تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- تطوير الكونترول Property Attributes الجزء الثالث
#1
كاتب الموضوع : silverlight

الموضوع : تطوير الكونترول Property Attributes
اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم


هناك الكثير من Attributes التي تتحكم في خواص وصفات Property الموجودة في أي كونترول وتستخدم هذه Attributes في إرسال معلومات الي IDE أو Integrated Development Environment وذلك من خلال IntelliSense تحديدا ولسوف نقوم بتعريف بعض هذه Attributes نظرا لأهميتها في تطوير الكونترول فهي تلعب دورا هاما في ظهور الكونترول في مرحلة التصميم Design بشكل احترافي وأيضا تضيف الي الكونترول الكثير من الصفات الهامة.

بعض هذه Attributes مذكور أدناه ولمزيد من المعلومات يمكن للقارئ أن يطلع علي System.ComponentModel Namespace

حيث سيجد الكثير من الأشياء الهامة التي سوف نتحدث عنها لاحقا لأهميتها في تطوير الكونترول ومن هذه الأشياء ِAttributes التي تخص تحديدا Property وهي موضوعنا الحالي. ولاستخدام أي Attribute يجب عمل Import لهذه Namespace


BrowsableAttribute

CategoryAttribute

DescriptionAttribute

DefaultValueAttribute

DisplayNameAttribute

EditorAttribute

DesignerSerializationVisibilityAttribute


BrowsableAttribute

هذا Attribute الهدف منه شئ واحد فقط وهو ضبط خاصية ظهور أو إخفاء Property في Properties Window

هذا Attribute له قيمته عبارة عن Boolean إما True أو False

لو تم ضبط قيمة هذا Attributeعلي أنها True فان ذلك يعني أن Property يمكن التحكم فيها في حالة Design وفي حالة Run Time أما إذا كانت القيمة False فذلك يعني أن هذه Property يمكن التحكم فيها في مرحلة run Time فقط

المثال التالي يوضح كيفية استخدام BrowsableAttribute في الحالتين



كود :
Imports System.ComponentModel

Public Class MyControl

Inherits Control

' الخاصيه ظاهره

<Browsable(True)> _

Public Property MyColor1() As Color

Get

End Get

Set(ByVal value As Color)

End Set

End Property

' الخاصيه مختفيه

<Browsable(False)> _

Public Property MyColor2() As Color

Get

End Get

Set(ByVal value As Color)

End Set

End Property

End Class
CategoryAttribute

هذا Attribute الهدف منه شئ واحد فقط وهو التصنيف الذي سوف تظهر تحته Property في Properties Window

هذا Attribute له قيمه واحده فقط وهي عبارة عن String

لو تم ضبط قيمة هذا Attributeعلي أنها "Xtra Appearance" مثلا فان ذلك يعني أن Property سوف تظهر تحت Category يسمي Xtra Appearance وهذا Attribute يتم إضافته الي Property في حالة Design وهو مرتبط مع BrowsableAttribute لان Property يجب أن تكون ظاهره في Properties Windows وبالتالي يتم تصنيفها بعد ذلك أي يتم إضافة CategoryAttribute لها بالطبع يمكن إضافة هذا Attribute أيضا حتى لو كانت BrowsableAttribute يساوي False ولكنها لن تكون ذات قيمه في هذه الحالة.

أيضا إذا لم يتم إعطاء قيمه لهذا Attribute فان Property سيتم تصنيفها تحت Misc وهي Default Value كما بالمثال السابق لم يتم إضافة CategoryAttribute وبالتالي فان Property سيتم تصنيفها تحت Misc.

المثال التالي يوضح كيفية استخدام CategoryAttribute



كود :
Imports System.ComponentModel

Public Class MyControl

Inherits Control

' الخاصيه ظاهره

<Browsable(True)> _

<Category("Xtra Appearance")> _

Public Property MyColor1() As Color

Get

End Get

Set(ByVal value As Color)

End Set

End Property

End Class
DescriptionAttribute

هذا Attribute الهدف منه شئ واحد فقط وهو عبارة توضيح الهدف من الصفة Property وهو عبارة عن Help أو وصف عام وسريع لأي Property في Properties Window

و عندما يقف المبرمج بالماوس علي هذه الصفه في مرحلة التصميم سيظهر ما كتبناه بين الاقواس كنوع من التعريف لهذه الخاصيه Property في اسفل Properties Window


كود :
Imports System.ComponentModel

Public Class MyControl

Inherits Control

' الخاصيه ظاهره

<Browsable(True)> _

<Category("Xtra Appearance")> _

<Description("Just For Demo Purpose")> _

Public Property MyColor1() As Color

Get

End Get

Set(ByVal value As Color)

End Set

End Property

End Class
DefaultValueAttribute

هذا Attribute ومن الواضح من اسمه يختص بتحديد القيمة الأولية أو القيمة الافتراضية لأي Property واعتقد أن الكثير منكم قد لاحظ أن القيم التي تخص كل Property ليست مكتوبة بخط Bold وعند تغيير بيانات Property يتحول الخط الي Bold وذلك حتى يعرف المبرمج أن القيمة الافتراضية قد تم تغييرها الي قيمه جديدة وعندما نقوم بتصميم أو تطوير Control فإننا نريد أن يحدث نفس الشيء لذلك يتم تحديد القيمة الافتراضية لأي Property قمنا بإضافتها الي الكونترول وتختلف DefaultValueAttribute باختلاف نوع Property نفسها طبعا مع الوضع في الاعتبار أن عدم إضافة DefaultValueAttribute الي Property سيجعل الخط المكتوبة به هذه Property عبارة عن Bold

المثال التالي يوضح الأمر ولقد تم تحديد القيمة الافتراضية محدده في حالة MyColor1 Property وبالتالي سيظهر الخط المكتوبة به قيمة هذه Property كخط Normal وأيضا لم يتم تحديد القيمة الافتراضية في حالة MyNumber1 Property لذا سيظهر الخط المكتوبة به قيمة هذه Property كخط Bold



كود :
Imports System.ComponentModel

Public Class MyControl

Inherits Control

Private myColor As Color = Color.White

<Browsable(True)> _

<Category("Xtra Appearance")> _

<Description("Just For Demo Purpose")> _

<DefaultValueAttribute(GetType(Color), "White")> _

Public Property MyColor1() As Color

Get

Return myColor

End Get

Set(ByVal value As Color)

myColor = value

End Set

End Property


Private myNumber As Integer = 10

<Browsable(True)> _

<Category("Xtra Appearance")> _

<Description("Just For Demo Purpose")> _

Public Property myNumber1() As Integer

Get

Return myNumber

End Get

Set(ByVal value As Integer)

myNumber = value

End Set

End Property

End Class
DisplayNameAttribute

هذا Attribute ومن الواضح من اسمه يختص بإعطاء Property اسم ما وبما انه عبارة عن String بالتالي يمكن عرض الاسم كما نشاء ولو نظرنا الي المثال التالي سنجد انه قد تم إضافة DisplayNameAttribute والاسم الموجود بين الأقواس عبارة عن String غير متصل ومثال علي ذلك لتوضيح الامر.

في أي كونترول سنجد خاصية BackColor Property وهنا يمكننا استخدام هذا Attribute لعرض الاسم في Properties Window بهذا الشكل Back Color ولكن عندما نريد أن نستخدم هذه Property ٌ سوف نستخدم المسمي BackColor كاملا

في الواقع هذه الخاصية هامه جدا عندما نقوم بعمل Data Binding الي أي Windows Forms Controls ولكن هذا موضوع مختلف و ربما نتحدث عنه في مقال أخر



كود :
Imports System.ComponentModel

Public Class MyControl

Inherits Control

Private myColor As Color = Color.White

<Browsable(True)> _

<Category("Xtra Appearance")> _

<Description("Just For Demo Purpose")> _

<DefaultValueAttribute(GetType(Color), "White")> _

<DisplayName("My Revised Name")> _

Public Property MyColor1() As Color

Get

Return myColor

End Get

Set(ByVal value As Color)

myColor = value

End Set

End Property

End Class
EditorAttribute

هذا Attribute يحدد Editor الذي سوف يتم استخدامه للتغيير في قيمة أو قيم Property في الواقع هذا ِAttribute وكل ما يخص Property Editing مثل UITypeEditor مع مجموعه أخري من Classes يمثلون حجر الزاوية في تطوير الكونترول في مرحلة Design

ولتوضيح الأمر أكثر نأخذ علي سبيل المثال خاصية BackgroundImage Property وهي خاصية موجودة في أي كونترول تقريبا وعند الوقوف علي هذه الخاصية بالماوس سيظهر لنا Button صغير وبالضغط عليه سيفتح نافذة ما ومن هناك يتم اختيار الصورة التي من الممكن إضافتها الي الكونترول

إن هذا Button الصغير ما هو إلا عبارة عن Editor معين قد تم إضافته الي الخاصية BackgroundImage باستخدام EditorAttribute عموما هذا الموضوع فقط يحتاج الي مقال منفصل وربما أكثر من مقال والمثال التالي يوضح كيفية إضافة EditorAttribute الي Property وفي المثال قمت بإضافة Class جديد باسم MyImageEditor ثم قمت عمل Inherit الي UITypeEditor وتحديدا قمت بعمل Overrides لأحدي Functions الموجودة في UITypeEditor وهي GetEditStyle طبعا لكي يعمل الامر بشكل صحيح يجب علينا أن نتعامل مع معظم Functions الموجودة داخل UITypeEditor Class ومن ثم قمت باستخدام EditorAttribute مع MyImage Property لكي احدد لها فقط Editor المسئول عن التعديل في Property

وهذا لتوضيح الأمر للقارئ فقط بكيفية استخدام EditorAttribute إما لكي تعمل الأمور بشكل صحيح فانن لدينا الكثير لنضيفه الي الكود وكما قلت سابقا أن التعامل مع Property Editor يحتاج الي أكثر من مقال



كود :
Imports System.ComponentModel

Imports System.Security.Permissions

Imports System.Drawing.Design

Public Class Mycontrol

Inherits Control

Private Img As Image

<BrowsableAttribute(True), EditorAttribute(GetType(MyImageEditor), GetType(System.Drawing.Design.UITypeEditor))> _

Public Property MyImage() As Image

Get

Return Img

End Get

Set(ByVal value As Image)

Img = value

End Set

End Property

End Class


<PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _

Public Class MyImageEditor

Inherits UITypeEditor

Public Sub New()

End Sub


Public Overloads Overrides Function GetEditStyle(ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle

Return UITypeEditorEditStyle.Modal

End Function

' Add Code for more Functions and methods as Required Here

End Class
DesignerSerializationVisibilityAttribute

هذا Attribute من أهم وظائفه هو إضافة Components أو كلاس معين الي الكونترول ومن ثم التحكم بخواصها للاستفادة منها في تطوير الكونترول والمثال المرفق يوضح الأمر بشكل مناسب حيث أننا قمنا بإضافة الكلاس MyComponents بكل Properties الموجودة به تحت Property واحده فقط وهي MyData Property الموجودة داخل الكونترول MyControl



كود :
Imports System.ComponentModel

Imports System.Security.Permissions

Imports System.Drawing.Design

Public Class Mycontrol

Inherits Control

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _

Public ReadOnly Property MyData() As MyComponents

Get

Return New MyComponents()

End Get

End Property

End Class

' This attribute indicates that the public properties of this object should be listed in the property grid.

<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))> _

Public Class MyComponents

Private Color1 As Color

Private Color2 As Color

Private x As Integer

Public Sub New()

End Sub

Public Property Mycolor1() As Color

Get

Return Color1

End Get

Set(ByVal value As Color)

Color1 = value

End Set

End Property


Public Property MyColor2() As Color

Get

Return Color2

End Get

Set(ByVal value As Color)

Color2 = value

End Set

End Property


Public Property MyInteger() As Integer

Get

Return x

End Get

Set(ByVal value As Integer)

x = value

End Set

End Property

End Class

في واقع الأمر يوجد الكثير والكثير من Attributes الهامة جدا والتي لها دور هام في خروج الكونترول بشكل احترافي وكما قلت سابقا لمن يريد المزيد من المعلومات عليه بمراجعة محتويات System.ComponentModel Namespace

أتمني فقط أننا قد قمنا بتوضيح بعض النماذج الهامة التي تخص Property Attributes وكيفية استخدامها داخل الكونترول


ملحوظه :

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

Editors

VisualStyleRenderer

GDI+

Designers

عموما أعدكم بتطبيق عملي أو بمشروع صغير مع الجزء الرابع من تطوير الكونترول الذي سيكون موضوعه عن Designers تحديدا حيث أن GDI+ و Editors و VisualStyleRenderer ممكن اعتبارها موضوعات منفصلة وربما بعضها واضح للقارئ من أي مصادر أخري

بالتوفيق

أخوكم عمر


يمكن متابعة الاجزاء السابقه علي هذه اللينك

الجزء الأول

http://vb4arb.com/vb/showthread.php?1200



الجزء الثاني

http://vb4arb.com/vb/showthread.php?1240
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,839 19-07-22, 12:15 AM
آخر رد: StartLight4000
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,162 30-06-19, 10:41 AM
آخر رد: invocker
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,521 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  WriteOnly Property silverlight 0 1,721 08-07-17, 08:12 AM
آخر رد: silverlight
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,156 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,027 06-01-17, 11:52 AM
آخر رد: silverlight
  إيجاد جميع الكونترول الموجودة في الفورم Recursively Find All Controls in Form silverlight 0 3,041 26-05-15, 12:31 AM
آخر رد: silverlight
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,281 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 2,820 22-02-13, 12:39 AM
آخر رد: أنس محمود
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,428 06-10-12, 12:23 AM
آخر رد: RaggiTech

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


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