05-10-12, 01:44 AM
نعود للنموذج الخاص بالمشروع الذي نحتاج لوجود صندوق نصوص وزرين عليه للقيام بتجربة الفئة الجديدة حيث سنقوم بتعريف متغير خاص على مستوى النموذج باسم MyTimer من نوع فئتنا MyStopWtach وباستخدام العبارة WithEvents التي ستمكننا من استقبال الأحداث التي ستطلقها فئتنا
وسيكون كود الزرين من أجل بدء وإيقاف المؤقت باستخدام فئتنا السابقة كما يلي
الآن أنشئ معالج للحدث ReturnVlaue العائد للمتغير MyTimer واجعله بحيث يكون الكود فيه كالتالي ثم جرب تشغيل البرنامج فستحصل على رسالة مشابهة للرسالة في بداية المقال
ولمعالجة هذه النقطة والتخلص من رسالة الخطأ سنحتاج لعمل Invoke للإجراء MyTimer_ReturnValue حتى نستطيع استخدام القيم المعادة منه في ضبط قيم خصائص التحكمات على النموذج وفي حالتنا هنا الخاصية Text لصندوق النصوص والعملية ببساطة ستتم كما يلي
في قسم المتغيرات العامة في النموذج سنقوم بتعريف إجراء مفوض Delegate يحمل نفس توقيع الإجراء MyTimer_ReturnValue وبدون جسم للإجراء كما يلي
ويكون الكود الذي سينفذ المهمة بصورة صحيحة كما يلي
حيث فحصنا قيمة الخاصية القابلة للقراءة فقط InvokeRequired لصندوق النصوص فإن كان False نقوم بضبط قيمة الخاصية Text باستخدام القيمة المعادة من الحدث مباشرة بدون أي مشاكل وإن كانت True عندها لن نستطيع ضبط القيمة مباشرة كي لا نحصل على الخطأ الوارد في بداية المقال عندها سنعرف متغير d من نوع الإجراء المفوض MyTimer_ReturnValueDelegate ونمرر له عنوان الإجراء MyTimer_ReturnValue ثم استخدمنا الطريقة Invoke العائدة للنموذج لتنفيذ نسخة آمنة من الحدث MyTimer.ReturnValue تمكننا من ضبط القيم المعادة إلى التحكمات وذلك بتمرير المتغير d كمحدد أول للخاصية Invoke ويكون المحدد الثاني للخاصية Invoke هو مصفوفة من النوع Object يتم تمرير محددات الإجراء MyTimer_ReturnValue كعناصر لها
وفيما يلي الكود الكامل للنموذج
كود :
Private WithEvents MyTimer As New MyStopWtachكود :
Private Sub Button1_Click() Handles Button1.Click
MyTimer.StartTimer()
End Sub
Private Sub Button2_Click() Handles Button2.Click
MyTimer.StopTimer()
End Subكود :
Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles MyTimer.ReturnValue
Me.TextBox1.Text = e.ReturnVlaue
End Subفي قسم المتغيرات العامة في النموذج سنقوم بتعريف إجراء مفوض Delegate يحمل نفس توقيع الإجراء MyTimer_ReturnValue وبدون جسم للإجراء كما يلي
كود :
Private Delegate Sub MyTimer_ReturnValueDelegate(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs)كود :
Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles MyTimer.ReturnValue
If Me.TextBox1.InvokeRequired = True Then
Dim d As New MyTimer_ReturnValueDelegate(AddressOf MyTimer_ReturnValue)
Me.Invoke(d, New Object() {sender, e})
Else
Me.TextBox1.Text = e.ReturnVlaue
End If
End Subوفيما يلي الكود الكامل للنموذج
كود :
Public Class Form1
Private Delegate Sub MyTimer_ReturnValueDelegate(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs)
Private WithEvents MyTimer As New MyStopWtach
Private Sub Button1_Click() Handles Button1.Click
MyTimer.StartTimer()
End Sub
Private Sub Button2_Click() Handles Button2.Click
MyTimer.StopTimer()
End Sub
Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles MyTimer.ReturnValue
If Me.TextBox1.InvokeRequired = True Then
Dim d As New MyTimer_ReturnValueDelegate(AddressOf MyTimer_ReturnValue)
Me.Invoke(d, New Object() {sender, e})
Else
Me.TextBox1.Text = e.ReturnVlaue
End If
End Sub
End Class