03-10-12, 09:10 AM
ملحوظه هامه عن الكونترول كلاس
الكونترول يمتلك مجموعه من الصفات Properties وهي صفات أوليه كلها تبدأ باسم Default مثل خاصية DefaultSize و DefaultFont وأيضا بعض الخواص الاخري وطبعا ممكن عمل Overrides لهذه الصفات جميعا لو أردنا وذلك حسب متطلبات الكونترول الذي نقوم بتصميمه.
كيف تصنع Designer ؟
الإجابة علي هذا السؤال تنحصر في الخطوات التالية:
لتصنع Designer فأنت بحاجه الي كونترول أولا أي يجب أن تصنع الكونترول الخاص بك مهما كان نوعه أو شكله أو الهدف منه
أيضا أنت بحاجه الي إضافة Reference هام جدا إلي مشروعك وهو Namespace: System.Windows.Forms.Design
ولكي تربط بين الكونترول و Designer الذي قمت بتصميمه عليك أن تستخدم DesignerAttribute Class
من المهم جدا تحديد نوع Designer الذي سوف تقوم بعمل Inherits له وذلك مرتبط بك وماذا تريد.
مثلا لو أردت أن تصنع Custom Control ولا تريد أن يتم إضافة أي كونترول أخري إليه أي لا تريد إضافة Child Control إليه عليك أن تستخدم ControlDesigner Class أما إذا كنت تريد أن تضيف كونترول أخري الي ما تصمم عليك أن تستخدم ParentControlDesigner Class
ولتوضيح هذه النقطة لنفرض انك تريد أن تصنع Custom Control وأيضا لا تريد من المستخدم أن يقوم بإضافة عناصر أخري Child Control الي هذا الكونترول هنا عليك أن تستخدم ControlDesigner Class وطبعا العكس صحيح إذا أردت أن تضيف عناصر أخري الي الكونترول عليك هنا أن تستخدم ParentControlDesigner Class أو أي كلاس أخر مشتق منه
ببساطه أكثر أن أي كونترول تقوم ببنائه وتستخدم معه ControlDesigner Class لا يمكن استخدامه كوعاء أو حاويه Container لأي أنواع أخري من الكونترول.
الفرق بين ControlDesigner Class و ParentControlDesigner Class
لو نظرنا الي كل من هذين الكلاسين من خلال Help File الخاص بالفيجوال استوديو سنجد أن ParentControlDesigner مشتق من ControlDesigner ولو عقدنا مقارنة بينهم سنجد أيضا أن ParentControlDesigner يمتلك عدة طرق أكثر قليلا من ControlDesigner وعددها سبعة طرق وبالمثل سبعة صفات إضافية أخري وهي موضحه كالأتي
الطرق Methods
AddPaddingSnapLines
CanParent
CreateTool
CreateToolCore
GetControl
GetParentForComponent
GetUpdatedRect
الصفات Properties
AllowControlLasso
AllowGenericDragBox
AllowSetChildIndexOnDrop
DefaultControlLocation
DrawGrid
GridSize
MouseDragTool
لرؤية باق الصفات والخواص والحقول يمكنك عزيزي القاري أن تراجع ملف Help الخاص بالفيجوال استوديو كما يمكنك أيضا ن تقارن بينهم لتري الفرق بنفسك وستجد أيضا أن هناك حقل Filed كان موجودا في ControlDesigner ولكنه لم يعد موجودا في ParentControlDesigner وهذا الحقل يطلق عليه InvalidPoint
مما سبق نكتشف أن الطرق والصفات التي تم إضافتها الي ParentControlDesigner هي التي خلقت الفرق بينهم وهي التي أعطت الإمكانيات لهذا Designer لكي يعطي إمكانية إضافة أي كونترول أخر الي أي Custom Control وبما أن معظم Designers مشتقه من ParentControlDesigner لذلك سوف نتحدث عنه تحديدا ونحاول أن نغطي الأجزاء الهامة به والتي نحتاجها في تصميم كونترول جديد وبمواصفات وشكل جديد.
هيا نصمم Custom Control
لنفتح مشروع جديد Form Application ثم نضيف له كلاس نطلق عليه MyControl و نضيف له كونترول عن طريق Inherits و أيضا في نهاية هذا الكلاس نضيف كلاس ونطلق عليه MyDesigner ونضيف أيضا له ParentControlDesigner عن طريق Inherits الأن لنربط بين الكونترول و Designer لكي نربط بين الكلاسين سوف نستخدم DesignerAttribute Class ومن ثم علينا أن نضيف Attribute الي MyControl Class والهدف هنا هو أننا نقول للكونترول MyControl أن Designer المسئول عنك هو MyDesigner ويتم إضافة DesignerAttribute (<Designer(GetType(MyDesigner))> _) مباشرة قبل MyControl Class وبذلك يكون الكود كالأتي
الكونترول يمتلك مجموعه من الصفات Properties وهي صفات أوليه كلها تبدأ باسم Default مثل خاصية DefaultSize و DefaultFont وأيضا بعض الخواص الاخري وطبعا ممكن عمل Overrides لهذه الصفات جميعا لو أردنا وذلك حسب متطلبات الكونترول الذي نقوم بتصميمه.
كيف تصنع Designer ؟
الإجابة علي هذا السؤال تنحصر في الخطوات التالية:
لتصنع Designer فأنت بحاجه الي كونترول أولا أي يجب أن تصنع الكونترول الخاص بك مهما كان نوعه أو شكله أو الهدف منه
أيضا أنت بحاجه الي إضافة Reference هام جدا إلي مشروعك وهو Namespace: System.Windows.Forms.Design
ولكي تربط بين الكونترول و Designer الذي قمت بتصميمه عليك أن تستخدم DesignerAttribute Class
من المهم جدا تحديد نوع Designer الذي سوف تقوم بعمل Inherits له وذلك مرتبط بك وماذا تريد.
مثلا لو أردت أن تصنع Custom Control ولا تريد أن يتم إضافة أي كونترول أخري إليه أي لا تريد إضافة Child Control إليه عليك أن تستخدم ControlDesigner Class أما إذا كنت تريد أن تضيف كونترول أخري الي ما تصمم عليك أن تستخدم ParentControlDesigner Class
ولتوضيح هذه النقطة لنفرض انك تريد أن تصنع Custom Control وأيضا لا تريد من المستخدم أن يقوم بإضافة عناصر أخري Child Control الي هذا الكونترول هنا عليك أن تستخدم ControlDesigner Class وطبعا العكس صحيح إذا أردت أن تضيف عناصر أخري الي الكونترول عليك هنا أن تستخدم ParentControlDesigner Class أو أي كلاس أخر مشتق منه
ببساطه أكثر أن أي كونترول تقوم ببنائه وتستخدم معه ControlDesigner Class لا يمكن استخدامه كوعاء أو حاويه Container لأي أنواع أخري من الكونترول.
الفرق بين ControlDesigner Class و ParentControlDesigner Class
لو نظرنا الي كل من هذين الكلاسين من خلال Help File الخاص بالفيجوال استوديو سنجد أن ParentControlDesigner مشتق من ControlDesigner ولو عقدنا مقارنة بينهم سنجد أيضا أن ParentControlDesigner يمتلك عدة طرق أكثر قليلا من ControlDesigner وعددها سبعة طرق وبالمثل سبعة صفات إضافية أخري وهي موضحه كالأتي
الطرق Methods
AddPaddingSnapLines
CanParent
CreateTool
CreateToolCore
GetControl
GetParentForComponent
GetUpdatedRect
الصفات Properties
AllowControlLasso
AllowGenericDragBox
AllowSetChildIndexOnDrop
DefaultControlLocation
DrawGrid
GridSize
MouseDragTool
لرؤية باق الصفات والخواص والحقول يمكنك عزيزي القاري أن تراجع ملف Help الخاص بالفيجوال استوديو كما يمكنك أيضا ن تقارن بينهم لتري الفرق بنفسك وستجد أيضا أن هناك حقل Filed كان موجودا في ControlDesigner ولكنه لم يعد موجودا في ParentControlDesigner وهذا الحقل يطلق عليه InvalidPoint
مما سبق نكتشف أن الطرق والصفات التي تم إضافتها الي ParentControlDesigner هي التي خلقت الفرق بينهم وهي التي أعطت الإمكانيات لهذا Designer لكي يعطي إمكانية إضافة أي كونترول أخر الي أي Custom Control وبما أن معظم Designers مشتقه من ParentControlDesigner لذلك سوف نتحدث عنه تحديدا ونحاول أن نغطي الأجزاء الهامة به والتي نحتاجها في تصميم كونترول جديد وبمواصفات وشكل جديد.
هيا نصمم Custom Control
لنفتح مشروع جديد Form Application ثم نضيف له كلاس نطلق عليه MyControl و نضيف له كونترول عن طريق Inherits و أيضا في نهاية هذا الكلاس نضيف كلاس ونطلق عليه MyDesigner ونضيف أيضا له ParentControlDesigner عن طريق Inherits الأن لنربط بين الكونترول و Designer لكي نربط بين الكلاسين سوف نستخدم DesignerAttribute Class ومن ثم علينا أن نضيف Attribute الي MyControl Class والهدف هنا هو أننا نقول للكونترول MyControl أن Designer المسئول عنك هو MyDesigner ويتم إضافة DesignerAttribute (<Designer(GetType(MyDesigner))> _) مباشرة قبل MyControl Class وبذلك يكون الكود كالأتي
كود :
Imports System.ComponentModel
Imports System.Windows.Forms.Design
<Designer(GetType(MyDesigner))> _
Public Class MyControl
Inherits Control
End Class 'MyControl
Public Class MyDesigner
Inherits ParentControlDesigner
End Class 'MyDesigner