السلام عليكــم ورحمـة الله وبركاتــه ،،
هل لاحظت يوما أثناء تصفحك لخصائص أحد الأدوات من نافذة الخصائص أن بعض الخصائص يتم تغيير قيمتها بطريقة مختلفة
فمثلا إذا نظرنا إلى خاصية من نوع Color ولتكن الخاصية BackColor فعند تغيير قيمتها يظهر محرر الخاصية بهذا الشكل
ولو نظرنا إلى خاصية من نوع Font ولتكن الخاصية Font لوجدنا محرر الخاصية مختلف قليلا وهو عبارة عن شاشة منفصلة بهذا الشكل
هذا هو ما يسمى بالـTypeEditor
هذه الفئة هى التى تخبر نافذة الخصائص كيف يتم تغيير وإظهار قيمة الخصائص المختلفة
فى هذا الدرس سنشرح بإذن الله كيف يمكن عمل محرر خصائص بالشكل الذى نريده ونضيفه إلى الأدوات الخاصة بنا
بسم الله نبدأ ,,
الخطوة الأولى بالتأكيد هى فتح مشروع جديد من نوع WindowsApplication
ثم
نضيف فئة جديدة وليكن اسمها MyCustomControl وهى ستكون فأر التجارب :D
الكود الخاص بها بهذا الشكل
Public Class MyCustomControl Inherits UserControl Private _value As Integer Public Property Value() As Integer Get Return _value End Get Set(ByVal value As Integer) _value = value End Set End Property End Class
كما هو واضح فى الكود ,, الفئة يتم وراثتها من الفئة UserControl وقمنا بإضافة خاصية واحدة فقط هى Value من النوع Integer
الآن لو قمنا بعمل ترجمة للمشروع سنجد أن الأداة الجديدة ظهرت فى شريط الأدوات
قم بإضافتها على الفورم وانظر إلى الخاصية Value وحاول التغيير فيها
ماذا لاحظت؟؟
بالتأكيد لم يتغير شئ :D :D
سنقوم الآن بكتابة محرر جديد للخاصية Value
نريد مثلا أن يتم تغيير قيمة الخاصية باستخدام TrackBar
قم بإضافة فئة جديدة بإسم MyValueEditor
الكود المبدئى لهذه الفئة سيكون بهذا الشكل
Imports System.Drawing.Design Imports System.Windows.Forms.Design Public Class MyValueEditor Inherits UITypeEditor Dim edsvc As IWindowsFormsEditorService Dim tb As TrackBar End Class
قمنا أولا باستيراد مجال الأسماء Imports System.Drawing.Design وهو الذى يحتوى على الفئة التى قمنا بوراثتها وهى UITypeEditor ومجال الأسماء System.Windows.Forms.Design وهو يحتوى على الفئة IWindowsFormsEditorService وهى المسئولة عن إظهار محرر الخصائص الخاص بنا
وقمنا بتعريف متغير من نوع TrackBar والذى يمثل الأداة التى سنستخدمها كمحرر للخاصية
الآن بما أننا قمنا بالاشتقاق من الفئة UITypeEditor فأول خطوة سنقوم بها هى تغيير طريقة تحرير الخاصية عن طريق الوظيفة GetEditStyle والتى تعود بقيمة من النوع System.Drawing.Design.UITypeEditorEditStyle وهو يدعم ثلاثة أنواع للمحررات
None: استخدام الطريقة الافتراضية
DropDown: يتم إظهار سهم صغير بجوار الخاصية مثل أداة ComboBox كما هو موجود فى الخاصية BackColor
Modal: يتم تحرير الخاصية عن طريق نافذة أخرى مثل الخاصية Font
فى مثالنا هذا سنستخدم النوع الثانى DropDown
Public Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle Return UITypeEditorEditStyle.DropDown End Function
الآن سنقوم بالعمل على الوظيفة EditValue والتى يتم استدعاؤها عند قيام مستخدم الأداة بمحاولة تحرير الخاصية
ستكون بهذا الشكل
Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object If provider IsNot Nothing Then edsvc = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService) If edsvc IsNot Nothing Then If tb Is Nothing Then tb = New TrackBar With tb .Maximum = 100 .Minimum = 0 AddHandler tb.MouseUp, AddressOf OnSelectValue End With End If If value IsNot Nothing AndAlso TypeOf value Is Integer Then tb.Value = value End If edsvc.DropDownControl(tb) value = tb.Value End If End If Return value End Function Private Sub OnSelectValue(ByVal sender As Object, ByVal e As MouseEventArgs) edsvc.CloseDropDown() End Sub
نقوم بتهيئة قيمة edsvc عن طريق استدعاء الوظيفة GetService التابعة للكائن provider
الكائن edsvc هو المسئول عن إظهار المحرر الخاص بنا
بعد ذلك يتم التأكد من الكائن tb إذا كان nothing نقوم بتهيئته ونضع قيم لبعض خصائصه وأخبرنا المترجم أن يقوم باستدعاء الإجراء OnSelectValue عند تنفيذ الحدث MouseUp
فى جملة الشرط التالية يتم التأكد من المعامل value وهى تحمل قيمة الخاصية الحالية ونقوم باسنادها للخاصية Value التابعة للكائن tb
بعد أن قمنا بتهيئة المحرر الخاص بنا بقى علينا أن نقوم بإظهاره وذلك عن طريق استدعاء الإجراء DropDownControl التابع للكائن edsvc
عند تنفيذ الحدث MouseUp سيتم نقل التحكم إلى الإجراء OnSelectValue وكما هو واضح من الكود أن هذا الإجراء يقوم فقط بإخفاء المحرر عن طريق إستدعاء الإجراء CloseDropDown التابع للكائن edsvc
سيتم إعادة التحكم للوظيفة EditValue مرة أخرى بعد تنفيذ هذا الحدث عند السطر
value = tb.Value
قمنا بوضع القيمة التى اختارها المستخدم عن طريقة الـTrackBar فى المعامل value الذى يتم إرساله مرة أخرى إلى نافذة الخصائص
انتهينا من أول وأبسط محرر خصائص خاص بنا
إذهب الآن إلى الفورم وحاول تغيير قيمة الخاصية Value ,, ستجد المحرر أصبح بهذا الشكل
ملحوظة بسيطة
الكود السابق كله لن يعمل :D :D
لا تنزعج
فقط سنعدل جزء بسيط جدا فى كود الفئة MyCustomControl
يجب أن نخبر المترجم أن محرر الخاصية Value هو MyValueEditor
سيكون الكود النهائى للأداة بهذا الشكل
Imports System.ComponentModel Imports System.Drawing.Design Public Class MyCustomControl Inherits UserControl Private _value As Integer <Editor(GetType(MyValueEditor), GetType(UITypeEditor))> _ Public Property Value() As Integer Get Return _value End Get Set(ByVal value As Integer) _value = value End Set End Property End Class
وهذا هو الكود النهائى للمحرر
Imports System.Drawing.Design Imports System.Windows.Forms.Design Public Class MyValueEditor Inherits UITypeEditor Public Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle Return UITypeEditorEditStyle.DropDown End Function Private edsvc As IWindowsFormsEditorService Dim tb As TrackBar Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object If provider IsNot Nothing Then edsvc = CType(provider.GetService(GetType(IWindowsFormsEditorService)), IWindowsFormsEditorService) If edsvc IsNot Nothing Then If tb Is Nothing Then tb = New TrackBar With tb .Maximum = 100 .Minimum = 0 AddHandler tb.MouseUp, AddressOf OnSelectValue End With End If If value IsNot Nothing AndAlso TypeOf value Is Integer Then tb.Value = value End If edsvc.DropDownControl(tb) value = tb.Value End If End If Return value End Function Private Sub OnSelectValue(ByVal sender As Object, ByVal e As MouseEventArgs) edsvc.CloseDropDown() End Sub End Class
أتمنى أن يكون الدرس مفيدا
