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


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

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


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

بالتأكيد أن من سيقرأ هذا الموضوع يعلم جيدا ما هو الكلاس Class وأيضا يعلم جيدا كيف يقوم ببناء كلاس ما........
وكما سبق وكتبت أنه ولكي نبني شيئا مناسبا يمكن استخدامه بشكل جيد فنحن غالبا سنحتاج الي الأشياء التالية

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

والأن لنكتب كلاسا بسيطا يحتوي علي مجموعة من Properties و بعض الدوال و Sub إضافة الي اي شئ أخر نريده ولسوف نطلق علي الكلاس الذي سوف نستخدمه إسم ThemeColors

الكود التالي يوضح الشكل المبدئي للكلاس


كود :
Imports System.Drawing.Design

Public Class ThemeColors

#Region " Fields "

Private m_northBegin As Color
Private m_northEnd As Color
Private m_southBegin As Color
Private m_southEnd As Color
Private m_borderOut As Color
Private m_borderIn As Color

#End Region

#Region " Constructor "

Public Sub New()
Me.m_northBegin = Color.Transparent
Me.m_northEnd = Color.Transparent
Me.m_southBegin = Color.Transparent
Me.m_southEnd = Color.Transparent
Me.m_borderOut = Color.Transparent
Me.m_borderIn = Color.Transparent
End Sub

Public Sub New(ByVal northColorBegin As Color, _
ByVal northColorEnd As Color, _
ByVal southColorBegin As Color, _
ByVal southcolorEnd As Color, _
ByVal borderOut As Color, _
ByVal borderIn As Color)

Me.m_northBegin = northColorBegin
Me.m_northEnd = northColorEnd
Me.m_southBegin = southColorBegin
Me.m_southEnd = southcolorEnd
Me.m_borderOut = borderOut
Me.m_borderIn = borderIn

End Sub

#End Region

#Region " Properties "

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthBegin() As Color
Get
Return m_northBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northBegin = value

End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthEnd() As Color
Get
Return Me.m_northEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northEnd = value

End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthBegin() As Color
Get
Return m_southBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southBegin = value

End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthEnd() As Color
Get
Return m_southEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southEnd = value

End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderOut() As Color
Get
Return Me.m_borderOut
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderOut = value

End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderIn() As Color
Get
Return Me.m_borderIn
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderIn = value

End Set
End Property

#End Region

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


كود :
Private m_events As EventHandlerList = Nothing

Protected ReadOnly Property Events() As EventHandlerList
Get
If m_events Is Nothing Then
m_events = New EventHandlerList()
End If
Return m_events
End Get
End Property
بعد أن قمنا بإضافة Property أعلاه الأن يمكننا أن نضيف أي EventHandler وعلي سبيل المثال لسوف أضيف Custom EventHandler بإسم ThemeChanged كما هو موضح بالكود التالي


كود :
#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("ThemeChangedEvent", value)
End AddHandler

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

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("ThemeChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
#End Region
ثم بعد ذلك نضيف Sub يشير الي هذه Event وهو الذي سوف نستخدمه لإستدعاء أو Fire لهذه Event من داخل Properties الخاصة بالألوان والتي تم تعريفها في الكلاس والكود التالي يوضح شكل هذا Sub


كود :
Protected Overridable Sub OnThemeChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
RaiseEvent ThemeChanged(sender, e)
End If
End Sub
الأن لنقوم بعمل Implementation او نقوم باستخدام IDisposable Interface
عندما نكتب جملة Implements IDisposable سيقوم الفيجوال استوديو بإضافة الكود التالي الي الكلاس حيث هنا علينا أن نقوم بعمل Dispse لأي EventHandler أو أي شئ أخر نريده


كود :
Implements IDisposable

Private disposedValue As Boolean = False ' To detect redundant calls

' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free other state (managed objects).
End If

' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub

#Region " IDisposable Support "
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
يمكننا بعد ذلك أن نضيف ما نريد من دوال أو طرق Methods كيفما نحتاج عموما وبشكل عام إن الخطوات السابقة لا تأخذ كثيرا في تنفيذها ويمكننا بالتأكيد أن نغير في ترتيب كتابة الكلاس كيفما أردنا فالمهم هو أن نكتب كلاسا متكاملا

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

والكود التالي يوضح الشكل النهائي للكلاس ThemeColors


كود :
Imports System.ComponentModel
Imports System.Drawing.Design

<TypeConverter(GetType(ThemeConverter)), Editor(GetType(ThemeEditor), GetType(UITypeEditor))> _
Public Class ThemeColors
Implements IDisposable

#Region " Fields "

Private m_northBegin As Color
Private m_northEnd As Color
Private m_southBegin As Color
Private m_southEnd As Color
Private m_borderOut As Color
Private m_borderIn As Color

Private m_events As EventHandlerList = Nothing
Private m_disposed As Boolean = False

#End Region

#Region " Constructor "

Public Sub New()
Me.m_northBegin = Color.Transparent
Me.m_northEnd = Color.Transparent
Me.m_southBegin = Color.Transparent
Me.m_southEnd = Color.Transparent
Me.m_borderOut = Color.Transparent
Me.m_borderIn = Color.Transparent
End Sub

Public Sub New(ByVal northColorBegin As Color, _
ByVal northColorEnd As Color, _
ByVal southColorBegin As Color, _
ByVal southcolorEnd As Color, _
ByVal borderOut As Color, _
ByVal borderIn As Color)

Me.m_northBegin = northColorBegin
Me.m_northEnd = northColorEnd
Me.m_southBegin = southColorBegin
Me.m_southEnd = southcolorEnd
Me.m_borderOut = borderOut
Me.m_borderIn = borderIn

End Sub

#End Region

#Region " Properties "

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Protected ReadOnly Property Events() As EventHandlerList
Get
If m_events Is Nothing Then
m_events = New EventHandlerList()
End If
Return m_events
End Get
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthBegin() As Color
Get
Return m_northBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northBegin = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthEnd() As Color
Get
Return Me.m_northEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northEnd = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthBegin() As Color
Get
Return m_southBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southBegin = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthEnd() As Color
Get
Return m_southEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southEnd = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderOut() As Color
Get
Return Me.m_borderOut
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderOut = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderIn() As Color
Get
Return Me.m_borderIn
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderIn = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property

#End Region

#Region " Methods "

Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.m_disposed Then
If disposing Then
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
End If
Me.m_disposed = True
End Sub

Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub

Friend Sub DrawTheme(ByVal gr As Graphics, ByVal rect As Rectangle)
ThemesUtility.DrawGradient(gr, rect, Me.ThemeNorthBegin, Me.ThemeNorthEnd, Me.ThemeSouthBegin, Me.ThemeNorthEnd, Me.ThemeBorderOut, Me.ThemeBorderIn)
End Sub

Friend Function ApplyTheme() As Boolean
Return ((Me.ThemeNorthBegin <> Color.Empty) AndAlso (Me.ThemeNorthEnd <> Color.Empty) AndAlso (Me.ThemeSouthBegin <> Color.Empty) AndAlso (Me.ThemeSouthEnd <> Color.Empty))
End Function

Protected Overridable Sub OnThemeChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
RaiseEvent ThemeChanged(sender, e)
End If
End Sub

Public Overrides Function ToString() As String
Return String.Empty
End Function

#End Region

#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("ThemeChangedEvent", value)
End AddHandler

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

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

End Class

بالتاكيد من الصعب توضيح كل سطر من الكود فهذا الأمر يحتاج الي الكثير من الوقت ولذلك أعتقد أن هذا الموضوع ليس موجها للمبتدئين .................. ولكن بالتأكيد تستطيعون الاستفسار عن ما تريدون

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


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

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 8,373 19-07-22, 12:15 AM
آخر رد: StartLight4000
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,448 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,826 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,501 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,209 06-01-17, 11:52 AM
آخر رد: silverlight
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,506 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 3,002 22-02-13, 12:39 AM
آخر رد: أنس محمود
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,683 06-10-12, 12:23 AM
آخر رد: RaggiTech

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم