الرئيسية      أرشيف المقالات       المنتدى        المكتبة       إتصل بنا
  القائمة الرئيسية
  Language
  تسجيل الدخول
اسم المستخدم :

كلمة المرور :

تذكرني



هل نسيت كلمة المرور ؟

اشترك الآن !
  بحث
  أقسام المقالات
  آخر المشاركات
  كتب جديدة
 
  زوار هذه الصفحة
اليوم 31
أمس 257
الإجمالي 22844
  الموقع

دلفي -  مساعدات الأصناف في دلفي Delphi Class Helpers
بواسطة عروة عيسى في 2016/11/16 (453 قراءة)
دلفي

"مساعدات الأصناف" في دلفي Delphi Class Helpers

أضيفت هذه الميزة ابتداءً من نسخة دلفي 2005 , وأهم مافيها أنها تمكّن من التعامل مع أصناف موجودة مسبقا وإضافة ميزات جديده عليها دون التعديل عليها مباشرة أو الحاجة لتوريث أصناف جديدة عنها.

مثلا في المكتبة القياسية لمكونات وأصناف دلفي , يمكن اضافة وظائف إضافية إلى الأصناف القياسية عن طريق "صنف مساعد" للصنف الأساسي يكتب في وحدة مختلفة برمجيا ويسمح بتوسيع الصنف الرئيسي في كل المكونات التي تستخدمه .

في حال احتجنا لإضافة منهج (تابع\إجراء) إلى صنف قياسي موجود , يكفي بناء صنف مساعد له يعرف المنهج الجديد , وبالتالي سيصبح متاح في الصنف الأصلي بشكل افتراضي , أما الصنف المساعد فلا يستخدم مباشرة من الكود بل تكمن مهمته في "مساعدة" الصنف الرئيسي عن بعد وتوسيع امكانياته.

لكي نفهم مساعدات الأصناف يمكن ان نستخدم المثال الذي قدمه Zarko Gajic على الصنف المشهور Tstrings . حيث نريد في الكثير من الحالات أن نتأكد من وجود نص معين ضمن لائحة نصوص Tstrings , ولايوجد منهج جاهز ضمن هذا الصنف للقيام بذلك :



يتم تعريف "الصنف المساعد" عن طريق العبارة :  class helper for
كالتالي

type TStringsHelper = class helper for TStrings
public
function Contains(const aString : string) : boolean;
end;

...

function TStringsHelper.Contains(const aString: string): boolean;
begin
result := -1 <> IndexOf(aString);
end;


كتبنا صنف مساعد يسمى TStringsHelper يوسع الصنف الرئيسي TStrings بمنهج جديد هو Contains يختبر وجود قيمة نصية ضمن لائحة القيم التي يخزنها .

الآن تمت إضافة تابع contain للصنف Tstrings ولكل الأصناف والمكونات التي تستخدمه مثل TComboBox و TListBox و TMemo وغير ذلك ,

لتجريب ذلك بإمكانك اختبار :

if ListBox1.Items.Contains('some string') then ...

مثال آخر 

سبق وقمت بإضافة مناهج جديدة إلى المكون TTreeView من أجل تحميل الشجرة من قاعدة البيانات و إضافة بعض المناهج المفيدة والكثيرة الاستخدام إليها ولاحقا استطعت استخدامها بشكل مكرر في عدة برامج أخرى , خاصة أنها تطبق كمناهج افتراضية ضمن المكون نفسة في كل مكان من المشروع .

مثلا , سنضيف تابع مفيد للبحث ضمن الشجرة عن أي نص موجود في أحد عقدها , ويقف على العقدة المطابقة بشكل كامل او جزئي ويجعلها selected , وليكن اسمه LocateNode :

type
TTreeViewHelper = class helper for TTreeView
public
Function LocateNode(AValue: String;partial:boolean=false):boolean;
published
. . .
{ TTreeViewHelper }

function TTreeViewHelper.LocateNode(AValue: String; partial: boolean): boolean;
var Node: TTreeNode;
    L:byte;
begin
Result := false;
if Items.Count = 0 then exit;
Node := Items[0];
while Node <> nil do
begin
if partial then L:= length(AValue)
else L := length(Node.Text);
if LowerCase(copy(Node.Text,0,L)) = LowerCase(AValue) then
begin
Node.Selected:=true;
Result := true;
Break;
end;
Node := Node.GetNext;
end;
end;


الاستخدام بسيط جدا , هذا التابع أصبح يظهر ضمن لائحة مناهج المكون treeView الافتراضية وكأنه واحد منها , و يكفي ان نقوم باستدعاءه مثل أي تابع طبيعي ضمن الصنف  :

TreeView1.LocateNode(Edit1.Text,true)

يمكن إضافة مناهج أخرى مثلا لإعادة عقدة محددة بناء على النص الخاص بها  GetNodeByText ,  أو  للتحميل من جدول في قاعدة البيانات أو غير ذلك . .


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

مساعدات الأصناف ليست مفيدة لإعادة تصميم الأصناف أو توريثها , بل لإضافة مرونة في التعامل مع حالات محددة بالدرجة الرئيسية , ومن الأمور المهم ذكرها هو محدوديتها أو عدم مناسبتها في الكثير من الحالات 
فهي مثلا لاتستطيع تعريف حقول جديدة ضمن الصنف (من النوع القادر على حفظ بيانات فعليه ضمنه , مثل متحولات حفظ القيم الفعلية المخفيه ضمن Private)
فيما يمكن إضافة الحقول الأصناف , أو إضافة التوابع والإجرائيات كما في الأمثلة السابقة .

ابتداء من XE3 أصبح من الممكن بناء مساعدات للأنواع الرئيسية مثل integer و string و TDateTime وغيرها 
مثلا يمكننا القيام بالتالي :

var s : string; 
... 
s.UpperCase.Reverse;


عروة نت

التقييم: 0.00 (0 أصوات)
**** تحضير للطباعة أرسل هذه المقالة
أضف هذه المقالة إلى المواقع التالية
إضافة إلى Blinklist إضافة إلى del.icio.us إضافة إلى Digg إضافة إلى Fark إضافة إلى Furl إضافة إلى Newsvine إضافة إلى Reddit إضافة إلى Simpy إضافة إلى Spurl إضافة إلى Yahoo مرجع إلى Balatarin مرجع إلى Faceboom مرجع إلى Twitter مرجع إلى Scripstyle مرجع إلى Stumble مرجع إلى Technorati مرجع إلى Mixx مرجع إلى Myspace مرجع إلى Designfloat _NW_BOOKMARK_TO_GOOGLEPLUS _NW_BOOKMARK_TO_GOOGLEREADER _NW_BOOKMARK_TO_GOOGLEBOOKMARKS
التعليقات تخص صاحبها ولا تخص ادارة الموقع
الكاتب الموضوع




عروة نت 2003-2016 . بالاعتماد على زوبس