إنشاء عناصر تحكم مخصصة لنظام ويندوز


الكاتب الأخ : محمد الناشـري

بسم الله الرحمن الرحيم
كثيرا ما تحتاج الى تنفيذ حدث معين لعنصر تحكم ما … فنذهب بكل بساطة الى محرر الكود ونختار وقت الحدث ثم نكتب مانريد من عنصر التحكم تنفيذة عند وقوع الحدث …
ولكن ماذا لو اننا تريد تنفيذ نفس الحدث على اكثر من نسخة من العنصر داخل الفورم ..
سيلزمنا حينها ان نعيد كتابة الحدث لكل عنصر … مما يعد امرا مرهقا بعض الشئ …
بصفة أوضح ..
ماذا لوكان لدينا نموذج وبة عدد لاباس به من عنصر التجكم TextBox ونريد عند التركيز على عنصر التكست ان يتحول لونة الى الاصفر لينبة المستخدم بانة هو العنصر الذي سيتم الكتابة فية .. مثلا ..
سنقوم بلاشك بجعل لون الخلفية للعنصر تساوي اللون الاصفر عند حدث التركيز …. وسنعيدها الي اللون الابيض عند فقد التركيز .. المهمة تبدو سهلة بعض الشئ ولكن ما ذا لو أردنا تطبيق ذلك على جميع عناصر TextBox الموجودة في الفورم ….. بلاشك سنحتاج الى الاشارة الى كل عنصر بتنفيذ احداث معينة نود تنفيذها ..
والنتيجة كم هائل من الكود ….
يتيح بيئة الدوت نت امكانية اشتقاق الكنترول وتطويرة بما يتناسب مع احتياجنا .. وللقيام بذلك
كل ما عليك هو البدء بمشروع جديد ثم اختر Windows Forms Control Library ….
وقم بتسمية المشروع MohdTextBox مثلا …
نبدا العمل بتغيير اسم كائن UserControl 1 الى MohdTextBox.vb ثم نقوم بحفظ المشروع ..
انقر show all في نافذة Solution Explorer لتري جميع ملفات المشروع .. يوجد اسفل ملف MohdTextBox.vb الملف المسمى MohdTextBox.Designer.vb قم بفتحة وستشاهد ان الملف يبدا بالعبارتين التاليتين

رموز PHP:
Partial Public Class MohdTextBox
Inherits System.Windows.Forms.UserControl

تدل العبارة الاولى الى ان الملف باكملة ينتمى الى فئة MohdtextBox …
لاشتقاق جميع خصائص عنصر التحكم TextBox علينا بتغيير العبارة الثانية لتصبح كالتالي

رموز PHP:
Inherits System.Windows.Forms.TextBox

وبهكذا نكون قد انشأنا عنصر تجكم جديد واشتققنا جميع خصائص TextBox ..
ولكن ماالفائدة من ذلك …. بلاشك اننا نريد أن اضافة امكانيات جديدة لعنصر التحكم الخاص بنا ..
ننتقل الان الى الكود الخاص بالكائن MohdTextBox.vb وحيث اننا نريد يتغير لون خلفية مربع النص الى اللون الاصفر عندما يكون عنصر التحكم نشطاً لذا علينا أن نكتب الكود الخاص بنا في حدث Enter الخاص بعنصر التحكم ..
نقوم بتوسيع القائمة المنسدلة Events وحدد الحدث Enter ثم نكتب الاتي

رموز PHP:
Private Sub MohdTextBox_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
Me.BackColor = Color.Yellow
End Sub

بعد ذلك لابد لنا بان نقوم ببرمجة الحدث Leave حتي يتم اعادة ضبط اللون الخلفية الى اللون الابيض .عند الغاء تنشيطة …

رموز PHP:
Private Sub MohdTextBox_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Leave
Me.BackColor = Color.White
End Sub

نقوم الان بعمل Build لمشروعنا …وبكذا نكون قد انشانا عنصر تحكم به الخاصية الاضافية وهي تغير لون الخلفية عند تنشيط العنصر .. ونستطيع استخدامة في اي مشروع خاص بنا او ارسالة لمن نشاء ليستخدمة …
ولاضافة عنصر التحكم الجديد الى اي مشروع نذهب الى نافذة ToolBox ونضغط على زر الفارة الايمن ونختار Choose Itemes ومن نافذة Choose ToolBox Itemes نضغط زر الاستعراض ونذهب الى مشروعنا وداخل مجلد Bin سنجد الملف MohdTextBox.dll نختارة ونضغط فتح وسيتم اضافتة الى المشروع ..
يتبع …

طلب احد الاخوان هنا … ان يتم تغير العلامة “.” الى ” ،” تلقائيا وسأل كيف يتم تطبيقها على العديد من عناصر التحكم TextBox ..
ولتنفيذ ذلك كل ماعلينا هو الذهاب الى مشروعنا ..
واضافة الكود التالي عند حدث
LostFocus

الكود

رموز PHP:

Private Sub MohdTextBox_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
Dim newstr As String
Dim oldstr As String = Me.Text
newstr = oldstr.Replace(".", "،")
Me.Text = newstr
End Sub 

تعرفنا سابقا على كيفية إنشاء عناصر تحكم مخصصة .. وكان الأمر في غاية السهولة .. ولكن وكما تلاحظون في مشروعنا أن المستخدم لأداتنا المخصصة ( وطبعا هو المبرمج ) لا يستطيع التحكم أو اختيار الألوان التي تناسبه أو تناسب مشروعه…
والسؤال هنا لماذا لا نجعل هذه القيمة كخاصية للعنصر كي يستطيع المطور ضبطها كيفما يشاء ?….
لنضف خاصيتين هما EnterFocusColor وLeaveFocusColor.. وحيث أن عنصر الذي انشأ ناه خصيصا من اجل عملية إدخال البيانات فسوف يكون من المفيد أيضاً إضافة سمة جديدة وثيقة الصلة بإدخال البيانات ألا وهي تنبيه المستخدم في حال ترك احد الحقول الإجبارية فارغا وذلك بظهور اللون الذي يتم تحديده من قبل المطور …
وطبعا لابد أن نحدد أولا ما إذا كان الحقل إجباريا أم لا …باستخدام خاصية Mandatory فإذا كان الحقل إجباريا وترك خاليا ستتغير قيمته بناء على اللون المحدد في خاصية MandatoryColor
سنستعرض ألان للخصائص التي سنخصصها لعنصر التحكم …..
خاصية EnterFocusColor عند تنشيط عنصر التحكم سيتم ضبط لون الخلفية على هذه القيمة
خاصية LeaveFocusColor : عند إلغاء تنشيط عنصر التحكم يتم ضبط لون الخلفية على هذه القيمة ولكن هنا يجب الانتباه إلى انه إذا كان الحقل إجباري أي أن خاصية Mandatory قيمتهاTrue وكان الحقل خاليا فستكون الأولية لخاصية Mandatoryخاصية Mandatory :إذا كانت قيمة هذه الخاصية هي True فهذا يعني أن الحقل إجباري والعكس بالعكس
خاصية MandatoryColor : تضبط هذه الخاصية لون خلفية عنصر التحكم في حال كانت خاصية Mandatory لها القيمة True

والآن جاء دور كتابة الأكواد ….

رموز PHP:
استيراد فضاء الاسماء
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

جزء التعريفات في Declarations

رموز PHP:
 هذة الخاصية لتحديد مااذا كان الحقل اجباري ام لا
Dim _mandatory As Boolean
خاصية تحديد لون خلفية العنصر عند التنشيط وعند الغاء التنشيط
Dim _enterFocusColor, _leaveFocusColor As Color
خاصية تحديد اللون اذا كان الحقل اجباري
Dim _mandatoryColor As Color

يتبع…

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

رموز PHP:
Property Mandatory() As BooleanGet
Mandatory = _mandatory
End Get
Set(ByVal Value As Boolean)
_mandatory = Value
End Set
End Property

وضع خاصية ضبط لون خلفية العنصر اذا كان اجباري في اطار الخصائص ..

رموز PHP:

Property MandatoryColor() As Color

Get
MandatoryColor = _mandatoryColor
End Get
Set(ByVal Value As Color)
_mandatoryColor = Value
End Set
End Property

وضع خاصية ضبط لون خلفية العنصر عند التنشيط في اطار الخصائص ..

رموز PHP:
Property EnterFocusColor() As ColorGet
EnterFocusColor = _enterFocusColor
End Get
Set(ByVal Value As Color)
_enterFocusColor = Value
End Set
End Property

وضع خاصية ضبط لون خلفية العنصر عند الغاء التنشيط في اطار الخصائص ..

رموز PHP:
Property LeaveFocusColor() As System.Drawing.Color
Get
LeaveFocusColor = _leaveFocusColor
End Get
Set(ByVal Value As System.Drawing.Color)
_leaveFocusColor = Value
End Set
End Property

ملاحظة : نلاحظ أن الخصائص قد تم وضعها في تبويب Misc في اطار الخصائص وهذا الاختصار لعلامة التبويب يعني الخصائص المتنوعة... وسنتعر ف في الموضوع القادم على كيفية وضع الخصائص في ما يناسبها من تبويب .... 

تصنيف الخصائص…
بصورة افتراضية يتم عرض جميع الخصائص في قسم Misc وفي حال الرغبه في عرض احد الخصائص في قسم مختلف نستخدم سمة Category .. الخاصة بالاجراء Property ..
جميع هذة السمات هي من عناصر الفئة System.ComponentModel … لذلك فقد تم اسيرادة مسبقا ضمن فضاء الاسماء…
لتحديد مواصفات الخاصية التي تظهر في الجزء السفلي من اطار Properties لابد من وضع السمة Description …

رموز PHP:
  <Category("Appearance"), _
Description("هذة الخاصية لضبط خلفية النص عند التنشيط ..")> _


يتم وضع هذا الكود لتحديد القسم الذي نود ظهور الخاصيه به … و لاظهار الخاصية
EnterFocusColor مثلا في قسم Appearance

رموز PHP:
  <Category("Appearance"), _
Description("هذة الخاصية لضبط خلفية النص عند التنشيط ..")> _
Property EnterFocusColor() As Color
Get
EnterFocusColor = _enterFocusColor
End Get
Set(ByVal Value As Color)
_enterFocusColor = Value
End Set
End Property
وهكذا … …
اتمنى ان اكون قد وفقت في هذا التطبيق وللمزيد أرجو قراءة مقالات تطوير الكنترول للاخ الفاضل /SilverLight
  1. لا توجد تعليقات حتى الآن.
  1. No trackbacks yet.

شاركنا برأيك ,لكي نرقى بالمدونة,يمكنك أضافة تعليق عن طريق حسابك في Facebook