سأحاول العمل خطوة خطوة قدر الإمكان
وأفترض أن الذي يتابع العمل معي لديه بعض الالمام بالفئات Class
أنشئ مشروعا جديدا وسمه RaiseEventsTest ثم أضف له Class واقبل الاسم الافتراضي Class1
حتى نطلق احداثنا الخاصة ونلتزم بالصيغة التي نشاهدها في الأحداث الخاصة بالتحكمات مثل
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
حيث نجد ان لكل حدث قيمتان دوما هي sender المرسل للحدث و e القيم الممررة بواسطة الحدث
سنقوم أولا باشتقاق فئة من الفئة System.EventArgs ونضمنها القيم التي نريد تمريرها وفائدة هذا الاجراء هو مرونة البرنامج لاحقا عندما تريد التعديل فإذا أردت إضافة قيمة جديدة ليتم تمريرها لن تحتاج سوى لإضافتها هنا و هذا نص الفئة الجديدة
أدخل هذا الكود في الملف الجديد class1
Public Class CustomEventArgs Inherits System.EventArgs Private m_Member1 As String Private m_Member2 As Integer Public ReadOnly Property Member1() As String Get Return m_Member1 End Get End Property Public ReadOnly Property Member2() As Integer Get Return m_Member2 End Get End Property Public Sub New(ByVal M1 As String, ByVal M2 As Integer) m_Member1 = M1 m_Member2 = M2 End Sub End Class
حيث عرفنا خاصيتين member1 و member2 لتعيدا القيم التي نريدها و أنشأنا sub new لتهيئة القيم قبل الارسال
الآن بعد تعريف class1 أدخل تعريف الحدث الذي نريد إطلاقه كما يلي
Public Class Class1 Public Event TestEvent(ByVal sender As Object, ByVal e As CustomEventArgs)
ثم سنضيف إجراء لنطلق الحدث الذي نريده من داخل class1 كالكود التالي حيث نمرر القيم التي نريد ارسالها كبارامترات للمشيد constructor الخاص بالفئة customeventargs ثم نستخدم الأمر raiseevent لإطلاق الحدث
Public Sub DoTestEvent()
Dim e As New CustomEventArgs("Member No 1", 1500)
RaiseEvent TestEvent(Me, e)
End Subوبهذا نكون قد انتهينا من إنشاء class1 ولم يبق سوى أن نختبره
وهذا النص الكامل له
Public Class Class1
Public Event TestEvent(ByVal sender As Object, ByVal e As CustomEventArgs)
Public Class CustomEventArgs
Inherits System.EventArgs
Private m_Member1 As String
Private m_Member2 As Integer
Public ReadOnly Property Member1() As String
Get
Return m_Member1
End Get
End Property
Public ReadOnly Property Member2() As Integer
Get
Return m_Member2
End Get
End Property
Public Sub New(ByVal M1 As String, ByVal M2 As Integer)
m_Member1 = M1
m_Member2 = M2
End Sub
End Class
Public Sub DoTestEvent()
Dim e As New CustomEventArgs("Member No 1", 1500)
RaiseEvent TestEvent(Me, e)
End Sub
End Classو لاختبار ما فعلناه إذهب إلى form1 وضع عليها زرا وانقر عليه نقرا مزدوجا فتنتقل لمحرر الكود
الأن سنقوم بتعريف متغير يشير إلى class1 وذلك بعد Windows Form Designer generated code مباشرة
Private WithEvents cls As New Class1
لاحظ استخدام العبارة withevents في تعريف المتغير الذي يشير لـ class1 حتى نستطيع التعامل مع الأحداث التي يطلقها
من القائمة المنسدلة اليسارية فوق محرر الكود اختر cls ثم من القائمة المنسدلة اليمينية اختر الحدث testevent فيضيف محرر الكود إجراء التعامل مع الحدث الخاص بنا أدخل الكود ضمن محرر الشيفرة ليصبح الاجراء الجديد كالتالي
Private Sub cls_TestEvent(ByVal sender As Object, ByVal e As Class1.CustomEventArgs) Handles cls.TestEvent MsgBox(e.Member1 & ControlChars.CrLf & e.Member2) End Sub
الآن انتقل إلى حدث النقر على الزر وعدله ليصبح كالتالي
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click cls.DoTestEvent() End Sub
مرفق المشروع كاملا ولكن أقترح القيام بالعمل خطوة خطوة قبل أن تحمل المشروع
وسأحاول قدر الإمكان الإجابة عن أي تساؤل بخصوص الموضوع