بسم الله الرحمن الرحيم
والصلاة والسلام علي أشرف الأنبياء والمرسلين ، سيدنا ونبينا وحبيبنا محمد صلى الله عليه وسلم
أما بعد
ها نحن معا من جديد وفي درس جديد من دروس لغة البرمجة الإحترافية Delphi
وفي هذا الدرس سوف نتعمق أكثر في التطبيقات العملية من خلال برمجة مثال أكثر عمقاً ومفاهيم .. Here we go .....
التطبيق الثاني : ( العمليات الحسابية )
الآن ، سنقوم بتصميم وبرمجة تطبيق آخر وهو عبارة عن برنامج يقوم بالعمليات الحسابية الأولية ( الجمع والطرح و الضرب والقسمة ) لعددين كما يلي :
رابط الصورة :
http://www.itpro2u.com/Images/Lessons/Delphi_3_1.jpg
ونلاحظ من إطار البرنامج أنه تم استخدام العناصر الآتية :
قوائم (Menus) وهي : قائمة ( عملية) وقائمة (خدمات) .
مجموعة Labels للساعة وللعدد الأول والثاني وللناتج.
مربعي نص (Edit) للعددين.
خمسة أزرار ، أربعة للعمليات الحسابية والأخير للخروج من البرنامج.
عنصري Bevel للتنسيق كما هو ظاهر في الإطار.
كما نلاحظ أن البرنامج يأخذ الشكل والاتجاه العربي حيث يظهر عنوان الإطار وأيضاً القوائم على اليمين.
وفكرة تطبيق البرنامج هي أن يتم إدخال عددين في مربعي النص ثم اختيار العملية الحسابية المطلوبة.
تحتوي قائمة ( عملية ) على الآتي :
رابط الصورة :
http://www.itpro2u.com/Images/Lessons/Delphi_3_2.jpg
كما تحتوي القائمة ( خدمات) على الآتي :
رابط الصورة :
http://www.itpro2u.com/Images/Lessons/Delphi_3_3.jpg
ونلاحظ الآتي :
- قائمة ( عملية ) تحتوي على أوامر العمليات الحسابية والخروج من البرنامج ، أما قائمة ( خدمات ) فتحتوي على أمرين فقط هما ( مسح ) ويستخدم لمسح مربعي النص وخانة الناتج والأمر ( حول البرنامج ) يظهر إطار يحتوي على معلومات عن البرنامج .
كل أمر من أوامر القائمتين يحتوي على حرف اختصار (ShortCut) كما هو موضح.
ويتم إضافة و تصميم القوائم في أي إطار كما يلي :
يوضع على الإطار العنصر MainMenu ويوجد في الصفحة Standard في مكتبة العناصر المرئية .
يشغل إطار تصميم القائمة بنقر العنصر MainMenu نقراً مزدوجاً .
رابط الصورة :
http://www.itpro2u.com/Images/Lessons/Delphi_3_4.jpg
يتم إدخال اسم القائمة والأوامر التابعة لها باستخدام الخاصية Caption مع ملاحظة إمكانية جعل أي حرف مسطر وذلك بكتابة الرمز & قبله.
الانتقال بين أسماء القوائم والأوامر في إطار تصميم القوائم يتم بمفاتيح الأسهم أو النقر بالماوس كما يمكن استخدام المفتاح Del لمسح أي أمر من الأوامر وأيضاً المفتاح Insert لإضافة أمر بين الأوامر الموجودة.
الخط الفاصل بين الأوامر والذي يفصل الأمر ( خروج ) عن بقية الأوامر في قائمة ( عملية ) يتم إنشاءه بكتابة رمز علامة الطرح ( - ) في الخاصية Caption وستتولى Delphi الباقي.
أحرف الاختصار يتم تحديدها بالخاصية ShortCut لكل أمر ، حيث يمكن عرض لائحة من أحرف الاختصارات لاختيار منها ما يناسب الأمر الحالي.
- بعد إكمال تصميم القوائم نعود إلى الإطار Form لنجد القائمة قد أخذت مكانها على الإطار.[/size]
تحديد خصائص العناصر :
في بداية التصميم يتم تحديد خصائص الإطار Form1 نفسه حيث نقوم بتغيير العنوان بواسطة الخاصية Caption ثم نجعل الإطار يدعم اتجاه اللغة العربية وذلك بتغيير قيمة الخاصية BiDiMode وجعلها bdRightToLeft ، كما نغير قيمة الخاصية Position ونجعلها poDesktopCenter وذلك ليظهر الإطار دائماً عند تشغيله في وسط سطح المكتب.
يتـم تحديد خصائص الـ Labels باستخدام الخاصية Caption لتصبح كما تظهر في الإطار أعلاه وتوضع القيمة ‘0’ للـ Label الخاصة بالناتج كقيمة مبدئية كما تترك الـ Label الخاصة بالساعة كما هي وسيتم شرح كيفية جعلها ساعة رقمية تشتغل بعد قليل.
يتم تحديد الخاصية Text للعنصرين Edit1 و Edit2 وجعلها ‘0’ وذلك ليظهر الرقم صفر في بداية تشغيل البرنامج في كل مرة.
يتم تحديد خاصية Caption للأزرار ، كما هو موضح في إطار البرنامج.
العنصر Bevel الخارجي يتم تغيير قيمة الخاصية Shape وجعلها bsFrame لتظهر لإطار محفور كما نشاهده في الإطار ، أما العنصر Bevel الآخر (الصغير) فيترك كما هو عليه أي bsBox وهو الشكل التلقائي له.
برمجة أحداث البرنامج :
1 – برمجة الساعة الرقمية :
لجعل أي Label ساعة رقمية تشتغل كأي ساعة رقمية أخري نضع على الإطار العنصر Timer ويوجد هذا العنصر في الصفحة system في مكتبة العناصر المرئية.
هذا العنصر Timer هو أحد العناصر الغير مرئية أثناء تنفيذ البرنامج أي أنه عنصر يوضع على الإطار لأداء مهمة في الخفاء مثل العنصر MainMenu الذي استخدمناه قبل قليل. وظيفة العنصر Timer الأساسية هي انه يمكن ضبطه لتكرار إجراء معين بعد وقت معين أثناء تنفيذ البرنامج.
في التطبيق الحالي نود أن نجعل العنصر Label4 يظهر كساعة رقمية عند تنفيذ البرنامج ولعمل ذلك نقوم بالآتي :
ننقر العنصر Timer1 الذي تم وضعه على الإطار Form1 نقراً مزدوجاً لنحصل على إجراء العنصر Timer الوحيد أو نفتح لائحة الإجراءات الخاصة بالعنصر Timer لنجد هذا الإجراء الوحيد.
داخل إجراء العنصر Timer نكتب السطر البرمجي التالي :
كود:
Label4.Caption := TimeToStr(Time) ;
وهذا السطر البرمجي يستدعي الوظيفة Time التي تقرأ ساعة الحاسوب ، أما الوظيفة TimeToStr فتقوم بتحويل قيمة الساعة من النوع Time إلى String وذلك كي يمكن وضع هذه القيمة للخاصية Caption .
وهذا الإجراء سينفذ تلقائياً بعد كل ثانية وبالتالي فإن خاصية Caption للعنصر Label3 تتغير كل ثانية نتيجة تكرار تنفيذ الإجراء مما يجعل الـ Label3 تظهر كساعة رقمية تشتغل كأي ساعة رقمية حقيقية.
- يمكن تعديل توقيت المؤقت Timer وذلك من خلال الخاصية Interval حيث يكتب رقم يقاس بجزء من 1000 من الثانية ، بمعني إذا أردنا تحديد الزمن بثانية واحدة فإنه يتم كتابة 1000 كقيمة للخاصية Interva .[/size]
2 – برمجة العمليات الحسابية :
- الزر ( جمع ) :
يتم استدعاء إجراء النقر على الزر ثم نكتب السطر البرمجي التالي :
كود:
Label3.Caption := FloatToStr ( StrToFloat ( Edit1.Text ) + StrToFloat ( Edit2.Text ) ) ;
والسطر البرمجي السابق يعني أنه يتم تحويل القيمة المكتوبة في مربع النص الأول Edit1 من قيمة حرفية String إلى قيمة رقمية من نوع Float باستخدام الوظيفة StrToFloat وكذلك بالنسبة لمربع النص الثاني Edit2 ويتم جمع القيمتين والناتج من عملية الجمع يتم تحويله إلى قيمة حرفية String كي يمكن تخصيصها كقيمة للخاصية Caption للعنصر Label3 وبهذا فإن النقر على الزر جمع سيؤدي إلى تحويل العنصر Label3 إلى ناتج الجمع .
وبنفس الطريقة يتم برمجة أزرار العمليات الحسابية ( طرح ) و ( ضرب ) و ( قسمة ) كما يلي :
- الزر ( طرح ) :
كود:
Label3.Caption := FloatToStr ( StrToFloat ( Edit1.Text ) - StrToFloat ( Edit2.Text ) ) ;
- الزر ( ضرب ) :
كود:
Label3.Caption := FloatToStr ( StrToFloat ( Edit1.Text ) * StrToFloat ( Edit2.Text ) ) ;
- الزر ( قسمة ) :
كود:
Label3.Caption := FloatToStr ( StrToFloat ( Edit1.Text ) / StrToFloat ( Edit2.Text ) ) ;
أي نفس السطر البرمجي مع تغيير علامة العملية الحسابية فقط.[/size]
3 – برمجة الأمر ( مسح ) في قائمة ( خدمات ) :
لاستدعاء إجراء النقر الخاص بالأمر ( مسح ) نفتح قائمة خدمات وننقر على الأمر ( مسح ) فنحصل على شفرة الإجراء الخاص بالنقر وبين الكلمتين المحجوزتين Begin و End نكتب الخطوات البرمجية الآتية :
كود:
Edit1.Text := ‘0’ ;
Edit2.Text := ‘0’ ;
Label3.Caption := ‘0’ ;
ونلاحظ الآتي :
- تم تخصيص القيمة ‘0’ وهي قيمة حرفية لأنها محاطة بعلامتي تنصيص ، لكلاًً من الخاصية Text للعنصرين Edit1 و Edit2 وأيضاً الخاصية Caption للعنصر Label3 و ذلك حسب القاعدة المتبعة في لغات البرمجة المرئية والتي تنص على الآتي :
اسم العنصر متبوع بنقطة ثم اسم الخاصية المراد تغيير قيمتها ثم علامة التخصيص := ثم القيمة
القيمة := الخاصية . اسم العنصر
- عند تطبيق هذا الإجراء ستستبدل أي قيم في مربعي النص والناتج الظاهر في العنصر Label3 بالقيمة صفر ‘0’ وهذا مناسب للبرنامج لإجراء العمليات الحسابية.[/size]
4 – برمجة الأمر ( About ) في قائمة ( خدمات ( :
الأمر ( About ) يستخدم لعرض الإطار التالي :
رابط الصورة :
http://www.itpro2u.com/Images/Lessons/Delphi_3_5.jpg
يحتوي الإطار السابق على العناصر التالية :
- العناصر Label لعرض البيانات الموضحة .
- العنصر Image1 لعرض الصورة الموضحة.
- العنصر Bevel للتنسيق.
- الزر ( خروج ) يستخدم للخروج من الإطار والعودة إلى الإطار السابق.[/size]
5 – برمجة الأوامر ( جمع ) ، ( طرح ) ، ( ضرب ) ، ( قسمة ) الموجودة في قائمة ( عملية ) :
نلاحظ أن هذه الأوامر هي أوامر مكررة سبق برمجتها ببرمجة الأزرار وبالتالي فإنه ليس من الحكمة ولا المنطق أن يتم تكرار كتابة الإجراءات من جديد وذلك أولاً لأن تكرارها يعتبر هدراً للوقت حتى تمت عملية التكرار بواسطة النسخ واللصق وثانياً لأن التكرار يتسبب في زيادة في حجم البرنامج ككل وإن كان الإجراء صغير وعلى هيئة سطر واحد ، وبالتالي فإن لغة البرمجة Delphi تتيح ميزة ربط أي إجراء بإجراء آخر تم كتابته وبهذا فإن إجراء النقر على الأمر ( جمع ) يمكن ربطه بإجراء النقر على الزر ( جمع ) لأنهما يؤديان نفس العمل وهكذا بقية الأوامر .
ربط الإجراءات :
لربط أي إجراء بإجراء آخر يتم الاستعانة بلائحة الإجراءات في نافذة مفتش العناصر Object Inspector حيث اختيار الإجراء المراد ربطه بإجراء تمت كتابته مسبقاً والنقر على السهم بجانب خانة الإجراء لفتح قائمة الإجراءات التي تمت كتابتها في التطبيق ككل لاختيار الإجراء المناسب والمراد ربطه بالإجراء الحالي.
وفي تطبيقنا الحالي سنقوم بربط إجراء النقر على الأوامر في قائمة ( عملية ) بإجراءات النقر على أزرار العمليات الحسابية التي تمت كتابتها مسبقاً ولأن أوامر القائمة لا يمكن التعامل مع خصائصها وإجراءاتها إلا بعد استدعاء إطار تصميم القائمة فإنه يجب أولاً نقر العنصر MainMenu1 نقراً مزدوجاً لإظهار إطار تصميم القائمة .
نضع الآن المؤشر على الأمر ( جمع ) ثم نفتح قائمة إجراءات هذا الأمر وأمام خانة إجراء النقر OnClick لهذا الأمر ننقر السهم لنحصل على لائحة بأسماء الإجراءات التي تمت برمجتها في التطبيق ككل وبالطبع سنختار إجراء النقر على الزر ( جمع ) وبهذا تتم عملية الربط.
بنفس الأسلوب في الخطوة السابقة نقوم بربط باقي أوامر القائمة ( عملية ) .
ملاحظة :
إذا دعت الحاجة إلى التعديل في أحد الإجراءات المربوطة بإجراء آخر فإنه سيتم التعديل في الإجراء الأصلي وبهذا سنوفر الوقت والجهد المبذولين في حالة كانت الإجراءات غير مرتبطة ببعض لأنه سيستلزم الأمر التعديل في الإجراءين لو أنهما غير مرتبطين.
إنتهى التطبيق ولكن لم ينتهي الدرس بعد ...