Home      Articles archive       Forum        Library       Contact us
  Main Menu
  اللغة
  Log in
Username:

Password:

Remember me



Lost Password?

Register now!
  Search
  Article Topics
  Last Posts
  New Books
 
  This Page Visitors
Today 22
Yesterday 72
Total 26644
  Site

Delphi -  مساعدات الأصناف في دلفي Delphi Class Helpers
Posted by Orwah Issa on 2016/11/16 (549 reads)
Delphi

"مساعدات الأصناف" في دلفي 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;


عروة نت

Rating: 0.00 (0 votes)
**** Printer friendly page Send this story to a friend
Bookmark this article at these sites
Bookmark to Blinklist Bookmark to del.icio.us Bookmark to Digg Bookmark to Fark Bookmark to Furl Bookmark to Newsvine Bookmark to Reddit Bookmark to Simpy Bookmark to Spurl Bookmark to Yahoo Bookmark to Balatarin Bookmark to Facebook Bookmark to Twitter Bookmark to Scripstyle Bookmark to Stumble Bookmark to Technorati Bookmark to Mixx Bookmark to Myspace Bookmark to Designfloat Bookmark to Google Plus Bookmark to Google Reader Bookmark to Google Bookmarks
The comments are owned by the author. We aren't responsible for their content.
Author Thread




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