المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الثاني من دورة برمجة العناصر


issamdnn
08-02-2010, 10:15 AM
:monster1:نبدأ بعون الله تعالى في الدرس الثاني من سلسلة دروس برمجة العناصر :

يوجد شجرة الأصناف المكونة لمكتبة العناصر المرئية VCL ومن المهم لكل مبرمج أن يكون على دراية بهذه الشجرة .

وكما نلاحظ فأن الصنف TComponent هو الجد المشترك لكل عناصر المكتبة VCL وكذلك بالنسبة لمكتبة ال CLX. وهو يحتوي على الحد الأدنى من الخصائص والأحداث الضرورية لعنصر لكي يعمل تحت بيئة دلفي. وبالتالي فأننا عندما ننشأ عنصر جديد فأننا عملياً نقوم بالوراثة من أحد الأصناف للشجرة السابقة.
باختصار ، هناك فرقان رئيسيان بين إنشاء المكونات واستخدامها في التطبيقات. فعند إنشاء مكون مبرمج المكونات يتمكن عملياً من:

1- الوصول إلى أجزاء من الأصناف ليست في متناول مبرمجي التطبيقات.
2- إضافة أجزاء جديدة (مثل خصائص أو الأحداث) إلى المكونات الخاصة به.

في المقطع التالي سأقوم بشرح كيفية إنشاء خصائص منشورة وموروثة في أصناف تالية للأصناف التي نقوم بإنشاءها(العناصر الجديدة):
لماذا ننشئ الخائص:من وجهة نظر مطوري التطبيقات فأن الخصائص تعتبر متحولات (variables) . فالمطورون يمكنهم تعديل أو قراءة قيمة خاصية ما كما لو كانت هذه الخاصية عبارة عن حقل (الحقل عبارة عن متحول يتم إضافته في القسم private أو في القسم var على حد سواء) وبالتالي : فالشيء الوحيد الذي تمتاز به الخاصية عن المتحول هو عدم إمكانية التصريح عنها في القسم var.
تعتبر الخصائص ذات ميزات أقوى من الحقول البسيطة وذلك للأسباب التالية:
1- تسمح الخصائص لمطوري التطبيقات (المبرمجين) بإمكانية تعديل قيمة الخاصية أثناء وقت التصميم على عكس المناهج(methods) والتي لا يمكن إجراء التغييرات عليها إلا أثناء وقت التنفيذ, وبالتالي فالخصائص تسمح للمبرمجين بتخصيص المكونات قبل تنفيذ البرنامج ,كما أن الخصائص تظهر في مفتش الكائنات الخاص بدلفي (Object Inspector) الأمر الذي يسهل عمل المبرمج . وبالتالي فأنه بدلاً من التعامل مع عدة بارمترات لإنشاء الكائن فأنك عملياً تترك دلفي تقرأ قيمة الخصائص من مفتش الكائنات ويقوم مفتش الكائنات بدوره من التحقق من القيمة المسندة للخاصية
2- الخصائص تخفي تفاصيل عملية التنفيذ .
3- الخصائص يمكن أن تكون ظاهرية
وكمثال بسيط : فعند قيام المبرمج بتغيير قيمة الخاصية Top لمجموعة من عناصر التحكم(مثل مجموعة من الأزرار) لا يقوم فقط بتغيير القيمة المخزنة وأنما يقوم أيضاً بتغيير مواضع هذه العناصر ويقوم أيضاً بإعادة رسمها مجدداً.
أنواع الخصائص:
يمكن للخصائص أن تكون أحد هذه الأنواع :
1- Simple : عددية أو محرفية أو نصية (string) تسمح للمبرمج بتعديل قيمة الخاصية مباشرة .
2- Enumerated: مثل الخصائص المنطقية Boolean والتي تظهر للمبرمج كقائمة drop-down وتسمح له بتغيير القيمة الإفتراضية بمجرد الضغط مرتين بالفأرة على الحقل الخاص بالخاصية.
3- Set: تظهر للمبرمج كمجموعة وعندما يتم الضغط مرتين بالفأرة على الخاصية تتمدد لتظهر كامل المجموعة وكمثال على هذا النوع من الخصائص خاصية ال Anchors للفورم .
4- Object : هي عبارة عن خصائص تعتبر بحد ذاتها أصناف تمتلك محرر خصائص خاص بها ,محددة بإجرائية تسجيل المكونات (component’s registration procedure) وإذا كان هذا الصنف يمتلك خاصية تمتلك خصائص منشورة فأن مفتش الكائنات يسمح للمبرمج بعمل توسيع للخاصية التي تمتلك قائمة الخصائص المنشورة علماً بأن خصائص الكائن ترث من الصنف TPersistent.
5- Interface: هذا النوع من الخصائص (الواجهات) تظهر في مفتش الكائنات وغالبا ما يكون للخاصية من هذا النوع محرر خصائص خاص بها
6- Array :الخصائص المصفوفية ينبغي أن يكون لها محرر خاصية خاص بها . ولا يمتلك مفتش الكائنات دعم مدمج لتحرير هذه الخصائص. وبالتالي يمكن تعيين محرر للخاصية من هذا النوع عند عمل تسجيل للمكونات .
تعريف خصائص العناصر:يتم التصريح عن الخاصية في قسم التصريحات لصنف المكون التي تعود الخاصية عليه, وعند التصريح عن الخاصية فأننا نقوم بتحديد ثلاثة أشياء وهي:
أ‌- أسم الخاصية.
ب‌- نوع الخاصية.
ت‌- المنهج(الإجرائية أو التابع) المستخدم للقراءة من والكتابة إلى قيمة الخاصية, وإذا لم يتم التصريح عن منهج للكتابة إلى قيمة الخاصية فأن الخاصية تعتبر إفتراضياً للقراءة فقط.
الخصائص المصرح عنها في المقطع published في قسم تصريحات صنف العنصر تكون قابلة للتحرير ضمن مفتش الكائنات أثناء وقت التصميم , وقيمة الخاصية المنشورة يتم حفضها مع العنصر في ملف النموذج(form file) . أما الخصائص التي يتم التصريح عنها في المقطع public , تكون متوافرة فقط أثناء وقت التنفيذ ويمكن تعيينها (تحديد قيمة لها ) أو القراءة منها بواسطة كود برمجي.
والمثال التالي يظهر تصريح نموذجياً لخاصية تسمى Count :
type

TYourComponent = class(TComponent)
private
FCount: Integer; { used for internal storage }
procedure SetCount (Value: Integer); { write method }
public
property Count: Integer read FCount write SetCount;
end;
حيث يتم قراءة قيمة الخاصية من قراءة الحقل FCount وقد تم وضع الحرف الأول F كمميز على أن هذا المتحول عبارة عن حقل وهو شرط غير لازم ولكن ضروري ,ويقوم المنهج SetCount بالكتابة إلى قيمة الخاصية السابقة .
التخزين الداخلي لمعطيات الخصائص (Internal data storage):
عملياً لا توجد أية قيود على الكيفية التي يتم بها تخزين بيانات خاصية ما. ولكن بشكل عام ، فإن مكونات دلفي تتبع هذه الأعراف :
1- الحقول المستخدمة لتخزين قيمة الخاصية تكون حقول خاصة (يتم التصريح عنها في القسم private) ويجب أن يتمكن فقط العنصر نفسه من الوصول إلى هذه الحقول, والعناصر المشتقة من هذا العنصر يتوجب عليها فقط أن تستخدم الخصائص الموروثة وليس الولوج المباشر للمعطيات المخزنة داخلياً للخاصية .
2- معطيات الخاصية يتم تخزينها في حقول الصنف (الخاص بالعنصر).
3- متحولات الحقول تبدأ دوماً بالحرف F متبوعة بأسم الخاصية كما في المثال السابق , فلخاصية Width على سبيل المثال يعرف الحقل الخاص بها بالأسم FWidth.
الدخول المباشر (Direct access):
تعتبر طريقة الدخول المباشر الطريقة الأسهل لجعل معطيات الخاصية(قيمتها أو قيمها) ضمن متناول اليد , حيث أن الجزئين read و write المصرح عنهما في الخاصية يجعلان القراءة و أسناد القيم للخاصية يجري مباشرة على الحقول المخزنة داخلياً دون إستدعاء لمنهج الدخول .الدخول المباشر يعتبر مفيداً عندما نريد جعل الخاصية في متناول اليد في مفتش الكائنات ولكن التغيير على قيمتها يتم دون معالجة فورية .
من الشائع إستخدام الدخول المباشر في القسم read كما أنه من الشائع أيضاً استخدم منهج في القسم write ,أي أن القراءة تكون بالدخول المباشر والكتابة تكون بإستخدام مناهج(طبعاً ليست هذه قاعدة عامة ولكن هذا هو الشائع). والمثال التالي يوضح الدخول المباشر في كلا القسمين read و write :
type

TSampleComponent = class(TComponent)
Private { التخزين الداخلي يكون خاص}
FMyProperty: Boolean; { التصريح عن حقل من أجل قيمة الخاصية}
published { جعل الخاصية في متناول اليد آثناء وقت التصميم}
property MyProperty: Boolean read FMyProperty write FMyProperty;
End;

مناهج الدخول(Access methods) :يمكن للمبرمج تعيين مناهج للدخول وذلك بدلاً من الحقول في القسم read و write ومناهج الوصول هذه ينبغي أن تكون محمية (protected) أي مصرح عنها في القسم (protected) وعادة يتم التصريح عن هذه المناهج على أساس أنها virtual أي ظاهرية كي تتمكن الأصناف المشتقة التالية من تجاهل هذه المناهج (إعادة صياغة مجازياً أو عمل ما يسمى override للمنهج ).
وفي المثال التالي صنف يصرح عن ثلاثة خصائص تستخدم المحدد index والذي يسمح للخصائص بأن تمتلك نفس منهج القراءة والكتابة :
type

TSampleCalendar = class(TCustomGrid)
public
property Day: Integer index 3 read GetDateElement write SetDateElement;
property Month: Integer index 2 read GetDateElement write SetDateElement;
property Year: Integer index 1 read GetDateElement write SetDateElement;
private
function GetDateElement(Index: Integer): Integer;
procedure SetDateElement(Index: Integer; Value: Integer(;

لا حظ البارمتر Index . وكما نلاحظ فأن الخصائص السابقة تستخدم الإجرائية نفسها للكتابة والتابع نفسه للقراءة , ويمكن إجراء ذلك في حالات خاصة فقط كون الخصائص Day و Month و Year جميعها أعداد صحيحة وجميعها تتطلب عمل encoding للتاريخ عند تعيين قيمة لها .
وفيما يلي قلب إجرائية الكتابة وقلب تابع القراءة للخاصيات السابقة:
[PHP]function TSampleCalendar.GetDateElement(Index: Integer): Integer;

var
AYear, AMonth, ADay: Word;
begin
DecodeDate(FDate, AYear, AMonth, ADay);
case Index of
1: Result := AYear;
2: Result := AMonth;
3: Result := ADay;
else Result := -1;
end;
end;

procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer);

var
AYear, AMonth, ADay: Word;
begin
if Value > 0 then
begin
DecodeDate(FDate, AYear, AMonth, ADay);
case Index of
1: AYear := Value;
2: AMonth := Value;
3: ADay := Value;
else Exit;
end;

FDate := EncodeDate(AYear, AMonth, ADay);
Refresh;
End;
End;
إلى هنا ينتهي الدرس الثاني
الدرس التالي: http://www.delphi4arab.com/forum/showthread.php?t=2610
مع التوفيق للجيميع .

issamdnn
09-02-2010, 10:35 AM
السلام عليكم أخي العزيز ... شكراً على ردك ..

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

وفقك لله وسدد خطاك..

paix144
09-02-2010, 04:25 PM
السلام عليكم
بارك الله فيك أخي عصام
بالنسبة للأخ قديم الشوق شوف درس الدورة لاشاء المكونات http://www.delphi4arab.com/forum/showthread.php?t=706
و أكثر من التكرار و البحث و سوف تفهم إن شاء الله