تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- Custom EventHandler & Classes - الجزء الأول
#1
كاتب الموضوع : silverlight

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته


جميعنا يعلم ماذا تعني كلمات مثل Event و EventArgs و EventHandler حيث أن جميع الكونترول الموجودة بالدوت نت قلما تخلو من مثل هذه المسميات وبالتأكيد الغالبية ممن سيقرأون هذا الموضوع يعرفون جيدا كيف يتعاملون مع مثل هذه الأشياء من حيث بنائها أو إضافتها الي الكونترول أو الكلاسات المختلفة

لكن ومنذ سنوات أضافت مايكروسوفت إمكانية جديدة ألا وهي استخدام ما يطلقون عليه Custom EventHandler وهذا أتاح للمبرمج إمكانية إضافة أحداث جديدة إلي الكونترول أو الكلاس بشكل أفضل وأيضا هذا أتاح له إمكانية التعديل علي الأحداث الموجودة في الكونترول أو الكلاسات المختلفة الموجودة بالدوت نت

أهم مميزات استخدام Custom EventHandler

تعتبر أهم مميزات استخدام Custom EventHandler هي التوفير في استهلاك ذاكرة الكمبيوتر وأيضا إن استخدامها بشكل دقيق وإعطائها مسميات دقيقة مختلفة عن بعضها البعض لن يؤدي الي أي نوع من انواع Blocking لبعضها البعض أثناء تنفيذها


الكود التالي يوضح شكل Custom EventHandler ولقد أعطيتها إسما شائعا ألا وهو PropertyChanged

سنلاحظ اننا عندما نقوم بكتابة الجملة Public Custom Event PropertyChanged As EventHandler أن الفيجوال استوديو قام بإضافة باقي الكود اتوماتيكيا أي أن الفيجوال استوديو قام بكتابة حوالي خمسون بالمائة من الكود والباق من الكود يجب علينا أن نقوم بكتابته بأنفسنا


كود :
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)

End AddHandler

RemoveHandler(ByVal value As EventHandler)

End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)

End RaiseEvent
End Event
الأن لنضيف الكود المناسب إلي PropertyChanged EventHandler والكود التالي يوضح ذلك


كود :
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

كيف نضيف Custom EventHandler إلي Component أو إلي Control

في واقع الأمر إن إضافة أي Custom EventHandler إلي Component أو Control يمكن إعتباره أمر تقليدي وتكراري وهو لن يختلف كثيرا عن الكود الذي كتبناه أعلاه
أيضا من الممكن إعتباره هو الجزء الأسهل في موضوعنا هذا والسبب في ذلك هو أن أي Component أو كونترول يمتلك Events Property وبالتالي هي تعمل بمثابة المخزن الذي يتم فيه تخزين أي EventHandler او Delegates يتم إضافتها الي الكونترول أو إل Component

الكود التالي يوضح كيفية إضافة Custom EventHandler إلي Control ما

سنلاحظ من الكود كيف نقوم بإضافة Custom EventHandler ومن ثم ربطها مع بعض Property وأيضا كيفية عمل Dispose لها وأيضا كيفية الإستفادة من Custom EventHandler في إخفاء بعض Handler الموجودة في الكونترول مثل BackColorChanged


كود :
Public Class ControlTest
Inherits Control

Public Sub New()
End Sub

Private m_color As Color = Color.Transparent
Public Property MyColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Empty
End If
Me.m_color = value
Me.OnPropertyChanged(Me, EventArgs.Empty)
End Set
End Property

Private m_BackColor As Color = Color.Transparent
<System.ComponentModel.Browsable(False)> _
<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Public Overrides Property BackColor() As System.Drawing.Color
Get
Return Me.m_BackColor
End Get
Set(ByVal value As System.Drawing.Color)
If value.IsEmpty Then
value = Color.Transparent
End If
' do nothing
End Set
End Property

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
MyBase.Dispose(disposing)

End Sub

Protected Overridable Sub OnPropertyChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
' Or we can use
'RaiseEvent PropertyChanged(sender, e)
End If
End Sub

Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

<System.ComponentModel.Browsable(False)> _
<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Public Shadows Custom Event BackColorChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("BackColorChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("BackColorChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("BackColorChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

End Class
الكود التالي يوضح كيفية إضافة Custom EventHandler إلي Component ما


كود :
Public Class ComponentTest
Inherits System.ComponentModel.Component

Public Sub New()
End Sub

Private m_color As Color = Color.Transparent
Public Property MyColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Empty
End If
Me.m_color = value
Me.OnPropertyChanged(Me, EventArgs.Empty)
End Set
End Property

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
MyBase.Dispose(disposing)

End Sub

Protected Overridable Sub OnPropertyChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
' Or we can use
'RaiseEvent PropertyChanged(sender, e)
End If
End Sub

Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

End Class
كيف نضيف Custom EventHandler إلي أي كلاس

لكي نقوم بذلك نحتاج إلي شيئان أساسيان وهما كالأتي:

أن يكون لدينا Property تشير إلي EventHandlerList وهي التي سوف تعمل بمثابة المخزن الذي سوف نقوم بتخرين جميع EventHandler به
أن نقوم بعمل Dispose لهذه EventHandler وبالتالي يجب علينا أن نقوم باستخدام IDisposable Interface

ولكي نوضح الأمر بمثال مناسب لنفرض جدلا اننا نريد أن نكتب كلاسا به مجموعة من Property وهي عبارة عن Color او ألوان مختلفة ومن ثم نريد بعض ذلك ان نضيف هذا الكلاس الي اي كونترول ما ونستخدم الألوان الموجودة به في رسم شئ ما علي الكونترول

ولكي نبني شيئا مناسبا يمكن استخدامه بشكل جيد فنحن غالبا سنحتاج الي الأشياء التالية

الكلاس الموجود به الألوان
نحتاج إلي كلاس تم توريثه من TypeConverter
نحتاج الي كلاس تم توريثه من TypeEditor
ثم اي كلاسات أخري نريد إضافتها
ثم بالنهاية كلاس تم توريثه من الكونترول مثلا حيث سنضيف له الكلاس الموجودة به الألوان ومن ثم نستخدمها في تلوين الكونترول


يتبع في المشاركة التالية ...............................................
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
مقال- Custom EventHandler &amp; Classes - الجزء الأول - بواسطة Raggi Tech - 05-10-12, 11:45 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 8,370 19-07-22, 12:15 AM
آخر رد: StartLight4000
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,444 30-06-19, 10:41 AM
آخر رد: invocker
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 12,084 28-04-18, 06:55 PM
آخر رد: moniam
  الفرق بين الأصناف Classes و الكائنات Objects RaggiTech 1 8,440 28-03-18, 10:30 PM
آخر رد: alsouf
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,825 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,499 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,207 06-01-17, 11:52 AM
آخر رد: silverlight
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,504 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 3,001 22-02-13, 12:39 AM
آخر رد: أنس محمود
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,681 06-10-12, 12:23 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: