الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقال : تطوير الكونترول Property Attributes

بدأه a_pess في 15 أغسطس 2008 · 4 رد · 1,175 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الموضوع : تطوير الكونترول 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 ممكن اعتبارها موضوعات منفصلة وربما بعضها واضح للقارئ من أي مصادر أخري

بالتوفيق

أخوكم عمر

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

الجزء الأول

الجزء الثاني

تم تعديل هذه المشاركة بواسطة a_pess في 15 أغسطس 2008 في 14:45

#3

great post thanks.

#4

جميل جدا أخى عمر

----

سأبدا فى أسئلتى من الحلقة القادمة

حيث ستبدأ فى Designers

---

ربنا يوفقك

أصفق أو لا أصفق فخلفي كتلة شحم تصفق وبعض المساحيق كانت تصفق وجاري يصفق وأسأل .. هل أعجبته الرواية؟ يبحلق ثم يلكز جنبي ويمضي يصفق أصفق أو لا أصفق أمامي كل الرؤوس تصفق وخلفي كل الصفوف تصفق أتى مارد شدني من يدي وتساءل لم لا تصفق تصايح كل الحضور اطردوه تحسست عقلي اطردوه أفقت لنفسي طريداً طريد فصفقت حتى انقطاع الوريد حتى انقطاع الوريد أصفق من أجل ذاك الذي لايصفق

#5

بالتوفيق إن شاء الله,,

من المتابعين,

Gaza.gif

3refhom.jpg

صائب

مبرمج مبتدأ في vb.net

saep435@hotmail.com

مواضيع مشابهة