3.7 من 5 (76 صوت)

إحترف لغة البرمجة Delphi
الكاتب: أحمد الحرش

بسم الله الرحمن الرحيم

الأخوة والأخوات الأعزاء ، أعضاء وزوار منتدى المبرجمين العرب .. هذه أول مشاركة لي في المنتدى وأرجو أن يوفقنى الله بالمساهمة بما ينفعكم من دروس ومعلومات ومشاركات ..

أبدأ معكم بعون الله في سلسلة دروس تعلم لغة الدلفي وهي لغة من أقوى اللغات البرمجية الهدفية و هي تعتبر لغة المحترفين لما لها من مزايا إحترافية و إمكانيات هائلة تفوق معظم اللغات البرمجية الآخرى .. على كل حال لنبدأ في التعرف على هذه اللغة :

الدرس الأول :
مقدمة إلى لغة البرمجة المرئية Delphi

لغة البرمجة Delphi هي لغة باسكال الرسومية أو المرئية وتستخدم لتصميم وإنشاء تطبيقات تعمل تحت بيئة نظام التشغيل Windows.
تستخدم Delphi لتطوير البرامج والتطبيقات بشكل سريع ولذلك يشار إليها بأنها ذات صفة RAD وهذه الصفة تعني تطوير البرامج بسرعة أي Rapid Application Development وذلك يتحقق باستخدام مكونات وأدوات جاهزة تنسق بالشكل المطلوب ويتم برمجتها بكتابة عدة برامج مرتبطة بأحداث معينة خاصة بهذه المكونات أو العناصر ويشار إلي هذا النوع من البرمجة بالبرمجة بالأحداث.
البرمجة بالأحداث هي برمجة تتوقف على حدوث حدث ما لعنصر ما يوجد في التطبيق بمعنى عند حدوث حدث معين مثل النقر على زر أو إغلاق إطار ، يتم تطبيق برنامج معين سبق كتابته في التطبيق ويفهم من ذلك أن لكل كائن أو عنصر Object حدث أو أكثر يمكن ربط أي منها بإجراء معين.
يطلق في علم البرمجة المرئية على العنصر اسم Object وهو نفسه الكائن أو المكون Component والعناصر هي عبارة عن أي شئ تم استخدامه في البرنامج مثل الإطار (Form) أو الزر (Button) أو مربع النص (Edit) أو القائمة (Menu) ... الخ.
لكل عنصر Object أحداث معينة مرتبطة به أو بمعنى آخر أحداث تحدث له في وقت معين ، فمثلاً تستخدم الأزرار كي يتم النقر عليها غالباً وعملية النقر هذه يشار إليها في علم البرمجة المرئية على أنها حدث النقر ، فعند النقر على زر ما تقوم لغة البرمجة المرئية Delphi بتطبيق الإجراء المرتبط بهذه الحدث والذي سبق وأن تمت برمجته من قبل المبرمج. أيضاً الكتابة داخل مربع النص تعتبر حدث والدخول أو الخروج من مربع النص يعتبر حدث آخر وتمرير مؤشر الماوس على أحد العناصر يعتبر أيضا حدث يمكن ربطه بإجراء (برنامج) معين... وهكذا.
تسمح لغة البرمجة Delphi للمبرمج بتصميم التطبيق المطلوب باستخدام عدة عناصر Objects توضع على إطار Form واحد أو أكثر حسب الشكل الذي يحتاجه التطبيق ومن ثم يتم كتابة البرامج أو الإجراءات Procedures لكل حدث event من الأحداث المراد برمجتها بمعنى أنه لو تم استخدام زر Button في التطبيق فإنه من الطبيعي أن يتم كتابة إجراء لحدث النقر على هذا الزر . وهكذا يتم كتابة كل الإجراءات اللازمة للتطبيق.

نستنتج من ذلك أن عملية تطوير التطبيقات باستخدام لغة البرمجة المرئية Delphi تمر بمرحلتين :
1 – المرحلة الأولى :
هي تصميم التطبيق وفي هذه المرحلة يتم وضع وتنسيق العناصر التي يتكون منها التطبيق ويتخلل هذه المرحلة تحديد خصائص Properties كل عنصر وخصائص العنصر هي عبارة عن مواصفاته مثل الأبعاد والموقع والاسم واللون وغير ذلك ويلاحظ هنا أن لكل عنصر خصائصه وإن اشتركت بعض العناصر في بعض الخصائص.

2 – المرحلة الثانية :
هي مرحلة كتابة الإجراءات المرتبطة بالأحداث وهي مرحلة البرمجة حيث يتم كتابة برامج صغيرة كانت أو كبيرة على هيئة إجراءات Procedures خاصة بأحداث معينة للعناصر المستخدمة في التطبيق.
يطلق على العناصر Objects المستخدمة في تطبيقات Delphi اسم مكونات Components وأحياناً تسمى المكونات الرسومية أي Visual Components ولغة Delphi غنية بهذه المكونات وتسمى مكتبة المكونات الرسومية VCL أو Visual Component Library بحيث يمكن لمطوري التطبيقات استخدامها لإنشاء وتصميم أي تطبيق. كما أن لغة Delphi تسمح بإنشاء مكونات رسومية خاصة بمطوري التطبيقات يمكن إضافتها إلى مكتبة المكونات الرسومية VCL الخاصة بلغة Delphi لكي يمكن استخدامها في أي وقت لاحقاً.

الإجراءات Procedures :
الإجراء هو مجموعة أسطر برمجية تبدأ بعنوان للإجراء وتهدف إلى إنجاز عمل ما داخل التطبيق ويتم تنفيذ هذا الإجراء باستدعائه بواسطة عنوانه أي يكتب العنوان كسطر من أسطر البرمجة.
في لغة Delphi لكل حدث إجراء يتم تنفيذه عند حدوث ذلك الحدث كما يمكن تنفيذ نفس الإجراء بكتابة عنوانه في إحدى الأحداث الأخرى.
كما يمكن في لغة Delphi كتابة إجراءات عامة يمكن لجميع الأحداث استدعاءها وتنفيذها عند اللزوم وتأخذ كافة الإجراءات في لغة Delphi الشكل الآتي :



Procedure ProcedureName ;
Begin
---------
--------- أسطر الإجراء
---------
End;


الوظائف Functions :
الوظيفة تشبه الإجراء تماما إلا أنها ترجع قيمة واحدة أي أن اسم الوظيفة يعمل كمتغير يحمل قيمة الوظيفة النهائية بمعنى أنه يمكن استخدام اسم الوظيفة ضمن أي سطر من أسطر البرمجة للتعبير عن القيمة التي تحملها الوظيفة.

الوحدات Units :
هي تجميع لعدة إجراءات ووظائف في ملف واحد يدعى Unit وذلك كي يمكن استخدام ملف الوحدة في أي تطبيق يحتاج إجراءات أو وظائف هذه الوحدة.

بيئة التطوير المدمجة للغة Delphi :
Delphi’s Integrated Development Environment (IDE) :



يقصد بها بيئة Delphi المستخدمة لتطوير البرامج والتطبيقات وهي بيئة تحتوي على كافة الأدوات اللازمة لتصميم

وبرمجة وتشغيل وتجربة التطبيقات وسميت مدمجة لأن كل الأدوات اللازمة للتطوير تعمل مدمجة مع بعض لإتاحة كل ما يحتاجه المبرمجون لإنهاء عملهم وتتكون بيئة التطوير المدمجة للغة Delphi من الآتي :

1 – سطر العنوان : Title Bar

هو سطر يظهر به اسم لغة البرمجة Delphi ورقم الإصدار ويليه اسم التطبيق المفتوح أي الجاري تطويره وتطلق لغة Delphi على التطبيقات اسم مشروع أو مشاريع وعليه فإن التطبيق الأول سيكون اسمه Project1 وهو الاسم التلقائي مع إمكانية تغييره طبعاً عن عملية تخزين المشروع.




2 – شريط القوائم : Menus Bar



ويحتوي على قوائم لغة Delphi وكل قائمة تحتوي على مجموعة أوامر تستخدم لإنجاز كل ما يحتاجه مطور التطبيقات من عمليات وهذه القوائم هي :
- قائمة File : تستخدم للتعامل مع ملفات المشروع من حيث الفتح والإغلاق والحفظ وغير ذلك.
- قائمة Edit : لإجراء أي عمليات تنقيح أثناء تصميم التطبيق أو كتابة الإجراءات والبرامج.
- قائمة Search : تستخدم للبحث عن شئ ما سواء كان كلمة أو عنصر أو إجراء أو جملة معينة بإمكانيات وخيارات متنوعة ومتطورة.
- قائمة View : تستخدم لعرض وإخفاء نوافذ وعناصر داخل بيئة Delphi.
- قائمة Project : تستخدم للتعامل مع المشروع ككل كتنقيحه وبناؤه وتحديد بعض الخيارات الخاصة به وأيضا إضافة أو حذف ملفات إليه أو منه .. الخ.
- قائمة Run : تستخدم بإجراء عمليات تشغيل (تنفيذ) المشروع وما يتعلق بهذه العملية من خطوات.
- قائمة Component : تستخدم للتعامل مع المكونات المرئية الخاصة بلغة Delphi من عمليات تركيب أو إضافة مكونات جديدة إلى مكتبة المكونات المرئية VCL وغير ذلك .
- قائمة Database : تحتوي على أوامر خاصة بلغة الاستفسارات SQL و أيضاً معالج الإطارات الخاص بإنشاء إطار مرتبط بملف قاعدة بيانات والمسمى Form Wizard .
- قائمة Tools : تحتوي على عدة خدمات تقدمها لغة Delphi لمطوري التطبيقات مثل التحكم في بيئة Delphi و محرر الإجراءات و أيضا التحكم في خيارات تنقيح البرامج و تشغيل بعض البرامج الهامة المرفقة مع لغة Delphi مثل برنامج Database Desktop وبرنامج Image Editor وغير ذلك.
- قائمة Windows : تستخدم للتحكم في الإطارات المفتوحة داخل بيئة Delphi.
- قائمة Help : تستخدم للحصول على معلومات مساعدة حول Delphi .

3 – أشرطة أزرار السرعة : Speed Buttons Bars



هي مجموعة أشرطة توجد عليها أزرار سرعة عادة ما يتم وضعها تحت شريط القوائم وتستخدم لتنفيذ أهم الأوامر الخاصة بلغة Delphi بشكل سريع دون اللجوء إلى القوائم .

4 – مكتبة المكونات المرئية VCL :




هي عبارة عن مجموعة كبيرة جداً من المكونات Components تم تصنيفها على هيئة صفحات كل صفحة تحتوي على مكونات ذات علاقة بموضوع معين ولكل صفحة عنوان يدل على مكوناتها لسرعة الحصول على المكون المطلوب وأهم هذه الصفحات هي :
- الصفحة Standard : بها المكونات القياسية شائعة الاستخدام في كل التطبيقات.
- الصفحة Additional : بها مكونات إضافية شائعة الاستخدام أيضاً.
- الصفحة Win32 : بها مكونات خاصة بعناصر بيئة نظام التشغيل Windows من الإصدار Win95 والذي يليه.
- الصفحة System : بها مكونات خاصة بالتعامل مع النظام ، مثل المؤقت Timer ومشغل تعدد الوسائط MediaPlayer .
- الصفحة DataAccess : بها مكونات خاصة بربط ملفات قواعد البيانات بتطبيقات Delphi.
- الصفحة DataControl : بها مكونات تعتبر واجهة لملفات قاعدة البيانات كي يمكن التعامل معها داخل تطبيقات لغة Delphi.
- الصفحة dbExpress : بها مكونات خاصة بربط قواعد البيانات SQL مع تطبيقات لغة Delphi.
- الصفحة DataSnap : بها مكونات خاصة بإنشاء قواعد البيانات متعددة المستويات Multi-tiered.
- الصفحة BDE : بها مكونات خاصة بالربط مع محرك قواعد البيانات الخاص ببورلاند.
- الصفحة ADO : بها مكونات خاصة بالربط مع قواعد البيانات باستخدام محرك قواعد البيانات ADO أي ActiveX Data Objects.
- الصفحة InterBase : بها مكونات خاصة بالربط مع قواعد البيانات من نوع InterBase مباشرة ودون استخدام أي محرك لقواعد البيانات مثل BDE أو ADO.
- الصفحة WebServices : بها مكونات تدعم كتابة تطبيقات الزبون Client للوصول إلى خدمات Web عن طريق البروتوكول SOAP .(Simple Object Access Protocol).
- الصفحة InternetExpress : بها مكونات تستخدم لإنشاء تطبيقات خاصة بالإنترنت.
- الصفحة Internet : بها مكونات خاصة بإنشاء تطبيقات مزود خدمة إنترنت.
- الصفحة WebSnap : بها مكونات خاصة بإنشاء تطبيقات مزود خدمة إنترنت ذات صفحات ويب معقدة.
- الصفحة FastNet : بها مكونات تعبر عن مجموعة متنوعة من البروتوكولات لدعم تطبيقات إنترنت.
- الصفحة DecisionCube : بها مكونات ذات أشكال خاصة تستخدم لتبسيط بيانات قواعد البيانات بعرضها بطرق معينة يسهل معها متابعة البيانات واتخاذ القرارات.
- الصفحة QReport : بها مكونات تستخدم لإنشاء تقارير سريعة مرتبطة بملفات قواعد البيانات .
- الصفحة Dialogs : بها مكونات تستخدم للحصول على مربعات حوار جاهزة مثل مربع حوار فتح أو حفظ ملف .
- الصفحة Win 3.1 : بها مكونات تعبر عن عناصر بيئة نظام التشغيل Win 3.1 القديم.
- الصفحة Samples : بها مكونات تعبر عن عناصر جاهزة للاستخدام مثل التقويم أو لوح الألوان والمنبه و عداد النسبة المئوية وغير ذلك.
- الصفحة ActiveX : بها مكونات عبارة عن عناصر ActiveX جاهزة للإستخدام في أي تطبيق.
- الصفحة COM + : بها مكونات تسمح بالتحكم الإلكتروني في عمليات تخزين البيانات.
- الصفحة Indy Clients : بها مكونات تعبر عن بروتوكولات شائعة الاستخدام يمكن استخدامها في أي تطبيق خاص بـ Internet Direct Clients .
- الصفحة Indy Servers : بها مكونات تعبر عن بروتوكولات شائعة الاستخدام يمكن استخدامها في أي تطبيق خاص بـ Internet Direct Servers .
- الصفحة Indy Misc : بها مكونات تعبر عن المزيد من البروتوكولات شائعة الاستخدام والخاصة بـ Internet Direct .
- الصفحة Servers : بها مكونات خاصة بمزودي الخدمة COM.
ملاحظة : بجانب المكونات يظهر دائما سهم يستخدم لإلغاء أي عملية اختيار لإحدى المكونات.

5 – الإطار Object TreeView :



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

6 – إطار الخصائص والأحداث Object Inspector :



يسمى هذا الإطار أيضاً مفتش العناصر Object Inspector و يحتوي هذا الإطار على صفحتين ، صفحة الخصائص و صفحة الأحداث وقائمة العناصر ، بحيث يقوم مفتش العناصر بعرض خصائص وأحداث العنصر الحالي والعنصر الحالي هو العنصر الذي تم النقر عليه أثناء عملية التصميم كما يمكن اختيار العنصر المراد تحديد خصائصه أو كتابة أحد أحداثه باختياره من قائمة العناصر Objects List الموجودة في قمة إطار مفتش العناصر و للتبديل بين صفحة الخصائص وصفحة الأحداث يتم النقر على عنوان الصفحة المطلوبة.
من الجدير ذكره أن خصائص وأحداث أي عنصر ترتب أبجدياً لسهولة الحصول على الخاصية أو الحدث المطلوب مع ملاحظة أن لغة Delphi تقوم دائما بوضع المؤشر على الخاصية الأكثر استخداماً وشيوعاً للعنصر المحدد أو يجعل الخاصية الحالية هي آخر خاصية تم التعديل فيها لآخر عنصر تم التعامل معه من قبل المبرمج.

7 – النموذج أو الإطار form :



عند فتح مشروع جديد في لغة Delphi يظهر إطار Form له نفس خصائص الإطار في بيئة التشغيل Windows حيث أنه يحتوي على قائمة تحكم Control Menu و اسم Title وأزرار التحكم في الإطار ( زر التكبير والتصغير والاستعادة والإغلاق ) ويكون الإطار عند فتح المشروع خالياً تماماً من أي مكونات أو عناصر وذلك كي يمكن استخدامه في تصميم أي تطبيق أو برنامج . وتظهر على الإطار نقاط صغيرة تساعد المبرمج في وضع العناصر على الإطار خلال عملية التصميم.
عند إنشاء تطبيق أو مشروع بلغة Delphi قد نحتاج إلى أكثر من إطار واحد وبالتالي فإنه يمكن إضافة إطار جديد أو أكثر إلى المشروع في أي وقت وكل الإطارات تأخذ نفس الشكل في بداية التصميم وعلى المبرمج تكييف كل إطار كما يتطلبه المشروع وتسمى الإطارات تلقائياً في لغة Delphi كالآتي Form1 ، Form2 ،Form3 وهكذا مع إمكانية تغيير الأسماء التقائية طبعاً .
ومن الملاحظات الهامة عن الإطار Form أنه يعتبر من العناصر الحاوية التي يوضع عليها عناصر أخرى وترث العناصر التي توضع على الإطار نفس خصائص الإطار كما سيتضح لاحقاً.

8 – إطار الوحدة Unit window :



لكل إطار Form في لغة Delphi وحدة Unit تظهر في إطار خاص بها ومرافق دائماً للإطار Form ويحتوي إطار الوحدة على قسمين :
القسم الأول : أسطر الوحدة البرمجية :
هي الأسطر البرمجية الخاصة بالوحدة وما تحتويه من إعلان عن الوحدات المستخدمة من قبل Delphi و العناصر والمتغيرات و الوحدات الأخرى ذات العلاقة الخاصة بالإطارات Forms المستخدمة في المشروع Project و أيضاً الإجراءات البرمجية والوظائف وغير ذلك.
ولأن إطار الوحدة هو مكان كتابة الإجراءات والأسطر البرمجية المطلوبة فإن إطار الوحدة يعتبر في حد ذاته محرر نصوص للغة Delphi به كافة صفات ومزايا أي محرر نصوص لأي لغة برمجية أخرى مع إمكانية التحكم في خيارات و إمكانيات هذا المحرر من قبل خدمات Delphi .
إطار الوحدة Unit Window يعتبر الملف البرمجي المصدري Source File وعند إجراء عملية ترجمة Compiling أو تنفيذ Run للمشروع يتم إنشاء الملف البرمجي الهدفي Target File الذي يعتبر Binary File ملف ثنائي جاهز للتنفيذ في كل مرة وذلك يعني أن كل إطار Form في مشروع Delphi سيكون له ثلاث ملفات مصاحبة هي ملف الإطار نفسه Form وملف الوحدة في صورته المصدرية Source و ملف الوحدة في صورته التنفيذية Object وذلك بمجرد إجراء أول عملية ترجمة أو تنفيذ أو بناء Building للمشروع .
القسم الثاني : مستكشف الوحدة Code Explorer :
هو إطار على يسار الوحدة يمكن إغلاقه أو إظهاره حسب رغبة المبرمج ويستخدم مستكشف الوحدة لعرض مخطط شجرة الذي يعرض كافة الأنواع Types و الفئات Classes والخصائص Properties والطرق Methods و المتغيرات العامة Global Variables الإجراءات والوظائف العامة المستخدمة في الوحدة كما يعرض مستكشف الوحدة أسماء الوحدات المعلن عنها في الوحدة.
يتم عرض محتويات المستكشف بطريقة الشجرة بحيث تتفرع العناصر حسب علاقة وتبعية كل عنصر بالآخر.
يمكن إغلاق مستكشف الوحدة Code Explorer فنقر زر الإغلاق أعلى إطار المستكشف ويمكن فتحه من خلال قائمة View أو بالنقر على إطار الوحدة نقرة يمينية و تنفيذ الأمر Code Explorer .

المشروع Project

المشروع هو التطبيق ككل محتويا لكل الإطارات Forms والوحدات Units وما رافق ذلك من مكونات ويحتوي على الملفات التالية :

1 – ملف المشروع Project File :

اسمه التلقائي Project1 أو Project2 ... الخ مع إمكانية تغييره أثناء عملية حفظ المشروع وتعطي لغة Delphi الامتداد .dpr لاسم المشروع ويعني Delphi Project ويصاحب ملف المشروع ملفات أخرى مساعدة تستخدمها لغة Delphi لتنفيذ المشروع والمساعدة في عمليات الترجمة و البناء وهي تحمل نفس اسم المشروع مع اختلاف الامتداد الذي يدل على محتويات الملف وهذه الملفات هي :
أ – ملف تهيئة المشروع Project Configuration File :
يأخذ هذا الملف الامتداد .cfg وتخزن فيه الإعداد الخاصة بتهيئة المشروع.
ب – الملف .dci :
يخزن هذا الملف الشكل العام للكود في بيئة Delphi وهذه الميزة تسمح للمبرمج بأن يغير في شكل الوحدة البرمجية حسب الرغبة وعلى هذا الملف أن يحتفظ بهذه التغييرات لإتاحتها للمبرمج في كل مرة يقوم بها تشغيل بيئة التطبيق للغة Delphi والامتداد .dci يعني Delphi Code Insight .
جـ - الملف .dct :
إذا قام المبرمج بأي تغييرات في مكتبة المكونات المرئية التي توفرها لغة Delphi فإن هذه التغييرات تخزن في هذا الملف ذو الامتداد .dct والذي يعني Delphi Component Template .
د – الملف .dmt :
أيضاً هذا الملف يقوم بتخزين أي تعديلات أو تغييرات في قوائم لغة البرمجة Delphi حسب رغبة المبرمج ويعني الامتداد .dmt Delphi Menu Template .
هـ- الملف .dof :
يخزن هذا الملف خيارات المشروع التي تم تحديدها داخل بيئة Delphi مثل إعدادات المترجم Compilerوالرابط Linker والمجلدات وغير ذلك. والامتداد .dof يعني Delphi Options File .
و – الملف .dro :
يخزن التغييرات الخاصة بإضافة أي عناصر إلى المستودع Repository الخاص بلغة Delphi والامتداد .dro يعني Delphi Repository .
ز – الملف .dsk
يخزن هذا الملف إعدادات سطح المكتب في حالة الرغبة في ذلك بتحديد خيارات حفظ إعدادات سطح المكتب والامتداد .dsk يعني Desktop .
ح – الملف .res :
يخزن هذا الملف بعض المعلومات المتعلقة بإصدار لغة Delphi و رمز المشروع Main Icon وبعض المعلومات الخاصة بأي ارتباطات بالمشروع.
ط – الملف .tds :
يخزن هذا الملف جدول الرموز الخاصة بالتنقيح الخارجي وهي رموز تستخدمها لغة Delphi للتحكم في عمليات التنقيح للمشروع والامتداد .tds يعني External debug symbol .
ي – الملف .todo :
يحتوي هذا الملف على قائمة الأعمال المراد تنفيذها على المشروع وهي قائمة يقوم بإعدادها المبرمج لتذكيره بخطوات العمل على المشروع حسب الأولوية وتخزن هذه القائمة في ملف ذو امتداد .todo .

2 – ملف الوحدة Unit File :
كما سبق وذكرنا أن لكل Form وحدة Unit كما أن لملف المشروع نفسه أيضاً ملف وحدة خاص به وملفات الوحدات لها الامتداد .pas أي Pascal لأن لغة Delphi تعتمد على لغة Pascal .

3 – ملف الوحدة الهدفي Object Unit File :
هو الملف المحلل لغوياً والمحول من الشكل المصدري للملف إلى شكله الثنائي أو الهدفي ويأخذ هذا الملف الامتداد .dcu ويعني Delphi Compiled Unit .

4 – ملف الإطار Form File :
هو الملف الذي يحتوي على المعلومات المتعلقة بتصميم الإطار وامتداده .dfm أي Delphi Form.

5 – ملف الرسم التخطيطي للإطار Diagram File :
في الإصدار السادس للغة Delphi تم إضافة صفحة خاصة برسم تخطيطي للإطار يستخدم لرسم العلاقة بين العناصر المستخدمة على الإطار ببعضها وبالإطار نفسه لمزيد من التوضيح و دقة في التصميم ـ يخزن هذا التخطيط في ملف مستقل يحمل الامتداد .ddp الذي يعني Delphi Diagram Page .
6 – ملف التشغيل Execute File :
هو الملف التنفيذي للمشروع ويحمل نفس اسم المشروع بامتداد .exe ويمكن استخدامه لوحده بدون أي ملفات إضافية أخرى في حالة كان المشروع غير مرتبط بأي ملفات من أي بيئة أخرى مثل ملفات قواعد البيانات وغيرها.
7 – الملفات الاحتياطية :
تقوم Delphi بإنشاء ملفات احتياطية للملفات التي يتم تعديلها وذلك للرجوع إليها عند الحاجة ولا ضرر من مسحها في حالة عدم الرغبة في اللجوء إليها. وتتميز هذه الملفات بعلامة ~ قبل أول حرف من الامتداد.

8 – الملفات المرافقة للمشروع :
قد يحتاج المشروع الاستعانة ببعض الملفات التي يحتاجها التطبيق مثل ملفات الربط الديناميكي DLL File أو ملفات الرموز Icon Files أو ملفات الصور والأشكال وأيضاً ملفات المساعدة Help Files.


الوحدة Unit

كما ذكرنا أن الوحدة هي ملف يحمل الامتداد .pas وهي المكان المحدد لكتابة الأسطر البرمجية المتعلقة بأحد الأطر المستخدمة في المشروع أو المتعلقة بالمشروع نفسه.
وتحتوي الوحدة القياسية لكل إطار على الأسطر البرمجية الآتية :
1 – عنوان الوحدة :
وهو عبارة عن كلمة Unit بالإضافة إلى اسم الوحدة واسم الوحدة هو اسم اختياري هو نفسه اسم ملف الوحدة.
2 – قسم الواجهة Interface :
يبدأ قسم الواجهة بكلمة Interface ويستخدم للإعلان عن المتغيرات والأنواع والإجراءات والوظائف وغيرها سواء كانت خاصة بالوحدة ذاتها أو للمشروع كله . يحتوي قسم الواجهة على الأجزاء الآتية :
- Uses :
يحدد في هذا الجزء أسماء الوحدات التي يحتاجها مترجم اللغة خلال عملية التشغيل للمشروع كي يستخدمها من ضمن الوحدات المستخدمة للمشروع.
- Type :
في هذا الجزء يتم إنشاء أنواع بيانات جديدة يحتاجها المبرمج وهذه الأنواع تستخدم بالطبع لتعريف متغيرات تستخدم في المشروع وينقسم الجزء Type نفسه إلى جزئين هما :
- فقر Private :
تستخدم هذه الفقرة للإعلان عن تعريفات تكون مرئية داخل الوحدة ذاتها ولا تكون مرئية لباقي الوحدات في المشروع.
- فقرة Public :
التعاريف في هذه الفقرة تكون مرئية لكافة وحدات المشروع بالإضافة إلى الوحدة نفسها أي يمكن أن تستخدمها من داخل الوحدة أو خارجها.
- Var :
في هذا الجزء يتم تعريف المتغيرات العادية ومتغيرات العناصر.

3 – قسم Implementation :
في هذا القسم يتم كتابة الإجراءات والوظائف التي تم تعريفها في قسم Interface وقد تستخدم فقرة Uses ضمن هذا القسم كي يمكن الوصول إلى بعض وحدات المشروع الأخرى.
توجد العبارة {$R*.DEM} في القسم Implementation وهي خاصة بوحدات Delphi وتستخدم للوصول والتعرف على الإطار Form الخاص بالوحدة.
4 – نهاية الوحدة وتنتهي بالطبع بكلمة End. .
فيما يلي مثال عن الوحدة القياسية التي يجهزها Delphi :



unit Unit1;
interface

uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs ;

type
TForm1 = class(Tform )
private
{Private declarations }

public
{Public declarations }
end;

var
Form1: TForm1;

implementation
{ $R *.dfm }

end.


ملاحظات :
- تقوم لغة Delphi بتجهيز الوحدة السابقة وما عليك سوى تحديد الإجراء المراد كتابته وكتابة أسطر الإجراء ما بين العبارتين Begin وEnd ; الخاصة بالإجراء الذي اخترته.
- السطر Tform1 = Class (Tform)
يوجد كأول سطر من ضمن الفقرة Type ويعني تعريف نوع هو Tform1 من نوع Tform أي تعريف نوع من البيانات على أنه عنصر Object.
- السطر Form1 : Tform1
هو الإعلان عن متغير Form1 من نوع Tform الذي تم تعريفه في السطر Tform1 = Class (Tform) .
- اسم الوحدة السابقة هو Unit1 وهو الاسم الافتراضي للوحدة .

الدرس الثاني :

أسس البرمجة بلغة Delphi 6

مقدمة :

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


التطبيق الأول : ( كلمة المرور ) :

لفتح تطبيق أو مشروع جديد نقوم باستخدام الأمر New ثم Application من قائمة File فنحصل على Form1 جاهز للتصميم وإطار الوحدة Unit Windows باسم Unit1 مرافق للإطار Form1.


أنقر على الرابط التالي لرؤية صورة الفورم ، Form :


أنقر على الرابط التالي لرؤية صورة إطار الوحدة ، Unit :



بمجرد الحصول على الإطارين السابقين فإن التطبيق جاهز للتصميم وما عليم سوى أن تحدد خصائص الإطار Form1 ثم تضع العناصر أو المكونات Components المناسبة عليه وتقوم بتحديد خصائص كل عنصر.
فمثلاً لتحديد عنوان للإطار Form1 وتغييره من Form1 إلى An Example نقوم بكتابة العنوان الجديد أمام الخاصية Caption كما هو موضح في الشكل التالي :

أنقر على الرابط التالي لرؤية صورة الفورم بعد التعديل :



أنقر على الرابط التالي لرؤية صورة نافذة الخصائص :



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

فكرة التطبيق :

نفترض أن التطبيق يستخدم لعرض صورة خاصة ولكن بعد إدخال كلمة مرور صحيحة بمعنى أن التطبيق يطلب إدخال كلمة مرور لعرض الصورة وإلا يتم إغلاق التطبيق.
الآن لنضع بعض العناصر على الإطار كالآتي :

أنقر على الرابط التالي لرؤية الصورة :



نلاحظ من الشكل أنه تم وضع العناصر الآتية :
- العنصر Label1
- العنصر Edit1
- العنصرين Button1 و Button2
و كل هذه العناصر توجد في الصفحة Standard من مكتبة المكونات المرئية بالإضافة إلى :
- العنصر Bevel1 ويوجد في الصفحة Additional من مكتبة المكونات المرئية.

نلاحظ أن العناصر السابقة وضعت على الإطار دون أن يتم تغيير أي من خصائصها إلا أن لغة Delphi قد قامت بتحديد بعض خصائصها تلقائياً وذلك بتحديد مكان كل عنصر على الإطار وحجمه وذلك بتحديد الخصائص Left و Top لتحديد المكان و الخاصية Width و Left لتحديد أبعاد كل عنصر.

والآن لنغير بعض الخصائص الأخرى للعناصر السابقة كالآتي :


أنقر على الرابط التالي لرؤية الجدول :



بعد تحديد الخصائص السابقة يصبح الإطار كما يلي :


أنقر على الرابط التالي لرؤية الصورة :



الخاصية Caption كما نلاحظ تحدد الاسم الظاهري ونلاحظ أن العناصر Form ، Label ، Button لها نفس الخاصية .

ملاحظة :

تم إضافة الرمز & قبل الحرف Y و الحرف N في خاصية Caption لكلاً من Button1 و Button2 وذلك لجعل الحرفين مسطرين لاستخدامها مع مفتاح Alt أثناء تشغيل التطبيق.

- الخاصية Text للعنصر Edit تعبر عن النص الذي يكتب داخل مربع لنص وهنا في التطبيق السابق تم استبدال Text1 بفراغ ليظهر مربع النص Edit1 خالي.

- الخاصية Password Char للعنصر Edit تستخدم لتحديد الرمز الذي سيظهر بدلاً من أي أحرف أو أرقام عند إدخال كلمة المرور .وهنا تم تحديد علامة النجمة ( * ) لتظهر محل أي أحرف أو أرقام والنجمة هي الرمز الأشهر استخداماً في هذه الحالة.

الآن نحتاج إلى إطار جديد لوضع الصورة عليه وبالتالي يتم إضافة إطار جديد بنقر زر السرعة الخاصة بإضافة إطار جديد أو باستخدام الأمر New ثم Form من قائمة File . سيكون اسم الإطار الجديد Form2 لأنه الإطار الثاني في التطبيق.

نقوم بوضع العنصر Image على الإطار الجديد وذلك لكي نضع عليه الصورة ، العنصر Image هو عبارة عن إطار فارغ يتم رسمه على الإطار Form بالحجم المناسب وفي المكان المناسب. كما يظهر في الشكل التالي :


أنقر على الرابط التالي لرؤية الصورة :



نلاحظ من الشكل أنه تم وضع عنصر Image واسمه الافتراضي هو Image1 والعنصر Button وسوف نقوم بتحديد الخصائص لكل عنصر كما يلي :


أنقر على الرابط التالي لرؤية الجدول:



بعد تحديد الخصائص يصبح الإطار كما يلي :


أنقر على الرابط التالي لرؤية الصورة :




بذلك تنتهي المرحلة الأولى من إنجاز التطبيق وهي مرحلة التصميم وفيما يلي شرح للمرحلة الثانية وهي مرحلة كتابة الإجراءات اللازمة وهي كما يلي :

في الإطار الأول Form1 النقر على الزر Yes يؤدي إلى ظهور الإطار الثاني المحتوي على الصورة في حالة كانت كلمة المرور المدخلة صحيحة وإلا يتم إغلاق التطبيق ككل. أي أن عند تطبيق البرنامج يقوم المستخدم بإدخال كلمة مرور ثم النقر على الزر Yes فيتحقق التطبيق من كلمة المرور فإذا كانت الكلمة المدخلة هي الكلمة المطلوبة يقوم التطبيق بعرض الإطار الذي يحتوي على الصورة وإلا يتم إغلاق التطبيق و في حالة النقر على الزر NO يتم إغلاق التطبيق مباشرة.
في الإطار الثاني Form2 يوجد زر واحد فقط هو Close يستخدم لإغلاق الإطار فقط.

كتابة إجراء النقر على الزر Yes :

لكتابة إجراء النقر على الزر Yes نقوم بنقر الزر نقراً مزدوجاً أو نجعل الزر Yes هو العنصر الحالي و نفتح صفحة الأحداث events الموجودة في نافذة مفتش العناصر Object Inspector أي (نافذة الخصائص والأحداث) ويتم اختيار الحدث OnClick الخاص بالزر Yes وذلك بنقره نقراً مزدوجاً وفي الحالتين سنحصل على الإجراء الخاص بنقر الزر جاهز لكتابة الأسطر البرمجية الخاصة به بين الكلمتين المحجوزتين Begin و End .

ملاحظة :

النقر على أحد العناصر نقراً مزدوجاً يؤدي إلى فتح محرر الإجراءات وتجهيز الإجراء الأكثر شيوعاً بالنسبة للعنصر المختار ، بمعنى أنه إذا أردنا كتابة إجراء غيره ففي هذه الحالة يجب اختياره من قائمة الأحداث الموجودة في نافذة الخصائص والأحداث و المسماة ( Object Inspector ) .
الآن ، نكتب السطر البرمجي التالي بين الكلمتين Begin و end :




If Edit1.text = ‘Hello’ then Form2.Show else close ;




ونلاحظ انه تم استخدام جملة If الشرطية للتحقق من أن الكلمة المدخلة في مربع حوار كلمة المرور مساوية لكلمة المرور وهي هنا Hello فإذا كان قد أدخل المستخدم كلمة المرور صحيحة فإن جملة If الشرطية ستقوم بتطبيق الجملة Form2.Show والتي تعني عرض الإطار الثاني Form2 والذي تم تجهيزه سابقاً و يحتوي على الصورة ، أما إذا كانت الكلمة المدخلة غير صحيحة فإن جملة If الشرطية تقوم بتنفيذ الأمر Close والذي يعني إغلاق الإطار وبالتالي يتم إغلاق البرنامج بالكامل لأن الإطار الأول هنا Form1 هو الإطار الرئيسي في التطبيق.

كتابة إجراء النقر على الزر No :

يتم استدعاء إجراء النقر على الزر No بنفس الطريقة المشروحة أعلاه ويكفي كتابة الأمر Close فقط بين العبارتين Begin وEnd لإغلاق البرنامج عند النقر على الزر No.

كتابة إجراء النقر على الزر Close :

يوجد هذا الزر في الإطار الثاني Form2 الذي يحتوي على الصورة ويستخدم لإغلاق الإطار وبالتالي فإنه يتم كتابة الأمر Close أيضاً بين العبارتين Begin و End في إجراء النقر على هذه الزر وهذه الأمر سيؤدي إلى إغلاق الإطار المحتوي على الصورة والرجوع إلى النموذج الأول.

بهذا نكون قد أكملنا كتابة إجراءات التطبيق وأنهينا المرحلة الثانية والأخيرة من إعداد التطبيق و تبقى الآن عملية تخزين التطبيق و حفظه على القرص المغناطيسي سواء الصلب أو المرن.

حفظ التطبيق :

يجب دائماً حفظ التطبيق بكل ملفاته في مجلد مستقل يحمل اسم يشير إلى التطبيق لسهولة الحصول عليه عند فتحه لاحقاً وبالتالي يتم إنشاء مجلد على القرص الصلب مثلاً ويسمى Password Example ولإجراء عملية الحفظ نفتح قائمة File ونختار الأمر Save All فنحصل على نافذة حوار الحفظ ومن خلالها يجب فتح المجلد الخاص بهذه التطبيق والمراد نسخ ملفات التطبيق تحته وهو في هذا المثال باسم Password Example وعند فتحه ننقر على الزر Save لنحفظ أول ملف في التطبيق وهو على الأرجح سيكون الملف Unit1 الخاص بالإطار الأول Form1 ، بالطبع يمكن تسمية الملف باسم آخر غير الاسم الحالي ، وبعد تخزين الملف الأول تطلب نافذة الحوار حفظ الملف الثاني وهو على الأرجح سيكون الملف Unit2 الخاص بالإطار الثاني Form2 وبعدها سيتم حفظ ملف التطبيق نفسه واسمه الافتراضي هو Project1 مع إمكانية تغيير الاسم طبعاً ، وبهذا يتم حفظ التطبيق و تخزينه على القرص الصلب تحت مجلد باسم Password Example .

تشغيل التطبيق :

يتم تشغيل التطبيق بتنفيذ الأمر Run من قائمة Run أو نقر زر السرعة Run الموجود في مجموعة أزرار السرعة الخاصة بدلفي.

عند تشغيل التطبيق تقوم لغة Delphi بترجمة و تنقيح أسطر البرمجة الخاصة بإجراءات التطبيق ككل وتنشأ الملفات اللازمة والمرافقة للتطبيق بما فيها الملف التنفيذي للتطبيق Exe File .


إغلاق التطبيق :

يتم إغلاق التطبيق بتنفيذ الأمر Close All الموجود في قائمة File .

فتح التطبيق من جديد :

يتم فتح التطبيق بتنفيذ الأمر Open Project من قائمة File أو اختيار اسم التطبيق من القائمة الفرعية التي تتفرع من الأمر Reopen الموجود في قائمة File وهذه القائمة الفرعية تظهر أسماء آخر مجموعة من التطبيقات تم فتحها والعمل عليها مؤخراً وذلك لسرعة فتح التطبيق المطلوب.


مرشد اللغة :

مرشد اللغة عبارة عن فقرة ستعتاد على قراءتها في نهاية كل تطبيق من تطبيقات هذا الكتابة ، تتناول هذه الفقرة أهم الجمل Statements و الإجراءات Procedures والوظائف Functions وأيضاً الخصائص Properties التي تمس موضوع التطبيق وتعتبر ذات صلة بإجراءاته .

• الوظيفة ShowModal :

تستخدم لعرض أي إطار Form وجعله في مقدمة الإطارات الأخرى المفتوحة في البرنامج مع عدم السماح بالانتقال إلى أي إطار Form آخر إلى أن يغلق هذا الإطار .

مثال :




Form2.ShowModal ;





هذا السطر البرمجي يعني عرض الإطار Form2 وجعله في مقدمة الإطارات الأخرى إلى أن يغلق.

• Application.Terminate :

هذا السطر البرمجي مكون من شطرين ، الأول هو كلمة Application وهي تشير إلى إمكانية تنفيذ إجراء ما على التطبيق الحالي ، والثاني هو عبارة عن إجراء هو Terminate ويستخدم لإنهاء التطبيق.

القصد من الإشارة إلى هذا السطر البرمجي هو إمكانية استخدامه لإنهاء التطبيق بدلاً من الإجراء Close المستخدم في التطبيق السابق.


الفرق في استخدام Close أو Application.Terminate هو أن الأخير يستخدم لإنهاء التطبيق في أي مناسبة يستخدم فيها أما Close فيستخدم لإغلاق الإطار الحالي ، فإذا كان الإطار الحالي هو الإطار الرئيسي فإن التطبيق بالتأكيد سيغلق .


• الإطار Password Dialog :

- هو إطار حوار جاهز يستخدم في أي تطبيق لإدخال كلمة مرور ما وهو بالشكل التالي :


أنقر على الرابط التالي لرؤية الصورة :



- للحصول علي هذا الإطار قم بفتح قائمة File ثم New ثم Others فتحصل على الإطار التالي :


أنقر على الرابط التالي لرؤية الصورة :




- من هذا الإطار يمكنك إدراج العديد من الإطارات بأنواع مختلفة ومن ضمنها الإطار Form العادي طبعاً كما يظهر في الصورة ، إلا أننا نود أن ندرج الآن الإطار Password Dailog ولهذا سنقوم بنقر التبويب Dialogs فنحصل على الشكل التالي :


أنقر على الرابط التالي لرؤية الصورة :



- نلاحظ أن من بينهم الإطار المطلوب وهو Password Dialog ، بالتأكيد تعرف الباقي .

- هذا الإطار Password Dialog هو إطار Form كأي إطار آخر إلا أن لغة Delphi تقوم بتجهيزه لمن يرغب في استخدامه مباشرة لإدخال كلمة مرور ما ، مع ملاحظة إمكانية تغيير خصائص أي عنصر من عناصره كما ترغب كأن تقوم بتغيير قيمة أي Caption لجعلها تظهر باللغة العربية مثلاً .

- أخيراً ، انتبه إلى أن اسم Name الإطار Password Dialog هو PasswordDlg .

التطبيق الثاني : ( العمليات الحسابية )

الآن ، سنقوم بتصميم وبرمجة تطبيق آخر وهو عبارة عن برنامج يقوم بالعمليات الحسابية الأولية ( الجمع والطرح و الضرب والقسمة ) لعددين كما يلي :


ونلاحظ من إطار البرنامج أنه تم استخدام العناصر الآتية :

قوائم (Menus) وهي : قائمة ( عملية) وقائمة (خدمات) .

مجموعة Labels للساعة وللعدد الأول والثاني وللناتج.

مربعي نص (Edit) للعددين.

خمسة أزرار ، أربعة للعمليات الحسابية والأخير للخروج من البرنامج.

عنصري Bevel للتنسيق كما هو ظاهر في الإطار.

كما نلاحظ أن البرنامج يأخذ الشكل والاتجاه العربي حيث يظهر عنوان الإطار وأيضاً القوائم على اليمين.

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


تحتوي قائمة ( عملية ) على الآتي :



كما تحتوي القائمة ( خدمات) على الآتي :



ونلاحظ الآتي :

- قائمة ( عملية ) تحتوي على أوامر العمليات الحسابية والخروج من البرنامج ، أما قائمة ( خدمات ) فتحتوي على أمرين فقط هما ( مسح ) ويستخدم لمسح مربعي النص وخانة الناتج والأمر ( حول البرنامج ) يظهر إطار يحتوي على معلومات عن البرنامج .

كل أمر من أوامر القائمتين يحتوي على حرف اختصار (ShortCut) كما هو موضح.

ويتم إضافة و تصميم القوائم في أي إطار كما يلي :

يوضع على الإطار العنصر MainMenu ويوجد في الصفحة Standard في مكتبة العناصر المرئية .
يشغل إطار تصميم القائمة بنقر العنصر MainMenu نقراً مزدوجاً .




يتم إدخال اسم القائمة والأوامر التابعة لها باستخدام الخاصية 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 ) يستخدم لعرض الإطار التالي :



يحتوي الإطار السابق على العناصر التالية :

- العناصر Label لعرض البيانات الموضحة .
- العنصر Image1 لعرض الصورة الموضحة.
- العنصر Bevel للتنسيق.
- الزر ( خروج ) يستخدم للخروج من الإطار والعودة إلى الإطار السابق.[/size]


5 – برمجة الأوامر ( جمع ) ، ( طرح ) ، ( ضرب ) ، ( قسمة ) الموجودة في قائمة ( عملية ) :

نلاحظ أن هذه الأوامر هي أوامر مكررة سبق برمجتها ببرمجة الأزرار وبالتالي فإنه ليس من الحكمة ولا المنطق أن يتم تكرار كتابة الإجراءات من جديد وذلك أولاً لأن تكرارها يعتبر هدراً للوقت حتى تمت عملية التكرار بواسطة النسخ واللصق وثانياً لأن التكرار يتسبب في زيادة في حجم البرنامج ككل وإن كان الإجراء صغير وعلى هيئة سطر واحد ، وبالتالي فإن لغة البرمجة Delphi تتيح ميزة ربط أي إجراء بإجراء آخر تم كتابته وبهذا فإن إجراء النقر على الأمر ( جمع ) يمكن ربطه بإجراء النقر على الزر ( جمع ) لأنهما يؤديان نفس العمل وهكذا بقية الأوامر .

ربط الإجراءات :


لربط أي إجراء بإجراء آخر يتم الاستعانة بلائحة الإجراءات في نافذة مفتش العناصر Object Inspector حيث اختيار الإجراء المراد ربطه بإجراء تمت كتابته مسبقاً والنقر على السهم بجانب خانة الإجراء لفتح قائمة الإجراءات التي تمت كتابتها في التطبيق ككل لاختيار الإجراء المناسب والمراد ربطه بالإجراء الحالي.

وفي تطبيقنا الحالي سنقوم بربط إجراء النقر على الأوامر في قائمة ( عملية ) بإجراءات النقر على أزرار العمليات الحسابية التي تمت كتابتها مسبقاً ولأن أوامر القائمة لا يمكن التعامل مع خصائصها وإجراءاتها إلا بعد استدعاء إطار تصميم القائمة فإنه يجب أولاً نقر العنصر MainMenu1 نقراً مزدوجاً لإظهار إطار تصميم القائمة .

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

بنفس الأسلوب في الخطوة السابقة نقوم بربط باقي أوامر القائمة ( عملية ) .

ملاحظة :

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


مرشد اللغة :

• الوظيفة Date :

- تستخدم هذه الوظيفة لقراءة التاريخ الحالي لساعة الحاسوب فمثلاً :



Label1.Caption := DateToStr(Date) ;



- هذا السطر البرمجي يستخدم لقراءة التاريخ الحالي من ساعة الحاسوب بواسطة الوظيفة Date ، ثم تقوم الوظيفة DateToStr ( ) بتحويل قيمة التاريخ إلى قيمة حرفية كي يمكن تخصيصها إلى الخاصية Caption للعنصر Label1.

• الوظيفة StrToDate :

- هي عكس الوظيفة DateToStr ( ) ، أي أنها تحول قيمة حرفية String إلى قيمة تاريخ Date.

• الوظيفة StrToTime :

- هذه الوظيفة عكس الوظيفة TimeToStr ( ) المستخدمة في التطبيق السابق وهي تقوم بتحويل قيمة حرفية إلى قيمة توقيت Time .

• الوظيفية IntToStr ( ) :

- هذه الوظيفة مثل الوظيفة FloatToStr ( ) إلا أنها تقوم بتحويل قيمة رقمية صحيحة Integer إلى قيمة حرفية String .

• الوظيفة StrToInt ( ) :

- عكس الوظيفة السابقة تماماً.

التطبيق الثالث : ( قاموس )

سنقوم الآن بتصميم وبرمجة قاموس إنجليزي عربي صغير فكرته تظهر في الإطار التالي :


فكرة البرنامج :

يعرض البرنامج مجموعة من المفردات في ListBox بحيث يتم النقر على أحد هذه المفردات لتظهر الكلمة التي تم النقر عليها ويظهر معناها على يسار الـ ListBox

كما هو واضح في الصورة.
ونلاحظ من إطار البرنامج أنه يحتوي على الآتي :

العنصر ListBox .
خمسة عناصر من Label .
ثلاث عناصر من Bevel .
العنصر Button .

تصميم البرنامج :

أولاً يتم استخدام الخاصية Items للعنصر ListBox لإضافة المفردات وذلك بنقر الزر ذو الثلاث نقاط بجوار الخاصية Items كما في الشكل التالي :



وبذلك يظهر الإطار String List Editor الذي يظهر في الصورة التالية :


يتم إدخال المفردات كما هو مبين ، ثم النقر على الزر OK .

بهذا نكون قد جهزنا ListBox لعرض المفردات في إطار البرنامج .

الآن ، نقوم بتجهيز باقي عناصر إطار البرنامج وتنسيقها كما هو موضح في شكل أعلاه.


برمجة العناصر :

البرنامج يتكون من إجراء واحد هام وهو إجراء النقر على أحد المفردات في لائحة العنصر ListBox وهذا الإجراء فكرته تعتمد على أنه عند النقر على أحد المفردات تظهر

الكلمة ومعناها في المكان المخصص لهما في الإطار ، وهذا كل شئ . أما الإجراء الآخر في البرنامج فهو إجراء الخروج من البرنامج وهو إجراء غني عن التعريف.

إجراء النقر على ListBox :


Procedure TForm1.ListBox1Click (Sender : Tobject ) ;
begin
Case ListBox1.ItemIndex of
0 : Label4.Caption := ‘تطبيق’ ;
1 : Label4.Caption := ‘كائن’ ;
2 : Label4.Caption := ‘مكتبة’ ;
3 : Label4.Caption := ‘قاعدة بيانات’ ;
4 : Label4.Caption := ‘قائمة’ ;
5 : Label4.Caption := ‘إطار’ ;
6 : Label4.Caption := ‘نظام’ ;
7 : Label4.Caption := ‘حدث’ ;
8 : Label4.Caption := ‘خاصية’ ;
9 : Label4.Caption := ‘شفرة’ ;
end ;
Label2.Caption := ListBox1.Items[ListBox1.ItemIndex] ;
end ;


شرح الإجراء :

- استخدمت جملة Case في الإجراء السابق على أساس أن لائحة المفردات في ListBox1 ترتب من 0 إلى 9 لأنها عشرة كلمات وبالتالي عند النقر على أحد هذه

الكلمات فإن البرنامج يسجل رقم ترتيب ItemIndex هذه الكلمة وباستخدام جملة Case يستطيع البرنامج تحديد الترجمة المناسبة للكلمة التي تم النقر عليها ( تم

اختيارها ) ويقوم الإجراء بتخصيص هذه الترجمة إلى الخاصية Caption للـ Label4 وفي كل الأحوال يخصص البرنامج الكلمة المختارة للخاصية

Caption للـ label2 بواسطة السطر البرمجي الأخير والذي يعرف الكلمة المختارة ListBox1.Items[ ] من خلال رقم ترتيبها والذي يعرف

من خلال الخاصية ItemIndex كما هو موضح في الإجراء.

- تذكر أن الخاصية Items [ ] تستخدم للتعامل مع الكلمة التي تم النقر عليها داخل أي ListBox وذلك من خلال كتابة رقم ترتيب هذه الكلمة داخل قوسي [

] الخاصية وذلك سواء تم كتابة الرقم مباشرة داخل القوسين مثل [ 0 ] للتعبير عن الكلمة الأولى أو كان التعبير عن الرقم باستخدام الخاصية ItemIndex التي

تتعرف تلقائياً على رقم ترتيب الكلمة .

- يلاحظ أن أي ListBox يمكن استخدامه لكتابة أي كلمات أو جمل أو عبارات أو نقاط معينة وذلك أثناء تصميم البرنامج باستخدام الإطار String List

Editor السابق شرحه أو كان ذلك بواسطة الأسطر البرمجية باستخدام الوظيفة Add ( ) للخاصية Items للعنصر ListBox حيث يتم كتابة أي

سلسلة حرفية بين قوسي الوظيفة Add .


مرشد اللغة :

• جملة Case :

- صيغتها كالآتي :


Case متغير ما عدا المتغيرات الحرفية do
Caseحالة : جملة أو أكثر ;
Caseحالة : جملة أو أكثر ;
Caseحالة : جملة أو أكثر ;
.
.
.
else
جملة أو أكثر ;
end;


- طبعاً في حالة كتابة أكثر من جملة يجب أن تحاط بين Begin وEnd .
- تستخدم Else مع جملة Case لتنفيذ الجملة أو الجمل التي تليها إذا ما كانت قيمة المتغير لا تحققها أي حالة من حالات Case المحددة في

الجملة.
- حالات Case يمكن أن تكون عل هيئة مدى معين مثل 1 .. 5 أي أن قيمة المتغير إذا كانت 2 فإن الحالة تصبح متحققة لوقوع القيمة 2 في المدى 1

.. 5 وهكذا .كما سنرى فيما بعد.
- يجب الانتباه إلى أنه يجب ألا تتداخل حالات جملة Case بمعنى أنه يجب عدم تكرار أي قيمة في القيم التي تحدد حالات Case .


• جملة with :

- في التطبيق السابق كان من الممكن كتابة السطر التالي :


Label2.Caption := ListBox1.Items[ListBox1.ItemIndex] ;


كما يلي :


With ListBox1 do
Label2.Caption := Items[ItemIndex] ;


- باستخدام جملة with تصبح الجمل البرمجية أسهل فهماً وكتابةً.
- بالطبع سنستخدم Begin و End في حالة كانت هنا أكثر من جملة تحتاج لخدمات جملة With.

بهذا ينتهي التطبيق وينتهي معه الدرس الرابع
لنا لقاء قريب في الدرس الخامس إن شاء الله وهو سيكون عن إنشاء وبرمجة تطبيق لتشغيل ملفات الصوت والفيديو بإذن الله .

ومنكم الدعاء
أحمد الحرش