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

تعلم كيف تصنع خاصية من نوع Structure باستخدام Object Converter

بدأه GHOST2010 في 5 أغسطس 2009 · 9 رد · 3,334 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

بعد أن تعلمنا فى هذا الدرس كيفية استخدام الفئة UITypeEditor لتصميم محرر خصائص سنتعلم اليوم كيفية إنشاء خاصية من النوع Structure أو من نوع Class وإمكانية تحريرها فى نافذة الخصائص

لفهم ما أقصد قم بإنشاء فئة جديدة بهذا الكود

Imports System.ComponentModel

Public Class MyCustomControl
	Inherits UserControl

	Public Structure MyStruct
		Private _x, _y As Integer

		Public Property X() As Integer
			Get
				Return _x
			End Get
			Set(ByVal value As Integer)
				_x = value
			End Set
		End Property

		Public Property Y() As Integer
			Get
				Return _y
			End Get
			Set(ByVal value As Integer)
				_y = value
			End Set
		End Property
	End Structure

	Private _struct As New MyStruct

	Public Property Struct() As MyStruct
		Get
			Return _struct
		End Get
		Set(ByVal value As MyStruct)
			_struct = value
		End Set
	End Property

End Class

قمنا بإنشاء تركيب Structure باسم MyStruct يحتوى على خاصيتين هما X , Y من النوع Integer

ثم أنشأنا خاصية تحمل نوع هذا التركيب وهى الخاصية Struct

قم ببناء المشروع ثم ضع هذه الأداة على الفورم واذهب إلى الخاصية Struct وحاول تغيير قيمتها

ماذا لاحظت؟؟

نعم ,, لن تستطيع تغيير قيمتها وستظهر بهذا الشكل

post-47088-1249460756_thumb.jpg

إذاً كيف نجعل مستخدم الأداة قادرا على تغيير قيمة الخاصية مثل الخاصية Font , Location , Size

لعلك الآن فهمت ما أقصد

الآن قم بإضافة فئة جديدة باسم MyStructConverter وسيكون الكود المبدئى لها بهذا الشكل

Imports System.ComponentModel

Public Class MyStructConverter
	Inherits ExpandableObjectConverter

End Class

هل لاحظت السطر الثالث؟؟

نعم ,, الفئة التى قمنا بوراثتها هى المسئولة عما نريد أن نفعله

إذهب إلى الفئة MyCustomControl وغير كود الخاصية Struct لتكون بهذا الشكل

	<TypeConverter(GetType(MyStructConverter))> _
	Public Property Struct() As MyStruct
		Get
			Return _struct
		End Get
		Set(ByVal value As MyStruct)
			_struct = value
		End Set
	End Property

قم بإعادة بناء المشروع واذهب إلى الفورم وحاول تغيير قيمة الخاصية

ماذا لاحظت؟؟

نعم ,, يمكنك الآن تحرير الخاصية بكل سهولة وستتحول الخاصية إلى هذا الشكل

post-47088-1249460844_thumb.jpg

لكن انتظر ,, ليس هذا كل شئ

انظر مثلا إلى الخاصية Size ستجد أن قيمتها تظهر بهذا الشكل x;y

أما فى حالتنا فستظر القيمة بالشكل WindowsApplication1.MyCustomControl+MyStruct ونحن لا نريد هذا ,, نريدها أن تظهر مثل الخاصية Size

أعذرونى على الإطالة وعلى الشرح الممل :blink: :blink:

اذهب الآن إلى الفئة MyStructConverter وسنقوم بكتابة بعض الأكواد الممتعة :D :D

الفئة التى قمنا بوراثتها تحتوى على 4 وظائف مهمة جدا وهى التى سيتم العمل عليها

CanConvertTo : يتم استدعائها عندما تحول أنت كمبرمج للأداة قيمة الخاصية إلى الشكل x;y فتحدد هل يمكن تحويل هذا النوع إلى النوع String أم لا

CanConvertFrom : يتم استدعائها عندما تكتب القيمة بيديك ,, مثلا إذا ذهبت إلى الخاصية Size وكتبت 30;60 يتم استدعاء هذه الوظيفة لتحدد هل يمكن تحويل القيمة التى كتبتها إلى النوع Size أم لا

ConvertTo : وهذه لتحويل قيمة الخاصية إلى النوع String

ConvertFrom : وهذه لتحويل القيمة التى كتبها المستخدم إلى النوع MyStruct

قد تكون هذه الوظائف غير واضحة من الشرح لكن بعد تطبيق المثال ستتضح لك بإذن الله

الوظيفة الأولى : CanConvertTo

بما أننا سنحول القيمة لتظهر على شكل String فيجب أن نتحقق أن النوع المطلوب التحويل إليه هو String

	Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
		If destinationType Is GetType(String) Then
			Return True
		End If
		Return MyBase.CanConvertTo(context, destinationType)
	End Function

المعامل destinationType يحمل النوع المراد التحويل منه

الوظيفة الثانية : CanConvertFrom

بالطبع القيمة التى سيكتبها المستخدم بيديه ستكون من النوع String

سيكون الكود بهذا الشكل

	Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
		If sourceType Is GetType(String) Then
			Return True
		End If
		Return MyBase.CanConvertFrom(context, sourceType)
	End Function

حيث أن المعامل sourceType يحمل النوع المراد التحويل منه فقمنا بالتأكد من هذا النوع إذا كان String فيمكن التحويل منه ولذلك أعدنا القيمة True

الآن ندخل على الوظيفتين الأهم

علينا الآن أن نعالج عمليات التحويل من وإلى String

نبدأ بالتحويل إلى String

الوظيفة الثالثة : ConvertTo

نريد تحويل قيمة الخاصية التى هى من النوع MyStruct لقيمة من النوع String تظهر بالشكل x;y

	Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
		If destinationType Is GetType(String) AndAlso value IsNot Nothing Then
			Dim st As MyCustomControl.MyStruct = CType(value, MyCustomControl.MyStruct)
			Return st.X & ";" & st.Y
		End If
		Return MyBase.ConvertTo(context, culture, value, destinationType)
	End Function

بعد التأكد من أن النوع المراد التحويل إليه هو String وأن المعامل Value والذى يحمل القيمة المراد تحويلها يحتوى فعلا على قيمة قمنا بإعادة قيمة من النوع String تحمل الشكل المطلوب x;y

الآن لو كتب المستخدم فى خانة قيمة الخاصية 50;100 ,, كيف سنحول هذه القيمة إلى النوع MyStruct ??

هذا هو ما تفعله الوظيفة الرابعة

الوظيفة الرابعة : ConvertFrom

كما هو واضح من الشرح السابق أن المتغير النصى x;y يحتوى على قيم الخصائص X , Y داخل التركيب MyStruct ويفصل بينها بالرمز ; لذلك سنقوم بتجزئة القيمة بدلالة هذا الرمز لنحصل على مصفوفة تحتوى على القيمتين X , Y ثم بعد ذلك نعرف متغير جديد من النوع MyStruct ونسند هذه القيم إلى الخصائص داخل هذا المتغير ثم نعيد هذا المتغير كقيمة عائدة من الوظيفة كما هو موضح فى الكود التالى

	Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
		If TypeOf value Is String Then
			Dim st As New MyCustomControl.MyStruct
			Dim values() As String = value.ToString.Split(";")
			st.X = values(0)
			st.Y = values(1)
			Return st
		End If
		Return MyBase.ConvertFrom(context, culture, value)
	End Function

انتهى الكود إلى هنا ,, أعد بناء المشروع واذهب إلى الخاصية وحاول تغيير قيمتها وسترى نتيجة عملك

سيكون الشكل النهائى لها

post-47088-1249460870_thumb.jpg

وهذا هو الكود النهائى للفئة MyStructConverter

Imports System.ComponentModel

Public Class MyStructConverter
	Inherits ExpandableObjectConverter

	Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
		If destinationType Is GetType(String) Then
			Return True
		End If
		Return MyBase.CanConvertTo(context, destinationType)
	End Function

	Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
		If sourceType Is GetType(String) Then
			Return True
		End If
		Return MyBase.CanConvertFrom(context, sourceType)
	End Function

	Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
		If destinationType Is GetType(String) AndAlso value IsNot Nothing Then
			Dim st As MyCustomControl.MyStruct = CType(value, MyCustomControl.MyStruct)
			Return st.X & ";" & st.Y
		End If
		Return MyBase.ConvertTo(context, culture, value, destinationType)
	End Function

	Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
		If TypeOf value Is String Then
			Dim st As New MyCustomControl.MyStruct
			Dim values() As String = value.ToString.Split(";")
			st.X = values(0)
			st.Y = values(1)
			Return st
		End If
		Return MyBase.ConvertFrom(context, culture, value)
	End Function

End Class

أعتذر مرة أخرى عن الشرح السئ لكن إذا كان هناك شئ مبهم فلا تترددوا فى السؤال ولا تنسونى من الدعاء بظهر الغيب

تم تعديل هذه المشاركة بواسطة GHOST2010 في 6 أغسطس 2009 في 23:00

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#2

ماشاء الله

تمام التمام

جزاك الله كل خير

#3
اقتباس
أعذرونى على الإطالة وعلى الشرح الممل

شروحات مهمة و في محلها...

شكرا على الموضوع المهم و بارك الله فيك.

تحياتي...

#4

ما شاء الله عنك, شرح جميل و ممتع, هذه الدروس مفيداً جداً لبناء اي كمبوننت بشكل احترافي...

هل لك ان تستمر في هذه الدروس و تشرح لنا كيف يمكن عمل قائمة مثل التي في الصورة:

post-51753-1249536112_thumb.jpg

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#5

شكرا لجميع الأخوة

Wael Dalloul كتب:
ما شاء الله عنك, شرح جميل و ممتع, هذه الدروس مفيداً جداً لبناء اي كمبوننت بشكل احترافي...

هل لك ان تستمر في هذه الدروس و تشرح لنا كيف يمكن عمل قائمة مثل التي في الصورة:

post-51753-1249536112_thumb.jpg

سبحان الله ياوائل ,, والله العظيم ده فعلا موضوع الدرس الجديد عن كيفية إنشاء الـSmart Tags

:D :D

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#7

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

شكرا جزيلا لك بارك الله فيك وجزاك عنا كل خير

فعلا موضوع ممتاز ويستحق التقييم

اللهم لا سهل الا ماجعلته سهلا، وانت تجعل الصعب ان شئت سهلا

83_45a7168be2ddb.jpg

#8

اخي الفاضل GHOST2010

عمل جيد ولك كل التحية وفقط لإثراء النقاش لدي استفسار

بما ان ExpandableObjectConverter مشتقة أصلا من TypeConverter Class أو بمعني أدق هي ترث هذا الكلاس

وبما أنك قمت بعمل Overrides للدوال الأربعة الرئيسية فقط لماذا لم تستخدم TypeConverter Class مباشرة

شئ أخير أعتقد أنه يفضل استخدام InstanceDescriptor Class وذلك عند بناء اي Converter

أخوك عمر

#9
a_pess كتب:

اخي الفاضل GHOST2010

عمل جيد ولك كل التحية وفقط لإثراء النقاش لدي استفسار

بما ان ExpandableObjectConverter مشتقة أصلا من TypeConverter Class أو بمعني أدق هي ترث هذا الكلاس

وبما أنك قمت بعمل Overrides للدوال الأربعة الرئيسية فقط لماذا لم تستخدم TypeConverter Class مباشرة

شئ أخير أعتقد أنه يفضل استخدام InstanceDescriptor Class وذلك عند بناء اي Converter

أخوك عمر

أهلا بالخبير عمر ,, نورت الموضوع :blush:

بالنسبة لعدم وراثة الفئة TypeConverter فذلك لأن الخاصية التى تحمل قيمة من نوع Structure تظهر فى نافذة الخصائص على شكل شجرى وذلك لن توفره الفئة TypeConverter لكن هذا متاح باستخدام الفئة الثانية وهى ExpandableObjectConverter فلماذا أرهق نفسى فى إعادة كتابة شئ هو موجود أصلا بالإضافة إلى أننى لا أعرف كيفية تحويل TypeConverter إلى ExpandableObjectConverter ,, إبدأ من حيث انتهى الآخرون كما أن الدرس للمستوى المتوسط ولو أطلت الشرح أكثر من ذلك فلن تجد من يقرأ الموضوع

لكل مقام مقال

كما أننى لست خبيرا فى تطوير الأدوات لكنى أتمنى أن أكون كذلك

وفقنى الله وإياك إلى ما يحب ويرضى :blush:

تم تعديل هذه المشاركة بواسطة GHOST2010 في 16 أغسطس 2009 في 13:53

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#10

شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

يعطيك العافيه وسلامه

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