الإرشادات التفصيلية: معالجة الأحداث

هذا ثاني موضوعين يتم بهما شرح كيفية العمل مع الأحداث. الموضوع الأول ‏‫الإرشادات التفصيلية : تعريف و رفع أحداث ، يُظهر كيفية تعريف و رفع أحداث. يستخدم هذا مقطع النموذج و الفئة من الإرشادات التفصيلية تلك لإظهار كيفية معالجة الأحداث عندما تحدث.

مثال الفئة Widget يستخدم عبارات معالجة أحداث تقليدية. Visual Basic يوفر تقنيات أخرى تُستخدم للتعامل مع الأحداث. يمكنك تعديل هذا المثال كتمرين لاستخدام عبارات AddHandler و Handles.

لمعالجة الحدث PercentDone لفئة Widget

  • ضع التعليمات البرمجية التالية في Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    الكلمة الأساسية WithEvents تحدد أن المتغير mWidget يُستخدم لمعالجة أحداث كائن. تحدد نوع الكائن بواسطة توفير اسم الفئة التي سيتم إنشاء الكائن منها.

    المتغير mWidget تم تعريفه في Form1 لأن متغيرات WithEvents يجب أن تكون مستوى فئة. يكون هذا صحيحاً بغض النظر عن نوع الفئة التي تضعهم بها.

    يتم استخدام المتغير mblnCancel لإلغاء الأسلوب LongTask.

كتابة تعليمات برمجية لمعالجة حدث

بمجرد أن تقوم بتعريف متغير باستخدام WithEvents، يظهر اسم المتغير في القائمة المنسدلة اليسرى لمحرر التعليمات البرمجية للفئة. عند تحديد mWidget، أحداث الفئة Widget تظهر في القائمة المنسدلة اليمنى. يؤدي تحديد حدث إلى عرض إجراء الحدث المطابق, مع بادئة mWidget و بتسطير أسفل السطر (_). كافة إجراءات الأحداث المقترنة مع متغيرات WithEvents يتم إعطائها اسم المتغير كبادئة.

لمعالجة حدث

  1. حدد mWidget من القائمة المنسدلة اليسرى في محرر التعليمات البرمجية.

  2. حدد حدث PercentDone من القائمة المنسدلة اليمنى. يقوم محرر التعليمات البرمجية بفتح إجراء الحدث mWidget_PercentDone.

    ملاحظة

    محرر التعليمات البرمجية مفيد, ولكنه ليس ضروري، لإدخال معالجات أحداث جديدة. في الإرشادات التفصيلية هذه ، نسخ معالجات الأحداث مباشرة إلى التعليمات البرمجية الخاصة بك مباشر أكثر.

  3. قم بإضافة التعليمات البرمجية التالية إلى معالج الحدث mWidget_PercentDone :

    Private Sub mWidget_PercentDone( 
        ByVal Percent As Single, 
        ByRef Cancel As Boolean 
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    كلما رفع الحدث PercentDone, يعرض إجراء الحدث النسبة المئوية للاكتمال في عنصر التحكم Label. الأسلوب DoEvents يسمح للتسمية بإعادة رسم، و منح المستخدم أيضاً الفرصة لنقر زر إلغاء الأمر.

  4. قم بإضافة التعليمات البرمجية التالية إلى معالج الحدث Button2_Click:

    Private Sub Button2_Click( 
        ByVal sender As Object, 
        ByVal e As System.EventArgs 
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

عندما يقوم المستخدم بالنقر فوق رز إلغاء الأمر أثناء تشغيل LongTask، يتم تنفيذ الحدث Button2_Click بمجرد أن تسمح العبارة DoEvents بحدوث معالجة الحدث. متغير مستوى الفئة mblnCancel تم تعيينه إلى True، ثم يقوم الحدث mWidget_PercentDone باختباره وتعيين الوسيطة ByRef Cancel إلى True.

توصيل متغير WithEvents إلى كائن

تم الآن إعداد Form1 لمعالجة أحداث كائن Widget. كل ما تبقى هو ايجاد Widget في مكان ما.

عندما تقوم بتعريف متغير WithEvents في وقت التصميم، لا يوجد كائن مقترن به. متغير WithEvents هو مثل أي متغير كائن أخر تماماً. يجب إنشاء كائن و تعيين مرجع له مع المتغير WithEvents.

لإنشاء كائن وتعيين مرجع له

  1. حدد ((Form1 Events من القائمة المنسدلة اليسرى في محرر التعليمات البرمجية.

  2. حدد حدث Load من القائمة المنسدلة اليمنى. يقوم محرر التعليمات البرمجية بفتح إجراء الحدث Form1_Load.

  3. قم بإضافة التعليمات البرمجية التالية إلى إجراء الحدث Form1_Load لإنشاء Widget:

    Private Sub Form1_Load( 
        ByVal sender As System.Object, 
        ByVal e As System.EventArgs 
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

عند تنفيذ هذه التعليمات البرمجية ، ينشئ Visual Basic كائن Widget يصل الأحداث الخاصة به إلى إجراءات الأحداث المقترنة مع mWidget. من تلك النقطة , كلما رفع Widget الحدث PercentDone الخاص به، يتم تنفيذ إجراء الحدث mWidget_PercentDone.

للاتصال بأسلوب LongTask

  • قم بإضافة التعليمات البرمجية التالية إلى معالج الحدث Button1_Click :

    Private Sub Button1_Click( 
        ByVal sender As Object, 
        ByVal e As System.EventArgs 
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

قبل استدعاء الأسلوب LongTask, يجب تهيئة التسمية التي تعرض النسبة المئوية للاكتمال ، و يجب تعيين مؤشر مستوى الفئة Boolean لإلغاء الأسلوب إلى False.

يتم استدعاء LongTask مع مدة مهمة من 12.2 ثانية. يتم رفع الحدث PercentDone مرة واحدة كل ثلث من الثانية. في كل مرة يتم رفع الحدث، يتم تنفيذ إجراء الحدث mWidget_PercentDone.

عندما ينتهي LongTask، يتم إختبار mblnCancel لمعرفة ما إذا كان LongTask قد انتهى بشكل طبيعي، أو في حالة توقفه لأن mblnCancel تم تعيينه إلى True. يتم تحديث النسبة المئوية للاكتمال فقط في الحالة السابقة.

لتشغيل البرنامج

  1. اضغط على F5 لوضع المشروع في وضع التشغيل.

  2. انقر فوق الزر بدء المهمة. كل مرة يرفع الحدث PercentDone, يتم تحديث التسمية بالنسبة المئوية لاكتمال المهمة.

  3. انقر فوق زرإلغاء الأمر لإيقاف المهمة. ولاحظ أنه مظهر زر إلغاء الأمر لا يتغير مباشرة عندما تقوم بالنقر عليه. الحدث Click لا يمكن أن يحدث حتى تسمح العبارة My.Application.DoEvents بمعالجة الحدث.

    ملاحظة

    لايعالج الأسلوب My.Application.DoEvents أحداث بنفس الطريقة تمامًا كما يفعل النموذج. على سبيل المثال، في هذه الإرشادات التفصيلية، يجب نقر زر إلغاء الأمر مرتين. للسماح للنموذج بمعالجة الأحداث مباشرة, يمكنك استخدام multithreading. لمزيد من المعلومات، راجع التأشير الترابطي ل Visual Basic و #Visual C.

قد تجد أنه من المفيد تشغيل البرنامج مع F11 ثم انتقل عبر التعليمات البرمجية سطر في كل مرة. يمكنك مشاهدة كيف يدخل التنفيذ LongTask بوضوح، ومن ثم إعادة دخول Form1 بإيجاز في كل مرة يرفع الحدث PercentDone.

ماذا يحدث لو، أثناء عودة التنفيذ مرة أخرى في التعليمات البرمجية لـForm1، هل تم استدعاء الأسلوب LongTask مرة أخرى ؟ في أسوء الحلات، قد يحدث تجاوز سعة مكدس إذا تم استدعاء LongTask كلما تم رفع الحدث.

يمكنك أن تجعل المتغير mWidget يعالج أحداث لكائن Widget مختلف بواسطة تعيين مرجع إلى Widget الجديد إلى mWidget. في الحقيقة، يمكنك جعل التعليمات البرمجية في Button1_Click تفعل ذلك كل مرة تنقر على الزر.

لمعالجة أحداث لـ widget مختلف

  • قم بإضافة السطر التالي من التعليمات البرمجية إلى الإجراء Button1_Click، الذي يسبق السطر الذي يقرأ mWidget.LongTask(12.2, 0.33) مباشرة:

    mWidget = New Widget
    ' Create a new Widget object.
    

تنشئ التعليمات البرمجية أعلاه Widget جديد في كل مرة يتم نقر الزر. بمجرد اكتمال الأسلوب LongTask، يتم إصدار المرجع إلى Widget، و يتم إتلاف Widget.

يمكن أن تحتوي متغير WithEvents على مرجع كائن واحد فقط في كل مرة، إذا قمت بتعيين كائن Widget مختلف إلى mWidget، لن يتم معالجة أحداث الكائن Widget السابق. إذا كان mWidget هو متغير الكائن الوحيد الذي يحتوي على مرجع إلى Widget القديم، سيتم إتلاف الكائن. إذا كنت تريد معالجة الأحداث من كائنات Widget عديدة, استخدام العبارة AddHandler لمعالجة الأحداث من كل كائن بشكل منفصل.

ملاحظة

يمكنك تعريف العدد الذي تحتاج من متغيرات WithEvents، لكن صفائف متغيرات WithEvents لا يتم دعمها.

راجع أيضًا:

المهام

الإرشادات التفصيلية: التصريح و إظهار الأحداث

موارد أخرى

الـأحداث (Visual Basic)