26.04.2015 Views

لغة البرمجة دلفي Delphi

لغة البرمجة دلفي Delphi

لغة البرمجة دلفي Delphi

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

تم تحميل الملف من موقع<br />

البوصلة التقنية<br />

www.boosla.com


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

بسم االله الرحمن الرحيم<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

موقع الكِتاب على الإنترنت<br />

http://www.alshater.net<br />

يسمح بالنشر الإلكتروني أو الاقتباس أو النقل<br />

على أن يتم الإشارة إلى المؤلف وموقع الكِتاب على الانترنت<br />

ولا يسمح بأي شكل من الأشكال النشر الورقي للكتاب<br />

إعداد<br />

محمد خالد ناصر آغا<br />

Support@alshater.net<br />

1


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إلى<br />

أمي،‏ إلى أبي الذين لولا سهرهما وتعبهما لم أكن هنا لأكتب<br />

هذا الكتاب.‏<br />

إلى أناس لا أعرفهم ولا يعرفونني ولكنهم قدموا لي الكثير وخاصة<br />

في مجال <strong>البرمجة</strong> كنت قد التقيت بهم على الانترنت في المنتديات<br />

وساحات الحوار وكان عطائهم من دون طلب حتى أنهم لم يطلبوا<br />

الشكر على المساعدة.‏<br />

2


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الفهرس<br />

الموضوع<br />

الصفحة<br />

5<br />

7<br />

10<br />

15<br />

16<br />

18<br />

20<br />

24<br />

27<br />

29<br />

35<br />

43<br />

48<br />

52<br />

55<br />

60<br />

69<br />

77<br />

86<br />

100<br />

111<br />

117<br />

118<br />

123<br />

131<br />

المقدمة ................................................................................<br />

نبذه عن <strong>دلفي</strong><br />

..........................................................................<br />

البرنامج الأول .........................................................................<br />

الوحدة<br />

.......................................................................... unit<br />

التعرف على العناصر .................................................................<br />

التعامل مع الأحداث<br />

التعامل مع واجهة ال<strong>دلفي</strong><br />

التعرف على عنصر المذكرة<br />

إنشاء قوائم للنماذج<br />

أنواع المعطيات<br />

الإجراءات والتوابع<br />

بعض التوابع المعرفة في <strong>دلفي</strong><br />

صناديق الحوار<br />

التعرف على العنصر<br />

التعامل مع السلاسل النصية<br />

معالجة الأخطاء في <strong>دلفي</strong><br />

..................................................... ( Events )<br />

...............................................................<br />

................................................. Memo<br />

....................................................................<br />

........................................................ Data Type<br />

...................................................................<br />

.........................................................<br />

.............................................................. Dialog<br />

..................................................... MaskEdit<br />

...........................................................<br />

..............................................................<br />

قواعد البيانات ........................................................................<br />

بناء تطبيقات قواعد البيانات ............................................................<br />

بناء قواعد البيانات<br />

.......................................... Database Desktop<br />

التعامل مع قاعدة البيانات من خلال <strong>دلفي</strong> ...............................................<br />

البحث في قواعد البيانات ..............................................................<br />

الحقول الحسابية .......................................................................<br />

<strong>لغة</strong> الاستفسارات البنيوية :<br />

.................................................... SQL<br />

ربط الجداول .........................................................................<br />

إنشاء الجداول ببرنامج<br />

...................................................... Access<br />

3


http://www.alshater.net<br />

137 ................................................................................ ADO<br />

140<br />

الطباعة ............................................................................... 146<br />

147<br />

150<br />

154<br />

158<br />

167<br />

169<br />

182<br />

184<br />

183<br />

197<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

برنامج دليل الهاتف ...................................................................<br />

لمسات برمجية ........................................................................<br />

................................................ Windows Registry<br />

............................................. Windows API<br />

مسجل النظام<br />

توابع وثوابت الويندوز<br />

إضافة عناصر جديدة ..................................................................<br />

السحب والإفلات.......................................................................‏<br />

الرسم في <strong>دلفي</strong> ........................................................................<br />

برمجة الأوساط المتعددة ...............................................................<br />

التعامل مع الملفات ....................................................................<br />

........................................................................<br />

............................................. Install Shelled Express<br />

برنامج المفكرة<br />

البرنامج<br />

4


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

المقدمة<br />

بسم االله والحمد الله والصلاة والسلام على رسول االله أما بعد:‏<br />

هذه مجموعة من المحاضرات كنت قد اعددتها أثناء تدريسي ل<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong> سنة 2003 في مركز الشبيبة<br />

للعلوم والحاسوب،‏ ومن ذلك الوقت وأنا أفكر بنشر هذه المحاضرات على الإنترنت ولكن العمل أخذ كل وقتي منذ<br />

ذلك الحين ولم أجد الوقت الكافي لإتمام ذلك.‏<br />

وكنت قد فكرت حينها أنه يجب تنقيح هذه المحاضرات لغويا ً وعلميا ً قبل نشرها الأمر الذي جعلني أجد من نشرها<br />

عملا ً شاقا ً ويأخذ الكثير من الجهد ولذلك قررت هذه العام 2006 أن أطرحها كما هي مع القليل القليل من التنقيح<br />

فلا اعتقد أني سأجد الوقت المناسب لنشر هذه المحاضرات في المستقبل.‏<br />

لماذا <strong>دلفي</strong>؟<br />

ظهر كثيرا ً من النزاع في مواقع الإنترنت حول أيهما أفضل فيجول بيسك أم <strong>دلفي</strong> ولا أريد هنا أن أدخل في هذه<br />

المناقشات ولكني اخترت ال<strong>دلفي</strong> لسببين<br />

:<br />

1<br />

– يدرس كل طلاب الهندسة المعلوماتية في سورية <strong>لغة</strong> الباسكال والتي هي ال<strong>لغة</strong> الأم لل<strong>دلفي</strong> وبالتالي يكون<br />

الانتقال إلى <strong>دلفي</strong> سلس وسهل.‏<br />

– 2 الموضة :<br />

قد يفاجئ البعض من هذا السبب ولكن وبكل صراحة اقتنيت حاسبا ً سنة 1997 وكنت في السنة<br />

الثانية في الكلية وكانت نسخة ال<strong>دلفي</strong> 2 قد ظهرت لأول مرة وكان الكثير يدرس ال<strong>دلفي</strong> في الكلية بالرغم من أنها<br />

غير مقررة في المنهاج الأمر الذي جعل ال<strong>دلفي</strong> تنتشر كما تنتشر الموضة الجديدة بين النساء،‏ بالنسبة لمن يرون أن<br />

تعبير موضة ليس في محله أذكرهم أن الموضة في عام<br />

العام.‏<br />

رحلتي مع <strong>دلفي</strong>:‏<br />

2005 كانت<br />

#C ولا أعرف أين ستتجه الموضة هذا<br />

بدأت بدارسة ال<strong>دلفي</strong> كما قلت في عام 1997 وبعدها أصبحت مدمنا ً لل<strong>دلفي</strong> كنت ألعب ال<strong>دلفي</strong> بينما كان أصدقائي<br />

يلعبون فيفا 98 أو رود رش<br />

.<br />

ولكن في عام 2004 بدأت حياتي تأخذ مسارا ً آخر فعملي أصبح يتطلب العمل على شبكات لينكس والتي تأخذ<br />

الكثير من الوقت بالإضافة أنني تعرفت على <strong>لغة</strong> برمجة جديدة وهي PHP والتي أصبحت تأخذ حياتي شيئا ً فشيئا ً،‏<br />

الأمر الذي جعلني أبتعد عن ال<strong>دلفي</strong> حتى أني توقفت السنة الماضية عن العمل بها أو تدريسها تمام ًا.‏<br />

لمن هذا الكتاب ؟<br />

بالرغم من أنني حاولت تبسيط الكتاب ما أمكن ولكنني توجهت في إعداد هذه المحاضرات إلى طلاب كلية الهندسة<br />

المعلوماتية و كلية الحاسبات الأمر الذي جعلني أفترض أن قارئ هذا الكتاب لديه إلمام ولو بسيط بلغات <strong>البرمجة</strong>.‏<br />

5


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لماذا أنشر هذا الكتاب<br />

:<br />

)<br />

اقتبس هذه الكلام من مقدمة كتاب احتراف Visual Basic.Net لمؤلفة محمد حمدي غانم):‏<br />

أعرف ُ أن الكثيرين سيتساءلون:‏ ما هو الدافع الذي حداك لبذل هذا المجهود؟..‏ وإن ّي لأجدها فرصة ً مناسبة ً لأنقلَ‏<br />

لكم فكرة ً تعلمتها من احتكاكي بأناسٍ‏ أكن لهم كل َّ الود والاحترام..‏ هذه الفكرة ُ تدور حولَ‏ كونِ‏ الإنسانِ‏ جزءا من<br />

مجتمعِه،‏ لهذا فمهما كانت أقدار هذا الإنسان،‏ فإن مصيره مرتبط بمصير هذا المجتمع،‏ يسعدانِ‏ معا ويشقيانِ‏ معا.‏<br />

فما فائدة ُ أن تملِك في مجتمعٍ‏ معدم؟<br />

وما جدوى أن تشعر في مجتمعٍ‏ متحجر؟<br />

وما قيمة ُ أن تعرف َ في مجتمعٍ‏ يجهل؟<br />

وما هدف ُ أن تفهم في مجتمعٍ‏ متبل ّد؟<br />

وما مغزى أن ت ُبدع في مجتمعٍ‏ متدن ّي الذائقةِ‏ والثقافة؟<br />

لن يكون لكل ِّ هذا قيمة ٌ إذا لم يتشارك معك فيه أناس آخرون،‏ بحيث تعم الفائدة على الجميع،‏ في إطارٍ‏ من التعاونِ‏<br />

والو د.‏<br />

إن الحاجة َ للإحساسِ‏ بالانتماءِ‏ هي حاجة ٌ من حاجاتِ‏ الإنسانِ‏ الحيويةِ‏ التي لا يستطيع العيش َ بدونِها،‏ تماما كالطعامِ‏<br />

والشراب!..‏ ولكن..‏ هل يمكن ُك أن تنتمي إلا لأناسٍ‏ يرقون لمستوى خ ُلقكِ‏ ومبادئك وثقافتِك وإبداعك؟؟!!‏<br />

إن هذه دعوة ٌ لكل ِّ من يقرأُ‏ هذه الكلماتِ‏ أن يحاولَ‏ أن يشارك الآخرين في معرفتِه وعلمِه،‏ على الأقل ِّ حت ّى يجد من<br />

يقدر هذه المعرفة َ ويحترم هذا العلم،‏ في مجتمعٍ‏ اختل ّت به كلّ‏ المقاييس!!،‏ وحت ّى ينطبق َ عليه قول الرسولِ‏ ‏(صل ّى<br />

االلهُ‏ عليه وسل ّم):‏ ‏"خير الناسِ‏ أنفعهم للناس".‏<br />

وفي النهاية أرجوا من كل من يستفيد من هذا الكتاب أن يدعو لي بالهداية والتوفيق والنجاح وللأمة الإسلامية<br />

بالنصر والعزة والخروج مما هي فيه من محن..‏<br />

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم<br />

محمد خالد ناصر آغا<br />

سورية - جامعة حلب<br />

الحرم الجامعي الرقمي الفرانكفوني<br />

Support@alshater.net<br />

6


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الأولى<br />

نبذه عن <strong>دلفي</strong> :<br />

من المعروف أن <strong>دلفي</strong> هي منتج بورلاند الأكثر مبيعا ً للتطوير<br />

http://www.alshater.net<br />

السريع للتطبيقات RAD (Rapid Application<br />

‏(‏Developmentوالمستخدم لكتابة تطبيقات ويندوز ، ويمكن باستخدام ال<strong>دلفي</strong> إنشاء تطبيقات ويندوز بسرعة<br />

أكبر وبسهولة أكثر من أي وقت مضى.‏<br />

هذا يعني أنه نستطيع إنشاء واجهة المستخدم<br />

الرئيسي<br />

)<br />

(..<br />

يقصد بواجهة المستخدم القوائم ومربعات الحوار والإطار<br />

للبرنامج مستخدمين تقنيات السحب والإفلات لمطور تطبيقات سريع ، ويمكن أيضا ً وضع تحكمات<br />

أكتيف إكس ) Active X<br />

العناصر المستخدمة في فيجول بيسك<br />

(<br />

على النماذج لإنشاء برامج متخصصة مثل برامج<br />

استعراض الويب في دقائق،‏ تقوم <strong>دلفي</strong> بعمل جيد وذلك بإخفاء بعض التفصيلات التي تشكل أحشاء برنامج الويندوز<br />

ولكن ليس بإمكانها كتابة البرامج بشكل كامل ، لذلك يجب في النهاية أن يكون المبرمج جيدا ً،‏ ويمكن لهذه العملية<br />

أن تكون طويلة ، والخبر الجيد أن <strong>دلفي</strong> تجعل الرحلة غير متعبة وحتى أنها تجعلها ممتعة.‏<br />

نظرة سريعة على مكونات <strong>دلفي</strong><br />

IDE<br />

سنتعرف في هذا القسم على بيئة التطوير المتكاملة لل<strong>دلفي</strong><br />

IDE (<strong>Delphi</strong> Integrated Development Environment).<br />

عندما تشغل برنامج ال<strong>دلفي</strong> تظهر بيئة التطوير فيه والتي سنتعرف عليها كل على حده<br />

بيئة <strong>دلفي</strong> مكونة من ثلاثة أقسام<br />

1<br />

:<br />

الإطار العلوي:‏<br />

يمكن اعتباره الإطار الرئيسي يحتوي على أشرطة الأدوات ولوحة المكونات توصل أشرطة أدوات <strong>دلفي</strong> إلى<br />

وظائف كالفتح والتخزين والبناء وتحتوي لوحة المكونات على كثير من مكونات <strong>دلفي</strong> التي يمكن وضعها في<br />

) البرنامج<br />

لافتة نصية ، علب تحرير ، مربعات سرد وأزرار وما شابه ذلك )، لتكون أكثر ملائمة فإن المكونات<br />

مقسمة إلى مجموعات ، حتى تضع مكون على برنامجك انقر على المكون ومن ثم انقر على المكان حيث تريد<br />

وضع المكون على النموذج.‏<br />

7


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

(<br />

)<br />

2 محرر الخواص :<br />

سنتعرف عليه بالتفصيل في دروس قادمة<br />

والذي يتم<br />

بواسطته تعديل الخصائص والأحداث للعنصر وسوف<br />

نستخدمه بشكل دائم<br />

خلال عملنا مع <strong>دلفي</strong><br />

والأحداث.‏Events<br />

وهناك صفحتين<br />

محرر الخواص هما الخصائص Properties<br />

مصطلح<br />

الخاصة Property يحتوي على خصائص لها قيم تحدد عمل العنصر<br />

يتضمن باب الأحداث Events<br />

قائمة أحداث العنصر،‏ تتشكل الأحداث نتيجة لتفاعل<br />

المستخدم مع المكون مثلا<br />

عند نقر المكون يتولد حدث يخبرك بأن المكون قد نقر<br />

بإمكانك كتابة أوامر تستجيب لهذه<br />

الأحداث.‏<br />

مصطلح الحدث Event<br />

هو شيء ما يحصل كنتيجة لتفاعل<br />

العنصر مع المستخدم أو<br />

(<br />

مع ويندوز )<br />

حدث ضغط على زر مثلا ً<br />

مصطلح معامل الحدث Event Handler<br />

هو مقطع<br />

من <strong>البرمجة</strong> ينفذ استجابة للحدث.‏<br />

منطقة عمل :<br />

3 <strong>دلفي</strong><br />

الجزء<br />

الثالث هو منطقة عمل<br />

<strong>دلفي</strong> وعادة ما يظهر مشروعا ً جديد ًا<br />

‏،في المقدمة<br />

مصمم النموذج وخلفه محرر<br />

الشيفرة الذي تدخل عبره <strong>البرمجة</strong> عند كتابة<br />

برامجك.‏<br />

وكلا ً من<br />

محرر الخواص ومصمم النموذج ومحرر الشيفرة تتفاعل فيما<br />

بينها عند بناء التطبيقات لتولد البرنامج.‏<br />

4 شجرة العناصر :<br />

تظهر هذه النافذة العناصر الموضوعة على النموذج على شكل شجرة من العناصر<br />

النافذة الرئيسية<br />

8<br />

:


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أ القوائم سنتعرف على القائمة<br />

File بالتفصيل لأنها أساس العمل مع البيئة ومن ثم باقي القوائم ستشرح في<br />

حينها :<br />

1 : File Menu وتحتوي على الأوامر التالية :<br />

<br />

: New وتظهر عنه قائمة فرعية<br />

. (<br />

البدء بكتابة برنامج جديد<br />

) يعمل تحت نظام ويندوز<br />

: Application<br />

( 1<br />

)<br />

. (<br />

البدء بكتابة برنامج جديد<br />

) يعمل تحت نظام لينكس وويندوز<br />

: CLX<br />

( 2<br />

)<br />

إنشاء وحدة جديدة<br />

‏(يتم الوصول لها من جميع نماذج<br />

المشروع).‏<br />

:Data Model<br />

( 3<br />

)<br />

: Form إضافة نمودج جديد للمشروع .<br />

( 4<br />

)<br />

تصميم عنصر يحوي مجموعة من العناصر للاستخدام مع نماذج المشروع<br />

) سيتم<br />

: Frame<br />

( 5<br />

)<br />

شرحة فيما بعد بمثال .<br />

خاص<br />

: Others سيتم شرحها في حينها .<br />

( 6<br />

)<br />

.<br />

( *.dpr<br />

)<br />

( *.Pas<br />

)<br />

: Open<br />

لفتح ملف وحدة<br />

أو ملف مشروع<br />

موجودين مسبقا ً<br />

.<br />

: Open Project<br />

لفتح مشروع موجود مسبقا ً<br />

<br />

: Reopen يقدم لائحة بآخر عدة ملفات تم فتحها لسهولة إعادة فتحها من جديد.‏<br />

.<br />

: Save<br />

تخزين آخر تعديل<br />

.<br />

: Save As<br />

تخزين الوحدة<br />

Unit الحالية باسم جديد<br />

.<br />

: Save Project As<br />

تخزين ملف البرنامج الرئيسي Main Program باسم جديد<br />

.<br />

: Save All<br />

إعادة تخزين جميع ملفات المشروع<br />

.<br />

: Close<br />

إغلاق النافذة الفعالة<br />

.<br />

: Close All<br />

إغلاق البرنامج بالكامل<br />

Use لاحقا ً ( .<br />

) Use<br />

: Use Unit<br />

لاستخدام وحدة أي وضع اسمها بعد تعليمة<br />

ستشرح تعليمة<br />

: print<br />

لطباعة النموذج الحالية أو لطباعة الوحدة الحالية.‏<br />

9


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الثانية<br />

سنقوم الآن بكتابة برنامج يقوم بتغير لون النافذة:‏<br />

أ مرحلة التصميم :<br />

1 إبدأ مشروعا جديدا عن طريق القائمة . File New Application<br />

2 لنعطي النموذج الجديد الخصائص التالية :<br />

أسم الخاصة<br />

القيمة<br />

شرح الخاصة<br />

bdRightToLeft تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من اليمين<br />

BiDiMode<br />

(<br />

إلى اليسار )<br />

لموافقة البرامج العربية<br />

تحديد ارتفاع النموذج<br />

280<br />

Height<br />

تحديد عرض النموذج<br />

350<br />

Width<br />

تغير الألوان<br />

تحديد عنوان للنموذج يظهر في شريط العنوان<br />

Caption<br />

(<br />

تحديد مكان ظهور النموذج )<br />

ستشرح قيمها فيما بعد<br />

poDesktopCenter<br />

Position<br />

2 نضع ثلاثة أزرار على النموذج Button) (<br />

من صفحة العناصر<br />

Standard ونعطي لكل منهم الخصائص<br />

التالية :<br />

إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />

تحديد عنوان للزر<br />

RedButton<br />

أحمر<br />

تحديد بعد الزر عن أعلى النافذة<br />

تحديد بعد الزر عن يسار النافذة<br />

)<br />

)<br />

بكسل)‏<br />

( بكسل<br />

إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />

تحديد عنوان للزر<br />

160<br />

230<br />

GreenButton<br />

أخضر<br />

تحديد بعد الزر عن أعلى النافذة<br />

تحديد بعد الزر عن يسار النافذة<br />

)<br />

)<br />

بكسل)‏<br />

( بكسل<br />

190<br />

203<br />

CloseButton<br />

إغلاق<br />

إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />

تحديد عنوان للزر<br />

تحديد بعد الزر عن أعلى النافذة<br />

تحديد بعد الزر عن يسار النافذة<br />

)<br />

)<br />

بكسل)‏<br />

( بكسل<br />

200<br />

24<br />

: Button1<br />

Name<br />

Caption<br />

Top<br />

Left<br />

Button2<br />

Name<br />

Caption<br />

Top<br />

Left<br />

Button3<br />

Name<br />

Caption<br />

Top<br />

Left<br />

10


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ب كتابة التعليمات :<br />

form1.Color := clred ;<br />

Color القيمة clred وهي<br />

1 نضغط مرتين على الزر الأول فيظهر محرر الشيفرة نكتب فيه مايلي<br />

:<br />

تقوم هذه العملية بتغير لون النموذج إلى اللون الأحمر عن طريق إعطاء خاصة اللون<br />

قيمة محجوزة في ال<strong>دلفي</strong> وتدل على اللون الأحمر.‏<br />

form1.Color := clgreen;<br />

close;<br />

2 نضغط مرتين على الزر الثاني فيظهر محرر الشيفرة نكتب فيه مايلي<br />

3 نضغط مرتين على الزر الثالث فيظهر محرر الشيفرة نكتب فيه مايلي<br />

تقوم هذه التعليمة بإغلاق النافذة<br />

:<br />

:<br />

وبذلك نكون قد أنهينا كتابة البرنامج ولحفظه نختار الأمر<br />

File Save Project As<br />

لنعطي الوحدة الاسم NewCloors والمشروع الأسم<br />

ChangeCloros<br />

ولتنفيذه نضغط على F9 أو نختار الأمر Run من القائمة<br />

Run<br />

( Run Run )<br />

سنقوم الآن بتغير بعض خواص العناصر للتعرف على<br />

خصائص جديدة :<br />

1 خصائص النموذج :<br />

:<br />

( Form1<br />

نختار النموذج بالنقر عليه أو باختيار اسمه )<br />

من القائمة الموجودة في أعلى محرر الخواص<br />

أ <br />

تظهر أمام هذه القائمة إشارة +<br />

بالنقر عليها تظهر لها أربع خيارات تأخذ كل منها القيمة<br />

: BorderIcons<br />

صح أو خطأ وتتحكم هذه الخواص بأزرار شريط العنوان :<br />

.<br />

بإعطاء هذه الخاصة القيمة<br />

False تختفي الأزرار الثلاثة<br />

: Bisystemmenu<br />

بإعطاء هذه الخاصة القيمة<br />

False يختفي زر التصغير .<br />

: BiMinimize<br />

. يختفي زر False بإعطاء هذه الخاصة القيمة : BiMaximize<br />

بإعطاء هذه الخاصة القيمة<br />

True يظهر الزر ؟<br />

) لا يظهر هذا الزر مع النوافذ العادية<br />

: BiHelp<br />

ستشرح مع الخاصة التالية .<br />

.<br />

ملاحظة<br />

: نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ<br />

ب<br />

: Borderstyle تقوم هذه الخاصة بالتحكم بشكل النافذة وشريط العنوان وتأخذ إحدى القيم التالية<br />

.<br />

11


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: bsDialog تقوم بإخفاء أزرار التكبير والتصغير بالإضافة إلى منع تغير حجم النموذج أثناء التنفيذ<br />

. Bihelp للخاصة True<br />

ويظهر فقط زر الإغلاق والزر ؟ في حال<br />

تم إعطاء القيمة<br />

: bsNone يظهر النموذج بدون شريط عنوان ولا يمكن تغير حجمه أثناء التنفيذ.‏<br />

: bsSingle تظهر جميع أزرار شريط العنوان ولا يمكن تغير حجمه أثناء التنفيذ .<br />

وهي القيمة الافتراضية ويظهر النموذج<br />

بشكله الطبيعي مع إمكانية التكبير والتصغير والتحجيم.‏<br />

: bsSizeable<br />

يظهر شريط عنوان صغير مع زر ×<br />

فقط وتختلف الأولى عن الثانية<br />

: bsToolWindow و bsSizeToolWin<br />

بإمكانية تغير الحجم .<br />

.<br />

ملاحظة<br />

: نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ<br />

:<br />

ج : Position<br />

لإظهار النموذج في مكان ما على الشاشة وأهم قيمها<br />

: poDesigned يظهر النموذج في المكان الذي حدد له أثناء التصميم .<br />

: poDesktopCenter يظهر النموذج في وسط الشاشة.‏<br />

يظهر النموذج في وسط الشاشة )<br />

في حال وجود شاشة واحدة لهذه<br />

: poScreenCenter<br />

الخاصة نفس نتيجة الخاصة السابقة ( .<br />

...<br />

د : Icon<br />

تتحكم هذه الخاصة بشكل أيقونة النافذة ، وعند تحديد هذه الخاصة يظهر زر عليه ثلاث نقاط<br />

بالنقر عليه يظهر صندوق حوار لاختيار أيقونة )<br />

يتم عادة جلب الأيقونات من الانترنت أو يتم رسمها<br />

:<br />

(<br />

يدويا ً كما سنرى لاحقا ً يمكن اختيار أحدى الأيقونات من الدليل<br />

C:\Program Files\Common Files\Borland Shared\Images\Icons<br />

هذه هي الخواص الأساسية للنموذج وسنتعرف على باقي الخواص لاحقا ً .<br />

1 خصائص الزر :<br />

:<br />

( Top, Left, Width, Height, Caption<br />

بالإضافة للخصائص المعروفة )<br />

هناك بعض الخصائص المهمة<br />

: BiDiMode تم شرح هذه الخاصة سابقا ً بالنسبة للنموذج ولكن من المهم أن نعلم أنه عند تغير هذه الخاصة<br />

في النموذج تتغير بشكل تلقائي في الزر .<br />

تتحكم هذه الخاصة بنوع خط عنوان الزر بالإضافة إلى لون العنوان وحجمه.‏<br />

تظهر هذه الخاصة ملاحظة عند وقوف مؤشر الفأرة فوق الزر<br />

: Font<br />

: Hint<br />

.<br />

يجب أن تأخذ هذه الخاصة القيمة<br />

True حتى يتم تفعيل الخاصة السابقة<br />

: Showhint<br />

مثال :<br />

أختر الزر<br />

RedButton ثم اختر الخاصة<br />

Hint من محرر الخواص واكتب النص<br />

(<br />

التالي )<br />

عند الضغط على هذا الزر سيتحول لون النافذة إلى اللون الأحمر<br />

ثم أعط الخاصة<br />

ShowHint القيمة True ونفذ البرنامج .<br />

.<br />

عند إعطاء القيمة<br />

False لهذه الخاصة لن يظهر الزر أثناء التنفيذ<br />

: Visible<br />

: Enable عند إعطاء القيمة False لهذه الخاصة سيظهر الزر بشكل باهت ولا يمكن الضغط عليه.‏<br />

12


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أثناء تنفيذ البرنامج وعند الضغط على الزر<br />

Tab في لوحة المفاتيح يظهر إطار مربع<br />

: TabOrder<br />

داخل الزر وينتقل هذا الإطار من زر إلى آخر بالنقر على الزر<br />

Tab وتقوم هذه الخاصة<br />

بتحديد ترتيب انتقال الإطار عند التنقل بين العناصر.‏<br />

1 لنضيف الآن زر جديد إلى النموذج السابق ولنعطه الخصائص التالية<br />

:<br />

BtnAbout Name<br />

Caption<br />

Top<br />

Left<br />

Width<br />

حول<br />

0<br />

0<br />

40<br />

إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />

تحديد عنوان للزر<br />

تحديد بعد الزر عن أعلى النافذة<br />

تحديد بعد الزر عن يسار النافذة<br />

تحديد عرض الزر<br />

)<br />

)<br />

بكسل)‏<br />

بكسل<br />

ثم نضيف نموذج جديد للمشروع عن طريق القائمة : File New Form<br />

وبذلك يظهر نموذج جديد لنعطه الخصائص التالية<br />

(<br />

:<br />

About Name<br />

bdRightToLeft BiDiMode<br />

إعطاء أسم جديد للنموذج<br />

تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من<br />

اليمين إلى اليسار<br />

)<br />

لموافقة البرامج العربية<br />

(<br />

تحديد ارتفاع النموذج<br />

تحديد عرض النموذج<br />

تحديد عنوان للنموذج يظهر في شريط العنوان<br />

تحديد مكان ظهور النموذج<br />

250<br />

300<br />

معلومات حول البرنامج<br />

poDesigned<br />

Height<br />

Width<br />

Caption<br />

Position<br />

الآن يمكن حفظ النموذج عن طريق الضغط على الزر<br />

Save من أزرار السرعة أو باختيار نفس الأمر من القائمة<br />

aboutunit<br />

File أو بالضغط على<br />

Ctrl + s من لوحة المفاتيح ، لنعط الوحدة أسم<br />

( Form1<br />

عند تنفيذ البرنامج لا يظهر إلا النموذج الأول )<br />

والآن علينا كتابة الشيفر المناسبة لاستدعاء النموذج<br />

. من النموذج Form1 About<br />

لاستدعاء نموذج ثاني من نموذج أول يجب علينا أن نعلم النموذج الأول باسم الوحدة التابع لها النموذج الثاني ويتم<br />

: Uses<br />

ذلك بإضافة اسم وحدة النموذج الثاني في القسم<br />

implementation لوحدة النموذج الأول بعد عبارة<br />

implementation<br />

والآن أضف العبارة التالية كما يلي :<br />

الآن نضغط مرتين على الزر<br />

يقوم الأمر Show بإظهار النافذة<br />

لنكمل الآن تصميم النموذج<br />

BtnAbout الموجود على النموذج الأول ونكتب التعليمة التالية<br />

uses aboutunit ;<br />

:<br />

about.Show;<br />

.(<br />

) About<br />

: About<br />

أحفظ البرنامج واضغط على الزر حول لمشاهدة النتائج<br />

13


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

1 نضيف العنصر<br />

http://www.alshater.net<br />

:<br />

)<br />

( لوح Panel<br />

AlTop<br />

Align<br />

من القائمة<br />

)<br />

Standard ولنعطه الخصائص التالية<br />

تجعل العنصر يتوضع في أعلى النافذة وعلى عرضها بشكل كامل<br />

سيتم شرح قيم هذه الخاصة قريب ًا<br />

(<br />

" "<br />

185<br />

bvLowered<br />

Caption<br />

Height<br />

BevelOuter<br />

تحديد عنوان للزر<br />

تحديد ارتفاع<br />

اللوح<br />

تحديد طريقة عرض الحد الخارجي للوح<br />

حاول إعطاء قيمة ما لخاصة Width ستلاحظ أنها لا تتغير وذلك لأن الخاصة<br />

2 نضيف زر<br />

Button ونعطه الخواص التالية<br />

Align مفعلة<br />

:<br />

BtnClose<br />

Name<br />

Caption<br />

Top<br />

إغلاق<br />

192<br />

إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />

تحديد عنوان للزر<br />

تحديد بعد الزر عن أعلى النافذة<br />

)<br />

112<br />

Left<br />

تحديد بعد الزر عن يسار النافذة<br />

)<br />

بكسل)‏<br />

بكسل<br />

3 نضيف عنصر الصورة Image من الصفحة Additional فوق العنصر<br />

(<br />

Panel<br />

picture<br />

أي صورة<br />

إعطاء صورة للعنصر يمكن أختيار أي صورة مرغوبة<br />

صورة من المجلد<br />

يمكن أخذ )<br />

:<br />

C:\Program Files\Common Files\Borland Shared\Images<br />

\Splash\256Color<br />

True<br />

Stretch<br />

إظهار كامل الصورة داخل العنصر<br />

Image<br />

0<br />

Top<br />

تحديد بعد الزر عن أعلى النافذة<br />

)<br />

0<br />

Left<br />

تحديد بعد الزر عن يسار النافذة<br />

3 نضيف عنصرين من النوع Label فوق العنصر<br />

)<br />

بكسل)‏<br />

( بكسل<br />

Panel<br />

Label1<br />

Caption<br />

Top<br />

Left<br />

font<br />

تغير الألوان<br />

24<br />

168<br />

Label2<br />

Caption<br />

نغير الخط ونعطيه اللون الأزرق<br />

: إعداد وتنفيذ<br />

88<br />

212<br />

Top<br />

Left<br />

Font<br />

نعطي الخط اللون الأحمر<br />

ونعطي الخصائص التالية:‏<br />

نضغط مرتين على الزر BtnClose ونكتب التعليمة Close في محرر شيفرة ، ثم نحفظ المشروع وننفذه<br />

.<br />

14


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

.<br />

أصبح الوقت ملائما ً الآن للتعرف على الوحدة<br />

الجلسة الثالثة<br />

Unit بشكل مفصل<br />

تتألف الوحدة سواء كانت مرتبطة بشكل أم لا من الأجزاء التالية<br />

:<br />

unit Unit Name ;<br />

interface<br />

uses<br />

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />

Dialogs;<br />

type<br />

TForm1 = class(TForm)<br />

private<br />

{ Private declarations }<br />

public<br />

{ Public declarations }<br />

end;<br />

var<br />

Form1: TForm1;<br />

implementation<br />

end.<br />

1 يبدأ رأس الوحدة بالكلمة المحجوزة Unit يليها مباشرة أسم الوحدة ) NewColors ( .<br />

في مثالنا<br />

قسم الاتصال الخارجي : Interface<br />

الذي يحدد بداية منطقة الاتصال الخارجي ، أي المنطقة من الوحدة التي يمكن أن تراها وحدات أخرى من وحدات<br />

التطبيق وفيه :<br />

القسم أ <br />

: Uses توضع فيه جميع أسماء الوحدات التي تتعامل معها الوحدة سواء كانت الوحدات الخاصة<br />

بال<strong>دلفي</strong> أو الوحدات التي أنشأها المبرمج<br />

) عند إضافة عناصر جديدة على النموذج تقوم <strong>دلفي</strong> بإضافة الوحدة<br />

التابعة لهذا العنصر بشكل تلقائي ( .<br />

ب القسم<br />

تعرف الوحدة هنا صنفا ً جديدا ً موروثا ً من النوع ) TForm صنف النموذج<br />

، يضاف إلى<br />

(<br />

: Type<br />

Type للوحدة<br />

الصنف الجديد أسماء جميع العناصر والأحداث المضافة إلى الوحدة )<br />

قارن بين القسم<br />

NewColors والوحدة ( AboutUnit ويتضمن القسم Type الجزأين :<br />

: Private وتوضع فيه المتحولات الخاصة بالوحدة نفسها.‏<br />

(<br />

وتوضع فيه المتحولات العامة<br />

) من أجل أن تتبادل الوحدة المعلومات مع الوحدات الأخرى<br />

: Public<br />

وسيشرح هذين الجزأين بشكل مفصل فيما بعد ، ينتهي القسم Type بالتعليمة .end;<br />

TForm1 ويشير Form1 إلى<br />

(<br />

)<br />

ج القسم : Var<br />

يتم فيه تعريف عن هدف<br />

اسمه غرض<br />

Form1 من النوع<br />

النموذج الذي نضيف له العناصر أثناء التنفيذ<br />

.<br />

15


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

قسم التنفيذ<br />

: implementation<br />

يمكن أن يحتوي هذا القسم على تصريحات عن توابع وإجراءات ومتحولات خاصة بالوحدة نفسها بالإضافة إلى<br />

ملاحظة<br />

جميع التوابع والإجراءات المستخدمة داخل الوحدة<br />

.<br />

:<br />

قد يكون الجزء السابق صعبا ً بعض الشيء لكنه ضروري لمتابعة العمل مع <strong>دلفي</strong> كما أننا سنتعرف عليه<br />

بشكل أكبر كلما دعت الحاجة إلى ذلك<br />

.<br />

سنعمل الآن على كتابة تطبيقات بسيطة الهدف منها التعرف على عناصر جديدة وخصائصها<br />

1 التعرف على صندوق الاختيار checkbox من القائمة<br />

ابدأ مشروع جديدا ً وصغر حجم النموذج قليلا ً وأضف أليه عنصر<br />

الزر<br />

:<br />

: Standard<br />

: checkbox وعنصر Button<br />

اختر العنصر checkbox1 من محرر الخواص واعطه الخاصة<br />

: Caption ‏"أظهر الزر "<br />

ثم انتقل إلى الصفحة Event واختر منها الحدث<br />

محرر الشيفرة اكتب فيه السطر التالي<br />

OnClick فيظهر<br />

:<br />

if checkbox1.Checked then button1.Visible := true else button1.Visible := false ;<br />

الخاصة<br />

16<br />

Checked للعنصر<br />

والقيمة False في حال اختفاء الإشارة السابقة<br />

نفذ البرنامج وشاهد النتائج<br />

.<br />

.<br />

3 التعرف على عنصر صندوق اللائحة<br />

checkbox تعيد القيمة True في حال تم إظهار إشارة في صندوق الاختيار<br />

ListBox<br />

يظهر هذا الصندوق قائمة بنصوص تم إدخالها أثناء التصميم<br />

أو أثناء التنفيذ<br />

من القائمة<br />

: Standard<br />

:<br />

قم بإنشاء مشروع جديد وأضف إليه صندوق نص<br />

وصندوق لائحة<br />

( Edit )<br />

( ListBox )<br />

( Button )<br />

أ أثناء التصميم<br />

كما في الشكل المرفق<br />

وثلاثة أزرار<br />

:<br />

:<br />

باختيار الخاصة Items من محرر<br />

الخواص تظهر نافذ يمكن أن نكتب فيها سطور القائمة<br />

" مثلا ً أدخل<br />

الجلسة الثانية<br />

ب أثناء التنفيذ<br />

" الجلسة الأولى<br />

في السطر الأول و<br />

"<br />

"<br />

في السطر الثاني<br />

.<br />

:<br />

أضغط مرتين على الزر Button وأضف السطر التالي<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تقوم التعليمة السابقة بإضافة النص المكتوب في صندوق النص إلى صندوق اللائحة<br />

لحذف سطر واحد من عنصر اللائحة نضغط على الزر الثاني ونضيف السطر التالي<br />

تقوم هذه التعليمة بحذف السطر الذي تم اختياره من اللائحة .<br />

كذلك لحذف عناصر اللائحة أثناء التنفيذ اضغط على الزر الثالث مرتين واكتب السطر التالي<br />

تقوم هذه التعليمة بمسح صندوق اللائحة بالكامل.‏<br />

4 التعرف على أزرار الراديو<br />

http://www.alshater.net<br />

Listbox1.items.add (edit1.text);<br />

(<br />

)<br />

نفذ البرنامج وشاهد النتائج<br />

:<br />

listbox1.DeleteSelected ;<br />

:<br />

Listbox1.items.clear ;<br />

: ( RadioButtons<br />

)<br />

تعتبر أزرار الراديو مشابهة لعنصر صندوق الاختيار وتختلف عنه أنه<br />

لا يمكن اختيار زري راديو بنفس الوقت أي أنه أمام المستخدم اختيار<br />

زر واحد من بين الأزرار الظاهرة على النموذج.‏<br />

كمثال على ذلك<br />

:<br />

أبدأ مشروعا ً جديدا ً وأضف إليه ثلاثة أزرار راديو كما في الشكل<br />

أعط الزر الثالث الخاصة<br />

:<br />

Checked القيمة<br />

اللون . ClCream<br />

أضغط مرتين على الزر الأول وأضف التعليمة التالية<br />

وأضف التعليمة التالية للزر الثاني<br />

وللزر الثالث التعليمة<br />

:<br />

True وأعط النموذج<br />

form1.Color := clred;<br />

form1.Color := clblue;<br />

form1.Color := clcream;<br />

:<br />

:<br />

نفذ البرنامج وشاهد النتائج<br />

.<br />

5 التعرف على صندوق المجموعة<br />

: GroupBox<br />

في المثال السابق لنفرض أننا نريد إضافة مجموعة جديدة من أزرار الراديو لتغير لون الخط في النموذج<br />

الأزرار السابقة تغير لون النموذج<br />

)<br />

(<br />

، فإذا أضفنا زرين آخرين على النموذج فلا يمكننا تغير الخط واللون معا ً<br />

لأنه لا يمكن اختيار زري راديو في نفس الوقت ، وهنا يأتي دور صندوق المجموعة حيث<br />

كانت<br />

يؤمن هذا الصندوق<br />

ربطا ً بين أزرار الراديو بداخله فقط دون التأثير على أزرار الراديو خارجه ، كما يوضح المثال التالي<br />

أضف صندوق مجموعة للمثال السابق وضع عليه زرين راديو كما في الشكل<br />

وأضف التعليمة التالية للزر الأول داخل الصندوق<br />

:<br />

form1.Font.Color := clgreen;<br />

form1.Font.Color := clyellow<br />

والتعليمة التالية للزر الآخر :<br />

17


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التعامل مع الأحداث<br />

: ( Events )<br />

يوجد لكل عنصر في <strong>دلفي</strong> مجموعة من الأحداث التي يمكن أن ينفذها ، تعرفنا مثلا ً على الحدث<br />

OnClick للزر<br />

) Button<br />

عند الضغط مرتين على الزر يتم تفعيل الحدث Onclick ويظهر معالج الشيفرة لكتابة التعليمات التي<br />

تبين كيفية تعامل البرنامج مع هذا الحدث ‏)،سنتعرف الآن على مجموعة جديدة من الأحداث.‏<br />

1 الحدث<br />

: OnMouseMove<br />

يشرين على مكان وجود الفأرة حيث<br />

عنوان النافذة وكمثال على ذلك<br />

يعمل هذا الحدث عن مرور الفأرة فوق العنصر ويعيد احداثيات<br />

X = left أي بعد الفأرة عن اليسار،‏ و<br />

( x,y<br />

)<br />

:<br />

أنشاء مشروع جديد وضع على عنصر<br />

اليسار ‏،والآن حدد النموذج<br />

الخاصة<br />

( Form1<br />

)<br />

y = top أي بعد الفأرة عن شريط<br />

الذين<br />

Label الأول في الأعلى وفي أقصى اليمين والثاني في الأسفل وفي أقصى<br />

اختر محرر الخواص وانتقل إلى الصفحة<br />

ف ُيظهر محرر الشيفرة التابع<br />

Event واضغط مرتين على<br />

:<br />

OnMouseMove<br />

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br />

Y: Integer);<br />

:<br />

label1.Caption := inttostr(x);<br />

label2.Caption := inttostr(y);<br />

.<br />

لنكتب بين السطرين Begin وEnd التعليمات التالية<br />

نفذ البرنامج<br />

2 الحدث<br />

السابق ، كمثال عليه<br />

: OnMouseDown<br />

حدد النموذج :<br />

Event واضغط مرتين على الخاصة<br />

)<br />

يعمل هذا الحدث عن الضغط على زر الفأرة ويعيد الإحداثيات كما في الحدث<br />

( Form1<br />

من المثال السابق اختر محرر الخواص وانتقل إلى الصفحة<br />

OnMouseDown فيظهر محرر الشيفرة أكتب فيه التعليمات التالية<br />

:<br />

label1.Left := x;<br />

label1.Top := y -10;<br />

label2.Left := x+20;<br />

label2.Top := y-10;<br />

18


http://www.alshater.net<br />

)<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تعمل هذه التعليمات على وضع عنصري العنوان<br />

Label في مكان الضغط على الفأرة ،<br />

تم إضافة وطرح الأرقام<br />

. (<br />

من X و<br />

y فقط لإظهار النتائج بشكل أفضل<br />

:<br />

5 الحدث<br />

: OnMouseLeave يعمل هذا الحدث عند ابتعاد الفأرة عن العنصر<br />

أضف عنصر<br />

التالية:‏<br />

Label جديد إلى الشكل السابق وحدد الحدث<br />

OnMouseMove لهذا العنصر واكتب التعليمة<br />

label3.font.color := clblue;<br />

ثم حدد الحدث OnMouseLeave واكتب التعليمة التالية :<br />

نفذ البرنامج ولاحظ أنه عند مرور الفأرة من فوق العنصر Label3 يتحول إلى اللون الأزرق ثم يعود إلى لونه<br />

الأسود عن مغادرة الفأرة له.‏<br />

Label3.font.color := clblack;<br />

:<br />

4 الحدث : On DblClick<br />

يعمل هذا الحدث عند الضغط مرتين على العنصر<br />

Close;<br />

On DblClick واكتب التعليمة :<br />

حدد العنصر<br />

Label3 ثم أختر الحدث<br />

نفذ البرنامج واضغط مرتين على العنصر<br />

Label3 للخروج من البرنامج<br />

.<br />

19


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الرابعة<br />

التعامل مع واجهة ال<strong>دلفي</strong> :<br />

1 إضافة عدة نسخ من العنصر نفسه :<br />

يمكن إضافة عدة نسخ من العنصر نفسه وذلك بالضغط على المفتاح<br />

Shift من لوحة المفاتيح وإبقاؤه مضغوطا ً<br />

حتى نختار العنصر المراد إضافته من لوحة العناصر،‏ عندئذٍ‏ يظهر مربع أزرق يحيط بأيقونة العنصر ضمن لوحة<br />

العناصر ، ننقر الآن فوق النموذج ليظهر العنصر وفي كل مرة ننقر على النموذج تظهر نسخة أخرى من العنصر<br />

نفسه ، لإيقاف العملية نضغط أيقونة المؤشر ضمن لوحة العناصر ليختفي الصندوق الأزرق حول العنصر ، كمثال<br />

على ذلك اضغط على العنصر<br />

Label بمؤشر الفأرة مع الضغط على المفتاح<br />

shift انقل الفأرة إلى النموذج<br />

واضغط عدة مرات .<br />

2 التحكم بمكان العنصر وحجمه على النموذج من لوحة المفاتيح :<br />

كما رأينا يمكن التحكم بهذه الخواص بدقة عن طريق محرر الخواص ولكن هناك طريقة أخرى ومفيدة للتحكم بهذه<br />

الخواص .<br />

أ تحريك العنصر :<br />

أختر العنصر المراد تحريكه اضغط على المفاتح<br />

+ Ctrl أزرار الأسهم فسيتم نقل العنصر باتجاه السهم المضغوط<br />

.<br />

، ولتحريك العنصر بسرعة أكبر أستخدم الأزرار + Ctrl + Shift<br />

أزرار الأسهم<br />

ب تغير حجم العنصر :<br />

اختر العنصر المراد تغير حجمه واضغط على المفتاح<br />

+ Shift أزرار الأسهم وسيتم التكبير أو التصغير حسب<br />

السهم المضغوط .<br />

3 اختيار أكثر من عنصر في نفس الوقت :<br />

يمكن أن نختار أكثر من عنصر على نموذج في نفس الوقت على عن طريق الضغط على العنصر الأول ومن ثم<br />

الضغط على العنصر الثاني مع مفتاح<br />

، وعند تنفيذ هذه العملية تظهر في محرر الخواص<br />

Shift وهكذا ...<br />

الخواص المشتركة للعناصر المختارة<br />

عند أختيار عنصرين الأول<br />

Label والثاني Edit ستظهر الخواص<br />

)<br />

( Caption, Text<br />

المشتركة مثل top, ... Width, Height, left,<br />

، وستختفي بعض الخواص مثل<br />

رصف العناصر :<br />

يمكننا رصف العناصر نسبيا ً وفق بعضها البعض ، أو نسبيا ً وفق الشكل وذلك من خلال اختيار العنصر المراد<br />

رصفه ومن ثم استخدام لوحة الرصف<br />

Alignment palette من القائمة View أو Alignment من القائمة<br />

: Edit<br />

أ لوحة الرصف : Alignment palette<br />

كل زر في هذه اللوحة له مهمة ما وسيتم شرح كل منها على حدة :<br />

ترصف جميع العناصر المختارة إلى الجهة اليسارية لأول عنصر تم اختياره<br />

20<br />

.<br />

نفس العمل السابق ولكن الرصف يتم للجهة اليمينية


http://www.alshater.net<br />

)<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ترصف العناصر جميع العناصر المختارة إلى<br />

منتصف العنصر الأول الذي تم اختياره بشكل أفقي<br />

تجعل<br />

جميع العناصر على عمود واحد (<br />

نفس عمل الزر السابق ولكن الرصف يتم بشكل عمودي،(تجعل جميع العناصر المختارة على صف واحد).‏<br />

تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل أفقي .<br />

تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل عامودي .<br />

تجعل المسافة بين العناصر الأفقية متساوية<br />

) تثبت العنصر الأول والأخير وتحرك العناصر التي بينهما<br />

لتأخذ مسافات متساوية .<br />

نفس الخاصة السابقة للعناصر العامودية .<br />

.<br />

.<br />

تحريك العناصر إلى نفس الناحية السفلية لأول عنصر تم اختياره<br />

تحريك العناصر إلى نفس الناحية العلوية لأول عنصر تم اختياره<br />

:<br />

ب : Alignment<br />

أختر<br />

Align من القائمة<br />

Edit ستظهر النافذة التالية<br />

عمل هذه النافذة يشبه عمل النافذة السابقة ولكن تم<br />

الاستعاضة عن الأيقونات بأزرار راديو ليتم الاختيار<br />

منها.‏<br />

تثبيت موقع العناصر :<br />

بعد أن نعطي العناصر مواقعها يمكننا تثبيت هذه المواقع لكي لا تتحرك العناصر بطريق الخطأ وذلك عن طريق<br />

اختيار العنصر ومن ثم استخدام الأمر<br />

Lock Controls من القائمة ، Edit عندها لن نستطيع تحريك هذه<br />

العناصر حتى نختار نفس الأمر مرة أخرى .<br />

قص ونسخ ولصق العناصر :<br />

يمكن قص أو نسخ العناصر ولصقها على نفس النموذج أو على نموذج آخر عن طريق اختيار العناصر وقصها او<br />

:<br />

نسخها عن طريق الأوامر Cut أو<br />

Copy في القائمة<br />

Edit ولصقها عن طريق الأمر<br />

Paste من نفس القائمة<br />

ملاحظة العنصر الملصق يأخذ جميع خصائص العنصر الأصل بالإضافة إلى جميع أحداثه .<br />

عنوان البرنامج :<br />

يمكن وضع عنوان للبرنامج<br />

عنوان البرنامج يظهر على شريط المهام بقرب أيقونة البرنامج<br />

( أختر الأمر<br />

)<br />

Application<br />

File Options وانتقل إلى الصفحة وانتقل إلى الصفحة<br />

Application ‏،واكتب في القسم<br />

النص الذي تريد،‏ نفذ البرنامج ولاحظ العنوان على شريط مهام ويندوز<br />

.<br />

Title قرب setting<br />

21


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أيقونة برنامج :<br />

)<br />

(<br />

تعلمنا سابقا ً تغير أيقونة نافذة )<br />

نموذج<br />

وسنتعلم الآن تغير أيقونة البرنامج<br />

أيقونة البرنامج هي نفس أيقونة الملف<br />

EXE الذي ينتج عند تنفيذ البرنامج وتظهر أيقونة البرنامج على شريط المهام وفي أي اختصار يوضع للبرنامج )،<br />

Load<br />

من نفس الصفحة السابقة Project Options انتقل إلى الصفحة<br />

Application ‏،اضغط على الزر<br />

Icon<br />

واختر أيقونة جديدة للبرنامج<br />

نفذ البرنامج ولاحظ النتائج<br />

) يمكن اختيار أيقونات من الفهرس<br />

C:\Program Files\Common Files\Borland Shared\Images\Icons<br />

.<br />

صناديق الرسائل :<br />

أ الصندوق : ShowMessage<br />

يستخدم الإجراء<br />

string) showmessage S) : لإظهار رسالة للمستخدم حيث تظهر نافذة صغيرة تحوي نص<br />

الرسالة وعلى الزر<br />

Ok فقط ويكون عنوان هذه النافذة هو أسم الملف التنفيذي للبرنامج<br />

كمثال على ذلك أنشأ مشروعا ً جديدا ً وأضف إليه<br />

Button وأضف التعليمة التالية عند حدث<br />

الضغط على الزر :<br />

نفذ البرنامج واضغط على الزر لتشاهد صندوق الرسالة<br />

‏;('أهلا ً بكم مع <strong>دلفي</strong>')‏showmessage<br />

ب الصندوق : MessageDlg<br />

هذا الصندوق يشبه الصندوق السابق ولكنه يتوقع من المستخدم أن يعيد قيمه للبرنامج من خلال الضغط على أزرار<br />

هذا الصندوق فرضا ً سيقوم البرنامج بتنفيذ تعليمات معينة إذا ضغط المستخدم على الزر<br />

Yes وتعليمات أخرى في<br />

حال الضغط على الزر ، NO يتم استدعاء هذا الصندوق عن طريق التابع التالي<br />

حيث<br />

:<br />

Function MessageDlg(const Msg: string ; DlgType: TMsgDlgType; Buttons:<br />

TMsgDlgButtons ; HelpCtx: Longint): Word<br />

.<br />

: Msg<br />

نص الرسالة المطلوب إظهارها<br />

: Dlgtype تحديد نوع لصندوق الرسالة ويأخذ أحدى القيم التالية :<br />

: mtWarning يظهر في صندوق الرسالة أيقونة على شكل مثلث أصفر له إشارة تعجب .<br />

.<br />

: mtError يظهر في صندوق الرسالة أيقونة على شكل دائرة حمراء داخلها إشارة ×<br />

.<br />

يظهر في صندوق الرسالة أيقونة على شكل<br />

! داخلها إشارة تعجب<br />

: mtInformation<br />

داخلها إشارة ? .<br />

: mtConfirmation<br />

: mtCustom<br />

يظهر في صندوق الرسالة أيقونة على شكل<br />

لا يظهر في صندوق الرسالة أيقونة<br />

!<br />

.<br />

يعتمد نوع صندوق الرسالة على نوع الرسالة المراد إظهارها للمستخدم هل هي للتنبيه أو لإعلام المستخدم<br />

بحصول خطأ ما أو إعطاءه معلومة جديدة .... .<br />

: Buttons<br />

تحدد الأزرار التي ستظهر في صندوق الرسالة وتأخذ القيم التالية :<br />

22


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

mbYes,mbNo,mbOK,mbCancel,mbAbort,mbRetry,mbIgnore,mbAll,mbNoToAll,mbYesT<br />

oAll, mbHelp<br />

توضع الأزرار بين قوسين ] [ وتوضع بينهما فاصلة .<br />

:HelpCtx<br />

توضع فيه رقم السطر في ملف المساعدة المرتبط مع الزر<br />

يعيد التابع قيمة تتبع للزر الذي ضغط عليه المستخدم حسب الجدول<br />

التالي<br />

)<br />

سيشرح ملف المساعدة<br />

*.HLP لاحقا ً .(<br />

:<br />

أي أنه عند الضغط على الزر OK سيعيد التابع القيمة<br />

mrok<br />

.<br />

وهكذا<br />

مثال<br />

.<br />

: ( 1 )<br />

أبدأ مشروعا ً جديدا ً وضع عليه الزر<br />

:<br />

Button واكتب التعليمة التالية<br />

عند حدث الضغط عليه<br />

if MessageDlg(' تريد إغلاق البرنامج mtConfirmation‏,'هل<br />

,[mbyes,mbno],0)= mryes then close;<br />

تظهر هذه التعليمة الصندوق التالي مع<br />

الزرين<br />

مثال<br />

Yes وNo وتغلق البرنامج في<br />

حال تم الضغط على زر<br />

. Yes<br />

: 2<br />

أضف زر جديد إلى المشروع السابق<br />

عليه:‏<br />

واكتب التعليمة التالية عند حدث الضغط<br />

messagedlg( ' ‏(‏mterror,[mball,mbyestoall,mbNoToAll,mbIgnore],0‎‏,'تجربة ;<br />

3 الصندوق : InputBox<br />

يظهر هذا الصندوق على شكل نافذة فيها عنصر Edit مع الزرين<br />

حيث<br />

Cancel وله الشكل التالي<br />

:<br />

Ok و<br />

InputBox( const ACaption, APrompt, ADefault: string ): string ;<br />

.<br />

: ACaption<br />

: Aprompt<br />

نص الرسالة<br />

هو عنوان الصندوق<br />

.<br />

: ADefault<br />

قيمة افتراضية تظهر في الصندوق<br />

يعيد التابع النص المدخل في العنصر<br />

مثال<br />

mbOK<br />

mbCancel<br />

mbYes<br />

mbNo<br />

mbAbort<br />

mbRetry<br />

mbIgnore<br />

mbAll<br />

mrOk<br />

mrCancel<br />

mrYes<br />

mrNo<br />

mrAbort<br />

mrRetry<br />

mrIgnore<br />

mrAll<br />

mrNoToAll<br />

mbNoToAll<br />

mbYesToAll mrYesToAll<br />

:<br />

'<br />

.<br />

. Edit<br />

:<br />

أضف زر جديد إلى المشروع السابق واكتب التعليمة التالية<br />

‏;('جديد ',' أدخل أسما ً جديدا ً للنموذج ‏,'تغير عنوان النموذج')‏inputbox form1.Caption =:<br />

23


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الخامسة<br />

التعرف على عنصر المذكرة<br />

24<br />

: Memo<br />

يستخدم عنصر المذكرة لكتابة نص طويل<br />

أكثر من )<br />

256 حرف (<br />

كما يمكن فيه كتابة نص من عدة سطور<br />

.<br />

تتم الكتابة في المذكرة أثناء التصميم عن طريق الخاصة Lines في محرر الخواص ‏،كما لها بعض الخصائص<br />

: المهمة مثل<br />

: WordWrap<br />

: WantTabs<br />

في حال كانت قيمة هذه الخاصة True يقوم المؤشر بالإنتقال إلى السطر التالي عند الوصول<br />

إلى آخر السطر الحالي .<br />

في حال كانت قيمة هذه الخاصة True فإنه ستتم إضافة 6 فراغات عند الضغط على الزر<br />

أثناء التنفيذ<br />

Tab<br />

Enter<br />

.<br />

: Wantreturns<br />

في حال كانت قيمة هذه الخاصة<br />

وستتم الكتابة على سطر واحد في حال قيمتها<br />

True سيتم إضافة سطر جديد عند الضغط على الزر<br />

. False<br />

: ReadOnly<br />

: Alignment<br />

في حال كانت قيمة هذه الخاصة True لا يمكن الكتابة في العنصر أثناء التنفيذ .<br />

تظهر طريقة عرض النص في المذكرة وتأخذ إحدى القيم التالية<br />

:<br />

: taRightJustify<br />

يظهر النص في الجهة اليمينية(‏ في حال كانت الخاصة<br />

( bdRightToLeft تساوي BiDiMode<br />

: taLeftJustify<br />

مثال<br />

يظهر النص في الجهة اليسارية<br />

)<br />

( bdRightToLeft تساوي BiDiMode<br />

: taCenter<br />

يظهر النص في وسط العنصر<br />

.<br />

:<br />

أنشئ مشروعا ً جديدا ً وأضف إليه عنصر مذكرة<br />

في حال كانت الخاصة<br />

Memo وزرين<br />

Caption ‏"حفظ "<br />

واكتب التعليمة التالية بعد الضغط عليه<br />

تقوم هذه التعليمة بحفظ النص المكتوب داخل عنصر المذكرة<br />

Button ‏،أعط الزر الأول الخاصة<br />

:<br />

Memo1.Lines.SaveToFile( 'c:\a.txt') ;<br />

)<br />

(<br />

. ( a.txt<br />

أعط الزر الثاني الخاصة<br />

" Caption<br />

فتح<br />

تقوم هذه التعليمة بتحميل النص من الملف<br />

التعرف على عنصر الزر<br />

"<br />

)<br />

‏(أثناء التنفيذ<br />

واكتب التعليمة التالية بعد الضغط عليه<br />

المذكور اسمه بين القوسين<br />

إلى الملف المحدد بين القوسين<br />

هنا<br />

:<br />

Memo1.lines.LoadFromFile ('c:\a.txt') ;<br />

. (<br />

: Bitbtn<br />

يشبه هذا العنصر عنصر الزر إلى حد بعيد ويختلف عنه في<br />

1 إمكانية تغير لون خط العنوان<br />

:<br />

. ( Caption )<br />

2 إمكانية إضافة صورة لهذا الزر وذلك عن طريق<br />

أ الصور الافتراضية الموجودة في الخاصة<br />

:<br />

. Kind<br />

إلى المذكرة


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ب الخاصة Glyph التي يمكن أن نختار منها صورة ما للزر يوجد بعض صور للأزرار في المجلد<br />

C:\Program Files\Common Files\Borland Shared\Images\Buttons<br />

يمكن تغير صورة الزر عند الضغط عليه باختيار الصورة Glyph عبارة عن ثلاث صور متجاورة بنفس الحجم<br />

)<br />

NumGlyph إلى<br />

كما في الصورة التالية :<br />

وتغير قيمة الخاصة<br />

، 3 حيث تكون الصورة الأولى للزر<br />

في الوضع الافتراضي والصورة الثانية في حالة كانت الخاصة Enabeled تساوي<br />

False والصورة الثالثة تظهر<br />

عند الضغط على الزر .<br />

: SpeedButton<br />

التعرف على<br />

الأزرار السريعة<br />

:<br />

هي عبارة عن أزرار تستخدم في أشرطة الأدوات ولها خصائص الزر<br />

BitBtn بالإضافة إلى الخصائص التالية<br />

1 : Flat تعطي مظهر مستوي للزر ويصبح المظهر ثلاثي البعد عند مرور الفأرة فوقه .<br />

<br />

GroupIndex ‏:عند إعطاء مجموعة من أزرار السرعة قيمة واحدة لهذه الخاصة أكبر من الصفر تعمل<br />

2<br />

هذه الأزرار كأزرار الراديو .<br />

مثال :<br />

Glyph<br />

أنشأ<br />

مشروعا ً جديدا ً وأضف أليه أربع أزرار<br />

Speedbutton أضف لكل زر صورة عن طريق الخاصة<br />

وأعط جميع الأزرار الخاصة GroupIndex القيمة<br />

1، نفذ البرنامج ولاحظ أنه لا يمكن لأكثر من زر من هذه<br />

المجموعة أن يكون مضغوطا ً في نفس الوقت .<br />

: ( MDI و SDI<br />

أنواع النماذج )<br />

:<br />

تقسم<br />

كل واجهات التطبيقات التي نصممها إلى نوعين هما<br />

واجهة الوثيقة الواحدة<br />

SDI أي إظهار نافذة واحدة<br />

.<br />

للبرنامج ‏،وواجهة الوثائق المتعددة : MDI<br />

وتعتمد على عدد من النوافذ الأبناء تظهر ضمن النافذة الأب<br />

يمكن تحديد نوع التطبيق الذي نصممه من خلال الخاصة FormStyle والتي تأخذ إحدى القيم التالية<br />

:<br />

FormStyle<br />

fsNormal<br />

fsMDIForm<br />

تنشئ شكلا ً وحيدا ً من النوع<br />

ملاحظات<br />

عملها<br />

SDI<br />

تنشئ شكلا ً أبا ً ‏(شكل رئيسي للتطبيق)‏ يمكن لهذا الشكل أن يحتوي على<br />

أشكال أخرى أثناء التنفيذ<br />

.<br />

تنشئ شكلا ً ولدا ً ، أي شكل ثانوي<br />

متعلق بشكل آخر<br />

تنشئ شكلا ً وحيدا ً يبقى ظاهرا ً في<br />

الأمام مهما كانت التطبيقات المفتوحة<br />

هذا الشكل سوف يحتوي من قبل<br />

الشكل الأب أثناء التنفيذ.‏<br />

fsMDIChild<br />

fsStayOnTop<br />

:<br />

وحتى نشرح كيف يستطيع الشكل الأب من النوع<br />

MDI أن يحتوي شكلا ً ولدا ً سنقوم بما يلي<br />

1 ننشئ مشروعا ً جديدا ً ونعطي الخاصة Formstyle للنموذج Form1 القيمة . fsMDIForm<br />

. fsMDIChild<br />

2 نضيف نموذج جديد للمشروع ونعطي الخاصة<br />

Formstyle له القيمة<br />

3 نفذ البرنامج ولاحظ أن النموذج الثاني يظهر ضمن حدود النموذج الأول ولا يمكن تحريكه خارجه<br />

.<br />

25


http://www.alshater.net<br />

: fsStayOnTop<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

المثال التالي يشرح الخاصة<br />

Formstyle للنموذج Form1 القيمة ، fsStayOnTop نفذ البرنامج<br />

ابدأ<br />

مشروعا ً جديدا ً وأعط الخاصة<br />

ولاحظ أن النافذة ستظهر على الشاشة ولا يمكن لأي نافذة أخرى الظهور فوقها<br />

) حاول مثلا ً فتح نافذة جهاز<br />

الكمبيوتر أو نافذة سلة المحذوفات ولاحظ أن هذه النوافذ ستظهر خلف نافذة البرنامج<br />

. (<br />

26


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إنشاء قوائم للنماذج<br />

تعطي القوائم طريقة سهلة للمستخدم للوصول إلى عدد من الأوامر وهناك نوعين من القوائم<br />

. ( Popup Menu<br />

)<br />

( Main Menu<br />

القائمة الرئيسية )<br />

والقائمة المنبثقة<br />

:<br />

القائمة الرئيسية Menu) ( Main :<br />

للقائمة الرئيسية الشكل التالي<br />

عناصر القوائم ضمن شريط القوائم<br />

أوامر القائمة<br />

أمر يفتح قائمة فرعية<br />

مفتاح تسريع<br />

اختصارات لوحة المفاتيح<br />

شريط فاصل<br />

مثال :<br />

Standered<br />

1 ابدأ مشروعا ً جديدا ً وأضف إلى النموذج عنصر<br />

MainMenu من القائمة<br />

:<br />

( Menu Desigenr<br />

2 افتح مصمم القوائم )<br />

عن طريق<br />

الخاصة<br />

Items من محرر الخواص أو الضغط مرتين على عنصر القائمة أو الضغط على العنصر بالزر<br />

اليميني<br />

Menu Item )<br />

واختر<br />

Menu Desigenr من القائمة عند ذلك سيظهر مصمم القوائم وفيه عنصر قائمة<br />

.<br />

فارغ مضاء وستضاء أيضا ً الخاصة<br />

Caption ضمن محرر الخواص<br />

(<br />

: (<br />

3 أعط الخاصة Caption القيمة )<br />

‏&ملف<br />

ستلاحظ ظهور عنصر القائمة ملف وظهور خط صغير تحت<br />

. Caption<br />

الحرف م في كلمة ملف وذلك لأننا وضعنا الرمز &<br />

قبل هذا الحرف في الخاصة<br />

. (<br />

)<br />

4 أعط الخاصة<br />

Caption للزر الظاهر تحت عنصر القائمة ملف القيمة<br />

‏&جديد<br />

. (<br />

5 وسيظهر عندها زر جديد تحت الزر السابق أعطه ) Caption<br />

‏&فتح<br />

.<br />

6 أعط ال Caption<br />

للزر الأخير القيمة<br />

– وذلك لإظهار خط فاصل بين أوامر القائمة<br />

27


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

7 أعط ال Caption لآخر زر ناتج القيمة<br />

http://www.alshater.net<br />

.<br />

28<br />

إغلاق &<br />

8 أختر عنصر القائمة الموجود بجانب العنصر ملف وأعطه ال<br />

9 أعط الزر الذي تحته ال Caption القيمة نسخ،‏ والخاصة<br />

بتنفيذ عملية الضغط على عنصر القائمة عند طريق استخدام لوحة المفاتيح<br />

10 أعط الزر التالي ال<br />

11 أعط الزر التالي ال<br />

إنشاء قائمة فرعية لقائمة رئيسية<br />

Caption ‏&تحرير .<br />

Shortcut القيمة Ctrl + c وتقوم هذه الخاصة<br />

.<br />

. Ctrl + X القيمة Shortcut قص ، والخاصة Caption<br />

. Ctrl + V القيمة Shortcut لصق ، والخاصة Caption<br />

:<br />

12 أعط الزر الذي يلي الزر لصق ال Caption نمط الخط ، اضغط عليه بزر الفأرة اليميني<br />

واختر Create SubMenu ستظهر عندئذ قائمة فرعية أعط فيها الأوامر الثلاث التالية<br />

غامق ، مائل ، تحته خط<br />

العمل مع عناصر القائمة<br />

:<br />

.<br />

:<br />

1 لحذف عنصر قائمة نختار أي عنصر ونضغط على الزر Delete أو نضغط بزر الفأرة الأيمن ونختار<br />

Delete من القائمة<br />

.<br />

2<br />

القائمة<br />

لإضافة عنصر جديد بين عنصرين نختار العنصر السفلي ونضغط بزر الفأرة الأيمن ونختار<br />

Insert من<br />

.<br />

3<br />

لتغيير موقع عنصر قائمة أو لإعادة ترتيب قائمة نسحب العنصر الذي نريد نقله<br />

العنصر ونبقيه مضغوطا ً<br />

)<br />

(<br />

ثم نحرر زر الفأرة ليتوضع في المكان الجديد<br />

.<br />

4 لإظهار عناصر قائمة متجاورين أفقيا ً نغير الخاصة Break لأمر القائمة المطلوب إلى<br />

نضغط بزر الفأرة على<br />

mbBreak<br />

أو إلى<br />

mbBarBreakوحيث تظهر الثانية خط عمودي بين الأوامر ، ولإعادة القائمة إلى الحالة الافتراضية نختار<br />

. mbNone<br />

حدث الضغط على عنصر قائمة<br />

:<br />

5<br />

تستخدم القوائم لتنفيذ تعليمات معينة ولكتابة هذه التعليمات نضغط على الأمر في القائمة أو نختاره ونضغط<br />

على الحدث OnClick من الصفحة Event في محرر الخواص<br />

.<br />

6<br />

غالبا ً ما تستخدم القوائم مع البرامج متعددة الوثيقة MDI ويمكن دمج قوائم النافذة الأبن مع نوافذ النافذة الأب<br />

وسندرس ذلك لاحقا ً.‏<br />

القائمة المنبثقة<br />

: ( Popup Menu )<br />

هي عبارة عن قائمة تظهر عند الضغط على زر الفأرة اليميني ويمكن ربطها مع النموذج أو أي عنصر آخر<br />

وتصميهما مشابه لتصميم القائمة الرئيسية<br />

مثال<br />

. Main Menu<br />

:<br />

أضف عنصري قائمة منبثقة PopUpMenu إلى مشروع جديد وأضف عنصر<br />

أضف إلى عنصر القائمة الأولى الأوامر التالية<br />

Panel كذلك .<br />

:<br />

الأمر الأول ، الأمر الثاني ، الأمر الثالث<br />

أضف إلى عنصر القائمة الثانية الأوامر التالية الرابع ، الخامس<br />

‏'لقد ضغطت على الأمر الأول من القائمة'‏ ‏'الأولى<br />

.<br />

.<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اضغط على الأمر الأول واكتب التعليمة التالية:‏<br />

اضغط على الأمر الثاني واكتب التعليمة التالية<br />

http://www.alshater.net<br />

Showmessage ( "you click the first button" );<br />

:<br />

Showmessage ( "you click over the second button " );<br />

اضغط على الرابع واكتب التعليمة التالية :<br />

Showmessage ("you click over the third button")<br />

:<br />

Showmessage ("you click over the fifth button" )<br />

. PopUpMenu1<br />

اضغط على الخامس واكتب التعليمة التالية<br />

اختر الخاصة PopUpMenu التابعة للنموذج وأعطها القيمة<br />

اختر الخاصة PopUpMenu التابعة لل Panel وأعطها القيمة<br />

نفذ البرنامج<br />

واضغط بزر الفارة الأيمن على كل من النموذج وال<br />

.PopUpMenu2<br />

. Panel<br />

إضافة ملاحظات إلى البرنامج<br />

29<br />

: ( Comments)<br />

يستخدم المبرمج الملاحظات ليتذكر عمل مقطع برمجي محدد ، وليترك فكرة عما يريد أن يطوره مستقبلا ً في<br />

سطور برمجية معينه<br />

.<br />

يمكن إضافة ملاحظات إلى البرنامج<br />

:<br />

1 }<br />

أكتب أي نص تريده بين هذين القوسين ، ويمكن أن يكون على عدة أسطر<br />

. {<br />

2 <br />

3 //<br />

(* أكتب أي نص تريده بين إشارتي القوس والنجمة ، ويمكن أن يكون على عدة اسطر<br />

أكتب أي نص تريده بعد هذين الإشارتين ، النص على سطر واحد فقط<br />

لكتابة الملاحظات في ال<strong>لغة</strong> العربية<br />

. (*<br />

.<br />

:<br />

properties<br />

القيمة<br />

اضغط بمؤشر الفأرة الأيمن في وسط محرر الشيفرة واختر من القائمة<br />

فتظهر النافذة Property Editors أختر منها الصفحة Display وغير الخاصة<br />

Editor Font إلى<br />

... Ok اضغط على ، Courier New ( Arabic)<br />

أنواع المعطيات<br />

تملك <strong>لغة</strong> باسكال الهدفية<br />

:Data Types<br />

(Object Pascal)<br />

:<br />

عدد ًا من أنواع المعطيات مسبقة التعريف بحيث تمكننا من التصريح<br />

مباشرة عن متحولات تنتمي لهذه الأنواع.‏ والجدول التالي يعرض أنواع المعطيات مسبقة التعريف في هذه ال<strong>لغة</strong>:‏<br />

الأنواع الصحيحة<br />

نوع المعطيات وصفها<br />

Integer<br />

Shortint<br />

Smallint<br />

هي أعداد بدون فاصلة عشرية.‏ تقع هذه الأعداد ضمن المجال من<br />

)<br />

(2147483647)<br />

، وتتطلب أربع بايتات من الذاكرة لتخزينها<br />

)<br />

2 بايت (<br />

‏-‏‎2147483648‎‏)وحتى<br />

كان حجمه في تربو باسكال<br />

لذلك ليس من الضروري ان تتطابق أنواع المعطيات بين <strong>دلفي</strong> و تربو باسكال)‏ .<br />

هي أعداد بدون فاصلة عشرية.‏ تقع في المجال بين<br />

من الذاكرة<br />

(128-)<br />

.<br />

وهي أعداد بدون فاصلة عشرية وتقع في المجال بين ‏(-‏‎32768‎‏)وحتى<br />

وحتى(‏‎127‎‏)‏ وتتطلب بايتا ً واحدا ً<br />

(32767)<br />

وتتطلب


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

بايتين من الذاكرة لتخزينها<br />

هي أعداد بدون فاصلة عشرية،‏<br />

وتقع في المجال بين(‏‎2147483648‎‏-)وحتى<br />

Longint<br />

‏(‏‎2147483647‎‏)وتتطلب أربع بايتات من الذاكرة لتخزينها<br />

هي أعداد بدون فاصلة عشرية وبدون إشارة تقع في المجال بين (0)<br />

وحتى<br />

‏(‏‎225‎‏)وتتطلب<br />

Byte<br />

بايتا ً واحدا ً من الذاكرة<br />

.<br />

هي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين<br />

‏(‏‎0‎‏)وحتى(‏‎65535‎‏)وتحتاج<br />

Word<br />

بايتين من الذاكرة.‏<br />

وهي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين(‏‎0‎‏)‏<br />

وحتى<br />

Cardinal<br />

(2147483647) وتحتاج أربع بايتات لتخزينها.‏<br />

2*10 63 -1<br />

)<br />

( -2*10 63<br />

وهي أعداد بدون فاصلة عشرية وتقع ضمن المجال )<br />

وحتى المجال<br />

Int64<br />

( وتحتاج إلى ثمان بايتات من الذاكرة<br />

الأنواع الحقيقية<br />

هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />

من<br />

) 8 ( أو ) 7 (<br />

1.5* 10 -45 وحتى<br />

10*3.4 38 وتحتاج إلى أربع بايتات من الذاكرة<br />

هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />

) 12 ( أو ) 11 (<br />

2.9*10 -39 إلى<br />

باسكال القديمة وإلا فإن استخدام<br />

أرقام وتقع في المجال<br />

وتقع ضمن المجال<br />

10*1.7 38 وهي تحتاج إلى ست بايتات من الذاكرة وتستخدم للتوافق مع نسخ<br />

Extended أو Double أولى<br />

هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />

) 16 ( أو ) 15 (<br />

5.0*10 -324 إلى<br />

10*1.7 308 وتحتاج إلى ثماني بايتات من الذاكرة<br />

هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />

.<br />

) 20 ( أو ) (19<br />

3.4*10 -4932 وحتى<br />

10*1.1 4932 وتحتاج إلى عشرة بايتات من الذاكرة<br />

وتقع ضمن المجال<br />

رقم وتقع في المجال<br />

وهي أعداد حقيقية ذات فاصلة ثابتة بخلاف باقي الأنواع ذات الفاصلة العائمة ، وهي ملائمة<br />

Single<br />

Real<br />

Double<br />

Extended<br />

Currency<br />

20 رقم (<br />

)<br />

( 19<br />

للحسابات المالية وتملك جزءا ً عشريا ً من )<br />

أو<br />

وتقع ضمن المجال<br />

922337203685477.5808- وحتى 922337203685477 ويتطلب تخزينها ثمان بايتات<br />

.<br />

هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />

أو ) (19<br />

) 20 ( رقم وتقع في المجال<br />

-9.2*10 18 وحتى<br />

10*9.2 18 وتحتاج إلى ثمان بايتات من الذاكرة<br />

.<br />

Comp<br />

30


http://www.alshater.net<br />

True أو False ويحتاج<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الأنواع البوليانية<br />

:<br />

Boolean<br />

هو نوع منطقي يمكن أن تأخذ المتحولات المنتمية إليه إحدى قيمتين<br />

إلى بايت واحد من الذاكرة<br />

.<br />

ByteBool مثل نوع Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى بايت واحد من<br />

الذاكرة<br />

مثل نوع<br />

مثل نوع<br />

الذاكرة<br />

Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى بايتين من الذاكرة<br />

Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى أربع بايتات من<br />

Wordbool<br />

Longbool<br />

الأنواع الرمزية :<br />

AnsiChar هو نوع رمزي يحتاج إلى بايت واحد من الذاكرة لتخزين شيفرة أسكي المقابلة لرمز معين<br />

) Unicode<br />

. Character<br />

WideChar هو نوع رمزي يحتاج إلى بايتين من الذاكرة لتخزين رمز بالشيفرة الموحدة<br />

الشيفرة الموحدة تم اعتمادها منذ فترة في أنظمة التشغيل Windows 2000,Xp وهي عبارة<br />

تمثيل يضم جميع لغات العالم<br />

)<br />

عدى لغات شرق آسيا<br />

(<br />

ويحتاج كل رمز فيها إلى<br />

هو نفس النوع AnsiChar تحت بيئة Windows 98,Me ولكنه قد يشير إلى<br />

16 بت .<br />

WideChar<br />

Char<br />

في بيئة . Windows 2000,Xp<br />

2 جيغا<br />

أنواع السلاسل الرمزية<br />

:<br />

AnsiString<br />

هو عبارة عن مصفوفة من الرموز غير محدودة الطول يبدأ حجمها<br />

بايت<br />

‎4‎بايت وينتهي ب<br />

وتبدأ رموزها من الحجرة الأولى<br />

) 1<br />

لا وجود للحجرة<br />

. ( 0<br />

هو عبارة عن مصفوفة من الرموز حدها الأقصى 256 رمز ويأخذ حجمها بين<br />

2 بايت و<br />

Sortstring<br />

( 0<br />

256 بايت ويخزن في الحجرة الأولى منها )<br />

الحجرة رقم<br />

طول المصفوفة<br />

هو عبارة عن مصفوفة من الرموز بالشيفرة الموحدة Unicode يبدأ حجمها ‎4‎بايت وينتهي<br />

ب 2 جيغا بايت وتبدأ رموزها من الحجرة الأولى<br />

) 1<br />

لا وجود للحجرة<br />

بشكل افتراضي تعريف متحول من هذا النوع يكافئ تعريف متحول<br />

. ( 0<br />

AnsiString أو<br />

WideString<br />

String<br />

WideString حسب نظام التشغيل ، ويمكن أن يشير<br />

إلى<br />

Shortstring في حال أضفنا<br />

{$H-}<br />

التعليمة التالية في بداية القسم implementation<br />

31


؛)‏<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

السلاسل الرمزية المنتهية بلا شيء<br />

http://www.alshater.net<br />

. ( Null )<br />

PAnsiChar<br />

هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز<br />

ورموز هذه السلسة من النوع<br />

Null<br />

AnsiChar<br />

PWideChar<br />

هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز<br />

ورموز هذه السلسة من النوع<br />

Null<br />

WideChar<br />

Pchar<br />

المؤشر<br />

نفس النوعين السابقين ويؤشر على النوع<br />

Char<br />

Pointer<br />

النوع المتنوع<br />

وهو مؤشر غير محدد النوع أي يؤشر إلى أي نوع من المعطيات ‏،ويحتاج إلى أربع حجرات<br />

. من الذاكرة<br />

( المتغير )<br />

Variant<br />

أمثلة<br />

نوع متغير متوافق مع جميع انواع المعطيات ويمكن أن يخزن قيما ً وفق أي نوع<br />

.<br />

:<br />

1 النوع<br />

: Boolean<br />

أنشأ مشروعا ً جديدا ً وأضف إليه زر<br />

Button وعنصري Edit وأكتب التعليمات التالية<br />

var a:Boolean;<br />

i,j:integer;<br />

begin<br />

i:=strtoint(edit1.text);<br />

j:= strtoint(edit2.text);<br />

a:= i>j;<br />

) ‏'العدد الثاني أكبر من ) else showmessage ‏'العدد اللأول أكبر من الثاني')‏ if a then showmessage<br />

2 النوع<br />

: Shortstring<br />

أضف زر وعنصري Label و عنصر Edit إلى مشروع جديد<br />

يقوم التابع<br />

Word بإعادة شيفرة الأسكي لرمز معين مثلا ً<br />

السلسة مخزن كرمز وليس كرقم<br />

الأول'‏<br />

واكتب التعليمات التالية عند الضغط على الزر<br />

:<br />

:<br />

var a:shortstring;<br />

begin<br />

a:=edit1.text;<br />

form1.Caption := inttostr(word(a[0]);<br />

if word(a[0]) >= 4 then<br />

label1.Caption := a[3]+a[4];<br />

Word('A') يساوي<br />

.<br />

65 واستخدم هذا التابع لأن طول<br />

32


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

السادسة<br />

2 النوع : String<br />

للحصول على طول سلسلة رمزية نستخدم التابع Length('s') حيث<br />

S هو السلسة المطلوب حساب طولها<br />

مثال :<br />

أضف زر وعنصر<br />

Edit إلى مشروع جديد واكتب التعليمات التالية عند حدث الضغط على الزر<br />

:<br />

var a:string;<br />

begin<br />

a:=edit1.text;<br />

label1.Caption := inttostr(length(A);<br />

label2.Caption :=inttostr(length('asdfgh');<br />

3 النوع<br />

label و<br />

: Pchar<br />

Var P:pchar;<br />

لنفرض أنه عرفنا متحول : Pchar<br />

P من النوع<br />

ثم كتبنا في القسم Begin التعليمة التالية<br />

p:=<br />

هذا يكافئ كتابة التعليمات التالية :<br />

'Hello<br />

;Form1.Caption := p<br />

s: string;<br />

begin<br />

s:= 'HELLO ALL......'#0 ;<br />

p:= @s[1];<br />

form1.Caption := p;<br />

:<br />

All…….'<br />

حيث #0 هو رمز الأسكي ل Null ووضعه هنا ينهي السلسلة<br />

. Null ب s<br />

@ يعيد عنوان موقع الذاكرة المخزن فيه الحرف الأول من السلسلة . s<br />

: Variant<br />

(<br />

4 النوع المتغير )<br />

المتنوع<br />

var v1,v2,v3 :variant;<br />

begin<br />

v1:= 5;<br />

v2:= 20;<br />

v3 := v1+v2 ;<br />

form1.Caption := v3;<br />

v1:= 5;<br />

v2:= 'asd';<br />

v3 := v1+v2 ;<br />

اكتب التعليمات التالية في حدث الضغط على زر<br />

التعليمات التالية تعطي رسالة خطأ من النوع<br />

ولكن التعليمات التالية لا تعطي هذا الخطأ<br />

: EvariantError<br />

:<br />

:<br />

v1:= 5;<br />

v2:= '123';<br />

v3 := v1+v2 ;<br />

33


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لماذا لا نستخدم النوع<br />

34<br />

Variant دائما ً :<br />

هذا لاحظ أن<br />

المتحول ضد التوجه العام ل<strong>لغة</strong> باسكال و ضد أعراف<br />

<strong>البرمجة</strong> الجيدة،‏ هذا النوع يتم فحص نوعه و يتم حسابه في وقت التشغيل،‏ والمجمع compiler لن يحذرك من<br />

احتمالات الأخطاء،‏ و التي لن يستدلّ‏ عليها إلا بعد اجراء اختبارات مكثفة،‏ بصورة عامة،‏ يمكنك اعتبار أجزاء<br />

الترجمة التي تستخدم<br />

هذا النوع هي ترجمة فورية<br />

،interpreted لأنه،‏ مثل أي<br />

<strong>لغة</strong> تفسيرية،‏ العديد من<br />

العمليات لا يمكن التقرير بشأنها وحل ّها إلا في وقت التشغيل،‏ هذا يؤثر بصفة خاصة في سرعة التنفيذ.‏<br />

المتحولات العامة والخاصة<br />

:<br />

يوجد في القسم Interface لكل وحدة قسم خاص بالمتحولات المستخدمة داخل الوحدة نفسها ويدعى<br />

private والمتحول المعرف في هذا القسم يمكن استخدامه في جميع إجراءات وتوابع هذه الوحدة لكن لا<br />

يمكن الوصول إليه من خارجها<br />

.<br />

وهناك قسم آخر يشبه القسم السابق ويختلف عنه بإمكانية الوصول إليه من وحدات خارجية مرتبطة مع الوحدة<br />

المعرف فيها هذا المستخدم ويدعى<br />

مثال<br />

. Public<br />

:<br />

أنشئ مشروعا ً جديدا ً وأضف إليه زرا ً وعرف في القسم Private المتحول التالي<br />

وعرف في القسم<br />

Public المتحول التالي<br />

private<br />

I :integer;<br />

public<br />

x:integer;<br />

:<br />

:<br />

أذهب إلى الحدث OnCreate الخاص بالنموذج واكتب فيه التعليمات التالية<br />

الحدث<br />

I := 4 ; X := 24;<br />

:<br />

) X,I<br />

OnCreate يتم تنفيذه عند يقوم ويندوز بإنشاء النافذة والتعليمات السابقة تعطي قيم ابتدائية للمتحولين<br />

لاحظ استخدام هذين المتحولين ضمن الإجراء<br />

يمكن استخدامها ضمن أي جزء من البرنامج<br />

الزر<br />

procedure TForm1.FormCreate أي<br />

. (<br />

:<br />

أضف نموذجا ً جديدا ً وأضف إليه زرا ً الآن اذهب إلى النموذج الأول واكتب التعليمة التالية في حدث الضغط على<br />

نفذ البرنامج حتى يتم ربط الوحدة الثانية مع الأولى بشكل آلي<br />

form2.Show ;<br />

)<br />

في حدث الضغط على الزر الموجود في النموذج الثاني أكتب التعليمة التالية<br />

أو اكتب أسم الوحدة الأولى في القسم<br />

. ( Uses<br />

:<br />

Form2.Caption := inttostr ( Form1.X) ;<br />

نفذ البرنامج لربط الوحدات مع بعضها آليا ً ثم نفذ البرنامج،‏ الزر في النافذة الأولى سيقوم بإظهار النافذة الثانية،‏<br />

والزر في النافذة الثانية سيأخذ القيمة X من الوحدة الأولى ويضعها في عنوان النافذة<br />

هناك طريقة أخرى لتعريف متحول خاص بالوحدة عن طريق تعريفه بالقسم<br />

ويتميز تعريف المتحول هنا بإمكانية إعطاء قيمة مبدئية له مباشرة<br />

Implementation<br />

.<br />

Var قبل<br />

.


:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

مثال عرف المتحولات التالية في القسم<br />

الثوابت<br />

قبل<br />

http://www.alshater.net<br />

Implementation Var<br />

Y: string = 'abcd'; F : double = 55;<br />

: Const<br />

الثابت هو حجرة من الذاكرة تحمل قيمة معينة طوال فترة تنفيذ البرنامج<br />

يمكن تعريف الثوابت خارج القسم<br />

في القسم<br />

:<br />

Type قبل<br />

Implementation فتكون ثوابت عامة ، ويمكن تعريفها<br />

Implementation وتكون ثوابت خاصة بالوحدة ‏.ويكون تعريفها بالطريقة التالية<br />

ويمكن تعريفها بطريقة أخرى<br />

الإجراءات والتوابع<br />

:<br />

Const<br />

pi=3.14;<br />

pi2=22/7;<br />

programmer = 'Khaled';<br />

Const<br />

Pi :Real = 3.14;<br />

pi2:single =22/7;<br />

programmer :string= 'Khaled';<br />

:<br />

:<br />

مبدئيا هي سلسلة من التعليمات تحت اسم خاص،‏ و التي يمكن تنفيذها في كل مرة باستخدام اسمها،‏ بهذه الطريقة<br />

تتجنب معاودة كتابة التعليمات مرة بعد أخرى،‏ فتتحصل على مجموعة واحدة من التعليمات يمكنك استدعائها في<br />

كامل البرنامج.‏<br />

في <strong>دلفي</strong> الإجرائية routine<br />

يمكن<br />

افتراضها بشكلين:‏<br />

إجراء procedure<br />

و تابع<br />

function<br />

نظريا،‏ يستخدم الإجراء عندما نريد من الحاسب القيام بعمل ما دون أن يعيد قيمة معينة ‏،والتابع هو عبارة عن<br />

إجراء ينفذ مجموعة من التعليمات ليعيد قيمة معينة يطلبها المبرمج<br />

،result قيمة مسترجعة،‏ بينما الإجراء ليس كذلك،‏ كلا<br />

متحولاتparameters<br />

، من أنواع بيانات<br />

تعطى لها .<br />

عمليا ً،‏ الفرق عموما بين التوابع و الإجراءات محدود جدا:‏ يمكنك<br />

‏(التي قد تكون رمز خطأ اختياري أو<br />

.<br />

هذا الفرق يؤك ّده<br />

حقيقة أن التابع له نتيجة<br />

النوعين من الاجرائيات يكمن أن يكون لهما عدة<br />

استدعاء تابع لإنجاز عمل ما ثم تتخط ّى النتيجة<br />

ما شابه)‏ كما بامكانك استدعاء إجراء يمرر نتيجته ضمن متحولاته.‏<br />

procedure Hello;<br />

begin<br />

35<br />

وهذا مثال لتعريف إجراء :<br />

وهذا مثال لتعريف تابع<br />

‏;('مرحبا ً بكم في <strong>دلفي</strong>')‏ ShowMessage<br />

end;<br />

function Double (Value: Integer) : Integer;<br />

begin<br />

Double := Value * 2;<br />

end;<br />

:


http://www.alshater.net<br />

Implementation<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تكتب هذه الإجراءات أو التوابع في القسم<br />

التالية في حدث الضغط على الزر الأول<br />

ولاستدعائها،‏ أضف زرين واكتب التعليمة<br />

Hello<br />

:<br />

Form1.caption := inttostr( Double(6));<br />

:<br />

والتعليمة التالية في حدث النقر على الزر الثاني<br />

المتحولات داخل إجراء أو تابع :<br />

1 الحالة العامة<br />

Procedure ProcedureName ( var1,var2,var3: anytype ;<br />

var4,var5:any type) ;<br />

Begin<br />

….<br />

…<br />

end;<br />

Procedure Add( x,y : integer) ;<br />

Begin<br />

Y:= x+y ;<br />

End;<br />

:<br />

var i,j:integer;<br />

begin<br />

i:=1;j:=2;<br />

add(i,j);<br />

label1.Caption := inttostr(i);<br />

label2.Caption := inttostr(j);<br />

.<br />

x إلى<br />

مثال :<br />

أضف زر وعنصري Label واكتب فيه التعليمات التالية<br />

يقوم هذا البرنامج باستدعاء التابع Add الذي يقوم بإضافة<br />

2 المتحولات<br />

y ولكنه لا يعيد أي نتيجة<br />

: ( )<br />

Procedure ProcedureName ( var1,var2,var3: anytype ;var<br />

var4,var5:any type) ;<br />

Begin<br />

….<br />

…<br />

end;<br />

مثال<br />

الوسطاء<br />

المتغيرة<br />

Add ليصبح كتالي ونفذ البرنامج<br />

procedure add(x:integer;var y:integer);<br />

begin<br />

y:= x+y;<br />

end;<br />

. j<br />

x إلى<br />

:<br />

عدل الإجراء<br />

يقوم البرنامج باستدعاء الإجراء<br />

Add الذي يقوم بإضافة<br />

y ولكنه يعيد قيمة y وبالتالي تتغير قيمة<br />

36


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ملاحظات<br />

http://www.alshater.net<br />

37<br />

:<br />

أ يمكن استدعاء الإجراء<br />

Add ( ولكن لا يمكن استدعائه بالشكل Add( (j,1 المعدل بالشكل Add<br />

(2,I أو بالشكل (1,2 Add( وذلك لأن الوسيط الثاني لهذا الإجراء يجب أن يكون متحول حتى تتم إعادة<br />

. النتيجة فيه<br />

ب قد يتبادر إلى الذهن هنا السؤال التالي بما أنني أريد من الإجراء أن يعيد قيمة ما فلماذا لا أستخدم تابع؟<br />

والجواب هنا أنه بهذه الطريقة يمكن أن يعيد الإجراء أكثر من قيمة بينما يعيد التابع قيمة وحيدة،‏ على كل حال هذه<br />

الطريقة يمكن أن تستخدم مع الإجراءات والتوابع على حد سواء أي انه يمكن أن نعرف تابع يعيد قيمة ما عن<br />

طريق إسمه وقيم أخرى عن طريق متحولاته<br />

3 الوسطاء الثابتة<br />

( . وسطاءه )<br />

:<br />

Procedure ProcedureName ( const var1,var2,var3: anytype ;<br />

var4,var5:any type) ;<br />

Begin<br />

….<br />

…<br />

end;<br />

عندما لا نكون بحاجة لتغير قيمة الوسيط ضمن التابع يمكن أن نعرفه من النوع الثابت<br />

في زيادة سرعة البرنامج<br />

.<br />

عدل التابع Add ليصبح بالشكل<br />

نفذ البرنامج ولن تلاحظ أي فرق في النتائج<br />

Const ولا يفيد ذلك إلا<br />

:<br />

procedure add(const x:integer;var y:integer);<br />

begin<br />

y:= x+y;<br />

end;<br />

أما إذا عدل البرنامج ليصبح بالشكل<br />

procedure add(const x:integer;const y:integer);<br />

begin<br />

y:= x+y;<br />

end;<br />

فسيعطي تنفيذ البرنامج رسالة الخطأ التالية<br />

Left side cannot be assigned to :<br />

.<br />

أنه لا يمكن إعطاء قيمة ل Y لأنها من النوع الثابت<br />

5 إجراءات القيمة الافتراضية<br />

.<br />

:<br />

يمكن إعطاء وسيط ما قيمة إفتراضية والاستغناء عن تمرير قيمه له عند الطلب<br />

وتعني<br />

:<br />

Procedure ProcedureName(var1,var2,var3: anytype ; var4:<br />

anytype = Value ; var5:anytype= value) ;<br />

Begin<br />

….<br />

…<br />

end;


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

مثال :<br />

عدل الإجراء<br />

Add ليصبح بالشكل<br />

الآن يمكن أن نطلب الإجراء Add بأحد الشكلين التاليين<br />

procedure add(var x:integer;var y:integer=5);<br />

begin<br />

x:= x+y;<br />

end;<br />

Add ( I,j) or Add( I )<br />

:<br />

في الحالة والثانية سيقوم الإجراء باستخدام القيمة الافتراضية المعطاه في تعريف الإجراء<br />

ملاحظة<br />

.<br />

:<br />

الوسطاء الافتراضية يجب أن تكون آخر الوسطاء المعرفة في التابع<br />

4 تعريف تابع فوق تابع أو إجراء فوق إجراء<br />

مثال<br />

: overload<br />

تمكننا هذه الطريقة من تعريف مجموعة توابع لها نفس الأسم ولكل منها وظيفة محددة<br />

.<br />

: أضف ثلاثة أزرار وعنصري Label إلى مشروع جديد واكتب الإجراءات التالية<br />

procedure change( i :integer; var s :string) ; overload;<br />

begin<br />

s:=inttostr(i);<br />

end;<br />

procedure change( i:tdatetime; var s :string) ; overload;<br />

begin<br />

s:= datetostr(i)<br />

end;<br />

procedure change( i:tdatetime; var s1,s2 :string) ;<br />

overload;<br />

begin<br />

S1:= datetostr(i);<br />

S2 := datetostr( i+1);<br />

end;<br />

Var a:string ;<br />

begin<br />

change ( 5,a) ;<br />

Label1.Caption := a ; end;<br />

Var B:String ; begin<br />

Change ( date,b);<br />

Label2.Caption := b; End;<br />

Var A,B:string; begin<br />

في حدث الضغط على الزر الاول أكتب التعليمة التالية<br />

:<br />

وفي حدث الضغط على الزر الثاني أكتب التعليمات التالية<br />

وفي حدث الضغط على الزر الثالث أكتب ما يلي<br />

:<br />

:<br />

38


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

6 متحول النتيجة<br />

http://www.alshater.net<br />

Change ( date,a,b);<br />

Label1.Caption := A; Label2.Caption := B; end;<br />

: Result<br />

Result هو عبارة عن متحول افتراضي في بيئة <strong>دلفي</strong> توضع قيمة التابع<br />

يمكن كتابة التابع Add بأحد الشكلين<br />

Function add( x,y:integer) :<br />

integer;<br />

Begin<br />

Add := x+y;<br />

End;<br />

:<br />

:<br />

Function add( x,y:integer) :<br />

integer;<br />

Begin<br />

result := x+y;<br />

End;<br />

جعل الإجراء مرئي من قبل وحدات أخرى<br />

:<br />

نعلم أنه كي نستطيع استدعاء متحول أو تابع من وحدة إلى أخرى يجب أن تكون موجودة في القسم<br />

. Interface<br />

1 وضع أسم الإجراء في القسم<br />

ثم نكتب الإجراء مع جسمه<br />

Interface قبل Var مثلا ً :<br />

Procedure Add( x,y : integer) ;<br />

( Begin… end )<br />

في القسم<br />

: Implementation<br />

Procedure Add( x,y : integer) ;<br />

Begin<br />

Y:= x+y ;<br />

End;<br />

بهذه الطريقة نستطيع طلب الإجراء من أي وحدة أخرى مرتبطة بالوحدة التي عرف في الإجراء عن طريق ذكر<br />

. اسمه فقط<br />

2 يمكن أن نضيف اسم الإجراء مع وسطائه إلى القسم<br />

مثال أضف السطر التالي في القسم<br />

. Type<br />

Private<br />

Procedure Add( x,y : integer) ;<br />

Type قبل<br />

:<br />

على أن نعرف الإجراء Add في القسم Implementation بالشكل التالي<br />

:<br />

Procedure Tform1.Add( x,y : integer) ;<br />

Begin<br />

Y:= x+y ;<br />

End;<br />

أضف وحدة أخرى إلى البرنامج وأطلب منها التابع Add العائد لل Form1 بالشكل التالي<br />

:<br />

Form1.add ( x,y ) ;<br />

39


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التوابع ذات الوسطاء المتعددة<br />

الجلسة السابعة<br />

http://www.alshater.net<br />

:<br />

Procedure procedureName ( var parameter1 : array of anytype<br />

; par2,par3:anytype );<br />

Begin<br />

……………………<br />

……<br />

end;<br />

يعرف في هذه الإجراءات<br />

مثال<br />

40<br />

( التوابع )<br />

:<br />

استخدمنا هنا التابع<br />

وسيط على أنه من نوع مصفوفة غير محدودة العناصر<br />

Function add( a:array of integer): string ;<br />

var h,i,s : integer;<br />

begin<br />

s:=0;<br />

h := high(a);<br />

for i:= 0 to h do s:= s + a[i];<br />

result:= inttostr(s);<br />

end;<br />

High الذي يعيد رقم آخر عنصر في مصفوفة<br />

)<br />

إي إذا عرفنا مصفوفة ما بالشكل<br />

[3..0] سيعيد التابع القيمة 3 وإذا عرفنها بالشكل [3..2] سيعيد القيمة 3 وإذا عرفت بالشكل<br />

[22..88] سيعيد . 88<br />

في حدث الضغط على زر أكتب التعليمات التالية<br />

:<br />

form1.Caption := add([1,3,4,89])<br />

سيقوم البرنامج بجمع الأعداد ووضع الناتج في عنوان النافذة<br />

ملاحظة<br />

) المستخدم<br />

:<br />

شريط العمل<br />

المصفوفات المتغيرة تبدأ دائما ً بالعنصر رقم صفر أي<br />

لذلك بدأت الحلقة المستخدمة في التابع<br />

Add من الصفر<br />

.<br />

: ProgressBar<br />

هو شريط يؤشر إلى كمية إنجاز العمل حتى لحظة معينة<br />

برنامج<br />

مثال<br />

أضف<br />

)<br />

[0]A وتنتهي بحسب العناصر التي أدخلها<br />

نفس الشريط الذي يظهر عند بدأ تنصيب<br />

Setup أي<br />

(<br />

كما يمكن استخدامه لإظهار قيمة معينة<br />

.<br />

Progress Bar من الصفحة<br />

:<br />

أعط الخاصة<br />

ل<br />

Win32 وTimer إلى مشروع جديد<br />

:<br />

Interval<br />

if progressbar1.Position < 100 then<br />

progressbar1.Position := progressbar1.Position+1;<br />

للمؤقت القيمة 100 واكتب في الحدث OnTimer التعليمات التالية<br />

:<br />

ProgressBar<br />

الخصائص المهمة التالية<br />

:<br />

1 : Position<br />

تعطي موقع الشريط الأزرق داخل<br />

ProgressBar<br />

وتأخذ قيمة بين<br />

Min و<br />

. Max


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تحدد أصغر قيمة يمكن أن تأخذها الخاصة<br />

http://www.alshater.net<br />

. Postion<br />

41<br />

2 : Min<br />

3 : Max<br />

تحدد أكبر قيمة يمكن أن تأخذها الخاصة<br />

. Postion<br />

4 : Step<br />

progressbar1.Position := progressbar1.Position+1;<br />

طول الخطوة وتحدد المسافة التي يقطعها الشريط الأزرق في كل مرة تنفذ فيها التعليمة<br />

:<br />

5 : Smooth<br />

عند إعطاء القيمة<br />

True لهذه الخاصة يظهر الشريط الأزرق بدون تقطيعات<br />

.<br />

6 <br />

عمودي<br />

orientation ‏:عند إعطاء القيمة<br />

ProgressBar ال ، pbVertical<br />

)<br />

شريط القيمة<br />

لملاحظة ذلك أعط الخاصة<br />

ProgressBar ل Height<br />

قيمة كبيرة<br />

100 مثلا ً (<br />

: TrackBar:<br />

يعمل بشكل<br />

يشبه هذا الشريط الشريط السابق ولكنه يختلف عنه بإمكانية تحريك مؤشره بواسطة الفأرة ومكان المؤشر سيعيد<br />

قيمة ليستخدمها البرنامج<br />

مثال : أضف إلى المشروع السابق TrackBar من الصفحة Win32 وأعط الخاصة<br />

والخاصة<br />

Max القيمة 1000<br />

Min القيمة 1<br />

واكتب في الحدث<br />

Onchange التعليمة التالية<br />

timer1.Interval := trackbar1.Position ;<br />

تقوم هذه التعليمة بتغير الخاصة<br />

عدل التعليمات الموجودة في<br />

Interval كلما تغير موقع مؤشر ال<br />

ontimer لتصبح بالشكل<br />

trackbar1<br />

:<br />

if progressbar1.Position < 100 then<br />

progressbar1.Position := progressbar1.Position+1<br />

else progressbar1.Position := 0;<br />

نفذ البرنامج وحرك المؤشر لتلاحظ كيف يمكن أن نتحكم بسرعة المؤقت أثناء التنفيذ.‏<br />

التعامل مع الحلقات<br />

:<br />

لن أشرح هنا الحلقات ولكن سأتعرض لبعض الحلقات ومشاكلها<br />

حلقة التأخير الزمني<br />

:<br />

:<br />

حلقة التأخير الزمني يمكن تمثيلها بأي نوع من الحلقات<br />

عمل ما لفترة زمنية بسيطة مثال<br />

في حدث الضغط على الزر<br />

( For ,Repeat ,While<br />

)<br />

أضف زر و :<br />

progressbar<br />

:<br />

نلاحظ أن مؤشر الخط الأزرق قد تحرك بسرعة كبيرة<br />

التعليمات السابقة كما يلي:‏<br />

والهدف منها تأخير<br />

إلى مشروع جديد واكتب التعليمات التالية<br />

var i :integer;<br />

begin<br />

for i := 0 to 100 do<br />

progressbar1.Position := i<br />

( غير ملحوظة )<br />

لذلك نضيف حلقة للتأخير الزمني<br />

عدل )<br />

var i,j :integer;<br />

begin<br />

for i := 0 to 100 do begin<br />

for j := 0 to 90000 do ;


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

نلاحظ أن الحلقة<br />

الوقت<br />

http://www.alshater.net<br />

progressbar1.Position := i<br />

end;<br />

.<br />

; do for j =: 0 to 10000 لا تنفذ شيء لكنها تعيق تنفيذ التعليمة التالية بعض<br />

أضف الآن إلى البرنامج السابق زر جديد واكتب في حدث الضغط عليه التعليمة التالية<br />

حاول الضغط على الزر الثاني أثناء تنفيذ الحلقة<br />

عليه حتى ينتهي تنفيذ الحلقة<br />

:<br />

Form1.color := clred;<br />

)<br />

إضغط على الزر الأول ثم الثاني<br />

(<br />

.<br />

عندما نستخدم المؤقت لتحريك ال<br />

ولاحظ أنه لا يمكن الضغط<br />

progressbar لا يؤثر ثلك على بقية البرنامج ولكن عند استخدام<br />

الحلقات لا يمكن تنفيذ حدث جديد حتى الخروج من الحلقة ولحل هذه المشكلة أضافت <strong>دلفي</strong> التعليمة التالية في حلقة<br />

التأخير الزمني<br />

تقوم هذه الرسالة بإعطاء البرنامج فرصة لتنفيذ تعليمات أخرى خارج الحلقات<br />

الثاني وتنفيذ التعليمات المرتبطة به على الرغم من أن الحلقة تعمل<br />

For j := 0 to 90000000 do<br />

Application.ProcessMessages ;<br />

)<br />

. (<br />

أي يمكنك الآن الضغط على الزر<br />

42


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

بعض التوابع المعرفة في <strong>دلفي</strong><br />

أً‏ توابع التعامل مع الأعداد<br />

الجلسة الثامنة<br />

http://www.alshater.net<br />

43<br />

:<br />

:<br />

معظم هذه التوابع موجودة في الوحدة Math لذلك يجب إضافتها إلى القسم Uses للوحدة التي تستدعي هذه<br />

. التوابع<br />

Abs(x)<br />

أسم التابع<br />

يعيد القيمة المطلقة لعدد معطى<br />

x<br />

Exp(x)<br />

يعيد التابع القيمة<br />

e X<br />

Floor(x)<br />

يعيد أقرب عدد طبيعي أقل أو يساوي<br />

عمله<br />

Floor (2.8) = 2; : مثال X<br />

Floor(-2.8) = -3<br />

Frac(x)<br />

يعيد الجزء العشري للعدد<br />

Frac(234.987)= 0.987: مثال X<br />

Int(x)<br />

تعيد القسم الطبيعي من عدد حقيقي<br />

Int(234.987)= 234<br />

X Y مثال<br />

intpower(2,3)=8;intpower(2,2)=4<br />

IntPower(X,y)<br />

Isinfinite(X)<br />

يعيد القيمة<br />

يعيد القيمة<br />

الأسفل<br />

True<br />

(<br />

X*2 Y LdExp(x,y)<br />

Ln(x)<br />

يعيد التابع القيم<br />

في حال كان<br />

يعيد اللوغاريتم الطبيعي للعدد<br />

X يسعى إلى اللانهاية .( لا حظ المثال في<br />

Len(e) = 1 : X<br />

Log10(X)<br />

يعيد اللوغاريتم العشري للعدد<br />

Log10(10) = 1 : X<br />

LogN(Y,X)<br />

يعيد لوغاريتم القيمة<br />

X بالنسبة للأساس<br />

Y<br />

Max(X,Y)<br />

يعيد قيمة الرقم الأكبر<br />

Max(3,6) = 6<br />

:<br />

Min ( X,Y)<br />

يعيد قيمة العدد الأصفر<br />

Min(3,6) = 3:<br />

Pi<br />

يعيد القيمة<br />

3.14159265358932358<br />

Poly ( x,y:array<br />

of double)<br />

يعيد قيمة السلسة<br />

المثال في الأسفل<br />

يعيد القيمة<br />

يعيد تدوير العدد الحقيقي<br />

Y[0]*X 0 +Y[1]*X 1 +…..+Y[n]*X n لاحظ<br />

X Y Power ( X,Y)<br />

Round ( 1.5) = : X<br />

Round ( X)<br />

2;Round(1.4)=1;Round(1.6) =2<br />

Sing(X)<br />

يعيد القيمة<br />

1 إذا كان<br />

X موجبا ً و<br />

1- إذا كان X سالبا ً و 0 إذا كان<br />

X=0<br />

Sqr(x)<br />

X 2 يعيد القيمة<br />

Sqrt(x)<br />

يعيد القيمة<br />

X<br />

Trunc(x)<br />

يعيد الجزء الطبيعي من العدد<br />

Trunc(5.022) =<br />

: X


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

مثال<br />

http://www.alshater.net<br />

5;Trunc(5.999)=5<br />

1 Isinfinite(X) :<br />

:<br />

أضف زر واكتب في حدث الضغط عليه التعليمات التالية<br />

:<br />

var v: variant;<br />

x:double;<br />

begin<br />

x:=1/0;<br />

v:= isinfinite(x);<br />

if v then<br />

form1.Caption := 'true';<br />

لاحظ أننا وضعنا في<br />

X القيمة<br />

1/0 والتي لن تقبل في حال كون X من النوع<br />

. Integer<br />

2 double) : Poly ( x,y:array of<br />

أضف زر واكتب في حدث الضغط عليه التعليمات التالية<br />

:<br />

var v: variant;<br />

begin<br />

v:= poly (4,[2,3,4,5]);<br />

form1.Caption := v;<br />

2ً توابع قلب وتحويل الأنواع : ترفض <strong>لغة</strong> <strong>دلفي</strong> إلحاق الأنواع المختلفة بعضها ببعض لذلك وجدت بعض<br />

التوابع والإجراءات التي تقوم بقلب بين الأنواع التي لها نفس الحجم ومن هذه التوابع<br />

:<br />

Integer ('A') = 65; Integer ('a') = 97;<br />

Char ( 97 ) = 'a'; Char (48) = '0'; char (65)= 'A';<br />

Boolean(0) = false; Boolean ( 1 ) = true;<br />

كما يمكن التحويل بين الأنواع المختلفة في الحجم بواسطة توابع معرفة مسبقا ً<br />

الجدول التالي يوضح بعض توابع تحويل الأنواع<br />

أسم التابع<br />

:<br />

:<br />

Strtoint64<br />

يشبه التابع<br />

عمله<br />

Strtoint ولكنه يحول النص المعطى إلى النوع<br />

int64<br />

Floattostr(X)<br />

يحول العدد الحقيقي<br />

X إلى نص<br />

:<br />

Floattostr(5.5e3)='5500';Floattostr(5.5)='5.5'<br />

FloattostrF(x,,,,)<br />

يحول العدد الحقيقي<br />

X إلى نص ولكن بشكل محدد<br />

)<br />

أنظر الأمثلة في الأسفل<br />

. (<br />

Strtofloat(s)<br />

يحول النص<br />

S إلى رقم ذو فاصلة عائمة<br />

Strtofloat(3.3)= 3.3; :<br />

Strtofloat( 3.3e4)=33000<br />

Strtocurr(S)<br />

يحول هذا التابع النص<br />

S إلى رقم من النوع عملة<br />

.<br />

Inttohex(X,y)<br />

يحول هذا التابع العدد الصحيح X إلى عدد ست عشري وتمثل y عدد أرقام النتيجة لا<br />

: حظ المثال<br />

44


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أمثلة<br />

التابع<br />

http://www.alshater.net<br />

function FloatToStrF(Value: Extended; Format: :<br />

TFloatFormat ; Precision, Digits: Integer):string ;<br />

1<br />

:<br />

يظهر هذا التابع العدد الحقيقي<br />

Format الذي يأخذ عدة قيم سيتم شرحها مع الأمثلة<br />

مثال<br />

:<br />

: ( 1 )<br />

1 Format = FFGeneral<br />

Value بعدة طرق حسب الوسطاء المعطاه في التابع وخاصة الوسيط<br />

تقوم هذه التعليمة بتحويل العدد Value إلى أقرب عدد بالفاصلة الثابتة أو العائمة مع إزالة كافة الأصفار على<br />

يسار الفاصلة وتتأثر هذه الخاصة بالقيمة Precision التي تحدد العدد الأعظمي لأرقام النتيجة ‏.والقيمة<br />

Digits التي تحدد عدد أرقام الأس<br />

أضف إلى حدث الضغط على زر التعليمة التالية<br />

:<br />

form1.caption := floattostrf(55.2723e+3, ffgeneral,5,2);<br />

سيعيد هذا التابع القيمة<br />

الرقم<br />

بالشكل<br />

55272 متجاهلا ً القيم بعد الفاصلة لأنه الوسيط<br />

Precision يساوي ، 5 غير الآن<br />

5 إلى<br />

:<br />

7 ولاحظ تغير النتيجة إلى الشكل<br />

. 527e4<br />

2 Format = FFExponent<br />

، 55272.3 غير الرقم السابق إلى<br />

4 ولاحظ ظهور النتيجة<br />

ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذي فاصلة عائمة من الشكل (ddd.edd) وتحدد الخاصة<br />

Precision هنا عدد أرقام النتيجة والقيمة<br />

Digits تتراواح بين 4..0 وتحدد عدد أرقام الأس<br />

.<br />

form1.caption := floattostrf(52.34, ffexponent,8,3);<br />

سيعيد التابع النتيجة<br />

001+5.2340000e في حال تغير الرقم<br />

8 إلى 4 والرقم 3 إلى<br />

2 تصبح النتيجة<br />

:<br />

5.234E+01<br />

3 Format = fffixed<br />

ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذو فاصلة ثابتة حيث يحدد عدد الأرقام بعد الفاصلة بالقيمة<br />

: Digits<br />

form1.caption := floattostrf(100.36, fffixed,6,1);<br />

سيعيد التابع القيمة<br />

في حال كانت قيمة<br />

100.4 لأنه لإظهار رقم واحد بعد النتيجة قام التابع بتدوير النتيجة<br />

.<br />

Precision أصغر من عدد أرقام العدد سيعيد التابع النتيجة بالفاصلة العائمة<br />

.<br />

4 Format = ffNumber<br />

تشبه الحالة السابقة ولكن مع إظهار فواصل بين الآلاف مع تقريب النتيجة<br />

.<br />

form1.caption := floattostrf(195784430.36, ffnumber,10,5);<br />

سيعيد التابع القيمة<br />

. 195,784,430.4000<br />

45


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

5 : Format = ffcurrency<br />

سيعيد التابع نفس القيمة السابقة ولكن مع ذكر ل.س بجانب الناتج<br />

طريق اعدادات إقليمية الموجودة في لوحة التحكم<br />

ل.س<br />

)<br />

يعيد التابع اسم العملة المحددة في الجهاز عن<br />

. (<br />

form1.caption := floattostrf(195784430.36, ffcurrency,10,5);<br />

195,784,430.4000<br />

التابع(‏Inttohex(X,Y :<br />

: مثال<br />

inttohex(2345,1); سيعيد القيمة 929 التي تكافئ العدد العشري<br />

2345<br />

لا حاجة لتحويل العدد الست عشري إلى عدد طبيعي في <strong>دلفي</strong> لأنه يمكن إلحاق الإعداد الست عشرية مباشرة في<br />

المتحولات الطبيعية Integer أو الحقيقية<br />

... ) $929 I:= تكافئ I:=2345 و J:=$F تكافئ<br />

( J=15<br />

هناك آلاف التوابع والإجراءات المعرفة في <strong>دلفي</strong> ولا يمكن شرحها كلها لذلك سنتعرف الآن على طرق البحث عن<br />

تابع ملفات في ملفات المساعدة الموجودة في <strong>دلفي</strong><br />

الحالة الأولى<br />

:<br />

:<br />

التابع معروف ولكننا بحاجة إلى تذكر الوسطاء التابعة له<br />

:<br />

اكتب إسم التابع في أي مكان في محرر الشيفرة وإضغط F1 سيظهر شرح كامل للتابع بال<strong>لغة</strong> الإنكليزية ، إذا كان<br />

لأحد الوسطاء عدة قيم<br />

)<br />

كما هي الحالة في الوسيط<br />

( Floattostrf للتابع Format<br />

الوسيط باللون الأخضر يمكننا بالضغط عليه الانتقال لصفحة تشرح هذه القيم<br />

الحالة الثانية<br />

.<br />

:<br />

التابع غير معروف ولكننا نتذكر تابع قريب أو مشابه له<br />

:<br />

سيظهر نوع هذا<br />

فرضا ً أريد أن أجد التابع الذي يحول النص إلى العدد الحقيقي من نوع عملة ، Currency نحن نعلم بوجود<br />

تابع يحول النص إلى عدد حقيقي وهو Strtofloat لذلك نكتب اسم هذا التابع في محرر الشيفرة ونضغط<br />

، F1 سيظهر الآن شرح للتابع ، Strtofloat ستلاحظ الآن وجود الكلمة<br />

See Also باللون الأخضر<br />

في أعلى الصفحة ، في حال الضغط عليها ستظهر هذه الوصلة قائمة بالتوابع المتعلقة بالتابع المذكور أو التوابع<br />

المشابهة له<br />

مثالنا<br />

)<br />

يمكن أن نختار منها )، Strtocurr كما يوجد أحيانا ً الوصلة بعد العنوان<br />

) Category<br />

( Floating point Conversion Routines<br />

المتصلة بموضوع التابع Strtofloat في مثالنا<br />

صيغة أخرى<br />

الحالة الثالثة<br />

)<br />

. (<br />

:<br />

نريد أن نبحث عن تابع له صفة معينة<br />

:<br />

)<br />

فرضا ً نريد أن نبحث عن تابع رياضي<br />

لذلك يمكن أن نكتب<br />

(<br />

بالضغط عليها ستظهر كل التوابع<br />

ستظهر كل التوابع المتعلقة بتحويل العدد الحقيقي إلى<br />

من المعروف أن معظم التوابع الرياضية تنتمي إلى الوحدة<br />

Math<br />

)<br />

أي تابع ينتمي للوحدة<br />

Power مع ظهور أسم الوحدة في الأعلى<br />

) math التابع Power مثلا ً (<br />

)<br />

.( math<br />

ملاحظة : معظم توابع التحويل<br />

)<br />

في<br />

ونضغط F1 سيظهر شرح التابع<br />

بالضغط عليه تظهر قائمة بجميع التوابع الموجودة في الوحدة<br />

..... Strtoint ‏)موجودة في الوحدة<br />

. Sysutil<br />

46


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الحالة الرابعة<br />

http://www.alshater.net<br />

:<br />

:<br />

لانعرف أي شيء من الحالات السابقة<br />

نريد أن نوجد تابع ما يقوم بعملية معينة<br />

)<br />

تابع الجيب جب<br />

( مثلا ً ( يه )<br />

من قوائم ال<strong>دلفي</strong> نختار<br />

Help <br />

<strong>Delphi</strong> help<br />

نختار بعدها الصفحة Find ‏(عند الضغط على الصفحة Find لأول مرة يظهر صندوق حوار لتحديد طرق<br />

البحث ‏(أختر الخيارات الأفتراضية)‏<br />

يظهر بعدها صندوق حوار نكتب فيه اسم التابع في ال<strong>لغة</strong> الإنكليزية<br />

الكلمات المكتوبة في ملفات المساعدة والتي تبدأ بالأحرف المكتوبة<br />

)<br />

Sin في مثالنا<br />

(<br />

( Sin )<br />

فيظهر في الأسفل جميع<br />

ويظهر أسفل هذه القائمة قائمة أخرى<br />

بالعنوانين التي تحوي هذه الكلمة حاول أن تختار منها طلبك واضغط عليه مرتين فيظهر نص المساعدة المرتبط<br />

) بهذا العنوان<br />

في مثالنا Otherوللعودة Standard routine إلى القائمة أختر السابقة<br />

Help<br />

. ( topic<br />

: ملاحظات<br />

لمعرفة عمل أي عنصر في <strong>دلفي</strong> أختره وأضغط على<br />

. F1<br />

لمعرفة عمل أي خاصة تابعة لعنصر ما في <strong>دلفي</strong> أختر هذه الخاصة واضغط على<br />

.... F1<br />

47


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

صناديق الحوار<br />

الجلسة التاسعة<br />

http://www.alshater.net<br />

: Dialog<br />

هي عبارة عن صناديق جاهزة موجودة في الصفحة<br />

وحفظ ملف ولتحديد لون ولفتح ملف صورة وللطباعة وللبحث<br />

صندوق<br />

الحوار فتح ملف<br />

Dialogs ومهمتها فتح نوافذ خاصة بنظام التشغيل<br />

)<br />

( ....<br />

وسندرس بعض هذه الصناديق بالتفصيل<br />

لفتح<br />

:<br />

: OpenDialog<br />

يستخدم لفتح ملف ما ‏،حيث يظهر النافذة المعروفة لفتح<br />

ملف الموجودة في الويندوز وحيث يمكننا من هذه<br />

النافذة اختيار الملف والضغط على فتح<br />

( Open )<br />

وسيعيد العنصر أسم الملف المختار بالخاصة<br />

FileName<br />

سنبدأ بمثال بسيط وسنحاول التعرف على<br />

بشكل أفضل لاحقا ً<br />

مثال<br />

:<br />

:<br />

أضف عنصر مذكرة<br />

جديد بالإضافة إلى العنصر<br />

العنصر<br />

Memo وزر إلى مشروع<br />

Opendialog<br />

في حدث الضغط على الزر أكتب التعليمات التالية<br />

:<br />

IF Opendialog1.Execute then<br />

memo1.Lines.LoadFromFile(opendialog1.FileName ) ;<br />

نفذ البرنامج واضغط على الزر سيظهر صندوق الحوار أختر أي ملف نصي<br />

سيمكنك الآن مشاهدة محتويات الملف في المذكرة<br />

التعليمة<br />

( TXT )<br />

واضغط على<br />

open<br />

.<br />

OpenDialog1.Execute تقوم بإظهار نافذة الحوار فتح ملف وتعيد القيمة<br />

اختار المستخدم أحد الملفات وضغط على الزر فتح<br />

opendialog1.FileName ستحتوي على<br />

اسم الملف،‏ وتعيد القيمة<br />

صندوق الحوار أو ضغط على الزر إلغاء الأمر(‏<br />

opendialog1.FileName ستحتوي على فراغ.‏<br />

الخاصة<br />

( Open )<br />

True في حال<br />

وفي هذه الحالة<br />

False في حال أغلق المستخدم<br />

( Cancel<br />

: Filter<br />

محرر الخواص واضغط على النقاط الثلاث<br />

Name أكتب ملف نص ، والعمود<br />

تحدد هذه الخاصة نوع الملفات التي ستظهر في النافذة ، اختر الخاصة<br />

وفي هذه الحالة<br />

Filter من<br />

...<br />

فتظهر النافذة التي تحدد نوع الملفات في العمود<br />

Filter<br />

Filter أكتب<br />

الحوار لا يظهر إلا المجلدات والملفات من النوع النصي<br />

يشير إلى نوع الملفات<br />

للعمود<br />

جميع الملفات<br />

" Files Type<br />

ملف نص<br />

*.txt أغلق النافذة ونفذ البرنامج ستلاحظ أن صندوق<br />

، "<br />

" Filter Name<br />

ملف دفعي ‏"وفي العمود<br />

، Txt وستظهر في أسفل الصندوق في العنوان الذي<br />

عد إلى الخاصة Filter أدخل في السطر الثاني<br />

"*.Bat " Filter<br />

ثم في السطر التالي العمود الأول<br />

"<br />

وبجانبه "<br />

. " *.* "<br />

48


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

نفذ البرنامج الآن واضغط على الزر سيظهر صندوق فتح الملفات حيث يمكنك الآن اختيار نوع الملفات التي<br />

ستظهر عن طريق<br />

الخاصة<br />

49<br />

. Files Type<br />

: FilterIndex<br />

الفلتر الأول و‎2‎ إلى الثاني<br />

الخاصة<br />

....<br />

تستخدم هذه الخاصة لتحديد نوع الملفات الافتراضي وتأخذ القيمة<br />

1 لتشير إلى<br />

: InitialDir تقوم هذه الخاصة بتحديد الفهرس الابتدائي الذي سيعمل فيه الصندوق أكتب في هذه<br />

الخاصة القيمة \:C وسيفتح عندها الصندوق في الفهرس<br />

الخاصة<br />

... C:\<br />

: Title<br />

‏"أختر ملف ما ليقوم البرنامج بفتحه<br />

الخاصة<br />

."<br />

: Option<br />

معلومات عن عمل كل خاصة.‏<br />

صندوق الحوار حفظ ملف<br />

تمكنك إظهار الخاصة من إظهار نص معين في شريط العنوان لنافذة فتح الملفات ادخل القيمة<br />

ينبثق عن هذه الخاصة العديد من الخواص حاول مراجعة تعليمات <strong>دلفي</strong> للحصول على<br />

: SaveDialog<br />

يقوم هذا الملف بفتح صندوق الحوار حفظ ملف وهو يشبه الصندوق السابق بطريقة الاستدعاء والخصائص لذلك لا<br />

داعي لإعادة شرح الخصائص<br />

مثال<br />

.<br />

:<br />

أضف زر و SaveDialog إلى البرنامج السابق وأعط الخاصة<br />

SaveDialog الخصائص التالية<br />

1 الخاصة<br />

2 الخاصة<br />

Caption<br />

" حفظ " للزر القيمة<br />

:<br />

: Filter<br />

ملف نص<br />

*.txt ........<br />

ملف دفعي :<br />

*.bat .......<br />

: Defaultext<br />

القيمة<br />

: .Txt<br />

في حدث الضغط على الزر اكتب التعليمات التالية<br />

هذه القيمة ضرورية لتحديد امتداد الملف الذي سيتم حفظه<br />

ثم أعط<br />

.<br />

:<br />

if savedialog1.Execute then<br />

memo1.Lines.SaveToFile(savedialog1.FileName )<br />

نفذ البرنامج واضغط على الزر حفظ واكتب الاسم الذي تريد<br />

إحدى الخصائص المهمة لهذا العنصر والتابعة للخاصة<br />

....<br />

Option هي الخاصة<br />

OfOverwritePrompt<br />

أعط هذه الخاصة القيمة Ture لكي يتم تنبيه المستخدم قبل أن يحفظ ملف فوق ملف من نفس الإسم<br />

صندوق الحوار<br />

مثال:‏<br />

.<br />

: OpenPictureDialog<br />

صندوق الحوار هذا يشبه صندوق الحوار فتح ملف ويختلف عنه بظهور قسم يجانب الملفات لإظهار الصور قبل<br />

فتحها ، من الملاحظ أن الخاصة Filter لهذا العنصر مجهزة بأنواع الملفات التي يمكن لل<strong>دلفي</strong> التعامل معها<br />

أضف زر وعنصر Image إلى مشروع جديد وأضف كذلك العنصر<br />

في حدث الضغط على الزر أكتب التعليمة التالية<br />

.<br />

. OpenPictureDialog<br />

:<br />

if OpenPictureDialog1.Execute then<br />

image1.Picture.LoadFromFile(OpenPictureDialog1.FileName )


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

نفذ البرنامج واضغط على الزر واختر أي صورة لتلاحظ ظهورها إلى يمين صندوق الحوار وبالضغط على الزر<br />

Open ستظهر الصورة في العنصر<br />

. Image<br />

ملاحظة : رغم وجود ملفان من النوع Jpg في الخاصة Filter لا تظهر الملفات *.jpg أثناء التنفيذ وإذا<br />

أردت إظهارها قم بإضافة اسم الوحدة Jpeg إلى القسم<br />

صندوق الحوار<br />

مثال<br />

. Uses<br />

: SavePictureDialog<br />

) ..........................................................................................<br />

.............<br />

نفس الكلام السابق<br />

(<br />

:<br />

أضف زر وعنصر<br />

الخاصة<br />

SavePictureDialog<br />

إلى البرنامج السابق و أعط<br />

.Bmp واكتب في حدث الضغط على الزر التعليمة التالية<br />

SavePictureDialog<br />

:<br />

DefaultExt القيمة<br />

if SavePictureDialog1.Execute then<br />

image1.Picture.SaveToFile(SavePictureDialog1.FileName)<br />

نفذ البرنامج ثم افتح صورة عن طريق الزر الأول واحفظها عن طريق الزر الثاني<br />

الصورة أي تغير نوعها عن طريق تغير الامتداد في أسفل صندوق الحوار<br />

صندوق الحوار الخطوط<br />

يقوم<br />

الخط<br />

)<br />

يمكنك أيضا ً تغير امتداد ملف<br />

. ( Save As Type<br />

: FontDialog<br />

.<br />

هذا العنصر بإظهار صندوق الحوار اختيار خط حيث يمكننا هذا الصندوق من تحديد نوع ونمط وحجم ولون<br />

أضف زر وعنصر<br />

: التعليمة التالية<br />

صندوق الحوار تحديد لون<br />

Label و عنصر<br />

FontDialog إلى برنامج جديد واكتب في حدث الضغط على الزر<br />

if Fontdialog1.Execute then<br />

label1.Font := fontdialog1.Font ;<br />

: ColorDialog<br />

يقوم هذا العنصر بإظهار صندوق حوار لاختيار لون حيث يمكن اختيار اللون من عدد كبير جدا ً من الألوان<br />

أضف زر وعنصر<br />

.<br />

ColorDialog إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />

صندوق الحوار ColorDialog يظهر فيه زر عنوانه<br />

:<br />

if colorDialog1.Execute then<br />

form1.Color := colordialog1.Color ;<br />

Define Custom colors بالضغط عليه<br />

يظهر لوح الألوان الذي يمكن من خلاله تحديد اللون أو يمكن كتابة RGB كتابة في حال معرفتها<br />

ملاحظة<br />

.<br />

:<br />

تتبع جميع صناديق الحوار<br />

فصندوق الحوار فتح ملف في ويندوز<br />

Dialog نظام التشغيل المستخدم،‏ أي أنها ستختلف حسب نظام التشغيل<br />

98 يختلف عنه في ويندوز<br />

Xp وبالتالي سيختلف شكل الصندوق من نظام<br />

تشغيل إلى آخر ولكنه سيؤدي نفس الوظيفة بنفس التعليمات ، كما تتأثر هذه الصناديق ب<strong>لغة</strong> النظام أي أنها ستظهر<br />

50


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

بال<strong>لغة</strong> العربية في حال كانت واجهات نظام التشغيل المستخدم بالعربية وبال<strong>لغة</strong> الإنكليزية في حال كانت واجهات<br />

نظام التشغيل بال<strong>لغة</strong> الإنكليزية<br />

.<br />

51


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة العاشرة<br />

التعرف على العنصر<br />

http://www.alshater.net<br />

) : MaskEdit<br />

الصفحة<br />

( Additional<br />

يشبه هذا العنصر عنصر التحرير Edit ويختلف عنه بإمكانية تحديد شكل النص المدخل وللتعرف على هذه اميزة<br />

اذهب إلى الخاصة Editmask من محرر الخواص وبالضغط على<br />

...<br />

ستظهر النافذة التالية<br />

:<br />

تحديد القناع<br />

أقنعة جاهزة<br />

الرمز الذي سيظهر<br />

مكان الفراغ<br />

( أمثلة )<br />

لتجربة النص المدخل<br />

تحميل أقنعة جاهزة<br />

مثال<br />

.....<br />

52<br />

:<br />

1<br />

أضف عنصر MaskEdit من الصفحة<br />

محرر الخواص واختر من النافذة السابقة في القسم<br />

Additional<br />

إلى برنامج جديد واختر الخاصة<br />

Editmask من<br />

( Sample Masks )<br />

Date واضغط على Ok عندها سيظهر<br />

العنصر بالشكل __/__/__ الآن نفذ البرنامج وحاول الإدخال إلى العنصر ولاحظ أنه لا يمكنك إدخال سوى<br />

الأرقام .<br />

: تحديد القناع<br />

نلاحظ أن القيم في الحقل تحديد القناع عبارة عن<br />

0 أو 9 أو L أو …<br />

فماذا تعني هذه الرموز<br />

:<br />

: 9<br />

يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف مع إمكانية عدم إدخال أي رقم<br />

مثلا ً في حال كان القناع 99999 ‏،يستطيع المستخدم إدخال عدد مكون من خمس أرقام أو أربع أو ثلاث<br />

يستطيع إدخال الأحرف<br />

)<br />

....<br />

(<br />

: 0<br />

يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف<br />

فعلى المستخدم إدخال خمس أرقام حصرا ً ولا يمكن أربعة<br />

رسالة خطأ عن خروج المؤشر من العنصر<br />

)<br />

في حال كان القناع<br />

ولا<br />

، 00000<br />

(...<br />

.<br />

: L<br />

يستطيع المستخدم،‏ إدخال أحرف مكان هذا الرمز ولا يمكن إدخال الأرقام<br />

المستخدم إدخال أربع أحرف حصرا ً<br />

)<br />

وفي حال ادخل المستخدم أربعة سيصدر البرنامج<br />

في حال كان القناع<br />

LLLL فعلى<br />

.(<br />

: l<br />

إدخال أحرف فقط مع إمكانية عدم الإدخال


http://www.alshater.net<br />

....<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: a إدخال أحرف مع أرقام مع إمكانية عدم الإدخال<br />

.<br />

إدخال أحرف مع أرقام ...<br />

حصرا ً<br />

: A<br />

يوجد مجموعة أخرى من الرموز يمكن مراجعتها في ملفات المساعدة التابعة لل<strong>دلفي</strong> ............<br />

( Win32<br />

العنصر : MonthCalendar )<br />

الصفحة<br />

يستخدم هذا العنصر لإظهار التاريخ،‏ ويستطيع المستخدم إدخال التاريخ عبره ...<br />

في حال أردنا من العنصر إظهار تاريخ اليوم في كل مرة نفتح البرنامج،‏ علينا إدخال التعليمة التالية في الحدث<br />

OnCreate للنافذة التي تحوي العنصر :<br />

MonthCalendar1.Date := date;<br />

للحصول على التاريخ المدخل من قبل المستخدم نكتب التعليمة التالية في حدث الضغط على زر أو حدث الضغط<br />

form1.Caption := datetostr(MonthCalendar1.Date);<br />

.. (<br />

)<br />

على العنصر نفسه<br />

:<br />

عن إعطاء الخاصة Align لهذا العنصر القيمة<br />

alClient يظهر مفكرة بعدة أشهر<br />

حسب حجم النموذج<br />

.<br />

Sample العنصر<br />

ملاحظة :<br />

يوجد في الصفحة<br />

Calendar وهو يشبه العنصر السابق إلى حد ما<br />

( Win32<br />

العنصر : DateTimePicker )<br />

الصفحة<br />

:<br />

(<br />

يستخدم هذا العنصر لإظهار )<br />

إدخال<br />

التاريخ أو الوقت<br />

يظهر التاريخ في حال كانت الخاصة Kind تساوي<br />

dtkDate ويمكن تغير التاريخ عن طريق مفاتيح الأسهم<br />

1<br />

أو عن طريق الضغط على السهم المجاور للعنصر حيث يظهر عندها شكل مشابه للعنصر MonthCalendar<br />

الذي يمكن تحديد التاريخ من خلاله،‏ كما يمكن تغير قيمة الخاصة DateMode إلى<br />

dmUpDown يظهر سهمين<br />

أعلى وأسفل لإدخال التاريخ ....<br />

Timer<br />

يظهر الوقت في حال كانت الخاصة Kind تساوي<br />

dtkTime وحتى يتم تحديث الوقت يجب إضافة<br />

2<br />

وكتابة التعليمة التالية في الحدث : OnTimer<br />

DateTimePicker1.Time := time;<br />

3 يمكن الحصول على الوقت من هذا العنصر عن طريق التعليمة التالية :<br />

Form1.Caption := TimeToStr(DateTimePicker1.Time );<br />

ويكون الحصول على التاريخ عن طريق التعليمة :<br />

Form1.Caption := Datetostr(DateTimePicker1.date );<br />

الصفحة<br />

العنصر<br />

( Win32<br />

) : PageControl<br />

يقوم هذا العنصر بإظهار صفحات مستقلة وللتعرف على هذا العنصر سنبدأ بمثال :<br />

مثال :<br />

ابدأ مشروعا ً جديدا ً وأضف إليه عنصر الصفحات<br />

PageControl من الصفحة<br />

،Win32 اضغط على العنصر<br />

Tabsheet1<br />

بزر الفأرة اليميني وأختر من القائمة<br />

New Page عندها ستظهر صفحة جديدة باسم<br />

، أعد الخطوة<br />

الأخيرة مرتين لإظهار TabSheet2 و . TabSheet3<br />

53


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اختر الصفحة الأولى<br />

وأعطها الخاصة<br />

التاريخ<br />

" وأضف في داخلها العنصر<br />

" Caption<br />

Tabsheet1<br />

. MonthCalendar<br />

اختر الصفحة الثانية<br />

TabSheet2 وأعطها الخاصة<br />

الوقت<br />

" وأضف إليها العنصر<br />

" Caption<br />

وأعطه الخاصة<br />

Kind القيمة dtkTime ولا تنس إضافة مؤقت لتحديث الوقت...‏<br />

DateTimePicker<br />

اختر الصفحة الثالثة<br />

TabSheet3 وأعطها الخاصة<br />

التاريخ والوقت<br />

" وأضف إليها عنصرين<br />

" Caption<br />

.... dtkTime القيمة Kind أعط إحداهما الخاصة DateTimePicker<br />

نفذ البرنامج ولاحظ كيفية الانتقال بين الصفحات ..<br />

ESC من<br />

اختر العنصر ) PageControl<br />

يمكن الانتقال من عنصر ابن إلى عنصر أب بالضغط على المفتاح<br />

.<br />

alClient القيمة Align<br />

لوحة المفاتيح (<br />

وأعطه الخاصة<br />

عندها سيأخذ العنصر حجم النموذج بالكامل<br />

Add<br />

أضف العنصر<br />

ImageList من الصفحة<br />

Win32 واضغط علية مرتين يظهر صندوق حوار اختر منه<br />

لإضافة مجموعة من الصور،‏ اضغط بعدها على<br />

،Ok عد بعدها إلى العنصر<br />

PageControl وأعط الخاصة<br />

Images القيمة ImageList1 وعندها ستظهر الصور بجانب عنوانين الصفحات،‏ نستطيع اختيار صور محددة<br />

... ImageIndex<br />

لصفحة ما باختيار الصفحة<br />

tabSheet ثم كتابة رقم الصورة المطلوبة في الخاصة<br />

يمكن تحويل موضع اختيار الصفحات عن طريق الخاصة<br />

TapPosition حيث يمكن أن تكون في الأسفل أو<br />

على اليمين أو على اليسار<br />

يمكن تحويل شكل الصفحات إلى أزرار عن طريق الخاصة<br />

Style للعنصر PageControl بإعطائها القيمة<br />

tpTop تساوي TapPosition لا تعمل هذه الخاصة إلا إذا كانت قيمة الخاصة ) tsFlatButtons أو tsButtons<br />

. (<br />

.<br />

الخاصة<br />

ActivePage تحدد الصفحة الفعالة عند تنفيذ البرنامج<br />

الخاصة<br />

عند إعطاء هذه الخاصة القيمة<br />

True يتحول لون خط عنوان الصفحة إلى اللون الأزرق<br />

: HotTrack<br />

. (<br />

عند مرور الفأرة فوقه )<br />

في وقت التنفيذ<br />

( Win32<br />

العنصر : TabControl )<br />

الصفحة<br />

يشبه هذا العنصر العنصر<br />

PageControl ويختلف عنه بكونه لا يعطي صفحات مستقلة حيث أنه مكون من<br />

صفحة واحدة<br />

) أي أن العناصر توضع في صفحة واحدة ويتم تطبيق تغيرات على هذه العناصر عندما يضغط<br />

المستخدم على أزرار الصفحات :<br />

. 5<br />

مثال :<br />

سنقوم بكتابة برنامج يعطي جدول ضرب العدد<br />

1,2,3,4,5,6,7,8,9 كل<br />

ابدأ مشروعا ً جديدا ً وأضف إليه العنصر ، TabControl في الخاصة<br />

Tabs أكتب القيم<br />

منها في سطر<br />

. TabControl<br />

أضف عنصري<br />

Label داخل العنصر<br />

:<br />

مستقل وفي الحدث<br />

OnChange أكتب التعليمات التالية<br />

var i :integer;<br />

begin<br />

54


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

حيث TabControl1.TabIndex تعيد رقم الصفحة التي ضغط المستخدم عليها<br />

و ] Tabcontrol1.Tabs[ تعيد عنوان الصفحة التي يوجد رقمها بين القوسين<br />

نفذ البرنامج واضغط على الصفحات ولاحظ النتائج<br />

http://www.alshater.net<br />

i := strtoint(tabcontrol1.Tabs[tabcontrol1.tabindex] );<br />

label1.Caption := inttostr(i) + ' * 5 = ';<br />

label2.Caption := inttostr(i * 5);<br />

.<br />

. [ ]<br />

55<br />

...<br />

بالنسبة لباقي الخصائص فهي مشابهة تماما ً لخصائص العنصر السابق<br />

العنصر<br />

أضف عنصر<br />

.<br />

) : UpDown<br />

الصفحة<br />

( Win32<br />

UpDown وعنصر<br />

Associate<br />

Edit إلى مشروع جديد ، حدد العنصر<br />

UpDown1 واعط الخاصة<br />

القيمة ، Edit1 نفذ البرنامج واضغط على أسهم العنصر UpDown ولاحظ تغير الرقم داخل<br />

الخاصة Increment للعنصر تحدد مقدار الزيادة أو النقصان في العدد داخل ال<br />

الخاصتان<br />

Edit<br />

. Edit<br />

Min و<br />

Max تحددان القيمة الدنيا والعليا للعدد داخل<br />

الخاصة Position تحدد القيمة الابتدائية للعنصر<br />

الخاصة<br />

الخاصة<br />

. Edit<br />

.<br />

Orientation<br />

تحدد اتجاه الأسهم<br />

)<br />

عامودي أو أفقي<br />

. (<br />

: Warp<br />

عند إعطاء هذه الخاصة القيمة<br />

الزر Down بعكس عند الضغط على الزر<br />

ملاحظة : يوجد في الصفحة<br />

إلى حد ما<br />

. Up<br />

Sample العنصرين<br />

True يتحول العدد من القيمة السفلى إلى العليا عند الضغط على<br />

SpinEdit و<br />

.<br />

التعامل مع السلاسل النصية<br />

1 التابع<br />

:<br />

: Concat<br />

يقوم هذا التابع بوصل السلاسل S1..Sn مع بعضها<br />

مثال<br />

SpinButton الذين يشبهان عمل هذا العنصر<br />

Concat ( s1, [s2..sn]) :string<br />

:<br />

أكتب التعليمات التالية في حدث الضغط على زر<br />

:<br />

var s1,s2,s3 : string;<br />

begin<br />

s1:= 'abc';<br />

s2 := 'efg';<br />

s3:= 'hij';<br />

form1.caption:=concat(s1,s2,s3)<br />

يشبه هذا التابع عملية جمع السلاسل النصية أي أن النتيجة ستكون مشابه لو كانت التعليمة الأخيرة<br />

Form1.Caption := s1+s2+s3;<br />

2 التابع : Copy<br />

Copy ( S:string , Index,Count :Integer ) :String<br />

يعيد هذا التابع سلسلة رمزية جزئية من السلسة S تبدأ من الحرف الذي ترتبه Index وبطول . Count


http://www.alshater.net<br />

... Copy ( 'Hello All',5,1) = o<br />

Delete ( Var S:string ,Index,Count ) ;<br />

Index وبطول<br />

var s1 : String;<br />

Begin<br />

s1:= 'Hello All' ;<br />

Delete (s1,1,3);<br />

Form1.Caption := s1;<br />

S1,4,3) Delete ( ستكون<br />

; Copy ( 'Hello All',2,6)<br />

= ello A<br />

: Delete<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: مثال<br />

3 الإجراء<br />

يعيد هذا الإجراء في المتحول<br />

S قيمة نفس السلسلة بعد حذف الرموز ابتداء من الرمز الذي ترتيبه<br />

:<br />

Count<br />

مثال :<br />

اكتب في حدث الضغط على زر التعليمات التالية<br />

ستكون نتيجة تنفيذ البرنامج القيمة ، lo All وإذا غيرنا وسطاء الإجراء إلى الشكل<br />

DupeString ( S: String ,Count :Integer) :String;<br />

Count مرة<br />

. HelAll<br />

: DupeString<br />

S مكررة<br />

DupeString( 'Ha ',5) = Ha Ha Ha Ha Ha<br />

StrUtils<br />

Insert ( S1:String , var S:string ; Index :Integer ) ;<br />

. S<br />

النتيجة<br />

4 التابع<br />

يعيد هذا التابع القيمة<br />

مثال :<br />

ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة<br />

5 الأجراء : Insert<br />

مثال<br />

يقوم هذا الإجراء بحشر السلسة S1 في السلسة S ابتداء من الرمز Index في السلسة S ويعيد النتيجة في<br />

: تكتب التعليمات التالية في حدث الضغط على زر :<br />

var s : string;<br />

begin<br />

s:= 'Hello Friends' ;<br />

insert ( 'All ' ,s,7);<br />

form1.Caption := s;<br />

StuffString( s:string , start, length :integer , S1:string ) :string;<br />

56<br />

التابع : StuffString<br />

يقوم هذا التابع بحشر السلسة قيمة<br />

الرموز من قيمة<br />

S1 في قيمة السلسلة S ابتداء من الرمز الذي ترتيبه Start مع حذف عدد من<br />

: Length بطول S<br />

مثال all' stuffstring('Hello Friend',7,6,'all') = 'Hello قام التابع بحذف ستة أحرف ابتداء من الحرف<br />

السابع وحشر السلسة ، all في حال تغير الرقم 0 سيعمل التابع عمل الإجراء<br />

. Insert<br />

6 إلى<br />

يختلف هذا التابع عن سابقة ب :<br />

:


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

1 التابع يقوم بحذف قسم من السلسة وإدراج غيره<br />

الإجراء<br />

Insert بحاجة إلى متحول<br />

S ستعاد قيمة التابع فيه بينما التابع<br />

StuffString يعيد السلسة<br />

2<br />

. (<br />

النتيجة بدون<br />

التأثير على وسطاءه<br />

ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة StrUtils<br />

LeftStr(S:String ,Count : integer) :string<br />

: Count وبطول S<br />

التابع<br />

: LeftStr<br />

يعيد هذا التابع سلسلة نصية تبدأ من يسار السلسلة<br />

. LeftStr( 'Good Morning,4 ) = Good<br />

، LeftStr( 'Hello Frind',6) = Hello<br />

مثال :<br />

:<br />

التابع : RightStr<br />

يشبه التابع السابق ولكنه يعيد ابتداء من نهاية السلسة<br />

Rightstr( 'Hello Friend',6)=Friend<br />

مثال :<br />

التابع : LowerCase<br />

) الأحرف اللاتينية ( .<br />

يعيد هذا التابع السلسلة<br />

S بعد تحويل جميع حروفها إلى حروف صغيرة<br />

LowerCase(Hello Friend) = hello friend :<br />

: UpperCase<br />

مثال<br />

التابع<br />

عكس التابع السابق ‏،مثال UpperCase (' Hello Friend') = HELLO FRIEND<br />

التابع : Trim<br />

يقوم هذا التابع بحذف الفراغات من بداية ونهاية السلسة S<br />

مثال :<br />

أضف زر وعنصر Edit إلى برنامج جديد وفي حدث الضغط على الزر اكتب التعليمات التالية<br />

أكتب نصا ً ما في العنصر Edit1 وحاول ترك فراغات في بداية هذه النص أو آخرة<br />

:<br />

edit1.Text:= Trim(edit1.Text );<br />

' Hello All<br />

'<br />

واضغط<br />

على الزر فيقوم التابع بحذف الفراغات وإعادة القيمة All' 'Hello .<br />

التابعين TrimLeft و<br />

التوالي<br />

TrimRight لهما نفس التأثير غير أنهما يحذفان الفراغات من بداية السلسة أو نهايتها على<br />

.<br />

التابع<br />

: Format<br />

Format ( S :String ; A:array of const ) ;<br />

داخلها وفقا ً لبعض المعايير ... A بعد إدراج القيم في Sيعيد هذا التابع السلسلة<br />

مثال :<br />

أضف التعليمات التالية في حدث الضغط على زر :<br />

var s1:string;<br />

var i,j :integer; z:real;<br />

begin<br />

i:= 200;j:=5; z:= i/j;<br />

57


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

سيعيد التابع القيمة<br />

http://www.alshater.net<br />

s1:= format('If You Divide %d by %d the result will be %g',[i,j,z]);<br />

form1.Caption := s1;<br />

. If You Divide 200 by 5 the result will be 40<br />

قام التابع بإعطاء قيمة العنصر الأول في المصفوفة<br />

الثاني وقيمة العنصر الثالث Z إلى الوسيط<br />

إذا ً يمكنك التابع<br />

( I<br />

)<br />

إلى الوسيط d% وقيمة العنصر الثاني إلى الوسيط<br />

%d<br />

. %g<br />

Format<br />

من إدراج مجموعة من الثوابت داخل الجملة عن طريق كتابة الرمز % داخل الجملة<br />

ملحقا ً برمز يدل على نوع الوسيط المراد إدراجه حسب الجدول التالي<br />

:<br />

عشري،‏ قيمة العدد الصحيح يحول إلى جملة من الخانات العشرية.‏<br />

ست عشري،‏ قيمة الرقم الصحيح ت ُحول إلى جملة من الخانات الست عشرية.‏<br />

مؤش ّر،‏ قيمة المؤشر يحول إلى جملة معبر عنها بأعداد ست عشرية.‏<br />

d (decimal)<br />

x<br />

(hexadecimal)<br />

p (pointer)<br />

s (string)<br />

e<br />

(exponential)<br />

f (floating<br />

point)<br />

g (general)<br />

قيمة الجملة،‏ الحرف،‏ أو نوع<br />

PChar يتم نسخها في مخرجات الجملة.‏<br />

مرفوع القوة،‏ قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز مرفوع القوة.‏<br />

نقطة عائمة،‏ قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز النقطة العائمة.‏<br />

عام،‏ قيمة النقطة العائمة تحول إلى جملة عشرية بأقرب ما يمكن مستخدمة إما ترميز النقطة<br />

العائمة أو مرفوع القوة.‏<br />

رقم،‏ قيمة النقطة العائمة تحول إلى جملة نقطة عائمة لكنها أيضا تستخدم فواصل الآلاف.‏<br />

نقود،‏ قيمة النقطة العائمة تحول إلى جملة تمثل مقدار العملة.‏ التحويل يعتمد على التوصيف<br />

الإقليمي لبيئة التشغيل-‏ انظر ملف مساعدة <strong>دلفي</strong> تحت موضوع:‏<br />

Currency and<br />

.date/time formatting variables<br />

n (number)<br />

m (money)<br />

: مثال<br />

أضف عنصر Edit وزر إلى برنامج جديد ، اكتب في حدث الضغط على الزر التعليمة التالية<br />

نفذ البرنامج واكتب أسمك في العنصر Edit وأضغط على الزر<br />

:<br />

ShowMessage( Format مرحبا ً')‏ %s',[Edit1.Text]));<br />

......<br />

58


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اللوائح النصية<br />

يستخدم النوع<br />

الجلسة الحادية عشرة<br />

http://www.alshater.net<br />

59<br />

:<br />

TSrings لتعريف اللوائح النصية حيث يقوم هذا النوع بتخزين عدد من السلاسل النصية ضمن<br />

سطور وقد تعاملنا معه في السابق فالخاصة<br />

Memo من النوع<br />

يبدأ التعامل مع النوع<br />

Items التابعة ل<br />

ListBox والخاصة<br />

. Tstrings<br />

TStrings بالتعليمة<br />

Lines التابعة لعنصر المذكرة<br />

TStringList.Create التي تقوم بحجز مكان لهذا النوع في الذاكرة،‏<br />

علما ً أن هذا النوع قد يأخذ مجال كبير من الذاكرة تبعا ً لحجم السلاسل النصية المراد تخزينها فيه،‏ وينتهي استخدام<br />

هذا النوع بالتعليمة Free لتحرير الذاكرة المستخدمة من قبل هذا العنصر<br />

ملاحظة<br />

.<br />

:<br />

عند إنهاء البرنامج دون استخدام التعليمة<br />

مما يعطل موارد الجهاز<br />

Free سيبقى حيز الذاكرة المحجوز من قبل المتحول<br />

Tstrings مشغولا ً<br />

)<br />

وتقسم اللوائح النصية إلى قسمين<br />

1 اللوائح النصية قصيرة الأمد<br />

تظهر هذه المشكلة مع العديد من البرامج العربية<br />

. (<br />

:<br />

:<br />

تكون اللائحة قصيرة الأمد إذا تم إنشاؤها وتحريرها في نفس الإجراء أو التابع<br />

مثال<br />

.<br />

:<br />

أنشئ مشروعا ً جديد ًا<br />

الزر التعليمات التالية<br />

:<br />

وضع السطر<br />

وأضف إليه عنصر اللائحة ListBox وزر وعنصر ، Edit أكتب في حدث الضغط على<br />

var a:TStrings;<br />

Begin<br />

إنشاء اللائحة وحجز مكان لها في الذاكرة // TStringList.Create; a =:<br />

إضافة النص الموجود في صندوق النص إلى الائحة // a.Add(Edit1.text);<br />

Form1.Caption := a.Strings [0]; //<br />

ListBox<br />

a<br />

ListBox1.Items.AddStrings(a); //<br />

a.Free ;<br />

end;<br />

TsrtingList.Create<br />

( 0 )<br />

إضافة عناصر اللائحة<br />

حاول استخدام البرنامج بدون التعليمة<br />

2 اللوائح النصية طويلة الأمد<br />

:<br />

من سطور اللائحة في عنوان النموذج<br />

إلى عنصر اللائح ة<br />

تكون اللائحة طويلة الأمد عند تعريف متحول عام أو خاص من النوع TStrings وهنا علينا تحريره عند إغلاق<br />

النموذج الذي قام بإنشائه<br />

مثال<br />

:<br />

:<br />

أضف متحول A من النوع TStrings في القسم Puplic من برنامج جديد<br />

في الحدث<br />

OnCreat للنموذج أكتب التعليمة التالية<br />

A := TStringList.Create;<br />

.<br />

:


http://www.alshater.net<br />

A.Free;<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

في الحدث OnDestroy اكتب التعليمة التالية<br />

:<br />

بإمكانك الآن استخدام عنصر اللائحة في أي جزء من البرنامج<br />

.<br />

الحدث<br />

OnDestroy يتم تنفيذه عند إغلاق النافذة<br />

ملاحظة :<br />

معظم الأنواع التي تحتاج إلى<br />

Create تحتاج إلى<br />

Free عند انتهاء التعامل معها،‏ وهذه الطريقة تشبه<br />

طريقة التعامل مع المؤشرات حيث يجب إنهاء المؤشر بعد الانتهاء منه .<br />

معالجة الأخطاء في <strong>دلفي</strong> :<br />

يجب على كل تطبيق جيد أن يعالج جميع احتمالات الأخطاء وأن يوجه المستخدم إلى حل ما للخروج من حالة<br />

الخطأ أو يقوم بإنهاء البرنامج بأسلوب جيد على الأقل ....<br />

)<br />

تدعى حالات حدوث الخطأ في <strong>دلفي</strong> بالاعتراضات<br />

Exceptions وهي عبارة عن أهداف<br />

متحولات،‏ توابع ،<br />

إجراءات معرفة (<br />

تحوي معلومات عن وقوع الخطأ ومكان حدوثه.‏<br />

.<br />

تستخدم التعليمة<br />

Try لحماية كتل التعليمات والتي لها شكلين سنشرح كل منهما بالتفصيل<br />

1 التعليمة : Try. . . . . . Except<br />

(<br />

بفرض أننا نتوقع حدوث خطأ ما في كتلة من التعليمات )<br />

مجموعة تعليمات<br />

لمعالجة هذا الخطأ نضع هذه<br />

، End وتستخدم Except قبل<br />

التعليمات ضمن الكتلة<br />

Try والتي تنتهي ب<br />

End لتوجيه البرنامج لتنفيذ عمليات<br />

محددة عند حدوث الخطأ .<br />

مثال :<br />

أضف زر وEdit إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />

نفذ البرنامج واكتب نصا ً في<br />

:<br />

var i :integer;<br />

begin<br />

i:= strtoint(edit1.text);<br />

)<br />

Edit<br />

( لا تكتب أرقام<br />

واضغط على الزر سيتوقف عندها تشغيل البرنامج وتظهر<br />

<strong>دلفي</strong> الرسالة التالية :<br />

الرسالة الموضحة لسبب الاعتراض<br />

أسم الإعتراض<br />

أسم البرنامج<br />

60


http://www.alshater.net<br />

"<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

والتي تعني أن البرنامج قد رفع اعتراضا ً من النوع EconvertError مع رسالة<br />

صحيح ، تم إيقاف العملية اضغط على تنفيذ مرة أخرى لإكمال عمل البرنامج<br />

عند الضغط على تنفيذ تظهر الرسالة التالية<br />

‏"النص الذي أدخلته<br />

ليس عدد<br />

.<br />

:<br />

والتي تعني أن النص المدخل ليس عدد صحيح<br />

احفظ البرنامج باسم<br />

61<br />

..<br />

Exception1 ونفذه ..<br />

أكتب نصا ً واضغط على الزر ستلاحظ ظهور الرسالة الثانية فقط<br />

ثم اذهب إلى فهرس البرنامج وشغل الملف التنفيذي<br />

، Exception1<br />

..<br />

، إذا ً فهذه هي الرسالة التي ستظهر للمستخدم<br />

وعلى فرض أن المستخدم لا يعرف ال<strong>لغة</strong> الإنكليزية فإنه لا يفهم سبب المشكلة وسيعتقد أن البرنامج سيئ<br />

لمعالجة هذا الخطأ عدل البرنامج السابق ليصبح بالشكل<br />

.<br />

Var i :integer;<br />

Begin<br />

Try<br />

i:= strtoint(edit1.text );<br />

Except<br />

) ‏’أدخل عدد صحيح من فضلك‘‏ ( Showmessage<br />

end;<br />

)<br />

:<br />

نفذ البرنامج الآن بالطريقة السابقة وستلاحظ ظهور الرسالة الأولى نفسها<br />

وجود خطأ هنا<br />

التعليمة<br />

(<br />

تظهر هذه الرسالة لتنبيه المبرمج عن<br />

ولكن الرسالة الثانية لن تظهر ولكن ستنفذ مكانها التعليمات التي وردت بعد القسم<br />

Except من<br />

. Try<br />

أحفظ البرنامج و أعد تشغيله من فهرس البرنامج ولاحظ النتائج<br />

ملاحظة<br />

.<br />

:<br />

من الواضح أن الكتلة Try . . End لم تمنع حدوث الخطأ ولكنها تعاملت مع الخطأ بأسلوب متطور<br />

والبرامج الأقوى هي البرامج التي تمنع حدوث الخطأ قدر المستطاع قبل التعامل معه فمثلا ً في برنامجنا هنا من<br />

الأفضل منع المستخدم من إدخال الأحرف داخل Edit وبالتالي لن يحدث الخطأ.‏<br />

تحديد نوع الخطأ<br />

مثال<br />

:<br />

: 2<br />

أضف عنصر<br />

Edit إلى البرنامج السابق وعدله ليصبح بالشكل<br />

var i,j :integer;z:real;<br />

Begin<br />

Try<br />

i:= strtoint(edit1.text);<br />

j:= strtoint(edit2.text );<br />

z:= i/j;<br />

edit3.Text := floattostr(z);<br />

Except<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

احفظ البرنامج ونفذه ولاحظ تنفيذ القسم<br />

Edit2 أي أن جميع التعليمات بين<br />

سيتم تنفيذها في حال حدوث خطأ<br />

نفذ البرنامج الآن وأدخل في<br />

رسالة خطأ من النوع<br />

http://www.alshater.net<br />

Except<br />

;( ‏’أدخل عدد صحيح من فضلك‘‏ ( Showmessage<br />

end;<br />

في حال حدوث الخطأ عند إدخال نص في Edit1 أو في<br />

Try وExcept سوف تخضع للفحص و جميع التعليمات بين<br />

End و Except<br />

Edit1 القيمة /232/<br />

.<br />

وأدخل في<br />

Edit2 القيمة / 0 /<br />

EzeorDivide والرسالة الثانية ستظهر من قبل برنامج<br />

" )<br />

نفذ البرنامج وستظهر <strong>دلفي</strong><br />

أدخل عدد صحيح من فضلك"‏ (<br />

بالرغم من قيامك بإدخال عدد صحيح لذلك أوجدت <strong>دلفي</strong> أسلوبا ً لتحديد نوع الخطأ وتنفيذ التعليمات المناسبة للتعامل<br />

معه ، عدل الآن البرنامج السابق ليصبح بالشكل<br />

:<br />

التعليمة<br />

أو<br />

Var i,j :integer;z:real;<br />

Begin<br />

Try<br />

i:= strtoint(edit1.text);<br />

j:= strtoint(edit2.text);<br />

z:= i/j;<br />

edit3.Text := floattostr(z);<br />

Except<br />

); ‏’أدخل عدد صحيح من فضلك‘‏ ( Showmessage On Econverterror Do<br />

On EZeroDivide Do shOwmessage ( ) ;<br />

end;<br />

Do<br />

On Econverterror Do تعني :<br />

‏'لا يمكن القسمة على صفر'‏<br />

وبذلك نستطيع تحديد كيفية التعامل مع كل خطأ على حدى<br />

...<br />

هناك عدد كبير من الاعتراضات والتي تصنف في مجموعات رئيسية<br />

EintError اعترضات الأعداد الصحيحة<br />

62<br />

عند وقوع خطأ من النوع EconvertError نفذ التعليمة بعد<br />

: EmathError )<br />

( ....<br />

ينبثق عنها اعتراضات جزئية<br />

)<br />

الاعتراضات الرياضية<br />

مثل<br />

EzerDivide أو<br />

( ErangeError<br />

وأفضل طريقة للتعرف على هذه الإعتراضات هي التعامل معها أثناء ظهورها حيث يمكننا<br />

الحصول على اسم الاعتراض من الرسالة التي<br />

تظهرها <strong>دلفي</strong> عند حدوثه كما رأينا عند ظهور<br />

EconvertError<br />

............<br />

2 التعليمة<br />

: Try .. .. Finally<br />

سنبدأ بالمثال التالي لشرح هذه التعليمة<br />

مثال<br />

:<br />

: 1<br />

أضف في حدث الضغط على زر التعليمات التالية<br />

:<br />

Var a:tstrings ;<br />

i:integer;<br />

begin<br />

إنشاء المتحول وحجز مكان له في الذاكرة // ; Tstringlist.Create =:a


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير strtoint(edit1.text);// =:i<br />

i:= i * 5;<br />

إضافة قيمة المتحول إلى اللائحة // a.Add(inttostr(i));<br />

Form1.Caption := 'Done'<br />

a.Free ;<br />

لنفرض أن المستخدم أدخل نصا ً في عنصر التحرير Edit ولم يدخل أرقاما ً سينشئ عندها الاعتراض<br />

EConvertErrorr وسيخرج البرنامج من الإجراء قبل تنفيذ التعليمة<br />

محجوزة من قبل المتحول<br />

)<br />

، a<br />

a.Free مما سيؤدي إلى بقاء الذاكرة<br />

جميع التعليمات التي تلي مكان الاعتراض لا يتم تنفيذها ولو عاد البرنامج إلى<br />

العمل،‏ لا حظ مثلا ً التعليمة 'Done' Form1.Caption =: التي لم يتم تنفيذها في حال حدث<br />

الاعتراض)‏<br />

عدل البرنامج السابق بحيث يصبح بالشكل<br />

:<br />

Var a:tstrings ;<br />

i:integer;<br />

begin<br />

Try<br />

إنشاء المتحول وحجز مكان له في الذاكرة // ; Tstringlist.Create =:a<br />

وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير strtoint(edit1.text);// =:i<br />

i:= i * 5;<br />

نفذ البرنامج ، ولاحظ حدوث الاعتراض ، أعد الضغط على الزر<br />

تنفيذها<br />

يحدث<br />

a.Add(inttostr(i));<br />

Finally<br />

Form1.Caption := 'Done' ;<br />

a.Free ;<br />

end;<br />

Finally تم<br />

)<br />

لا حظ تغير عنوان النافذة<br />

. (<br />

)<br />

Run وستجد أن التعليمات في القسم<br />

أكثر ما تتميز به التعليمة Try Finally بأنها ستقوم بتنفيذ التعليمات بعد Finally سواء حدث الاعتراض أم لم<br />

نفذ الإجراء وأدخل عدد صحيح في العنصر Edit ولاحظ أن القسم Finally قد تم تنفيذه<br />

. (<br />

تسمى هذه التعليمة بتعليمة تحرير الموارد لأن أكثر استخداماتها تكون عند الحاجة لإنشاء متحولات وتحريرها بعد<br />

. انتهاء عملها<br />

تداخل تعليمات<br />

: Try<br />

يمكن أن تتداخل تعليمات Try مع بعضها البعض إذا كانت من نفس النوع كما يلي<br />

:<br />

63


http://www.alshater.net<br />

Try<br />

…….<br />

Try<br />

…..<br />

Finally<br />

……….<br />

End;<br />

……..<br />

Finally<br />

………<br />

End;<br />

Try<br />

…….<br />

Try<br />

…..<br />

Except<br />

……….<br />

End;<br />

……..<br />

Except<br />

………<br />

End;<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

64


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

)<br />

( Except<br />

)<br />

كما أنها يمكن أن دمج نوعي عبارة<br />

Try الأولى لمعالجة الاعتراض<br />

القسم<br />

والثانية لحماية الموارد<br />

القسم<br />

( Finally وذلك لتزويد البرنامج بحماية أكبر ، ولكن يجب الحذر عند استخدام هذا التداخل لمعرفة أي منهما<br />

يحدث أولا ً .<br />

تنقيح البرنامج :<br />

بعد الانتهاء من كتابة البرنامج لا بد من فحص الأخطاء التي قد تحدث والتي لا يمكن التنبه لها عند تنفيذ البرنامج<br />

لأول مرة وتدعى هذه الأخطاء ب<br />

ويوجد مع <strong>دلفي</strong> العديد من الأدوات التي تمكن المبرمج من<br />

فحص<br />

( Bugs<br />

)<br />

برامجه والتأكد من خلوها من الأخطاء قبل النشر ، تسمى عمليات فحص البرنامج والتخلص من أخطائه ب )<br />

( Debug<br />

1 التحكم بتنفيذ برنامج :<br />

من المفيد معرفة قيم متحولات البرنامج أثناء التنفيذ ومعرفة كيفية تغير قيم هذه المتحولات ، ولهذا أوجدت <strong>دلفي</strong><br />

طرقا ً لتنفيذ جزء من تعليمات البرنامج ثم التوقف أو تنفيذ تعليمات البرنامج خطوة خطوة وفحص قيم المتحولات<br />

عند نقطة معينة ثم العودة للتنفيذ .<br />

تنفيذ البرنامج خطوة خطوة :<br />

يوجد أمرين لتنفيذ البرنامج خطوة خطوة أولاهما الأمر<br />

الضغط على الزر<br />

Trace into والذي يمكن اختياره من القائمة<br />

Run أو عبر<br />

Run<br />

من أزرار السرعة أو الضغط على<br />

F7 من لوحة المفاتيح والثاني<br />

Step Over الذي يمكن تنفيذه من القائمة<br />

. F8<br />

أو الضغط على الزر<br />

أو الضغط على<br />

عند اختيار الأمر<br />

Trace Into يقوم بتنفيذ التعليمة الأولى من البرنامج ثم نضغط عليه مرة ثانية لتنفيذ التعليمة<br />

الثانية وهكذا وإذا صادف هذا الأمر إجراء أو تابعا ً ينتقل إليه لينفذ تعليماته كذلك .<br />

والأمر<br />

Step Over يشابه الأمر Trace Into ولكنه إذا صادف إجراء أو تابعا ً فإنه ينفذه بالكامل ويعود إلى<br />

التعليمة التي تلي طلب هذا الإجراء .<br />

مثال :<br />

أضف زر وعنصر لائحة<br />

ListBox إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />

:<br />

Var s:string ;<br />

i , j ,z :integer;<br />

begin<br />

for i := 0 to 500 do<br />

begin<br />

j:= i * 5;<br />

z:= j * 2 ;<br />

s:= inttostr ( j ) + ' ' + inttostr(z);<br />

Form1.Caption := s;<br />

listbox1.Items.Add(s)<br />

65


http://www.alshater.net<br />

end;<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أضغط على F7 عدة مرات حتى ينهي الأمر Trace Into تعليمات تهيئة البرنامج ويدخل في جملة التعليمات<br />

المكتوبة في الأعلى ، أضغط الآن على F7 مرة أخرى ولاحظ انتقال تنفيذ البرنامج إلى التعليمة التالية حيث يظهر<br />

سهم أخضر على يسار التعليمة التي ستنفذ عن الضغط على F7 في المرة التالية<br />

.<br />

كرر الضغط على F7 حتى يصل السهم الأخضر إلى التعليمة listbox1.Items.Add(s) ، حرك الآن مؤشر<br />

الفأرة ليقف فوق المتحولات في جسم الحلقة مثلا ً أوقف المؤشر فوق المتحول I ستظهر عندها القيمة المخزنة في<br />

وكذلك في<br />

I<br />

....S و Z<br />

أضغط على F7 مرتين حتى يقف السهم الأخضر بجانب التعليمة * 5 i =:j ولاحظ أنه يمكنك الحصول على قيمة<br />

I الجديدة ولا يمكنك الحصول على كل من قيمة<br />

القيم لم يتم إعطائها قيم جديدة بعد<br />

ملاحظة<br />

j و Z و<br />

.<br />

:<br />

s ويعود السبب لأن I قد أخذت قيمتها الجديدة بينما باقي<br />

يستخدم الأمر Step Over بنفس الطريقة ولكن عليك بدأ تنفيذ البرنامج ب Trace Into حتى يتم تنفيذ التعليمة<br />

Application.Run لأن الإجراء Step Over يعتبرها تعليمة واحدة وينفذ البرنامج بعدها بالكامل<br />

.<br />

الأمر<br />

: Run To Cursor<br />

قد يكون أحيانا ً من الصعب تنفيذ البرنامج خطوة خطوة للوصول إلى مجموعة تعليمات نريد فحصها لذلك وجد هذا<br />

الأمر حيث يكفي أن تضع مؤشر الكتابة في السطر البرمجي الذي تريد ثم تختار الأمر<br />

القائمة Run أو الضغط على F4 عندها سيتم تنفيذ البرنامج حتى التعليمة التي وقفت عندها<br />

Run To Cursor<br />

.<br />

من<br />

ملاحظة : لا تستخدم هذه الطرق الثلاث لمعرفة قيم المتغيرات فحسب ، فهي تستخدم في البرامج الكبيرة وخاصة<br />

عندما يعطي البرنامج في أماكن معينة نتائج غير متوقعة أو نتائج غير المطلوبة ، حيث تقوم هذه الأوامر بإعطائك<br />

معلومات عن سير البرنامج ومعرفة النقطة التي يحدث فيها الخلل،‏ كما أن <strong>دلفي</strong> قد تعطيك بعض رسائل الأخطاء<br />

التي لا يمكن تحديد مكانها بسهولة<br />

نقاط التوقف<br />

.<br />

:<br />

تستخدم نقاط التوقف لإيقاف البرنامج في نقاط محددة حيث يستمر تنفيذ البرنامج حتى وصول البرنامج إلى السطر<br />

المحدد وتختلف نقاط التوقف عن الأمر Run To Cursor بأننا نستطيع إضافة عدد كبير من نقاط التوقف في<br />

. البرنامج<br />

ولإضافة نقطة توقف في البرنامج نضع المؤشر في السطر المراد التوقف عنده ونختار الأمر<br />

من القائمة<br />

Add Breakpoint<br />

Run<br />

ثم الضغط على Ok في صندوق الحوار أو الضغط على F5 أو الضغط على يسار السطر<br />

بالفأرة وتتميز السطور المعلمة بنقاط توقف بلونها الأحمر<br />

.<br />

سنتعلم الآن كيفية التعامل مع نقاط التوقف وسنتعلم لاحقا ً كيفية الاستفادة منها<br />

.<br />

66


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التعامل مع نقاط التوقف<br />

1 عرض جميع نقاط التوقف :<br />

يمكن توزيع نقاط التوقف في كل وحدات البرنامج بنفس الوقت ولعرض قائمة بجميع أوامر التوقف نختار من<br />

القائمة View<br />

View Debug Window Breakpoints<br />

حيث تظهر نافذة تظهر نافذة تخبرك باسم الوحدة الموجودة فيها نقطة التوقف وفي أي سطر من الشيفرة .<br />

2 تعطيل نقاط التوقف :<br />

يمكن تعطيل نقاط التوقف مؤقتا ً بالضغط على الدائرة الحمراء بزر الفأرة اليميني والضغط على الخيار Enable<br />

من القائمة المنبثقة حيث يتحول لون نقطة التوقف إلى اللون الأخضر ويمكن إعادة النقطة إلى العمل بتكرار العملية<br />

3 حذف نقطة توقف :<br />

يتم حذف نقطة التوقف بالطريقة التي تم إنشاءها بها )<br />

أي بإمكانك الضغط على الدائرة الحمراء بزر الفأرة اليساري<br />

أو الضغط على .... F5 (<br />

يمكن حذف جميع نقاط التوقف عن طريق View Debug Window Breakpoints ومن<br />

عرض الائحة<br />

ثم الضغط على إحدى النقاط في اللائحة بزر اليمين للفأرة واختيار الأمر .... Breakpoint Delete All<br />

4 استخدام نقاط توقف شرطية :<br />

يمكنك تحديد شرط لنقطة التوقف حيث لا يتوقف البرنامج إلا إذا حصل هذا الشرط )<br />

مثلا ً في المثال السابق وصول<br />

المتحول ( 500<br />

j إلى القيمة<br />

ويتم ذلك عن طريق الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار<br />

j =<br />

)<br />

Condition ومن ثم كتابة الشرط في القسم Breakpoint Properties<br />

في النافذة مثلا ً أكتب الشرط<br />

( 500<br />

5 استخدام عدد مرات العبور :<br />

يمكن أن نطلب من البرنامج أن يقف عن نقطة التوقف عند تنفيذها لعدد معين من المرات،‏ ويتم ذلك عن طريق<br />

الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار<br />

Breakpoint Properties ومن ثم كتابة عدد<br />

المرات المطلوبة في القسم Pass count<br />

Pass Count ب<br />

مثلا ً أضف نقطة توقف عن السطر<br />

listbox1.Items.Add(s) ثم حدد<br />

100 نفذ البرنامج الآن<br />

وستلاحظ توقف البرنامج عن العمل عندما تنفذ الحلقة 100 مرة .<br />

مراقبة التعابير والمتحولات :<br />

تستخدم المراقبة لمعرفة قيم تعابير ومتحولات محددة أثناء سير البرنامج ‏،ولإضافة نقطة مراقبة اتبع<br />

إحدى الطرق<br />

التالية :<br />

1 حدد المتحول الذي تريد إضافة نقطة مراقبة له واضغط بزر الفأرة اليميني وأختر الأمر Debug Add<br />

Watch at Cursor<br />

2 اختر Add Watch من القائمة<br />

Run أو اضغط<br />

. Ctrl F5<br />

3 إظهار النافذة Watch List من القائمة View Debug Windows watches View<br />

67


http://www.alshater.net<br />

. Expression<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

عندئذٍ‏ سيظهر صندوق الحوار التالي حيث يمكنك كتابة القيمة المراد مراقبتها في القسم<br />

بعد إضافة المتحولات المطلوب مراقبتها عليك تنفيذ البرنامج خطوة خطوة أو استخدام نقاط التوقف،‏ حيث ستبقى<br />

.<br />

نافذة المراقبة مفتوحة وتعطيك قيمة المتحولات في كل لحظة<br />

يتوقف فيها البرنامج<br />

التعامل مع عناصر المراقبة ‏:أفتح أولا ً لائحة عناصر المراقبة عن طريق<br />

watches<br />

يمكنك تعطيل عنصر مراقبة عن طريق الضغط عليه بزر الفأرة اليميني واختيار الأمر<br />

View Debug Windows :<br />

، Disable ولحذف عنصر<br />

مراقبة نهائيا ً نختار . Delete<br />

للتغير في عنصر المراقبة نختار الأمر Edit Watch فتظهر النافذة :<br />

حيث<br />

Expression هو التعبير المراد مراقبته<br />

ونستطيع هنا أن نكتب تعبرا ً ما فرضا ً يمكن<br />

مراقبة قيمة<br />

i+j رغم أن هذه التعليمة غير<br />

موجودة في سطور البرنامج .<br />

: Repeat Count تستخدم مع الأنساق<br />

والسجلات فبفرض لدينا مصفوفة من أربع<br />

عناصر فنكتب في القسم Expression أسم<br />

الم صفوفة وف ي الحق ل<br />

4/ عندها ستظهر جميع عناصر المصفوفة أثناء المراقبة .<br />

Repeat Count القيمة /<br />

كما يمكن تحديد كيفية ظهور المعطيات من جزء النافذة في الأسفل فاختيار<br />

Hexadecimal سيظهر قيمة المتحول<br />

في النظام الست عشري ويحدد الحقل<br />

Digits عدد الأرقام بعد الفاصلة عند إظهار الرقم بالفاصلة العائمة<br />

. Floating Point<br />

رؤية استدعاء الروتينات :<br />

يمكننا مشاهدة المكدس الذي يحوي على استدعاء الاجراءات عن طريق<br />

Stack<br />

حيث يتوضع في أعلى النافذة التابع المستدعى حاليا ً والسطر الذي يليه التابع الذي قام باستدعائه .<br />

View Debug Windows call<br />

Add ( 10 ) ;<br />

:<br />

مثال :<br />

اكتب في حدث الضغط على زر التعليمة التالية<br />

Procedure Add ( x ) ;<br />

:<br />

وعرف الإجراء<br />

Add بالشكل التالي<br />

Begin<br />

X := x +1;<br />

If X < 50 then Add ( x ) ; // 50<br />

End;<br />

سيعيد هذا التابع تنفيذ نفسه حتى وصول المتحول إلى القيمة<br />

نفذ الآن البرنامج خطوة خطوة ولاحظ تغير<br />

. النتائج<br />

68


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الثاثثة عشر<br />

ما هي قاعدة المعطيات؟:‏<br />

http://www.alshater.net<br />

)<br />

قاعدة المعطيات Database هي تركيب تستطيع من خلاله تخزين كمية ً ضخمة ً من المعطيات التي تربطها علاقات<br />

معينة،‏ وحقيقة ُ الأمر،‏ فإن قاعدة المعطيات ما هي إلا ملف ّ File أو مجموعة ملف ّات ت ُخزن على القرص الصلب<br />

Hard Disk ككلّ‏ الملف ّات العادية،‏ ولكن ما يميزها عن باقي الملف ّات،‏ هو قدرتك على كتابة المعطيات فيها<br />

وقراءتها منها،‏ باستخدام الوسائل التي تمنحها لك برامج قواعد المعطيات،‏ دون الحاجة إلى التعامل مع الملف ّ<br />

مباشرة ً،‏ وهو ما يجعل الأمر أكثر سهولة ً وتنظيما بالنسبة لك.‏<br />

ولا مانع أن تخزن بياناتك في ملف ّ خاص بك بالطريقة التي تريحك،‏ ولكن استخدام قواعد المعطيات يوف ّر لك<br />

الكثير من الوقتِ‏ والجهد.‏<br />

في بدايات قواعد المعطيات كان كل مبرمج ينشئ ملف معطيات خاص به ويقوم بالتعامل مع هذا الملف بالطرق<br />

التي تتيحها لغات <strong>البرمجة</strong> للتعامل مع الملفات<br />

)<br />

سنتعرف عليها لاحقا ً<br />

(<br />

( ملفات )<br />

ولكن مع الوقت تطورت قواعد البيانات<br />

وأصبح المستخدمون بحاجة إلى قواعد بيانات ذات حجم كبير و إلى القدرة إلى الحصول على المعلومات المطلوبة<br />

بشكل سريع بالإضافة إلى إمكانية التشارك على المعلومات أي إمكانية إدخال المعلومات والحصول عليها من ملف<br />

قواعد المعطيات من قبل عدة مستخدمين بنفس الوقت،‏ الأمر الذي جعل من المستحيل أن يقوم مبرمج<br />

عادي بتحقيق هذه الشروط<br />

(<br />

وهناك أنواع كثيرة من قواعد المعطيات،‏ تبعا للشركة التي تنتجها والبرامج التي تنشئها،‏ فهناك قواعد بيانات<br />

برنامج<br />

Access وبرنامج<br />

شركات أخرى.‏<br />

وتسمى هذه البرامج ‏"أنظمة إدارة قواعد المعطيات"‏<br />

SQL Server وهما من إنتاج ميكروسوفت،‏ وهناك عشرات البرامج غيرهما من إنتاج<br />

(DBMS) ،Database Management Systems ومهمتها<br />

الأساسية أن تمنحك الوسائل والأدواتِ‏ اللازمة لإنشاءِ‏ قواعدِ‏ المعطيات والتعاملِ‏ معها،‏ بأسهلِ‏ طريقةٍ‏ وأفضلِ‏<br />

إمكانيات،‏ بحيث ُ تقوم بدور الوسيط بينك وبين المعطيات المخزنة في ملف ّ قاعدة المعطيات.‏<br />

ومهما كان نوع قاعدة المعطيات التي تتعامل معها،‏ ومهما كانت طريقة تخزينها في الملف ّ،‏ فإن كلّ‏ قواعد<br />

المعطيات تتبع قواعد أساسية وتحق ّق شروطا معينة متعارفا عليها دوليا،‏ كما أن ّها كل ّها بلا استثناء تستخدم ‏"<strong>لغة</strong><br />

الاستعلام المرك ّبة"‏ (SQL) ،Structured Query Language وهي <strong>لغة</strong> خاصة لحفظ واسترجاع وتحديث<br />

المعطيات في قواعد المعطيات.‏<br />

: التالي<br />

مما تتألف قواعد المعطيات:‏<br />

العنصر الأساسي في أي قاعدة بيانات هو الجدول ويتألف الجدول من أعمدة وأسطر يدعى كل سطر سجل وكل<br />

عمود بحقل وبالتالي فإن السجل مكون من عدة حقول،‏ لنفرض أنه لديك قاعدة بيانات لمكتبة فسيكون لديك الجدول<br />

69


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

( أسماء الحقول ) أسماء الأعمدة<br />

رقم الكتاب<br />

اسم الكتاب<br />

اسم المؤلف<br />

تاريخ<br />

دار النشر<br />

السجل الحالي<br />

الإصدار<br />

الحقل الحالي<br />

1997/1/2<br />

<strong>لغة</strong> <strong>البرمجة</strong><br />

ياسر عقاد<br />

دار شعاع<br />

1255<br />

<strong>دلفي</strong><br />

محمد حمدي 2002/2/9<br />

غانم<br />

كتاب<br />

إلكتروني<br />

VB.Net<br />

1256<br />

سجلات<br />

1944/3/3<br />

شجرة الحكم<br />

توفيق الحكيم<br />

مصر<br />

1257<br />

2000/4/2<br />

الأي دي<br />

توفيق الحكيم<br />

مصر<br />

1258<br />

الناعمة<br />

1990/3/12<br />

شهرزاد<br />

الحكيم توفيق<br />

مصر<br />

.(<br />

ملاحظة : )<br />

المعلومات في هذا الجدول غير دقيقة<br />

: السجل الحالي<br />

هو السجل الذي يقف مؤشر قاعدة البيانات عنده والحقل الحالي هو تقاطع السجل الحالي مع<br />

العامود الحالي حيث يمكنك دائما ً تحرير قاعدة البيانات عند السجل الحالي وفي الحقل الحالي ) سنتآلف مع هذه<br />

المعلومات لاحقا ً<br />

.(<br />

يمكن أن تتكون قاعدة المعطيات من عدة جداول وهذه الجداول قد تكون مخزنة في ملف واحد<br />

أكسيس مثلا ً<br />

)<br />

(<br />

يعرف كل حقل<br />

أو أن يكون كل جدول في ملف على حدة كما في قاعدة بيانات بارادوكس<br />

.<br />

( عمود )<br />

Integer أو<br />

وتاريخ الإصدار من النوع<br />

قاعدة بيانات<br />

في قواعد المعطيات نوع المعطيات التي سيحويها فمثلا ً الحقل رقم الكتاب من النوع<br />

LongInt حسب حجم المكتبة بينما أسم الكتاب و اسم المؤلف ودار النشر تكون من النوع نص<br />

. Date<br />

وأكثر من ذلك عندما نعرف الحقل من نوع نص علينا تحديد عدد الأحرف التي سيحويها هذا النص مثلا ً أسم<br />

الكتاب عشرين حرف علما ً أنه لا يسمح بكتابة أكثر من الحد المعطى ، كما أن حجم الحقل سيكون بحجم النص<br />

عشرين بايت<br />

)<br />

(<br />

سواء أكان أسم الكتاب من عشرين حرف أو أقل ،<br />

البيانات ، بالإضافة إلى قواعد البيانات التي تأخذ حقول متغيرة<br />

قواعد المعطيات العلائقية<br />

)<br />

. (<br />

:<br />

سنتعرف لاحقا ً على أنواع الحقول في قواعد<br />

في الجدول السابق وضعنا أسم المؤلف ضمن الجدول ، ومن الممكنِ‏ أن يحتوى الجدول على أكثر من كتابٍ‏ لنفس<br />

المؤل ّف..‏ في هذه الحالة سيتم تكرار اسم المؤل ّف أكثر من مرة،‏ مما سيعمل على زيادة حجم قاعدة المعطيات،‏<br />

وإبطاء عمليات البحث..‏ إذن ما الحلّ؟<br />

الحلّ‏ هو تخصيص جدولٍ‏ للمؤل ّفين،‏ هذا الجدول يحتوي على رقم مسلسل ID لكلّ‏ مؤل ّف..‏ وفي جدول الكتب ننشئ<br />

عمودا نضع فيه رقم مؤل ّف الكتاب..‏ فمثلا لو كان رقم ‏(توفيق الحكيم)‏ في جدول المؤل ّفين هو 100، فإن خانة رقم<br />

70


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

المؤل ّف في جدول العناوين لا بد أن تكون<br />

100 لكلّ‏ من الكتب التالية<br />

‏"شهرزاد"‏<br />

و"الأيدي الناعمة"‏<br />

و"أرني االله"‏<br />

:<br />

و"شجرة الحكم"‏<br />

وسيصبح لينا جدولين بالشكل<br />

رقم الكتاب<br />

اسم الكتاب<br />

اسم المؤلف<br />

تاريخ<br />

دار النشر<br />

الإصدار<br />

1997/1/2<br />

<strong>لغة</strong> <strong>البرمجة</strong> 50<br />

دار شعاع<br />

1255<br />

<strong>دلفي</strong><br />

2002/2/9 كتاب<br />

56<br />

VB.Net<br />

1256<br />

إلكتروني<br />

1944/3/3<br />

شجرة الحكم 100<br />

مصر<br />

1257<br />

2000/4/2<br />

الأيدي الناعمة 100<br />

مصر<br />

1258<br />

1990/3/12<br />

شهرزاد 100<br />

مصر<br />

جدول الكتب<br />

رقم المؤلف<br />

أسم المؤلف<br />

ياسر عقاد<br />

محمد حمدي غانم<br />

توفيق الحكيم<br />

سعيد الصافي<br />

50<br />

56<br />

100<br />

114<br />

ولكي تستوعب مقدار التوفير في الحجم،‏ يجب أن تعرف أن كلّ‏ حرف في النص يخزن في بايت<br />

،Byte مما يعني<br />

أن النص<br />

‏"توفيق الحكيم"‏<br />

يحتاج إلى<br />

12 بايت ، وتكراره أربع مرات يعني أن ّه يحتاج إلى<br />

48 بايت !.. بينما تخزين<br />

8 بيتات<br />

رقم يصل إلى<br />

32000 لن يحتاج إلا إلى بايتين فقط،‏ مما يعني أن تخزين رقم<br />

100 أربع مرات يحتاج إلى<br />

فقط..‏<br />

طبعا الفرق واضح.‏<br />

وليت َ الأمر يقتصر على هذا..‏<br />

إن إنشاء عمود يحتوي على أسماء المؤل ّفين يقتضي تصميمه ليستوعب أطول اسم<br />

30<br />

من هذه الأسماء..‏<br />

افترض أن أطول اسم لمؤل ّف هو<br />

20 حرفا،‏ في هذه الحالة لو كان جدول الكتب يحتوي على<br />

600 كيلو<br />

= 20<br />

ألف كتاب،‏ فإن هذا معناه أن عمود أسماء المؤّلفين يحتاج إلى × 30000<br />

600 ألف بايت ، أي<br />

بايت!‏<br />

بينما لو استعضنا عن ذلك بعمود أرقام المؤل ّفين،‏ فإن ّه سيحتاج إلى<br />

60 ألف وحدة،‏ أي<br />

60 كيلو بايت فقط.‏<br />

طبعا ستتساءل:‏<br />

ولكن ّنا في كلّ‏ الأحوال سننشئ عمودا لأسماء المؤل ّفين بالإضافة لعمود رقم المؤل ّف في جدول<br />

المؤل ّفين..‏<br />

نعم،‏ ولكن عدد المؤّلفين قد لا يزيد عن<br />

3 آلاف مؤل ّف<br />

‏(باعتبار أن كلّ‏ مؤل ّف له عشر كتب)،‏ وهو ما<br />

سيحتاج إلى<br />

66 كيلو بايت.‏<br />

= (2<br />

+ 20)<br />

× 3000<br />

إذن فإن المجموع الكل ّي لمساحة التخزين في حالة تقسيم المعلومات على جدولين<br />

126 كيلو بايت،‏<br />

= 66<br />

+ 60<br />

=<br />

أي حوالي خمس المساحة المستهلكة عند وضع أسماء المؤل ّفين في نفس جدول الكتب!‏<br />

71


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

هذا بالإضافة إلى سرعة عملية البحث،‏ فالكمبيوتر يكون أسرع بكثير عند البحث عن رقم 100 عنه عند البحث عن<br />

النص<br />

‏"توفيق الحكيم".‏<br />

ليس هذا فحسب..‏<br />

افترض أن الذي يدخل أسماء المؤل ّفين أخطأ وكتب اسم<br />

‏(توفيق الحكيم)‏<br />

كالتالي:‏ ‏"تفيق الحكيم"..‏<br />

في هذه الحالة ما عليه إلا أن يعدل الخطأ مرة واحدة في جدول المؤل ّفين..‏<br />

أما لو كانت أسماء المؤل ّفين في نفس<br />

جدول الكتب،‏ فإن تكرار كتابة اسم المؤل ّف يجعل احتمالات الخطإ أكبر،‏ بالإضافة إلى تضييع الوقت والجهد في<br />

كتابتها،‏ وصعوبة تعديلها كل ّها!‏<br />

طبعا نفس هذا الكلام ينطبق على جدول دار النشر.‏<br />

قاعدة هامّة:‏<br />

كل ّما كان ممكنا،‏ قم بتقسيم المعطيات التي تتكرر أكثر من مرة على أكثر من جدول،‏ خاصة ً إذا كانت هذه المعطيات<br />

تستهلك مساحة تخزين كبيرة..‏<br />

إن هذه العملية تسمى التطبيع<br />

،Normalization ولها الكثير من القواعد،‏ وإن كان<br />

. (<br />

من الممكن استنتاجها منطقيا )<br />

تدرس في قسم المادة النظري<br />

تسمى هذه القواعد التي تعتمد الطريقة السابقة بقواعد المعطيات العلائقية أو بقواعد المعطيات المترابطة<br />

:Relational Databases<br />

حيث قامت هنا علاقة بين جدولين وسيعتمد احدهما على الآخر في الحصول على معلوماته .<br />

رأينا في المثال السابق أن هناك علاقة ً<br />

Relationship بين جدولي الكتب والمؤل ّفين،‏ حيث إن الرابط بينهما هو<br />

حقل رقم المؤل ّف..‏<br />

وهنا يجب أن تعرف هذه المصطلحات:‏<br />

يسمى الحقل المشترك في كلا الجدولين .Key field<br />

‏"حقل مفتاحي"‏<br />

-<br />

- يسمى حقل رقم المؤل ّف في جدول المؤل ّفين باسم<br />

‏"المفتاح الأساسي‏"‏<br />

،Primary Key وذلك لأن ّه متفرد<br />

Unique غير قابل للتكرار..‏<br />

ولا يحتوي الجدول على أكثر من مفتاح أساسي واحد.‏<br />

- يسمى حقل رقم المؤل ّف في جدول الكتب باسم<br />

‏"المفتاح الفرعي‏"‏<br />

،Foreign Key لأن ّه موضوع في هذا<br />

الجدول ليربطه بجدول آخر..‏<br />

وطبعا يمكن أن تتكرر قيمة هذا العمود بدون أدنى مشكلة..‏<br />

ويمكن أن يحتوى<br />

الجدول على أكثر من مفتاح فرعي يربطه بعدد من الجداول الأخرى.‏<br />

- يسمى جدول المؤّلفين باسم<br />

‏"الجدول الرئيس ي"‏<br />

،Master وجدول أسماء الكتب باسم<br />

‏"جدول التفاصيل"‏<br />

..Join<br />

،Detail حيث يمكنك أن تحصل منه على معلومات عن الكتب المتوافرة لكلّ‏ مؤل ّف.‏<br />

- تسمى عملية مطابقة الصفوف بين الجدولين المترابطين عن طريق الحقل المفتاحي‏،‏ عملية<br />

‏"ربط"‏<br />

مثل أن تحاول معرفة اسم مؤل ّف كتاب معين،‏ أو أن تحاول أن تعرف كلّ‏ الكتب التي كتبها نفس المؤل ّف.‏<br />

- تسمى العلاقة بين الجدولين علاقة<br />

يمكن أن يكون له أكثر من كتاب.‏<br />

‏"واحد بمتعدد"‏<br />

،One-to-many Relationship وذلك لأن مؤل ّف ًا واحدا<br />

- يمكن أن توجد علاقة<br />

‏"متعدد بمتعدد"‏<br />

،Many-to-many Relationship وذلك لو كان لدينا كتب اشترك<br />

في تأليفها أكثر من مؤل ّف..‏<br />

في هذه الحالة سيكون لدينا جدول ثالث هو جدول<br />

‏"مؤل ّفو الكتب"،‏ يحتوى على<br />

72<br />

عمود يمث ّل رقم الكتاب في جدول عناوين الكتب،‏ وعمود آخر يمث ّل رقم المؤل ّف في جدول المؤل ّفين،‏<br />

كالتالي:‏


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

AuthorID<br />

23<br />

106<br />

8<br />

8<br />

BookID<br />

1<br />

1<br />

2<br />

3<br />

حيث اشترك المؤّلفان رقما<br />

رقمي<br />

23 و<br />

106 في تأليف الكتاب رقم<br />

2، بينما قام المؤل ّف رقم<br />

8 بتأليف الكتابين<br />

2 و ..3<br />

هذه هي علاقة متعدد بمتعدد.‏<br />

صحّة المرجع<br />

:Referential Integrity<br />

ماذا سيحدث لو تم حذف سجلّ‏ توفيق الحكيم من جدول المؤل ّفين؟..‏ ستظلّ‏ هناك روايات في جدول الكتب تشير<br />

لسجلّ‏ توفيق الحكيم،‏ بينما هو محذوف..‏ إن هذا وضع مثالي لحدوث أخطاءٍ‏ مزعجة في تطبيقك!‏<br />

والحلّ؟<br />

يجب أن تراعي منطقية وصحة العلاقات المرجعية<br />

Referential Integrity<br />

بين الجداول،‏ فلو قمت بحذف سجلّ‏<br />

توفيق الحكيم من جدول الكتب،‏ فيجب أيضا أن يتم حذف كلّ‏ الروايات والكتب التي أل ّفها من جدول الكتب.‏<br />

عامة ً اطمئن‏،‏ فكما ذكرنا من قبل،‏ فإن برامج قواعد المعطيات مصممة لتريحك من معظم العمل اليدوي‏،‏ لهذا فهي<br />

ستعينك على التحق ّق من صحة العلاقات المرجعية بين الجداول،‏ كما سنرى بعد قليل.‏<br />

العمليات على قواعد المعطيات<br />

:<br />

قاعدة المعطيات عبارة عن مخزن يتم فيه تخزين المعطيات ويجب أن يتمتع هذا المخزن بالخصائص التالية<br />

1 الإضافة<br />

2 الحذف<br />

3 التعديل<br />

:<br />

:<br />

أي إمكانية إضافة سجلات جديدة إلى الجداول<br />

.<br />

:<br />

أمكانية حذف قيم من الجداول دون أن يؤثر ذلك على القاعدة<br />

.<br />

:<br />

يجب أن نكون قادرين على تعديل حقول قاعدة البيانات ، أفرض مثلا ً أن هناك حقل في جدول<br />

يحوي على عدد النسخ من الموجودة من الكتب ، علينا أن نعدل هذا الحقل كلما إشترى أحد الزبائن كتابا ً ما<br />

4 البحث<br />

.<br />

:<br />

5 الترتيب والفرز<br />

يجب الحصول على المعلومة المطلوبة بأسرع وقت ممكن<br />

.<br />

:<br />

حسب أسم الكتاب أو حسب أسم المؤلف<br />

القدرة على إظهار البيانات للمستخدم بالشكل الذي يريد<br />

)<br />

.<br />

في جدول يمكن ترتيب الكتب<br />

عليك أن تعرف أيضا ً الفرق بين تخزين المعطيات والفائدة التي يمكن أن تجنيها من هذه المعطيات ، فالعمليات على<br />

المعطيات هي التي تعطي المعلومات والتي يحتاجها مستثمر قاعدة البيانات ليتخذ قراره،‏ تستخدم قواعد البيانات في<br />

بلادنا في مجال المحاسبة وإصدار الفواتير وفي مجالات الإحصاء على أكثر تقدير<br />

الاستفادة من المعلومات الإحصائية<br />

)<br />

(<br />

قليل من الشركات تعرف<br />

بينما تستخدم قواعد المعطيات في الخارج كالولايات المتحدة الأمريكية مثلا ً<br />

للحصول على كم هائل من المعلومات لا يمكن لإنسان عادي أن يتصوره ، افرض أن الزبون سعيد قد اشترى من<br />

المكتبة عدة كتب تتعلق بلغات <strong>البرمجة</strong> خلال سنة ، يتكون من هذه المعطيات أن سعيد يحب قراءة كتب <strong>البرمجة</strong><br />

73


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ويقوم صاحب المكتبة بإرسال إعلانات إلى سعيد كلما صدر مؤلف جديد في لغات <strong>البرمجة</strong>،‏ لنفرض أيضا ً أنه في<br />

http://www.alshater.net<br />

أسبوع ما كثر الطلب على كتاب ما<br />

) Harry potter الكتاب الذي حصد أكبر مبيعات في العالم في الشهر السادس<br />

، عندها يقوم صاحب المكتبة بتعديل ترتيب الكتب الموضوعة على الرفوف ليكون<br />

هذا الكتاب على<br />

(<br />

2003<br />

الرفوف في واجه المكتبة<br />

.( طبعا ً لا يمكن تطبيق هذه الأمثلة عندنا هكذا ، لأن أي مكتبة في الولايات المتحدة يكون<br />

لها فروع في أكثر من ولاية ومدينة مما يعني عدد زبائن يفوق المليون زبون،‏ مما يعطي إحصائيات واسعة عن<br />

حركة البيع والشراء (<br />

خطوات تصميم قواعد المعطيات :<br />

1 تحديد الغرض من قاعدة المعطيات .<br />

2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات .<br />

3 تحديد حقول الجداول التي نحتاج إليها .<br />

4 تعيين الحقول المفتاحية .<br />

5 تحديد العلاقات بين الجداول<br />

6 إدخال المعطيات .<br />

1 تحديد الغرض من قاعدة :<br />

المعطيات<br />

يجب المعرفة أولا ً ماذا يريد المستخدم من قاعدة المعطيات وثم معرفة المعطيات التي يجب تخزينها في القاعدة لأن<br />

أي زيادة في المعطيات سينتج عنه زيادة في حجم القاعدة بدون سبب ، وأي نقص في المعطيات سيتطلب منا تعديل<br />

الجدول فيما بعد والذي قد يؤدي بدوره إلى تعديل في الجداول المرتبة وبالتالي تعديل القاعدة بالكامل .<br />

2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات :<br />

بعد تحديد المعطيات المطلوب تخزينها يجب علينا العمل على تخطيط الجداول التي ستخزن هذه المعلومات .<br />

3 تحديد حقول الجداول التي نحتاج إليها :<br />

يجب<br />

أن لا يتضمن الجدول معلومات متكررة ‏،كما أنه لا يجب تكرار المعلومة الواحدة بين الجداول ، هذا يضمن<br />

تحديث المعلومة في مكانها ويقضي على احتمال إدخال معلومات متباينة لتلك المعلومة فيما لو وجدت في مكانين<br />

مختلفين .<br />

........<br />

قواعد المعطيات في <strong>دلفي</strong> : .....<br />

1 برامج قواعد المعطيات<br />

: هي البرامج التي تسمح للمستخدم بالتعامل مع المعطيات المخزنة ضمن قاعدة<br />

المعطيات،‏ وعند كتابة برنامج لقاعد معطيات يجب أن تكون على علم كاف ببنية قاعدة المعطيات التي تتعامل معها<br />

)<br />

الجداول والحقول<br />

( حيث يمكنك ذلك من تصميم الواجهات التي تسمح للمستخدم بتعامل مع هذه المعطيات<br />

)<br />

استعراض ، إضافة ، حذف ، بحث ....... ( .<br />

74<br />

2 أنواع قواعد المعطيات<br />

:


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اختيار نوع قاعدة المعطيات التي ستخدم يعتمد على ثلاث نقاط رئيسية<br />

1 حجم المعطيات التي سيحويه كل جدول .<br />

2 كم هو عدد المستخدمين الذين سيتشاركون العمل على هذه القاعدة .<br />

3 سرعة الأداء المطلوبة من قاعدة المعطيات .<br />

وعلى هذا المبدأ تقسم قواعد المعطيات إلى قسمين :<br />

أ قواعد المعطيات المحلية :<br />

تعمل قواعد المعطيات المحلية على جهاز واحد أو على شبكة محلية صغيرة ، وهي سريعة عمليا ً ولكنها أبطئ في<br />

حالات التشارك على قواعد المعطيات )<br />

تصور عدد من الموظفين يقومون بإدخال الكتب الجديدة الواصلة إلى<br />

المكتبة بنفس الوقت ، عندها على قاعدة المعطيات العمل على جعل ذلك متاحا ً للموظفين (<br />

تقوم قواعد المعطيات<br />

(<br />

المحلية على قفل الملف )<br />

الجدول<br />

للمستخدم الحالي ومنع التعديل في هذا الجدول من<br />

قبل مستخدم آخر حتى ينهي<br />

(<br />

المستخدم الحالي تعديله )<br />

يوجد خوارزميات كثيرة لتطبيق هذا العمل<br />

واعتماد قواعد المعطيات على هذا النوع من<br />

. (<br />

القفل جعلها محدودة الحجم نوعا ً ما )<br />

هناك عدد أعظمي للسجلات التي يمكن لقاعدة المعطيات التعامل معها<br />

سرية المعلومات في هذه القواعد ضعيفة جدا ً ويمكن كسرها بسهولة.‏<br />

. Paradox, dBASE, FoxPro, and Access.<br />

كمثال على قواعد المعطيات المحلية لدينا :<br />

ب قواعد المعطيات الموزعة :<br />

(<br />

تسمح هذه القواعد لعدة مستخدمين )<br />

آلاف المستخدمين<br />

بالتعامل مع الجداول وتستخدم خوارزميات معقدة لتحقيق<br />

Microsoft SQL<br />

ذلك )<br />

جميع شركات الطيران في العالم موصولة إلى قاعدة بيانات واحدة)‏<br />

، قاعدة معطيات<br />

Server تستخدم القفل على مستوى السجل أي تسمح لعدة مستخدمين بتعديل نفس الجدول بنفس الوقت ولكنها لا<br />

تسمح لهم بتعديل نفس السجل .<br />

يمكن أن يصل حجم قواعد المعطيات هذه إلى كميات هائلة )<br />

بلغ حجم معطيات إحدى شركات التسويق في أمريكا<br />

( 3.6 TB كما أنه يمكن لقواعد المعطيات هذه أن توجد على أجهزة مختلفة .<br />

سرية المعلومات في هذه القواعد قوية جدا ً ، كما أنها تعطي سماحيات للمستخدمين ، فموظف المكتبة المسئول عن<br />

إدخال أسماء الكتب لا يحق له الإطلاع على كمية المبيعات ...<br />

تشترك قواعد المعطيات هذه باستخدامها ل<strong>لغة</strong> الاستفسارات البنيوية (SQL) Structured Query Language<br />

InterBase, Oracle, Sybase, Informix, Microsoft SQLserver,<br />

كمثال على قواعد المعطيات الموزعة لدينا :<br />

and DB2.<br />

3 بنية برنامج قواعد المعطيات:‏<br />

يبن الشكل المجاور بنية تطبيق قواعد<br />

المعطيات<br />

والذي يتألف من<br />

أ واجهة المستخدم<br />

: وهي النوافذ<br />

التي يصممها المبرمج ليسمح<br />

للمستخدم بالتعامل مع المعطيات<br />

.<br />

75


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ب عناصر الوصول<br />

: Data Access تستخدم للوصول إلى قواعد المعطيات وهي عبارة عن ربط بين<br />

) :<br />

عناصر التحكم بالمعطيات مع واجهة المستخدم .<br />

.<br />

ج عناصر التحكم بالمعطيات :<br />

تزود المستخدم بواجهة التعامل مع جداول المعطيات<br />

من المهم أن تلاحظ أن التطبيق<br />

البرنامج<br />

( مستقل عن قاعدة المعطيات،‏ حيث توفر <strong>دلفي</strong> أدوات للوصول إلى<br />

)<br />

قواعد المعطيات ولالكنها لا تتدخل بكيفية تعامل القاعدة مع المعلومات المدخلة<br />

) عند إدخال سجل إلى جدول<br />

معطيات<br />

Oracle لا تهتم <strong>لغة</strong> <strong>البرمجة</strong> ولا حتى المبرمج بكيفية تخزين هذا السجل والطرق الخوارزمية المتبعة في<br />

ذلك و لا حتى طرق البحث ، فعمل <strong>لغة</strong> <strong>البرمجة</strong> هنا يقتصر على طلب أوامر محددة من قاعدة المعطيات والتي<br />

Data<br />

تقوم<br />

بدورها بتنفيذها وإعادتها إلى البرنامج وتدعى عناصر <strong>دلفي</strong> المسئولة عن ذلك بعناصر الوصول<br />

.Access<br />

76


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة الرابعة عشر<br />

بناء تطبيقات قواعد المعطيات<br />

http://www.alshater.net<br />

:<br />

يأتي مع <strong>دلفي</strong> قواعد معطيات جاهزة تستخدم كأمثلة على قواعد المعطيات وطرق التعامل معها،‏ لذلك سنتعامل مع<br />

هذه القواعد حتى يصبح الوقت جاهزا ً لإنشاء قواعدنا الخاصة<br />

مثال<br />

.<br />

: 1<br />

بناء نموذج فيه جدول وحيد<br />

:<br />

أسهل طريقة لكتابة برنامج قواعد المعطيات هي استخدام معالج النماذج<br />

( Form Wizard )<br />

. Database<br />

للبدء بالعمل أنشئ مشروعا ً جديدا ً ثم أغلق النموذج الأول<br />

) الافتراضي (<br />

عن طريق الأمر<br />

من القائمة<br />

File Close أو<br />

التحويل إلى محرر الشيفرة والضغط على المفتاحين Ctrl+F4 ستظهر لك نافذة تسألك إن كنت تريد حفظ الوحدة<br />

. أجب بلا<br />

بهذه الطريقة نكون قد حصلنا على مشروع بدون نموذج أولي لأننا سننشئ هذه النافذة من خلال معالج النماذج<br />

اختر الأمر<br />

ستظهر النافذة التالية<br />

Database Form Wizard<br />

من قوائم ال<strong>دلفي</strong><br />

:<br />

:<br />

اترك الخيارات<br />

الافتراضية وستتعرف على خيارتها لاحقا ً<br />

اضغط على الزر<br />

.<br />

Next<br />

ستظهر عندها النافذة المجاورة والتي تطالبك<br />

بتحديد الجدول الذي سيتعامل معه النموذج ،<br />

لتحديد الجدول أختر DBDEMOS من القسم<br />

Drive or Alias Name ‏(سيشرح معنى ذلك<br />

لاحقا ً)‏<br />

ستظهر جميع الجداول في القاعدة<br />

اختر منها الجدول<br />

DBDEMOS<br />

Country.db<br />

77


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اضغط على<br />

. Next<br />

تظهر عندها النافذة المجاورة والتي تطالبك بتحديد<br />

الحقول التي تريد إظهارها في الجدول .<br />

لإظهار حقل ما أختر هذا الحقل واضغط على الزر<br />

><br />

ولإظهار جميع الحقول اختر الزر ><br />

. ( >><br />

أضف الآن جميع الحقول )<br />

واضغط على Next للمتابعة<br />

ستظهر نافذة تطالبك بطريقة عرض البيانات :<br />

أفقي أو عامودي أو في جدول<br />

( In grid<br />

حدد الخيار في جدول )<br />

واضغط على Next<br />

تظهر النافذة الأخيرة<br />

) خيارات هذه النافذة سيتم<br />

توضيحها لاحقا ً (<br />

فعل الخيار Generate a main form<br />

إذا كان النموذج هو النموذج الرئيسي في برنامجك<br />

اضغط على<br />

Finish لإظهار النموذج التالي<br />

.<br />

78


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

عند الانتهاء يظهر النموذج التالي :<br />

عنصر التحكم<br />

TDBnaviagtor<br />

عنصر الوصول<br />

TDataSouce<br />

عنصر الوصول<br />

TTable<br />

عنصر التحكم<br />

DBGrid<br />

لقد قام معالج النماذج بإنشاء نموذج وضع عليه عدد من عناصر التحكم بالمعطيات وعناصر أخرى للوصول إلى<br />

المعطيات .<br />

نفذ التطبيق الآن ولاحظ ما يلي :<br />

1 عناصر الوصول على المعطيات لا تظهر أثناء التنفيذ .<br />

2 يظهر عنصر الشبكة<br />

DBGrid بيانات الجدول المرتبط معه حيث أعمدة هذا الجدول هي أسماء الحقول<br />

وتكون ظاهرة في السطر الأول و سطور هذه الجدول هي السجلات ويوجد سهم صغير يدل على السجل<br />

الحالي،كما أن الحقل الحالي يكون مفعلا ً أسماء باللون الحقول الأزرق .<br />

مؤشر إلى السجل الحالي<br />

السجل الحالي<br />

79


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

يمكن أن نقوم نحن بوضع العناصر على نموذج فارغ للحصول على النموذج السابق بدون استخدام معالج الأشكال.‏<br />

سنشرح الآن كل عنصر من هذه العناصر على حدى :<br />

العنصر : Table<br />

يستخدم هذا العنصر للربط بين البرنامج وقاعدة المعطيات وهو عنصر من مجموعة عناصر تدعى DataSet وهي<br />

عبارة عن عناصر لها القدرة على التعامل مع محرك قاعدة المعطيات للوصول للجداول ومن هذه العناصر .<br />

Table, Query, AdoTable, AdoQuery,<br />

في مثالنا يحتوي النموذج على عنصر واحد من النوع Table وقد ربطه معالج النماذج مع قاعدة المعطيات اعتمادا ً<br />

على الخصائص التالية :<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

القيمة<br />

DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى مكان<br />

DBDEMOS<br />

DataBaseName<br />

تواجد<br />

مسار<br />

الجداول<br />

) نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />

(<br />

)<br />

بدلا ً منها<br />

اسم الجدول الذي سيرتبط مع العنصر<br />

) اسم العنصر<br />

يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في <strong>دلفي</strong><br />

country.db<br />

Table1<br />

TableName<br />

Name<br />

(<br />

أعط القيمة<br />

True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />

False<br />

Active<br />

العنصر : DataSource<br />

DataSet وعناصر<br />

يرتبط هذا العنصر مع العنصر<br />

Table ويستخدم هذا العنصر للربط بين عناصر الوصول<br />

التحكم بالمعطيات وله الخصائض التالية :<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

تجعل هذه الخاصة المعطيات في وضع التحرير<br />

أمكانية التعديل<br />

( أما<br />

)<br />

True<br />

AutoEdit<br />

إذا أردنا استعراض<br />

قراءة دون تغيير<br />

( المعطيات فقط فنعطي هذه<br />

)<br />

الخاصة القيمة False<br />

Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1<br />

Dataset<br />

للحصول على المعطيات<br />

اسم العنصر<br />

.<br />

)<br />

80<br />

يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في <strong>دلفي</strong><br />

Datasource1<br />

Name


http://www.alshater.net<br />

(<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: ( DBGrid<br />

عنصر التحكم بالمعطيات )<br />

يستخدم هذا العنصر لعرض وتحرير المعطيات ويرتبط مع العنصر<br />

Datasource ليحصل منه على أسماء الحقول<br />

وقيم الجدول وأعطاه معالج النماذج الخصائص التالية :<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

تحدد هذه الخاصة العنصر الذي سيزود<br />

اسم العنصر<br />

DBGrid بالمعطيات<br />

Datasource1<br />

Dbgrid1<br />

Datasource<br />

Name<br />

عنصر التحكم : DBNavigator<br />

يحوي هذه العنصر العديد من الأزرار مهمتها تحريك مؤشر السجل والقيام بأعمال الإضافة والحذف والتراجع عن<br />

التعديل ويرتبط هذا العنصر مع ال<br />

Datasource عن طريق الخاصة<br />

، DataSource اعط القيمة Trueللخاصة<br />

ShowHint التابعة لهذا العنصر .<br />

يضيف معالج النماذج أيضا ً سطر برمجي واحد في حدث إنشاء النموذج هو<br />

Table1.Open لفتح الجدول وإظهار<br />

.<br />

سجلاته ويمكن الاستعاضة عن هذه التعليمة بإعطاء الخاصة Active للعنصر Table القيمة True<br />

: (<br />

Database Engine<br />

محرك قواعد المعطيات )<br />

محرك قاعدة المعطيات يحدد أسلوب تعامل البرنامج مع القاعدة وهي عبارة عن مجموعة مكتبات جاهزة تربط بين<br />

عناصر ال<strong>دلفي</strong> وقواعد المعطيات ومن أهم المحركات في <strong>دلفي</strong> :<br />

: Borland Database Engine<br />

1 : BDE<br />

يتعامل هذا المحرك مع عناصر الوصول الموجودة في الصفحة<br />

Bde ويتعامل مع قواعد معطيات من النوع<br />

Pardox أو Dbase وغيرها كثير .<br />

: Microsoft ActiveX Data Objects<br />

2 : ADO<br />

Access أو<br />

يتعامل هذا المحرك على العناصر الموجودة في<br />

الصفحة<br />

Ado ويستخدم مع قواعد معطيات مثل<br />

. Oracle أو SQL SERVER<br />

3 :Interbase<br />

يتعامل هذا المحرك على العناصر الموجودة في الصفحة<br />

Interbase Express ويستخدم مع قواعد معطيات<br />

Interbase التي يمكن تحميلها من القرص الذي توجد عليه <strong>دلفي</strong> .<br />

:<br />

مثال : 2<br />

بناء نموذج لإدخال المعطيات<br />

( Vertical<br />

أعد خطوات المثال السابق حتى تصل إلى النافذة التي تطالبك بطريقة عرض المعطيات )<br />

اختر منها<br />

Finish ثم Next<br />

( Left<br />

وستظهر بعدها نافذة تسألك عن طريقة عرض عناوين الحقول )<br />

اختر منها<br />

أضغط على<br />

ليظهر النموذج التالي<br />

:<br />

81


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لاحظ ظهور حقول المعطيات بدلا ً من الجدول وتظهر<br />

هذا الحقول في العناصر<br />

Dbedit والتي ترتبط مع<br />

قاعدة المعطيات عبر الخاصة Datasource<br />

نفذ البرنامج واستخدم<br />

DBNavegator للتنقل بين<br />

الحقول<br />

) السجل الحالي هو الحقل الذي تظهر قيمه<br />

داخل الحقول (<br />

القيمة DataSource1 Datasource<br />

Datacontrole<br />

أضف عنصر<br />

DBGrid من الصفحة<br />

وأعطه الخاصة<br />

DBEdit تبعا ً<br />

نفذ البرنامج وحاول التنقل بين السجلات في<br />

DBGrid بالفأرة ولاحظ كيف تتغير قيم الحقول في<br />

لتغير السجل الحالي .<br />

:( Master \ Detail Form )<br />

مثال<br />

‎3‎‏:بناء نموذج من النوع الرئيسي تفصيلي<br />

وجدنا سابقا ً في مثال المكتبة كيف يمكن لمجموعة من الجداول أن ترتبط مع بعضها البعض لتشكل قاعدة معطيات،‏<br />

كما وجدنا<br />

‏:كيف أن جدول المؤلفين هو جدول رئيسي بينما جدول الكتب هو جدول ثانوي وقلنا أن هذه هي علاقة<br />

رأس بأطراف أو واحد إلى مجموعة لنفترض الآن أن المستخدم بحاجة لمعرفة جميع الكتب التي كتبت من قبل<br />

مؤلف ما،‏ تدعى النماذج التي تقدم هذه المعلومات بالنماذج ذات النوع الرئيسي تفصيلي.‏<br />

سنستخدم في مثالنا الآن معالج النماذج لإنشاء نماذج من هذا النوع وسنعتمد على الجدول الرئيسي Customer.db<br />

.<br />

والجدول التفصيلي<br />

Orders.Db وقبل البدء سأشرح كل من الجدولين<br />

جدول الزبائن<br />

يحوي معلومات عن الزبائن<br />

) رقم الزبون ، الأسم ، العنوان ، المدينة ،<br />

: Customer.db<br />

:<br />

الهاتف<br />

، المفتاح الرئيسي فيه هو رقم الزبون.‏<br />

( ......<br />

جدول الطلبات<br />

يحوي معلومات عن طلبات الزبائن<br />

) رقم الطلبية ، رقم الزبون ، تاريخ التسليم ،<br />

: Orders.db<br />

طريقة التسليم .... (<br />

من الواضح أن المفتاح الرئيسي لهذا الجدول هو رقم الطلبية ، كما أن هناك مفتاح ثانوي هو رقم الزبون ( .<br />

سننشئ الآن نموذجا ً يظهر فيه جدولي الزبائن والطلبيات ولكن السجلات الظاهرة في سجل الطلبيات هي السجلات<br />

التابعة للزبون الحالي في جدول الزبائن .<br />

ابدأ مشروعا ً جديدا ً،‏ أغلق النموذج الافتراضي ، اختر الأمر Database Form Wizard<br />

82


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

من النافذة الأولى للمعالج حدد الخيار Create Master Detail Form من القسم<br />

Next<br />

النافذة الثانية تطالبك بإدخال الجدول الرئيسي حدد DBDEMOS في Driver or alias name<br />

http://www.alshater.net<br />

Form Option واضغط على<br />

واختر الجدول<br />

Customer.db ومن النافذة التي تليها حدد جميع حقول هذا الجدول ، وفي النافذة التالية حدد طريقة العرض<br />

بجدول<br />

. in a grid<br />

النافذة التالية تطالبك بتحديد الجدول التفصيلي أختر<br />

وطريقة العرض جدول<br />

تظهر بعدها النافذة المجاورة<br />

Orders من<br />

)<br />

اختر من القسم<br />

CustNo Availableالقيمة Indexes<br />

واختر من اللائحة<br />

Master Fields القيمة<br />

CustNo<br />

ومن اللائحة Detail Fields القيمة CustNo<br />

إضغط بعدها على<br />

Add ثم على<br />

Next ثم على<br />

Next مرة أخرى ‏.سيظهر عندها النموذج رئيسي<br />

: تفصيلي<br />

نفذ البرنامج وتنقل بين حقول الجدول<br />

حظ التغيرات على الجدول<br />

Master ولا<br />

... Detail<br />

DBDEMOS واختر بعدها جميع الحقول<br />

لقد أضاف معالج النماذج هنا عنصري Table بالإضافة إلى عنصري Datasource وقام بالربط بينهما في<br />

الحقول التالية<br />

في العنصر<br />

الخاصة<br />

:<br />

Tabel2<br />

الشرح<br />

القيمة<br />

Datasource1 MasterSource<br />

CustNo IndexName<br />

يعرف عنصر DataSource المرتبط مع الجدول الرئيسي<br />

يحدد الحقل الذي سيقوم بترتيب وفهرسة السجلات في الجدول<br />

:<br />

: 1 مثال<br />

بعد أن تعلمنا كيفية تنفيذ تطبيقات قواعد باستخدام معالج النماذج سنعيد الأمثلة السابقة باستخدام العناصر مباشرة<br />

سنقوم بكتابة برنامج يعرض الجدول Country.db الموجود ضمن القاعدة<br />

ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية<br />

1 العنصر Table من الصفحة<br />

DBDemos<br />

:<br />

BDE<br />

_ 2<br />

العنصر DataSource من الصفحة<br />

. Data Access<br />

83


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

. Data Control<br />

3 العنصر DBGrid و<br />

DBNavigator من الصفحة<br />

:<br />

أعط العنصر<br />

Table الخصائص التالية<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

القيمة<br />

DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />

DBDEMOS<br />

DataBaseName<br />

مكان تواجد<br />

)<br />

مسار (<br />

الجداول<br />

نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />

)<br />

بدلا ً منها<br />

اسم الجدول الذي سيرتبط مع العنصر<br />

أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />

country.db<br />

True<br />

TableName<br />

Active<br />

:<br />

أعط العنصر<br />

DataSource الخصائص التالية<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

تجعل هذه الخاصة المعطيات في وضع التحرير<br />

أمكانية التعديل<br />

( أما<br />

)<br />

True<br />

AutoEdit<br />

إذا أردنا استعراض<br />

قراءة دون تغيير<br />

( المعطيات فقط فنعطي هذه<br />

)<br />

الخاصة القيمة False<br />

Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1<br />

Dataset<br />

للحصول على المعطيات .<br />

:<br />

أعط العنصر DBGrid والعنصر<br />

DBNavigator الخاصة التالية<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

تحدد هذه الخاصة العنصر الذي سيزود<br />

DBGrid بالمعطيات<br />

Datasource1<br />

Datasource<br />

نفذ البرنامج .<br />

مثال : 2<br />

إنشاء Master Detail Form بدون استخدام المعالج :<br />

ابدأ مشروعا ً جديدا ً وأضف إليه عنصري Table وعنصري DataSource وعنصري DBGrid وعنصر<br />

. DBNavigator<br />

: ( Master<br />

1 ربط الجدول الرئيسي )<br />

:<br />

أعط العنصر<br />

Table1 الخصائص التالية<br />

الخاصة<br />

القيمة<br />

ملاحظات<br />

القيمة<br />

DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />

DBDEMOS<br />

DataBaseName<br />

مكان تواجد<br />

مسار<br />

الجداول<br />

) نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />

(<br />

)<br />

بدلا ً منها<br />

84


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

Customers.db<br />

True<br />

TableName<br />

Active<br />

أعط العنصر<br />

أعط العنصرين<br />

. القيمة Table1 DataSet الخاصة DataSource1<br />

اسم الجدول الذي سيرتبط مع العنصر<br />

أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />

. القيمة DataSource1 DataSource الخاصة و DBNavigator1 DBGrid1<br />

2 ربط الجدول التفصيلي<br />

: Detail<br />

أعط العنصر Table2 الخصائص التالية<br />

)<br />

:<br />

ملاحظات<br />

الخاصة القيمة<br />

القيمة DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />

مكان تواجد<br />

) الجداول ( مسار<br />

DBDEMOS DataBaseName<br />

order.db TableName<br />

True Active<br />

أعط العنصر<br />

أعط العنصرين<br />

. القيمة Table2 DataSet الخاصة DataSource2<br />

نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />

بدلا ً منها<br />

اسم الجدول الذي سيرتبط مع العنصر<br />

أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />

. القيمة DataSource2 DataSource الخاصة DBGrid2<br />

بهذا نكون قد ربطنا العناصر مع الجدول ولآن علينا أن نعلم الجدول Table2 أنه جدول تفصيلي للجدول<br />

. Table1<br />

أعط العنصر<br />

Table2 الخاصة MasterSource القيمة<br />

Datasouce1 و الخاصة<br />

MasterField القيمة<br />

CustNo<br />

85


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

الخامسة عشر<br />

بناء قواعد البيانات :<br />

يوجد العديد من برامج بناء قواعد البيانات ويعتمد الأمر على نوع القاعدة التي تريد استخدامها فلبناء قاعدة محلية<br />

Oracle<br />

(<br />

Paradox<br />

تستخدم جداول باردوكس )<br />

هناك البرنامج<br />

Borland Paradox ولبناء جداول تستخدم<br />

هناك البرنامج<br />

Oracle 9i وهكذا وقد زودتنا <strong>دلفي</strong> بأداة سهلة لإنشاء قواعد البيانات وتعديل الجداول بدون العودة<br />

إلى تلك البرامج،‏ حيث يوجد ضمن مجموعة أدوات <strong>دلفي</strong> البرنامج<br />

Database Desktop الذي يمكن عن طريقة<br />

تصميم العديد من أنواع جداول البيانات .<br />

: DataBase Desktop<br />

أفضل طريقة لتعلم هذا البرنامج هي نبدأ بمثال :<br />

المطلوب إنشاء جداول تتعلق بحركة الركاب في المطار باستخدام جداول الباردوكس وهذه الجداول هي<br />

جدول المسافرون<br />

اسم الحقل نوع الحقل الشرح<br />

:<br />

GoFrom<br />

( Passengers )<br />

Pno<br />

Pname<br />

Nationality<br />

PassNo<br />

عدد<br />

نص<br />

نص<br />

عدد<br />

*<br />

رقم المسافر<br />

اسم المسافر<br />

الجنسية<br />

رقم جواز<br />

السفر<br />

ArriveTo<br />

GoTime<br />

ArriveTime<br />

CardCount<br />

بلد المغادرة<br />

نص بلد الوصول<br />

نص وقت المغادرة<br />

تاريخ ووقت وقت الوصول<br />

تاريخ ووقت عدد البطاقات<br />

عدد المتوفرة<br />

اسم الحقل<br />

Pno<br />

TripNo<br />

SeatNo<br />

ClassNo<br />

جدول المسافرون والرحلات<br />

TripsAndPassengers<br />

نوع الحقل<br />

عدد<br />

عدد<br />

عدد<br />

عدد<br />

الشرح<br />

رقم المسافر<br />

رقم الرحلة<br />

رقم المقعد<br />

رقم الصف<br />

( Trips<br />

جدول الرحلات )<br />

اسم الحقل<br />

نوع الحقل<br />

عدد<br />

نص<br />

الشرح<br />

رقم الرحلة<br />

اسم الشركة<br />

*<br />

TripNo<br />

Company<br />

86


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

.<br />

تدل النجمة<br />

( * )<br />

وتبين الأسهم طريقة ربط الجداول<br />

رقم المقعد يجب أن يأخذ قيمة بين<br />

على أن هذا الحقل مفتاح رئيسي<br />

.<br />

.<br />

1 و . 200<br />

1 في البداية أنشأ الفهرس AirLines على القرص C حيث سيتم وضع قاعدة البيانات في هذا الفهرس<br />

2 تشغيل البرنامج : Database Desktop<br />

يمكنك تشغيل البرنامج خارج إطار <strong>دلفي</strong> عن طريق القائمة<br />

Start Programs Borland <strong>Delphi</strong> Database Desktop<br />

أو من داخل <strong>دلفي</strong> عن طريق القائمة Tools Database Desktop<br />

2 تحديد فهرس العمل<br />

:<br />

إن فهرس العمل في قواعد البيانات يعني المكان الذي سيبحث فيه<br />

البرنامج عن الملفات وسيكون هو الفهرس الافتراضي وسيظهر<br />

ضمن صندوقي فتح وحفظ الملفات ، ولتحديد الفهرس الافتراضي<br />

اختر الأمر<br />

File Working Directory<br />

فتظهر عندها النافذة ، اضغط على الزر Browse واختر<br />

AirLines<br />

اضغط بعدها على ok للخروج .<br />

C:\<br />

3 تعريف اسم بديل<br />

87<br />

: Alias<br />

قلنا أن الاسم البديل عبارة عن أسم يستخدمه النظام<br />

للوصول إلى فهرس قاعدة البيانات ولتعريف اسم بديل<br />

للفهرس C:\AirLines نختار الأمر<br />

من القائمة Tools في البرنامج<br />

Alias Manger<br />

Database Desktop<br />

:<br />

اضغط على الزر New واكتب في اللائحة<br />

Database<br />

Alias<br />

السلسلة ) Travel (<br />

وفي اللائحة<br />

) STANDARD القيمة Driver Type


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تحدد هذه اللائحة نوع قاعدة البيانات المستخدمة وتعطى القيمة<br />

Standard إذا كانت قاعدة البيانات من النوع<br />

بارادوكس ).<br />

( Browse<br />

) Path<br />

حدد بعدها مسار<br />

القاعدة<br />

C:\AirLiens في القسم<br />

يمكن أن تكتبه كتابة أو تختار الزر<br />

اضغط بعدها على الزر Keep New لإضافة القاعدة الجديدة إضغط بعدها على الزر<br />

Ok ستظهر رسالة تسألك إن<br />

.<br />

كنت تريد حفظ التغيرات في IDAPI32.CFG عليك أن تجيب على<br />

Yes لحفظ القاعدة الجديدة<br />

ملاحظات :<br />

1 يستخدم الاسم البديل في لغات <strong>البرمجة</strong> لإعطاء المستخدم الحرية في اختيار مكان تخزين قاعدة البيانات،‏ لاحظ<br />

إن معظم البرامج تعطي المستخدم حرية في اختيار مكان وضع البرنامج أثناء التنصيب،‏ تصور مثلا ً أنك لم<br />

تستخدم الاسم البديل وأعطيت الخاصة<br />

DatabaseName للعنصر Table القيمة C:\AirLiens عندها عليك<br />

أن تضع قاعدة البيانات في هذا الفهرس على جميع الأجهزة التي ستستخدم برنامجك .<br />

2 إحدى فوائد الاسم البديل الأخرى هي العودة إلى جداول سابقة وخاصة في برامج المحاسبة،‏ تصور إن<br />

المستخدم يريد العودة إلى مدخلات سنة<br />

حيث كان قد حفظها على الفهرس<br />

1998\:D عندها عليك تغير<br />

1998<br />

مسار الاسم البديل فقط دون التغير في البرنامج .<br />

3 يمكن إنشاء وحذف الاسم البديل برمجيا ً .<br />

في النافذة السابقة<br />

Alias Manger في حال إزالة الخيار<br />

Public Alias سيتم تعريف Alias جديد في<br />

4<br />

.<br />

البرنامج<br />

Database Desktop فقط ولا يمكن الوصول إلى هذا ال<br />

Alias من ال<strong>دلفي</strong> مثلا ً<br />

.<br />

:<br />

5 يستخدم الزر<br />

البدء بجدول جديد<br />

Remove لحذف اسم بديل<br />

للبدء بجدول جديد اختر الأمر File New Table<br />

تظهر النافذة المجاورة لتحديد نوع الجدول حيث يمكن إنشاء العديد من<br />

أنواع قواعد البيانات باستخدام البرنامج ) Database Desktop<br />

اضغط على زر اللائحة لمشاهدة هذه الأنواع<br />

، اختر من اللائحة<br />

Paradox7 واضغط على موافق.‏<br />

(<br />

معظم العمل في البرنامج Database<br />

Desktop يتم في هذه النافذة لذلك<br />

ستشرح بشيء من التفصيل<br />

جدول الحقول : Field roster<br />

يتم في هذا الجدول<br />

تعريف حقول الجدول<br />

وتتألف من<br />

1 اسم الحقل<br />

: Field Name<br />

88


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

يوضع في هذا القسم اسم الحقل،‏ وأسماء الحقول في جداول الباردوكس يجب أن لا تتجاوز 25 حرف،‏ كما يمكن<br />

أن تحتوي على فراغات ويمكن أن يكون اسم الحقل بال<strong>لغة</strong> العربية ولكن ينصح باستخدام أسماء حقول إنكليزية دائما ً<br />

وعدم احتوائها على فراغات وخاصة عند استخدام<br />

، SQL كما يجب الابتعاد عن بعض الأسماء المحجوزة في <strong>لغة</strong><br />

... Date أو From أو SELECT مثل SQL<br />

2 نوع الحقل : Type<br />

يصف هذا الحقل نوع المعطيات الذي سيخزن في هذا الحقل وهناك عدد من الأنواع التي يمكن أن ينتمي إليها<br />

Space<br />

الحقل ولمعرفة هذه الأنواع إضغط بزر الفأرة اليميني في العمود<br />

Type أو اضغط على مفتاح المسافة<br />

:<br />

Paradox<br />

عندما يكون العمود<br />

Type فعالا ً ، والجدول التالي يبين الأنواع التي توفرها جداول<br />

النوع<br />

الحجم<br />

الرمز<br />

ملاحظات<br />

A نص عادي يمكن أن يحتوي رموزا ً أو أرقام ويحدد حجم الحقل طول<br />

255<br />

–<br />

1<br />

Alpha<br />

السلسلة التي سيأخذه الحقل<br />

N عدد حقيقي<br />

Number<br />

$ نفس النوع السابق ولكن بصيغة مالية<br />

Money<br />

Integer عدد صحيح طويل بطول بايتين من النوع S<br />

Short<br />

Longint عدد صحيح طويل من النوع I<br />

Long Integer<br />

عدد صحيح عشري مضغوط )<br />

التمثيل الثنائي لإعداد الفاصلة<br />

#<br />

0 .. 32<br />

BCD<br />

(1)<br />

العشرية (<br />

D تاريخ<br />

Date<br />

T وقت<br />

Time<br />

@ يدمج التاريخ والوقت في حقل واحد<br />

TimeStamp<br />

( 2 )<br />

M نص بحجم كبير.‏<br />

1..240<br />

Memo<br />

نص بحجم كبير مع تخزين طريقة تنسيق هذا النص )<br />

نوع الخط<br />

لون النص و<br />

( 2 )<br />

(..<br />

F<br />

0.. 240<br />

Formatted<br />

Memo<br />

( 3 )<br />

G صورة<br />

0..240<br />

Graphic<br />

( 3 )<br />

Excel مثلا ً (<br />

يمثل حاوية لربط وإدراج الكائنات )<br />

إدراج ملف<br />

O<br />

0..240<br />

OLE<br />

False أو True يمثل قيمة منطقية L<br />

Logical<br />

+ عدد صحيح طويل يزداد تلقائي ًا<br />

Auto increment<br />

( 3 )<br />

.Mb يخزن المعلومات ثنائيا ً داخل ملفات B<br />

0..240<br />

Binary<br />

Db معطيات بالصيغة الثنائية تخزن ضمن ملف قاعدة البيانات Y<br />

1..255<br />

Byte<br />

: ( 1<br />

) الرقم في العمود حجم تحدد عدد الأرقام بعد الفاصلة<br />

89


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

يستخدم النوع<br />

Memo في حال النصوص التي يبلغ حجمها أكثر من<br />

255 حرف وتخزن عادة خارج ملف<br />

: ( 2 )<br />

الجدول في ملفات ذات امتداد<br />

MB ويدل الرقم المدخل في عمود الحجم على عدد الأحرف الذي سيخزن داخل<br />

ملف الجدول<br />

بفرض أعطينا القيمة<br />

30 في عمود الحجم عندها في حال أدخل المستخدم<br />

30 حرف أو أقل<br />

) .Db<br />

ستخزن البيانات داخل ملف القاعدة أما إذا إدخل المستخدم أكثر من<br />

30 حرف ستخزن عندها البيانات داخل ملف<br />

من النوع .Mb<br />

( 3 يمكن عدم تحديد حجم هذا النوع .<br />

)<br />

حجم الحقل<br />

Size كما هو ملاحظ في الجدول السابق هناك بعض أنواع الحقول بحاجة لتحديد حجمها لنأخذ<br />

3<br />

، 20 نستطيع<br />

مثالا ً على ذلك الحقل من نوع<br />

Alpha بفرض أنه عرفنا حقل اسم المسافر من النوع A وبحجم<br />

عندها إدخال أسماء المسافرين ذات طول عشرين حرف أو أقل أما إذا كان اسم أحد المسافرين أطول من عشرين<br />

حرف فسيتم تخزين العشرين حرف الأولى وتجاهل الباقي ، مشكلة أخرى يمكن أن تظهر ، بفرض أن اسم أحد<br />

المسافرين مكون من عشرة أحرف<br />

محمد آغا<br />

" مثلا ً فإن اسم هذا المستخدم سيخزن في القاعدة بحجم عشرين<br />

"<br />

بايت ، أي أنه جميع حقول العمود في جدول الباردوكس تأخذ نفس الحجم مهما كان طول المعلومات المدخلة .<br />

المفتاح الرئيسي<br />

الأساسي<br />

: Key اضغط بزر الفأرة الأيسر في هذا الحقل إذا أردت أن يكون هذا الحقل<br />

(<br />

)<br />

4<br />

:<br />

مفتاح رئيسي وإذا أردت مزيد من المعلومات عن<br />

حول المفاتيح الأساسية<br />

المفاتيح الرئيسية اقرأ الفقرة التالية<br />

تأتي فاعلية نظام قاعدة البيانات العلائقية من القدرة على العثور على المعلومات المخزنة في جداول منفصلة بسرعة<br />

وتجميعها معا ً باستخدام استعلامات ونماذج وتقارير.‏<br />

لكي يتم ذلك،‏ يجب أن يحتوي كل جدول على<br />

حقل أو<br />

مجموعة حقول تقوم بتعريف كل سجل مخزن في الجدول بشكل فريد،‏ وتسمى هذه المعلومة المفتاح الأساسي<br />

للجدول(‏<br />

رقم المسافر يعرف المسافر بشكل فريد ، كذلك رقم الرحلة يعرف رحلة وحيدة أي بمجرد معرفة رقم<br />

الرحلة نستطيع معرفة المعلومات المتعلقة باسم شركة الطيران وبلد المغادرة وبلد الوصول وساعة المغادرة وساعة<br />

الوصول .. (<br />

متى قمت بتعيين مفتاحا ً أساسيا ً للجدول،‏ يمنع إدخال أي قيم مكررة أو قيم<br />

‏"خالية"‏<br />

Null في حقول المفتاح الأساسي.‏<br />

هناك ثلاثة أنواع من المفاتيح الأساسية التي يمكن تعريفها :<br />

المفاتيح الأساسية من نوع الترقيم التلقائي<br />

يمكن إعداد حقل الترقيم التلقائي لإدخال رقم تسلسلي تلقائيا ً عند إضافة كل سجل إلى الجدول.‏<br />

تعد أبسط طريقة<br />

لإنشاء مفتاح أساسي هي تعيين مثل هذا الحقل كمفتاح أساسي ولتعريف حقل ترقيم تلقائي اختر Auto<br />

. Increment<br />

المفاتيح الأساسية من نوع الحقل المفرد :<br />

إذا<br />

كان لديك حقلا ً يتضمن قيم فريدة مثل رقم الهوية الشخصية،‏ يمكنك تعيين هذا الحقل على أنه المفتاح الأساسي.‏<br />

ويمكنك تحديد مفتاح أساسي لحقل يحتوي بالفعل على بيانات طالما لا يحتوي هذا الحقل على قيم مكررة أو قيم<br />

‏"خالية"‏ .Null<br />

90<br />

المفاتيح الأساسية من نوع الحقل المتعدد<br />

:


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

في الحالات التي لا يمكنك فيها ضمان وجود حقل فردي،‏ قد يكون بإمكانك تعيين حقلين أو أكثر باعتبارهما مفتاحا ً<br />

أساسيا ً.‏<br />

والحالة الأكثر شيوعا ً التي يحدث فيها ذلك هي الجدول المستخدم لربط جدولين آخرين في علاقة أطراف<br />

بأطراف<br />

على سبيل المثال،‏ يمكن<br />

أن يربط جدول<br />

‏"مؤلفي الكتب"‏<br />

بين جدولي<br />

‏"الكتب"‏<br />

.( Many to Many<br />

)<br />

و"المؤلفين".‏<br />

ويتكون مفتاحه الأساسي من حقلي:‏ ‏"رقم الكتاب"‏<br />

و"رقم المؤلف".‏<br />

إذا كان لديك أي شك حول إمكانية تحديد تركيب مناسب من الحقول لمفتاح أساسي متعدد الحقول،‏ فربما يجب عليك<br />

إضافة حقل<br />

‏"ترقيم تلقائي"‏<br />

وتعيينه كمفتاح أساسي بدلا ً من ذلك.‏<br />

على سبيل المثال،‏ فإن ضم حقلي<br />

‏"الاسم الأول"‏<br />

و"الاسم الأخير"‏<br />

لتكوين مفتاح أساسي لا يعتبر اختيارا ً صائبا ً،‏ بسبب إمكانية مصادفة تكرار في ضم هذين الحقلين<br />

في المستقبل.‏<br />

إنشاء جدول المسافرين :<br />

مازلنا في النافذة السابقة،‏ لإضافة الحقل رقم المسافر أكتب في العمود<br />

والعمود<br />

+ Type أي أن الحقل من النوع ترقيم<br />

" PNo<br />

" Filed Name<br />

Key<br />

(<br />

تلقائي )<br />

لا حاجة لتحديد حجم هذا النوع<br />

وضع إشارة في الحقل<br />

لأن هذا الحقل سيكون مفتاح أساسي .<br />

لإضافة الحقل اسم المسافر أكتب في السطر الثاني من العمود Field<br />

، 30 أي أن<br />

لأن الحقل من نوع نص ، في العمود<br />

Size اكتب القيمة<br />

"A"<br />

Type والعمود Pname القيمة Name<br />

.<br />

طول الحقل<br />

30 حرف ، واترك العمود<br />

Key فارغا ً واكمل كما في الشكل المجاور<br />

Alias القيمة<br />

لحفظ الجدول اضغط على الزر<br />

Save As سيظهر لك صندوق الحوار حفظ باسم اختر من اللائحة<br />

.<br />

Travel أدخل اسم الملف<br />

Passengers واضغط على حفظ<br />

إنشاء جدول الرحلات :<br />

اختر الأمر<br />

File new table واختر Paradox7 من القائمة<br />

فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :<br />

احفظ الجدول ضمن Travel باسم . Trips<br />

إنشاء جدول المسافرون والرحلات :<br />

اختر الأمر<br />

File new table واختر Paradox7 من القائمة<br />

فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :<br />

احفظ الجدول ضمن Travel باسم PassAndTrips<br />

:<br />

ملاحظة :<br />

تخزن قواعد البيانات<br />

Paradox في نوعين من الملفات<br />

.<br />

1 ملفات من الامتداد<br />

Db حيث يتم تخزين معظم بيانات الجدول<br />

....<br />

91<br />

2 ملفات من الامتداد<br />

فتح جدول<br />

Mb حيث يتم تخزين الأجزاء الكبيرة مثل المفكرات و الصور<br />

:


http://www.alshater.net<br />

FileOpen Table<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لفتح جدول المسافرين أختر الأمر<br />

تظهر عندها النافذة فتح ملف اختر منها الملف<br />

Passengers.db<br />

تعديل جدول :<br />

بفرض أنك بحاجة لإضافة حقل جديد إلى جدول أو حذف أحد الحقول أو تغير نوعه يمكن ذلك عن طريق فتح<br />

الجدول ومن ثم اختيار الأمر<br />

Table Restructure تظهر عندها نافذة بناء الجداول يمكنك العمل فيها كما تعلمنا سابقا ً.‏<br />

.<br />

سنتعرف الآن على عناصر القائمة Table properties<br />

في نافذة إنشاء جدول أو نافذة تعديل جدول<br />

1 ضبط المدخلات : Validity Checks<br />

يحدد هذا الخيار طريقة عرض وقبول البيانات في كل حقل وله الفروع التالية :<br />

<br />

: Required Field عند تفعيل هذا الصندوق ينبغي إدخال قيمة في هذا الحقل ولا يمكن أن يترك فارغا ً<br />

1<br />

.<br />

2 : Minimum يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا .<br />

3 : Maximum يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا .<br />

4 : Default Value القيمة المحدد في هنا ستكون القيمة الافتراضية ويمكن تعديلها فيما بعد<br />

تشبه هذه الخاصة في عملها العنصر<br />

MaskEdit حيث يمكن تحديد طريقة إدخال البيانات في<br />

5 : Picture<br />

.<br />

حقل ما،‏ اضغط على الزر Assist<br />

لاختيار قوالب جاهزة<br />

مثال :<br />

في جدول الرحلات Trips<br />

اجعل الحقل اسم الشركة مطلوبا ً و الحقل عدد البطاقات المتوفرة يجب أن يأخذ قيمة<br />

بين 0 و 350<br />

نفتح الجدول Trips من القائمة FileOpen table ثم نختار<br />

الجدول<br />

Table Restructure فتظهر النافذة تعديل<br />

Required<br />

Table Properties ثم نختار الحقل<br />

Company ونفعل الخيار<br />

Validity Checks من اللائحة<br />

.Field<br />

0 وفي Maximum القيمة . 350<br />

ثم نختار الحقل<br />

CardNo ونضع في Minimum القيمة<br />

.<br />

نضغط على الزر<br />

Save لحفظ التغيرات<br />

2 تحديد جدول البحث : Table Lookup<br />

يمكن تحديد قيمة لحقل ما في جدول عبر لائحة من<br />

القيم من جدول آخر ، يدعى الجدول الآخر بجدول<br />

البحث .<br />

مثال<br />

: نعلم أن قيمة الحقل رقم المسافر في جدول<br />

المسافرون والرحلات يجب أن تكون مساوية<br />

لإحدى قيم العمود رقم المسافر في جدول<br />

92


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

المسافرون كما أن القيمة رقم الرحلة في جدول المسافرون والرحلات يجب أن تكون مساوية لإحدى قيم العمود<br />

رقم الرحلة في جدول الرحلات لتحقيق ذلك :<br />

Table Restructure<br />

افتح الجدول PassAndTrips<br />

وادخل إلى النافذة تعديل الجدول<br />

Define<br />

اختر الحقل PNo واختر Table LookUp من اللائحة<br />

Table Properties واضغط على الزر<br />

تظهر النافذة المجاورة :<br />

. Ok<br />

من اللائحة Lookup Table اختر الجدول<br />

Passengers.db واضغط على<br />

. Trips<br />

أعد نفس الخطوات للبحث عن قيمة<br />

TripNo في الجدول<br />

لن نشرح هذه الميزة بمزيد من التفصيل لأن تطبيقها برمجيا ً أسهل ..<br />

ولكن سنتعلم فائدتها عند إدخال قيم إلى<br />

الجدول .<br />

3 الفهرسة الثانوية :Secondary index<br />

تستخدم الفهرسة الثانوية لترتيب الجدول بترتيب مختلف عن الترتيبب المفتاحي للجدول )<br />

أي يختلف عن ترتيب<br />

المفتاح الرئيسي ( .<br />

:(<br />

ماذا تعني الفهارس الثانوية )<br />

للإطلاع<br />

افترض أن ّك تريد أن تبحث عن قيمة معينة في أحد الأعمدة،‏ كأن تريد البحث مثلا عن<br />

‏(أحمد سعيد)‏<br />

في حقل اسم<br />

المسافر ..<br />

أول ما سيجول بذهنك هو أن الكمبيوتر سيفحص أسماء المسافرين واحدا وراء الآخر من البداية<br />

للنهاية..‏<br />

للأسف:‏<br />

ربما تبدو هذه الطريقة سهلة،‏ ولكن ّها أسوأ طريقة يمكن أن يتم البحث بها،‏ لأن ّها قد تتسبب في بطءٍ‏<br />

شنيع في أداء البرنامج،‏ خاصة وأن العمود قد يحتوي على عدد كبير من الصفوف،‏ قد يزيد عن عشرة آلافٍ‏ أو<br />

أكثر.‏<br />

لهذا فإن هناك العديد من الطرق لتسريع البحث،‏ تبدأ بترتيب العمود أبجديا،‏ وذلك لأن البحث في عمود مرت ّب<br />

أسرع بكثير من البحث في عمود عشوائي‏،‏ خاصة مع استخدام طريقة بحث جيدة،ولكن،‏ رغم سرعة هذه البحث<br />

بعد الترتيب،‏ إلا إن الترتيب نفسه قد يكون مأساة!..‏<br />

هل تتخيل كم من الوقت يمكن أن يضيعه برنامجك لترتيب<br />

خمسين ألف نص مثلا؟..‏<br />

فما بالك إذن حينما يقوم البرنامج بتكرار البحث في نفس العمود أكثر من مرة؟!‏<br />

إذن ما الحل؟<br />

بسيط جدا:‏<br />

نرت ّب العمود في قاعدة البيانات منذ البداية!‏<br />

جميل،‏ ولكن ماذا لو كان الجدول يحتوي على أكثر من عمود تحتاج للبحث فيها،‏ فتبعا لأي منها سوف نرت ّب<br />

الجدول؟!!‏<br />

هنا يبرز الحلّ‏ العمل ي:‏<br />

الفهارس<br />

..Indexes تخيل معي أن ّنا طلبنا من قاعدة البيانات إنشاء فهرس لعمود اسم<br />

المسافر<br />

.. هنا ستقوم قاعدة البيانات بترتيب هذا العمود،‏ مع إنشاء ما يشبه عمودا جديدا تضع فيه الترتيب الرقمي<br />

،2<br />

لكلّ‏ مسافر..‏<br />

فمثلا،‏ سيأخذ<br />

‏(أحمد سعيد)‏<br />

1 في هذا رقم<br />

العمود الخفي‏،‏ بينما سيأخذ<br />

‏(توفيق الحكيم)‏<br />

رقم<br />

وهكذا...‏ .<br />

بهذه الطريقة سنحق ّق ما يلي:‏<br />

93


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لن نحتاج لتغيير ترتيب عرض البيانات في قاعدة البيانات،‏ وبالتالي سنترك للمستخدم حرية ترتيب البيانات كما<br />

يحلو له.‏<br />

يمكننا إنشاء أكثر من فهرس لأكثر من عمودٍ‏ في نفس الجدول،‏<br />

مما يعني قدرتنا على ترتيب كلّ‏ هذه الأعمدة.‏<br />

سنوف ّر وقت ترتيب العمود،‏ أثناء <strong>البرمجة</strong>،‏ وإن كان هذا الوقت سيستهلك عند إنشاء الفهرس لأول مرة.‏<br />

ستكون عملية البحث أسرع،‏ حيث سيتم البحث في السجلات حسب ترتيب فهارسها.‏<br />

وفي الإمكان كذلك إنشاء فهرس لأكثر من عمود معا،‏ حيث سيتم الترتيب تبعا للعمود الأول،‏ فإن تماثلت قيم بعض<br />

الصفوف،‏ يتم ترتيب هذه الصفوف على أساس العمود الثاني.‏<br />

ولكن..‏<br />

طبعا لا توجد طريقة مثالية..‏<br />

هناك عيبان أساسيان لهذه الطريقة:‏<br />

الفهارس المنشئة يتم حفظها في قاعدة البيانات،‏ مما يعمل على زيادة حجمها..‏<br />

لهذا إذا كان حجم قاعدة بياناتك<br />

كبيرا،‏ فلا بد أن توازن بين حاجتك لتوفير الوقت وحاجتك لتوفير الحجم!‏<br />

وكقاعدة:‏<br />

لا تنشئ فهارس إلا للحقول التي تتوق ّع أن برنامجك سيحتاج للبحث فيها بغزارة.‏<br />

عند تعديل قيمة أي خانة في العمود أو حذف أو إضافة أي صف ّ،‏ لا بد من إعادة<br />

تحديث الفهارس لمراعاة<br />

الاختلاف الذي أحدثته القيمة الجديدة..‏<br />

مثل هذا الأمر يسبب عيبا خطيرا،‏ هو بطء عمليات التحديث والحذف<br />

والإضافة بطريقة ملحوظة،‏ تزداد سوءا مع ازدياد طول الجدول..‏<br />

هنا يجب أن توازن في برنامجك،‏ بين حاجتك<br />

لسرعة البحث وحاجتك لسرعة التحديث والحذف والإضافة..‏<br />

فإذا كان من المتوق ّع أن يقوم برنامجك بمئات من هذه<br />

العمليات بطريقة متتالية،‏ فمن الأفضل حذف الفهرس إلى أن تنتهي هذه العمليات،‏ ثم إعادة إنشائه مرة أخرى قبل<br />

الشروع في عمليات البحث،‏ رغم ما تضيعه عملية إعادة إنشاء الفهرس من وقت!‏<br />

لإنشاء فهرس :<br />

ثانوي<br />

بفرض أننا نريد إنشاء فهرس ثانوي للحقل اسم المسافر في جدول المسافرين .<br />

قم بفتح الجدول ثم اختر Table Restructure من اللائحة<br />

Table Properties اختر القيمة Secondary Index واضغط<br />

:<br />

على الزر<br />

Define عندئذ ستظهر النافذة المجاورة<br />

واضغط على Fields<br />

اختر الحقل<br />

PName من اللائحة<br />

سيظهر عندها اسم الحقل في القائمة Indexed Fields نلاحظ<br />

وجود الخيارات التالية في القسم : Index Option<br />

<br />

: Unique فعل هذا الخيار إذا كانت قيمة هذا الحقل فريدة<br />

1<br />

أي لا يمكن أن تتكرر<br />

) في مثالنا قد يكون هناك مسافرين لهما<br />

نفس الاسم لذلك لا يمكن تفعيل هذا الخيار ( .<br />

<br />

: فعل هذا الخيار إذا أردت من قاعدة البيانات تحديث جدول الفهرس كلما تم تعديل البيانات<br />

Maintained<br />

2<br />

في الجدول وفي حال عدم تفعيله يتم تحديث جدول الفهرس فقط عند استخدام الفهرس .<br />

3 : Case Sensitive فعل هذا الخيار إذا أردت من الفهرس التميز بين الحروف الكبيرة و الصغيرة .<br />

فعل هذا الخيار إذا أردت ترتيب الحقول تنازلي ًا<br />

.<br />

94<br />

4 : Descending


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

. PNameIndex<br />

اضغط على الزر<br />

Ok ستطالب بإعطاء اسم للفهرس أعطه الاسم<br />

ملاحظة :<br />

. (<br />

1 يمكن تطبيق الفهارس الثانوية على أكثر من حقل )<br />

لكل حقل فهرس ثانوي<br />

2 يمكن تطبيق فهرس ثانوي واحد على مجموعة من الحقول يمكن مثلا ً إنشاء فهرس ثانوي لحقلي اسم المسافر<br />

والجنسية تستخدم هذه الطريقة في حال كنا نبحث في جدول ما على الحقلين معا ً .<br />

3 ستتضح هذه الأمور لاحقا ً عند دراسة البحث في قواعد البيانات .<br />

تعريف علامة مرجعية متكاملة : Referential Integrity<br />

وجدنا سابقا ً كيف يتم الربط بين جداول قاعدة البيانات بشكل نظري )<br />

الربط بين جدولي المؤلفين والكتب والربط<br />

بين جدولي المسافرين وجدول المسافرين والرحلات (<br />

أي بعبارة أخرى سنقوم الآن بتعريف مفتاح ثانوي في جدول<br />

ما يأخذ قيمة من جدول .<br />

آخر<br />

إذا أنشأنا علامة مرجعية متكاملة بين الجدولين<br />

‏"المسافرين"‏<br />

و"المسافرين والرحلات"‏<br />

فهذا يعني أن الحقل رقم<br />

.<br />

"<br />

المسافر في جدول<br />

‏"المسافرين والرحلات<br />

سيأخذ قيمه من الحقل رقم المسافر في جدول المسافرين<br />

.<br />

يدعى الجدول الذي سنحصل منه على القيم بالجدول الأب والجدول<br />

الذي سيخزن القيم بالجدول الابن<br />

لإنشاء علامة تكامل مرجعية :<br />

Referential واختر القيمة Table Restructure<br />

افتح الجدول الإبن<br />

PassAndTrips واختر الأمر<br />

: Define<br />

Integrity من اللائحة<br />

Table Properties واضغط على الزر<br />

تظهر عندها النافذة التالية :<br />

Table<br />

نختار الحقل<br />

PNo من لائحة الحقول ونضغط على الزر ثم نختار جدول المسافرين من اللائحة<br />

ونضغط على الزر <br />

يجب بعد ذلك تحديد نوع التعديل في الصندوق Update Rule<br />

1 الخيار : Cascade<br />

هذا الخيار يعني أنه أي تعديل في الحقل الموجود في الجدول الأب سيؤدي إلى تعديلات<br />

في الحقول المربوطه معه في جدول الابن )<br />

في حال حذف الحقل سجل ما من جدول المسافرين سيتم حذف<br />

، "<br />

السجلات المرتبطة معه في جدول "<br />

المسافرين والرحلات<br />

95


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الخيار<br />

: Prohibit يمنع هذا الحقل تحديث الحقول في جدول الأب إذا كانت مرتبطة مع حقول في جدول<br />

2<br />

. (<br />

الابن )<br />

لا يمكن حذف سجل من جدول أب مرتبط مع سجلات في الجدول الابن<br />

3 : Strict Referential Integrity فعل هذا الخيار إذا كنت ستستخدم قواعد البيانات هذه مع برامج قديمة<br />

تعمل تحت النظام .Dos<br />

اضغط على بعدها على زر<br />

Ok ستطالب عندها باختيار اسم للعلامة المرجعية أدخل أي اسم تريده واضغط على<br />

موافق ...<br />

ملاحظات :<br />

الخيار<br />

Prohibit هو الخيار الذي تعمل به قواعد البيانات<br />

Paradox ولا يمكن الاستفادة من الخيار<br />

1<br />

Cascade إلا في حال استخدام بعض برامج SQL الحديثة.‏<br />

2 لحذف سجل أب مرتبط مع سجلات أبناء عليك أن تحذف جميع السجلات في الجدول الابن المرتبطة مع هذا<br />

السجل .<br />

.<br />

"<br />

بنفس الطريقة أربط بين رقم الرحلة في الجدول "<br />

المسافرين والرحلات<br />

مع رقم الرحلة في جدول الرحلات<br />

5 وضع كلمات سر للجداول :<br />

قد نحتاج في بعض الأحيان إلى حماية جداول أو الحقول من أن يصل إليها أو يستخدمها غيرنا،‏ لذلك يمكن وضع<br />

كلمة سر للجدول كاملا ً أو لحقل أو عدد من حقوله فقط .<br />

ولإعطاء الجدول كلمة سر لجدول المسافرين<br />

1 افتح الجدول واختر الأمر Table Restructure واختار Table Security من اللائحة Table<br />

properties واضغط على الزر<br />

Define سيظهر عندها صندوق الحوار<br />

التالي :<br />

اكتب كلمة السر في الحقل<br />

Master Password وأعد كتابتها في الحقل<br />

.Ok واضغط على Verify Master Password<br />

أما لتحديد كلمة سر للحقول نعيد الخطوات السابقة ونختار بعدها<br />

Auxiliary Password فتظهر عندها النافذة<br />

‏(في الأسفل).‏<br />

أكتب كلمة السر في الحقل Current Password وحدد سماحيات<br />

الوصول من Table rights واضغط على Add<br />

يمكنك أن تعطي أكثر من كلمة سر للحقل الواحد<br />

أو لمجموعة حقول ‏،بالنسبة لسماحيات الوصول<br />

فتحدد طريقة تعامل المستخدم مع الجدول فإذا<br />

كانت القيمة<br />

Read Only فلا يمكن للمستخدم<br />

إدخال البيانات<br />

، كل مرة يتم فتح الجدول<br />

....<br />

فيها سيطالب المستخدم بإدخال كلمة السر و<br />

96


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تعطى السماحيات لهذا المستخدم تبعا ً لكلمة السر المدخلة<br />

لحذف كلمة سر وضعت على جدول أعد الخطوات في 1<br />

. Delete<br />

واضغط على الزر<br />

Modify واختر بعدها الزر<br />

ملاحظة هامة :<br />

إذا كانت سرية قاعدة البيانات تهمك فلا تستخدم قواعد بيانات<br />

Paradox فهناك مئات البرامج التي تستطيع اكتشاف<br />

كلمة سر القاعدة ، ويستطيع أي هاوي أن يدخل إلى جداولك والحصول على معلوماتها وتعديلها ‏،عمليا ً أقوى قواعد<br />

البيانات من حيث السرية والسماحيات أيضا ً هي قواعد البيانات<br />

وOracle MySQL<br />

وServer . MS SQL<br />

6 تحديد <strong>لغة</strong> الجدول : Table Language<br />

لتحديد <strong>لغة</strong> الجدول اختر<br />

Table Language من اللائحة خصائص<br />

الجدول<br />

إذا كانت بيانات الجدول التي تدخلها بال<strong>لغة</strong> العربية فأبق هذا<br />

الصندوق على الخيار الافتراضي 'Ascii' ANSI .<br />

7 عرض الجداول التابعة الجدول : Dependent Table<br />

:<br />

بعد أن ننشئ علاقة ربط متكاملة بين الجداول نكون قد عرفنا علاقة بين جدول أب وجدول ابن ولرؤية هذه العلاقة<br />

Dependent Table من اللائحة<br />

( Passengers<br />

نفتح الجدول الأب )<br />

ونفتح النافذة تعديل الجدول ثم نختار<br />

.<br />

( PassAndTrips<br />

Table properties عندئذ تظهر الجداول المرتبطة مع هذا الجدول )<br />

ملاحظات :<br />

إلى هنا نكون قد تعلمنا إنشاء جداول من النوع<br />

Paradox ويكون إنشاء جداول من أنواع أخرى مشابهة لهذه<br />

1<br />

الطريقة ولكن تتغير بعض الأشياء فأنواع الحقول في جداول<br />

Dbase مثلا ً تختلف عن أنواع الحقول في جداول<br />

Paradox بالاسم فقط ولكن تبقى جميع أنواع قواعد البيانات مصممة لتخزين النصوص و الأرقام و....‏<br />

2 يفضل في البداية تصميم الجداول على الورق بما فيها تحديد الارتباطات وأنواع الحقول والقيود إلى الحقول<br />

وثم البدء بإنشاء الجداول الآباء ثم الأبناء وتعريف خصائص الجدول عند إنشاءه .<br />

3 عمليا ً يفضل أن تكون جميع جداول القاعدة جاهزة قبل البدء بإدخال المعطيات إليها .<br />

4 جداول القاعدة المعتمدة في هذا المثال والطرق التي اتبعت في إنشاءها غير مثالية واعتمدت هنا بهدف تعليمي<br />

فقط .<br />

إدخال البيانات إلى الجداول :<br />

بالإضافة إلى إمكانية بناء الجداول يتيح البرنامج<br />

إدخال البيانات إليها وتعديلها<br />

.<br />

Database Desktop<br />

97


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إدخال البيانات بال<strong>لغة</strong> العربية<br />

لكي تستطيع إدخال نصوص بال<strong>لغة</strong> العربية في البرنامج<br />

Database Desktop عليك تغير الخط المستخدم في<br />

البرنامج ويتم ذلك باختيار الأمر<br />

والضغط على الزر<br />

Change لتغير الخط أختر من<br />

Edit Peferences<br />

القائمة أحد الخطوط التي تدعم ال<strong>لغة</strong> العربية Arabic Transparent مثلا ً .<br />

استخدام نمط التحرير :<br />

قبل البدء بإدخال البيانات إلى الجدول يجب الدخول إلى نمط التحرير ويتم ذلك عن طريق اختيار الأمر Edit من<br />

القائمة<br />

Table أو الضغط على الزر<br />

F9 أو زر السرعة في أقصى يمين شريط السرعة<br />

) طبعا ً يجب أن يكون<br />

الجدول مفتوحا ً ( .<br />

أدخل الآن المعلومات التالية إلى جدول المسافرين :<br />

افتح اولا ً جدول المسافرين وادخل في نمط التحرير<br />

استخدم الزر<br />

Tab للتنقل بين الحقول كما أن نفس الزر<br />

سينقلك إلى سجل جديد .<br />

لاحظ انه لا يسمح لك بإدخال قيمة في حقل من النوع ترقيم<br />

.<br />

تلقائي لإن هذا الحقل يأخذ قيمته تلقائيا ً ويزاداد بمقدار<br />

1 عند إضافة سجل جديد<br />

كما أنه لا حاجة لحفظ المعلومات المدخلة في الجدول ، حيث يقوم الجدول بحفظ المعلومات تلقائيا ً عند الانتقال إلى<br />

سجل جديد .<br />

أدخل المعلومات التالية إلى جدول الرحلات<br />

: افتح الجدول وانتقل إلى وضع التحرير<br />

حاول إدخال القيمة<br />

400 في الحقل<br />

CardCount ولاحظ عدم قبول البرنامج لهذه القيمة وتذكر الشرط الذي<br />

وضعناه على هذا الحقل<br />

) إقرأ الرسالة التي تظهر في الزاوية اليسارية السفلى للبرنامج ( .<br />

.<br />

في الحقول من النوع<br />

TimeStamp يمكن الضغط على مفتاح المسافة لإدخال الوقت والتاريخ الحالي<br />

أدخل البيانات إلى جدول المسافرين والرحلات<br />

: افتح الجدول وانتقل إلى جدول الرحلات<br />

تعلم أننا قد ربطنا الحقل PNo بجدول<br />

بحث<br />

للاستفادة من هذه الخاصة أضغط على<br />

المفاتيح Ctrl + Space أثناء وجود<br />

المؤشر في الحقل PNO ستظهر نافذة<br />

98


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

جديدة فيها جميع حقول جدول البحث<br />

Passengers.db أختر أحد السجلات واضغط عليه مرتين ستغلق النافذة<br />

.<br />

وتنتقل قيمة الحقل<br />

PNo في السجل المختار إلى الجدول الحالي<br />

يمكنك أيضا ً إدخال رقم المسافر يدويا ً ولكن لا يسمح لك بإدخال رقم مسافر غير موجود في جدول المسافرين ، كما<br />

(<br />

لا يسمح بإدخال نفس المسافر على نفس الرحلة مرتين )<br />

لا يمكن للمسافر أن يسافر في رحلة واحدة مرتين<br />

.<br />

وتظهر الرسالة<br />

Key Violation وذلك لأنه لا يمكن أن تكون القيم في المفتاح الرئيسي مكررة<br />

أخيرا ً حاول التدرب على الأوامر في القائمة<br />

. Record<br />

99


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ببعد أن قمنا ببناء الجداول باستخدام<br />

من خلال <strong>دلفي</strong> باستخدام هذه الجداول<br />

عرض جدول المسافرين في نافذة<br />

الجلسة السادسة عشر<br />

http://www.alshater.net<br />

Database Desktop<br />

:<br />

ابدأ مشروعا ً جديدا ً أضف إليه العناصر<br />

أعط العنصر Table1 الخصائص التالية<br />

الخاصة<br />

سنكمل الآن مشوارنا بتعلم التعامل مع قاعدة البيانات<br />

. Table, DBGrid, DataSource, DBNavigator<br />

DatabaseName<br />

TableName<br />

Active<br />

أعط العنصر<br />

أعط العنصرين<br />

نفذ البرنامج ولاحظ النتائج<br />

التعامل مع الحقول<br />

القيمة<br />

Travel<br />

Passengers<br />

True<br />

القيمة Table1 DataSet الخاصة DataSource<br />

القيمة DataSource1 DataSource الخاصة DBGrid و DBNavigator<br />

...<br />

:<br />

تمكننا العناصر الموجودة في الصفحة Data Control من رؤية البيانات وتحريرها أما إذا أردنا الوصول إلى<br />

البيانات والتحكم بطريقة عرضها علينا إنشاء عناصر الحقول<br />

إنشاء عناصر الحقول<br />

.<br />

:Tfield<br />

يمكن استخدام محرر الحقول لتعريف لائحة من الحقول ضمن الجدول<br />

حقل تنشئ <strong>دلفي</strong> عنصر من النوع<br />

خلاله الوصول إلى قيمة الحقل والتحكم بمواصفاتها<br />

)<br />

عنصر الجدول<br />

Tfield وهذا العنصر غير مرئي ولكن يمكن من<br />

( Table<br />

.<br />

لفتح صندوق حوار محرر الحقول اضغط مرتين على العنصر<br />

Table1 لتظهر النافذة<br />

المجاورة ، إضغط بزر الفأرة الأيمن في وسط هذه النافذة لتظهر قائمة اختر منها<br />

Add<br />

All Field عندها ستظهر حقول جدول المسافرين في هذه النافذة ، أعد الضغط بزر<br />

الفأرة اليميني على أحد هذه الحقول تظهر القائمة في هذه الحالة عمليات التعامل مع هذه<br />

اللائحة من قص ونسخ وحذف<br />

..<br />

‎1‎ احذف الحقل Pno من اللائحة ولاحظ اختفاءه من العنصر<br />

. DBGrid<br />

2<br />

ومن أجل كل<br />

أعد ترتيب الحقول ضمن القائمة وذلك عن طريق سحب الحقل PassNo وإفلاته في أعلى القائمة ولاحظ<br />

تأثير ذلك على العنصر<br />

. DBGrid<br />

افتح محرر الشيفرة وانتقل إلى القسم Type ولاحظ قيام<br />

<strong>Delphi</strong> بتعريف<br />

عدد من المتحولات<br />

تم تعريف حقل من النوع النصي لأن الحقل من النوع نص // TStringField; Table1Pname:<br />

Table1Nationalty: TStringField;<br />

تم تعريف حقل من النوع الصحيح لأن الحقل من النوع الصحيح // TIntegerField; Table1PassNo:<br />

100


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تحديد خواص العنصر من النوع<br />

افتح محرر الحقول واختر الحقل<br />

http://www.alshater.net<br />

: Tfield<br />

PassNo ولاحظ خواص هذا الحقل في محرر الخواص حيث يظهر في أعلى<br />

محرر الخواص اسم العنصر ونوع العنصر Table1Pname: TStringField حيث تعطي <strong>دلفي</strong> اسم هذا الحقل<br />

تلقائيا ً والذي يمكن تغيره عن طريق الخاصة<br />

. Name<br />

3 غير قيمة الخاصة Alignment إلى القيمة taCenter ولاحظ تأثير ذلك على العنصر<br />

4 أعط الخاصة<br />

. DBGrid<br />

DisplayLabel القيمة "<br />

رقم جواز السفر<br />

. "<br />

سنتعرف لاحقا ً على إمكانيات إضافية لهذا لمحرر الحقول أما الآن فسنتعلم كيفية الوصول إلى قيمة الحقل برمجيا ً<br />

قراءة قيم الحقول<br />

الطريقة الأولى<br />

:<br />

:<br />

:<br />

بالاعتماد على عناصر الحقول<br />

أضف إلى النموذج السابق عنصر<br />

: TFeild<br />

label1 وزر :<br />

في حدث الضغط على الزر اكتب التعليمة التالية<br />

Label1.Caption := Table1Pname.value ;<br />

:<br />

نفذ البرنامج واضغط على الزر ولاحظ ظهور قيمة الحقل<br />

واضغط على الزر مرة أخرى<br />

...<br />

تقوم هذه التعليمة بإلحاق قيمة الحقل<br />

Tabel1Pname في الخاصة<br />

Pname في العنصر<br />

، Label غير السجل الحالي<br />

Caption وذلك لأن الحقل والCaption من<br />

نوع String أما إذا أردت إلحاق قيمة حقل عددي إلى نوع نص استبدل التعليمة السابقة بالتعليمة التالية<br />

ويملك العنصر<br />

TField عدد من الخواص يشبه الخاصة السابقة وهي<br />

:<br />

Label1.Caption := Tabel1PassNo.AsString ;<br />

، AsFloat<br />

، AsInteger<br />

، AsBoolean<br />

. AsDateTime<br />

الطريقة الثانية<br />

:<br />

وله الشكل التالي<br />

باستخدام الخاصة<br />

المنهج )<br />

TableName.FeildByName('FieldName').Value<br />

:<br />

FieldByName (<br />

:<br />

وللتحويل بين الأنواع<br />

مثال<br />

TableName.FeildByName('FieldName').AsType<br />

101<br />

:<br />

: ( 1 )<br />

أضف زرين إلى البرنامج السابق وعنصر نص<br />

: Label<br />

في حدث الضغط على زر اكتب التعليمة التالية :<br />

label1.Caption := Table1.FieldByName('Pname').Value<br />

وفي حدث الضغط على الزر الثاني اكتب التعليمة التالية :<br />

Label2.Caption := table1.fieldbyname('PassNo').AsString ;<br />

الطريقة الثالثة ‏:التعامل مع الحقل كنوع<br />

ولها الشكل التالي<br />

مثال<br />

Table1['FieldName']<br />

Variant<br />

:<br />

:<br />

في حدث الضغط على الزر الأول اكتب التعليمة التالية<br />

في حدث الضغط على الزر الثاني اكتب التعليمة التالية<br />

Label1.Caption := Table1['Pname'] ;<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لاحظ أنه لا حاجة لاستخدام المنهج<br />

الطريقة الرابعة<br />

مثال<br />

http://www.alshater.net<br />

Label2.Caption := table1['PassNo'] ;<br />

TableName.Field[Index].Value<br />

.AsString<br />

AsString<br />

:<br />

:<br />

في حدث الضغط على الزر الأول اكتب التعليمة التالية<br />

في حدث الضغط على الزر الثاني اكتب التعليمة التالية<br />

Label1.Caption := Table1['Pname'] ;<br />

:<br />

Label2.Caption := table1.Fields[3].AsString ;<br />

إلحاق قيم بالحقول<br />

1 تعديل سجل<br />

102<br />

:<br />

( : حقل )<br />

في هذه الحالة نريد أن نغير في قيمة السجل الحالي ونستخدم الأسلوب التالي<br />

Table1.Edit ;<br />

Tabel1.FieldByName( 'FieldName').Value := NewValue ;<br />

Table1.Post;<br />

كما وجدنا عند إدخال البيانات إلى الجداول في البرنامج Database Desktop قمنا بالانتقال إلى وضع التحرير<br />

:<br />

بنفس الطريقة عند إدخال البيانات في <strong>لغة</strong> <strong>البرمجة</strong> علينا أن نضع الجدول في وضع التحرير لذلك استخدمنا التعليمة<br />

. Table1.Edit<br />

التعليمة الثانية تقوم بإدخال القيمة الجديدة داخل الحقل ، أما التعليمة<br />

على الجدول وت ٌخرج الجدول من وضع التحرير<br />

مثال<br />

.<br />

:<br />

Table1.Post فمهمتها ثثبيت التغيرات المدخلة<br />

أضف ثلاثة عناصر تحرير Edit إلى النموذج السابق واكتب في حدث الضغط على زر التعليمات التالية<br />

يمكن استبدال التعليمة الرابعة<br />

:<br />

Table1.Edit ;<br />

Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />

Table1.FieldByName('Nationalty').Value := Edit2.Text ;<br />

Table1.FieldByName('PassNo').AsString := Edit3.Text ;<br />

Table1.Post ;<br />

; edit3.Text table1.FieldByName('PassNo').AsString := بالتعليمة<br />

Table1.FieldByName('PassNo').Value := strtoint( Edit3.Text) ;<br />

نفذ البرنامج وأدخل قيم في عناصر التحرير واضغط على الزر ولاحظ تغير قيم السجل .<br />

ملاحظة : وجدنا أنه يمكن تعديل الجدول من خلال العنصر DBGrid دون أن نقوم بوضع الجدول في وضع<br />

AutoEdit للعنصر<br />

DataSource حيث يقوم هذا العنصر بوضع الجدول في وضع<br />

التحرير وهذا يعود للخاصة<br />

التحرير بشكل تلقائي وبإعطاء هذه الخاصة القيمة False نفقد القدرة على تغير قيمة البيانات في جدول<br />

من المفيد أن تلاحظ أننا استطعنا أن نصل للمعطيات في الجدول بدون المرور على العنصر<br />

في القراءة أو الكتابة<br />

.<br />

) DataSoucre<br />

(<br />

حيث أن التعليمات تتعامل مع العنصر<br />

Table1 مباشرة .<br />

سواء


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

2 إضافة سجل<br />

تقوم التعليمة<br />

http://www.alshater.net<br />

Table1.insert ;<br />

Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />

Table1.FieldByName('Nationalty').Value := Edit2.Text ;<br />

Table1.FieldByName('PassNo').AsString := Edit3.Text ;<br />

Table1.Post ;<br />

:<br />

Table1.insert بوضع الجدول في وضع التحرير وتضيف سجل جديد فارغ إلى الجدول وتجعله<br />

السجل الحالي ، ثم تقوم التعليمات التالية بإلحاق قيم في هذا السجل والتعليمة الأخيرة تقوم بتثبيت المعلومات في هذا<br />

. الجدول<br />

يمكن استخدام طرق القراءة السابقة في الكتابة أي يمكن استبدال التعليمة<br />

Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />

Table1.Field[0].Value := بالتعليمة ‏['‏Table1['Pnameأو := Edit1.Text ;<br />

Edit1.Text ;<br />

.... Table1Pname.Value := Edit1.Text<br />

أو بالتعليمة بالتعليمة<br />

التعرف على عناصر الصفحة<br />

: Data Control<br />

العنصر 1 <br />

: DBGrid<br />

تعرفنا على هذا العنصر سابقا ً وسنشرح الآن بعض الخصائص المهمة له<br />

الخاصة<br />

القيمة<br />

:<br />

bdRightToLeft<br />

BiDiMode<br />

Color<br />

FixedColor<br />

Font<br />

TitleFont<br />

كما يوجد في الخاصة<br />

الخاصة<br />

أي لون<br />

أي لون<br />

Option العديد من الخصائص الفرعية الهامة:‏<br />

القيمة<br />

True or False<br />

True or False<br />

True or False<br />

True or False<br />

True or False<br />

True or False<br />

True or False<br />

dgEditing<br />

dgTitle<br />

dgIndicator<br />

dgColLines<br />

dgTabs<br />

dgRowSelect<br />

dgConfirmDelete<br />

العمل<br />

تحول اتجاه الجدول بحيث يصبح من اليمين إلى<br />

اليسار<br />

إعطاء لون لصفحة البيانات في العنصر<br />

إعطاء لون لحواف الجدول<br />

تغير نمط الخط المستخدم في صفحة البيانات<br />

تغير نمط الخط المستخدم في أسماء الأعمدة<br />

العمل<br />

التحكم بإمكانية التحرير أو عدمه في العنصر<br />

إظهار أو عدم إظهار أسماء الأعمدة<br />

إظهار أو إخفاء مؤشر السجل الحالي<br />

إظهار أو إخفاء خطوط بين الأعمدة<br />

منع استخدام الزر Tab للتنقل بين الحقول<br />

إمكانية اختيار السجل بالكامل<br />

التحكم بإظهار رسالة تأكيد حذف سجل<br />

103


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

True or False<br />

dgMutiSelect<br />

بقي أن نشرح الخاصة Columns لهذا العنصر<br />

:<br />

باختيار هذه الخاصة أو بالضغط مرتين على العنصر<br />

نافذة محرر الأعمدة كما في الشكل المجاور<br />

إمكانية اختيار أكثر من سجل بنفس الوقت<br />

DBGrid تظهر<br />

:<br />

حيث تظهر النافذة في البداية فارغة ، اضغط على الأيقونة الثالثة<br />

)<br />

( Add All Field<br />

فتظهر جميع أسماء حقول الجدول داخل هذه النافذة<br />

:<br />

في حال حذف أحد هذه الحقول من القائمة فلن يظهر في العنصر<br />

DBGrid وللقيام بذلك اضغط على الزر الثاني Delete بعد اختيار<br />

الحقل المراد حذفه<br />

.<br />

ملاحظة ‏:يختلف الأمر هنا عن حذف الحقل من محرر الحقول وذلك لأنه في هذه الحالة الحقل المحذوف من محرر<br />

الأعمدة يمكن الوصول إليه بطريقة أخرى عن طريق العنصر Table مباشرة أو عن طريق ربطه بأحد عناصر<br />

، Data Control أما في حال حذف العنصر من محرر الحقول فلن نستطيع الحصول على قيم هذا الحقل<br />

العنصر Table لن يتصل مع قاعدة البيانات لإحضار قيم هذا الحقل<br />

)<br />

. (<br />

باختيار أحد هذه الحقول تظهر خصائص الحقل في محرر الخواص والتي يمكن الاستفادة منها كمايلي<br />

:<br />

عمليا ً<br />

العمل<br />

الخاصة القيمة<br />

Alignment<br />

Color<br />

Font<br />

Title-Alignment<br />

Title-Caption<br />

Title-Font<br />

سنشرح الخاصة الأخيرة<br />

التحكم بمكان ظهور البيانات داخل العمود<br />

إعطاء لون محدد لعمود<br />

إعطاء نمط خط محدد لعمود<br />

)<br />

(<br />

التحكم بمكان ظهور عنوان العمود<br />

إعطاء عنوان لعمود<br />

)<br />

إعطاء نمط خط ما لعنوان العمود<br />

إظهار أحد الأعمدة بلون خط آخر مثلا ً<br />

أعط إسم العمود بال<strong>لغة</strong> العربية<br />

(<br />

PickList بمثال :<br />

تقوم هذه الخاصة بإظهار لائحة من القيم لاختيار إحداها<br />

:<br />

اختر العمود Nationality اختر الخاصة PickList واضغط على الزر<br />

Editor أكتب فيها القيم التالية<br />

البحرين<br />

...<br />

، ستظهر النافذة<br />

String List<br />

:<br />

........<br />

نفذ البرنامج واضغط على الحقل<br />

من القيم المدخلة<br />

حلب في السطر الأول ، دمشق في الثاني ثم القاهرة ثم عمان ثم الرياض ثم<br />

Nationality<br />

.<br />

سيظهر سهم القائمة بجواره إضغط على هذا السهم واختر قيمة<br />

104


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

كما أنه يمكنك أن تدخل قيمه من خارج هذه اللائحة يدويا ً<br />

يمكن أيضا ً إضافة عمود جديد إلى محرر الأعمدة عن طريق اختيار الزر الأول<br />

) New ( Add وربط هذا العمود<br />

مع حقل ما عن طريق الخاصة<br />

، FieldName قد تريد مثلا ً أن تعرض عمود ما مرتين<br />

) سنتعرف لاحقا ً على<br />

ميزة هذه الخاصة ( .<br />

....<br />

يمكن أيضا ً تغير ترتيب الأعمدة في<br />

DBGrid بتغير ترتيبها في محرر الأعمدة<br />

:<br />

2 العنصر<br />

: DBNavigator بالإضافة إلى الخصائص السابقة يملك العنصر الخصائص المهمة التالية<br />

تجعل هذه الخاصة أزرار العنصر منبسطه ( .<br />

) مسطحة<br />

: Flat<br />

.<br />

الخاصة : Hints<br />

تمكن هذه الخاصة من كتابة تلميح لك زر من أزرار العنصر<br />

.<br />

الخاصة : VisibleButton<br />

تستخدم هذه الخاصة لإخفاء أو إظهار بعض أزرار العنصر<br />

.<br />

3 العنصر : DBtext<br />

يشبه العنصر<br />

Label ولكنه يمكن ربطه مع قاعدة البيانات<br />

.<br />

4 العنصر<br />

: DBEdit تم شرحه مسبقا ً<br />

.Memo<br />

5 العنصر : DBMemo<br />

يتم ربط هذا العنصر مع حقل من النوع<br />

6 العنصر<br />

يتم ربط هذا العنصر مع حقل من النوع صورة<br />

.<br />

: DBImage<br />

105


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة السابعة عشر<br />

سنتابع الآن مع العناصر في الصفحة<br />

6 العنصر<br />

مثال<br />

http://www.alshater.net<br />

: Data Control<br />

: DBImage<br />

يستخدم هذا العنصر لعرض وإضافة الصور إلى قاعدة البيانات<br />

.<br />

) :<br />

استخدام العنصرين<br />

: ( DBImage و DBMemo<br />

ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية<br />

: Table و Datasource و DBGrid و DBImage و<br />

DBNavigator و DBMemo<br />

اربط العنصر Table1 مع القاعدة DBDemos ومع الجدول<br />

بعض الأسماك<br />

) biolife.db<br />

(<br />

وأعطه الخاصة<br />

Active القيمة<br />

Table1 وأعط بقية العناصر في الخاصة<br />

DBMemo1 مع الحقل Notes في الخاصة<br />

،True وأعط الخاصة<br />

DataSet<br />

وهو جدول يحوي معلومات عن<br />

للعنصر<br />

DataSource<br />

.. القيمة DataSource1 DataSource<br />

، Datafield والعنصر<br />

DBImage1 مع الحقل<br />

القيمة<br />

، واربط العنصر<br />

... Graphic<br />

لاحظ أولا ً أن قيمة الحقلين<br />

Notes و<br />

Graphic غير ظاهرتين في العنصر DBGrid وذلك لأن هذا العنصر لا<br />

يستطيع عرض الحقول ذات الحجم الكبير وبالتالي لا يستطيع تحريرها لذلك إذا أردنا التعامل مع هذه الحقول لا بد<br />

لنا من استخدام عناصر التحكم التي تستطيع إظهار هذا النوع من الحقول لذلك استخدمنا العنصرين<br />

DBMemo و<br />

: DBImage<br />

حقل من نوع ( إضافة ) تحرير<br />

: Graphic<br />

عند الضغط على الزر Edit أو الزر Insert يمكنك تحرير الجدول من خلال العنصر DBGrid و العنصر<br />

DBMemo وتبقى المشكلة في كيفية تحرير عنصر الصورة<br />

.<br />

1<br />

يتم التعامل مع العنصر DBImage عن طريق حافظة الويندوز ClipBoard ويكون ذلك بإحدى الطريقين<br />

نسخ الصورة المطلوبة إلى الحافظة عن طريق أحد برامج الرسم ومن ثم اختيار العنصر<br />

DbImage إثناء<br />

التنفيذ والضغط على الزرين Ctrl+v أو استخدام الأمر DBImage1.PasteFromClipboard في حدث<br />

الضغط على زر<br />

.<br />

106


http://www.alshater.net<br />

2<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تحميل الصورة من ملف باستخدام العنصر OpenPictureDialog ومن ثم نسخ الصورة إلى الحافظة<br />

ولصقها ولتنفيذ ذلك أضف عنصر زر وعنصر<br />

الوحدة Jpeg في حال أردت استخدام صور<br />

OpenPictureDialog إلى النموذج السابق<br />

)<br />

( Jpg<br />

وفي حدث الضغط على الزر اكتب التعليمات التالية<br />

لا تنسى استخدام<br />

:<br />

If OpenPictureDialog1.Execute then Begin<br />

DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName );<br />

DBImage1.CopyToClipboard ;<br />

DBImage1.PasteFromClipboard ;<br />

end;<br />

نقوم في هذه الحالة بتحميل الصورة إلى العنصر DBImage1 ومن ثم نسخها إلى الحافظة وإعادة لصقها في<br />

. العنصر<br />

على كل حال هذه الطريقة ليست طريقة جيدة للتعامل مع الحافظة ولكنها الطريقة الأسهل وسوف نتعلم قريبا ً أسلوب<br />

التعامل مع الحافظة عند دراسة الرسم في <strong>دلفي</strong><br />

.<br />

3<br />

يمكن تحرير حقل من نوع صورة مباشرة دون العودة إلى العنصر<br />

في الجلسة الماضية ويكون ذلك عن طريق التعليمات التالية<br />

ملاحظة<br />

DBImage أو<br />

DataSource كما وجدنا<br />

:<br />

Table1.edit;<br />

If OpenPictureDialog1.Execute then<br />

Table1Graphic.LoadFromFile(OpenPictureDialog1.FileName);<br />

Table1.Post ;<br />

:<br />

1<br />

لا يمكن في هذه الطريقة استخدام صور من نوع Jpg لأن الحقل من نوع صورة لا يخزن إلا صور من نوع<br />

، Bmp أما في المثال السابق فتقوم الحافظة بتحويل الملف من نوع Jpg إلى ملف<br />

Bmp تلقائي ًا .<br />

2<br />

تخزين الصور من نوع Bmp في قاعدة البيانات سيحتاج إلى مساحة تخزين كبيرة لذلك يفضل بعض<br />

المبرمجين استخدام حقل من نوع<br />

لإظهاره<br />

Binary<br />

...<br />

7 العنصر<br />

: DBListBox<br />

وتخزين ملف الصورة<br />

Jpg ثنائيا ً ومن ثم إعادة هذا الحقل إلى ملف<br />

يعرض قائمة من القيم الجاهزة لتمكين المستخدم من اختيار إحداها لإدخالها ضمن سجل ما في حقل معين ولا يمكن<br />

للمستخدم إضافة قيم جديدة في هذه القائمة<br />

8 العنصر<br />

.<br />

: DBComboBox<br />

يظهر قائمة منسدلة من القيم بحيث يستطيع المستخدم اختيار إحداها لإدخالها لحقل ما،‏ ويمكن للمستخدم أيضا ً أن<br />

يقوم بإدخال قيم أخرى ضمنها غير موجودة مسبقا ً لإلحاقها بقيمة حقل ضمن سجل<br />

9 العنصر<br />

.<br />

: DBDateTimePiker<br />

يرتبط هذا العنصر مع حقول من النوع<br />

Kind إذا كنا نريد إظهار الوقت أو التاريخ<br />

TimeStamp أو Time أو Date<br />

.<br />

وبالنسبة للنوع الحقل تحدد الخاصة<br />

107


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: ( DBcomboBox<br />

DBlistBox<br />

مثال : )<br />

العنصرين<br />

و<br />

ابدأ مشروعا ً جديدا ً أضف إلى النموذج العناصر<br />

Table و DataSource وعنصري DBedit وعنصر<br />

. DBNavigator<br />

DBComboBox و عنصري<br />

DBDateTimePiker و عنصر<br />

DBListBox و<br />

رتب العناصر كما في الشكل<br />

Travel والجدول Trips واعط<br />

اربط العنصر<br />

Table1 مع القاعدة<br />

الخاصة Active القيمة . True<br />

، Table1<br />

اربط العنصر<br />

DataSouce1 مع العنصر<br />

حدد باقي العناصر وأعطها القيمة<br />

Datasoucrce1 في الخاصة<br />

. DataSource<br />

Datafield<br />

اربط العنصر<br />

DBedit1 مع الحقل<br />

TripNo في الخاصة<br />

وأعط الخاصة<br />

ReadOnly القيمة ) True لأن الحقل حقل ترقيم تلقائي<br />

ولا حاجة إلى تحريره (<br />

............. Company<br />

اربط العنصر<br />

DBedit2 مع الحقل<br />

اربط العنصر<br />

DBListBox1 مع الحقل GoFrom وأعط الخاصة<br />

Items القيم التالية<br />

: حلب ، عمان ‏،دمشق ،<br />

اللاذقية ، أثينا ..<br />

اربط العنصر<br />

ComboBox1 مع الحقل<br />

ArriveTo وأعط الخاصة<br />

Items القيم التالية<br />

: القاهرة ، الرياض ، جدة<br />

، عمان ، هامبورغ ...<br />

اربط العنصر<br />

DBDateTimePiker1 مع الحقل<br />

GoTime وأعط الخاصة<br />

Kind القيمة ) dtkTime تذكر أن<br />

. ( Timestamp<br />

الحقل<br />

GoTime من النوع<br />

نفذ البرنامج ولاحظ ما يلي :<br />

1 تنقل بين السجلات ولاحظ التغير في العناصر ComboBox1 و . DbListBox1<br />

2 يمكن الإضافة في الحقل GoFrom من خلال اختيار أحد عناصر القائمة . DBListBox1<br />

DBComboBox1 أو<br />

يمكن الإضافة في الحقل<br />

ArriveTo من خلال اختيار أحد عناصر القائمة المنسدلة<br />

3<br />

كتابة قيمة ما داخل العنصر .<br />

...<br />

4 أضف إلى الشكل عنصر<br />

DbGrid وحاول الإضافة والحذف والتعديل<br />

. Logical<br />

10 العنصر : DBCheckBox<br />

يرتبط هذا العنصر مع حقل من نوع<br />

العنصر<br />

: DBRadioGroup يستخدم هذا العنصر لإدخال أو إظهار قيمة ما إلى حقل يأخذ عدد محدد من<br />

11<br />

القيم :<br />

مثال :<br />

في المثال السابق استبدل العنصر DBListBox بالعنصر ، DBRadioGroup اعط الخاصة DataSource<br />

القيمة<br />

Datasource1 و الخاصة<br />

Items القيم التالية<br />

: حلب ، عمان<br />

DataField القيمة GoFrom والخاصة<br />

108<br />

‏،دمشق ، اللاذقية ، أثينا<br />

..


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

. ..<br />

والخاصة Values القيم :<br />

حلب ، عمان ‏،دمشق ، اللاذقية ، أثينا<br />

حيث تستخدم الخاصة<br />

Items لإظهار عناوين لأزرار الراديو ، أما<br />

Values فتستخدم لإعطاء قيمة للحقل في حال<br />

ضغط المستخدم على زر الراديو ..<br />

العنصر<br />

يشبه العنصر<br />

DBListBox ولكن بدلا ً من الخاصة Item يتم<br />

: DBLookUpListBox<br />

_ 12<br />

الحصول على قيم القائمة من خلال جدول آخر .<br />

العنصر<br />

يشبه العنصر<br />

Item ولكن بدلا ً من الخاصة DBComboBox<br />

: DBLookUpComboBox<br />

13<br />

يتم الحصول على قيم القائمة من خلال جدول آخر .<br />

مثال :<br />

سوف نقوم الآن بإنشاء نموذج للإدخال إلى جدول<br />

المسافرين والرحلات<br />

PassAndTrip حيث سيتم إدخال رقم<br />

"<br />

"<br />

المسافر من خلال العنصر<br />

DBLookUpListBox الذي سيرتبط مع جدول المسافرين لإحضار اسم المسافر ،<br />

وسيتم إدخال رقم الرحلة من خلال العنصر<br />

DBLookUpComboBox الذي سيرتبط مع جدول المسافرين<br />

لإحضار اسم شركة الطيران .<br />

DataSource وعنصري DBedit وعنصر<br />

ابدِأ مشروعا ً جديدا ً وأضف إليه ثلاثة عناصر<br />

Table وثلاثة عناصر<br />

. DBGrid والعنصر DBLookUpComboBox وعنصر DBLookupListBox وعنصر DBNavigator<br />

DataSource1 معه .<br />

اربط العنصر<br />

Table1 مع الجدول<br />

PassAndTrip في القاعدة<br />

Travel واربط العنصر<br />

DataSource2 معه .<br />

اربط العنصر<br />

Table2 مع الجدول<br />

Passengers في القاعدة<br />

Travel واربط العنصر<br />

DataSource3 معه .<br />

اربط العنصر<br />

Table1 مع الجدول<br />

Trips في القاعدة<br />

Travel واربط العنصر<br />

أعط جميع الجداول الخاصة Active القيمة . True<br />

أعط بقية العناصر الخاصة Datasource القيمة . DataSource1<br />

:<br />

أعط<br />

DBLookupListbox1 الخصائص التالية<br />

. "<br />

"<br />

الخاصة DataField القيمة "PNo" :<br />

سيرتبط هذا العنصر مع الحقل<br />

Pno في جدول<br />

المسافرين والرحلات<br />

الخاصة<br />

Listsource القيمة : DataSource2 القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول<br />

. Passengers<br />

الخاصة<br />

ListField القيمة : Pname سيظهر في هذا العنصر قائمة بجميع أسماء المسافرين في الجدول<br />

. Passengers<br />

PassAndTrip عند<br />

الخاصة KeyField القيمة : PNo<br />

تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول<br />

اختيار اسم المسافر عمليا ً يتم في هذه الخاصة تحديد المفتاح الرئيسي<br />

KeyField المرتبط معه المفتاح الثانوي<br />

. DataFields<br />

:<br />

اعط العنصر<br />

DBLookupComboBox1 الخصائص التالية<br />

الخاصة<br />

سيرتبط هذا العنصر مع الحقل<br />

TripNo في جدول<br />

" المسافرين<br />

: "TripNo" القيمة DataField<br />

" . والرحلات<br />

109


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الخاصة<br />

http://www.alshater.net<br />

: القيمة DataSource3 Listsource<br />

.Trips<br />

الخاصة<br />

: Company القيمة ListField<br />

. Trips<br />

الخاصة<br />

:TripNo القيمة KeyField<br />

اختيار اسم الشركة<br />

القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول<br />

سيظهر في هذا العنصر قائمة بجميع أسماء شركات الطيران في الجدول<br />

تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول<br />

PassAndTrip عند<br />

.<br />

اربط العنصر Dbedit1 مع الحقل<br />

SeatNo والعنصر<br />

نفذ البرنامج وتنقل بين السجلات ولاحظ تغير القيم في العناصر<br />

DBEdit2 مع الحقل<br />

. ClassNo<br />

.<br />

اضغط على الزر + إضافة وأدخل قيم عن طريق اختيار اسم أحد المسافرين و اسم الشركة<br />

أضف عدد من السجلات للتآلف مع العناصر<br />

....<br />

...<br />

14 العنصر : DBRichEdit يمكن ربط هذا العنصر مع حقل من نوع Memo أو حقل من نوع<br />

Formatted Memo<br />

العنصر : DBCtrlGrid 15<br />

سطور بعدد سجلات الجدول أثناء التنفيذ<br />

مثال<br />

.<br />

:<br />

أضف هذا العنصر إلى النموذج السابق وأعط الخاصة<br />

DBedit واعط الخاصة<br />

16 العنصر<br />

هذا العنصر يقوم بإظهار صفحة من البيانات حيث يقوم هذا العنصر يتوليد<br />

القيمة DataSource2 DataSource<br />

DataField القيمة<br />

، Pname نفذ البرنامج ولاحظ النتائج<br />

.<br />

: DBChart<br />

لإظهار مخططات بيانية من للقيم الموجودة في جدول<br />

.<br />

وضع داخله عنصر<br />

110


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

الثامنة عشر<br />

البحث في قواعد البيانات :<br />

تعتبر عملية البحث عن سجل معين أو قيمة معينة لحقل ما في سجل من أهم تطبيقات قواعد البيانات ، ونظرا ً<br />

(<br />

لضخامة البيانات الموجودة في قواعد البيانات )<br />

بنوك المعلومات<br />

فإننا نحتاج إلى تقنيات بحث سريعة توصلنا إلى<br />

المعلومة المحددة وبدون عناء البحث ضمن جميع بيانات الجدول ، وسنستعرض الآن أهم طرق البحث التي زودتنا<br />

بها <strong>لغة</strong> <strong>دلفي</strong> .<br />

المنهج : Locate<br />

يقوم هذا المنهج بوضع مؤشر السجل الحالي عند أول سجل يطابق شروط البحث،‏ باستخدام هذه الطريقة يمكننا<br />

Locate ( 'FieldName',SearchValue,Option ) ;<br />

البحث عن قيمة لحقل ما حيث يأخذ هذه المنهج الشكل<br />

حيث<br />

:<br />

: FieldName<br />

اسم الحقل الذي سيتم البحث فيه<br />

.<br />

: SearchValue القيمة التي سيتم البحث عنها.‏<br />

Option ‏:تحدد خيارات البحث وتأخذ القيم التالية :<br />

عدم التميز بين الأحرف الكبيرة والصغيرة , ] [loCaseInsensitive Option =<br />

Option = [ loPartiaKey ] ;<br />

"<br />

"<br />

"<br />

البحث في جزء من الكلمة أي أن البحث عن قيمة "<br />

محم<br />

يمكن أن يعيد<br />

محمد<br />

أو " محمود "<br />

دمج الخيارين السابقين ]; loPartiaKey Option = [ loCaseInsensitive ,<br />

لا نريد استخدام أي من الخيارين السابقين ;[ [ = Option<br />

يعيد هذا المنهج القيمة<br />

True في حال استطاع إيجاد القيمة المطلوبة في جدول البحث والقيمة<br />

False في الحالة<br />

المعاكسة .<br />

مثال :<br />

ابدأ مشروعا ً جديدا ً وأضف إلى النموذج عنصر Table و DataSorce و DbGrid و Button و Edit<br />

: DBGrid<br />

أربط الجدول مع جدول<br />

Passengers في القاعدة<br />

Travel وأظهر محتويات الجدول ضمن<br />

اكتب في حدث الضغط على الزر التعليمة التالية<br />

:<br />

If Table1.Locate('Pname',Edit1.Text , [locaseinsensitive,lopartialkey]) Then<br />

Showmessage(' The record is found ') Else<br />

Showmessage ( ' There is no match , Try Another Value ' );<br />

يقوم البرنامج السابق بالبحث عن القيمة المدخلة في العنصر Edit1 ضمن الحقل PName في جدول المسافرين .<br />

نفذ البرنامج وابحث عن قيمة حقل ما في الجدول ولاحظ انتقال مؤشر الحقل الحالي إليها عند وجودها ، ثم ابحث<br />

عن جزء من اسم أحد المسافرين<br />

ابحث عن الحرف<br />

م<br />

" فقط ولاحظ توضع مؤشر السجل الحالي عند اسم أول<br />

"<br />

)<br />

مسافر يبدأ بحرف<br />

م<br />

ثم احذف الخيار<br />

loPartialKey من تعليمة البحث ولاحظ عدم قدرة المنهج من إيجاد<br />

( "<br />

"<br />

الحقل إلا في حال كانت القيمة مطابقة<br />

.<br />

111


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ثم أضف أسماء مسافرين بال<strong>لغة</strong> الإنكليزية<br />

loCaseInsensitive وأعد البحث<br />

http://www.alshater.net<br />

مثلا ً )<br />

( ahmed و Ahmed<br />

....<br />

استخدام المنهج Locate للبحث عن أكثر من حقل بنفس الوقت<br />

بفرض أننا نريد البحث عن اسم المسافر والجنسية بنفس الوقت<br />

المنهج<br />

:<br />

)<br />

وابحث عن القيمتين ثم احذف الخاصة<br />

المسافر محمد من سورية مثلا ً<br />

(<br />

نستخدم عندها<br />

Locate بالشكل :<br />

Locate ( 'FieldName1; FieldName2; FieldName3',VarArrayOf ( [SearchValue1,<br />

SearchValue2, SearchValue3]),Option ) ;<br />

:<br />

مثال :<br />

أضف عنصر<br />

Edit2 إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية<br />

if table1.Locate('pname;Nationalty',vararrayof([ edit1.Text,Edit2.text]) , [<br />

locaseinsensitive , lopartialkey ] ) then<br />

Showmessage('the record is found') else<br />

Showmessage ( 'there is no match , Try Anther Value' );<br />

التابع VarArrayOf ينشئ مصفوفة عناصرها من النوع . Variant<br />

: ملاحظة<br />

إذا كان الحقل من نوع عدد صحيح<br />

Short أو<br />

Long Integer يجب أن تكون SearchValue من النوع عدد<br />

صحيح أيضا ً ولذلك إذا أردنا أن نبحث عن رقم المسافر بدلا ً من اسمه نستبدل التعليمات السابقة بما يلي<br />

2 المنهج<br />

:<br />

if table1.Locate('PNo;Nationalty',vararrayof([ strtoint(edit1.Text),Edit2.text])<br />

,[locaseinsensitive,lopartialkey]) then<br />

Showmessage('the record is found') else<br />

Showmessage ( 'there is no match , Try Anther Value' );<br />

: Lookup<br />

يعيد هذا المنهج مصفوفة من القيم لمجموعة من حقول الجدول دون أن تغير موضع السجل الحالي والمثال التالي<br />

يوضح هذا المنهج<br />

:<br />

:<br />

مثال سنبحث عن رقم المسافر وسنطلب من التابع ان يعيد اسم المسافر وجنسيته<br />

زر التعليمات التالية<br />

:<br />

اكتب في حدث الضغط على<br />

var LookupResult : Variant;<br />

begin<br />

lookupResult := Table1.Lookup('Pno',strtoint(edit1.Text ),'Pname;Nationalty');<br />

if Not VarIsnull( lookupResult) then<br />

Showmessage(vartostr(lookupresult[0]) + ' ' + vartostr(lookupresult[1] ) );<br />

التعليمة الأولى للبحث عن رقم المسافر المكتوب في العنصر Edit1 ووضع النتيجة في متحول من النوع Variant<br />

يعيد هذا التابع<br />

Lookup القيمة<br />

Null في المتحول إذا لم يجد القيمة المطلوب البحث عنها والتابع<br />

يستخدم لمعرفة إذا كان المتحول من النوع Variant يحوي قيمة أم لا<br />

VarIsNull<br />

.<br />

112


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التابع VarToStr يحول قيمة المتحول variant إلى نص<br />

ملاحظات<br />

http://www.alshater.net<br />

.<br />

113<br />

:<br />

1<br />

يمكن استخدام التابع Lookup للبحث في أكثر من حقل في نفس الوقت مثال استبدل التعليمة الأولى في<br />

المثال السابق بالتعليمة<br />

lookupResult := Table1.Lookup('Pno;Pname',VarArrayof<br />

([strtoint(edit1.Text),Edit2.text]),'PName;Nationalty');<br />

:<br />

2 من أهم مزايا المنهجين<br />

Locate و<br />

lookup أنهما يستطيعان التعامل مع حقول مفهرسة وغير مفهرسة ،<br />

ويستخدمان أيضا ً خوارزميات متقدمة للبحث حيث يستفيدان من الحقل إذا كان مفهرسا ً و يطبقان عمليات الفرز<br />

الفلترة<br />

المنهج<br />

)<br />

(<br />

في حال كان غير مفهرس<br />

.<br />

: FindKey<br />

هذا المنهج خاص بالتعامل مع الحقول المفهرسة حيث تكون عمليات البحث أسهل حيث يأخذ المنهج<br />

Findkey<br />

قيمة الحقل التي سيبحث عنها ويعيد قيمة بوليانية تدل على عثور هذا المنهج على السجل المطلوب ويقوم بنقل<br />

مؤشر السجل الحالي إلى السجل المطابق لشروط البحث<br />

: مثال<br />

في حدث الضغط المثال السابق على زر اكتب التعليمة التالية<br />

تقوم هذه التعليمة بالبحث في الفهرس<br />

الافتراضي<br />

:<br />

If not Table1.FindKey( [ Strtoint ( edit1.text)]) Then<br />

Showmessage ( 'the Record is not Found');<br />

)<br />

PNo<br />

لأنه المفتاح الرئيسي<br />

(<br />

عن القيمة المكتوبة في العنصر<br />

Edit وفي حال تم إيجادها ينتقل مؤشر السجل الحالي للسجل المطابق لنتيجة البحث ويعيد المنهج القيمة<br />

في حال لم توجد النتيجة فيعيد التابع القيمة<br />

،True أما<br />

False<br />

للبحث في الفهارس الثانوية يجب تحديد الفهرس الثانوي عن طريق الخاصة<br />

ويمكن تحديدها أثناء التصميم أو أثناء التنفيذ<br />

مثال<br />

Table للعنصر IndexName<br />

.<br />

:<br />

في المثال السابق أعط العنصر Table1 في الخاصة<br />

عرفنا هذا الفهرس في البرنامج<br />

IndexName<br />

القيمة<br />

) PNameIndex<br />

( Database Desktop<br />

مباشرة حيث سيصبح ترتيب السجلات اعتمادا ً على الترتيب الأبجدي في الحقل<br />

عدل التعليمة في حدث الضغط على زر بالشكل التالي<br />

نفذ البرنامج وابحث عن اسم مسافر ما<br />

ولاحظ تغير ترتيب السجلات في العنصر<br />

تذكر أننا<br />

DbGrid<br />

. PName<br />

If not Table1.FindKey([edit1.text]) then<br />

Showmessage ( 'the Record is not Found');<br />

:<br />

.....<br />

وجدنا أيضا ً أنه يمكن أن تكون المفاتيح الرئيسية عبارة عن حقلين أو أكثر كذلك الأمر بالنسبة للفهارس<br />

الثانوية وفي هذه الحالة نستخدم المنهج<br />

مثال : يمكن البحث في جدول<br />

البحث عن المسافر رقم 2 في الرحلة<br />

FindKey بالشكل :<br />

TableName.FindKey ( [ SearchValue1,SearchValue2 ,…,SearchValue3]) ;<br />

: [2,3]) Table1.FindKey( حيث سيتم<br />

"<br />

المسافرين والرحلات"‏<br />

. 4<br />

باستخدام التعليمة


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

4 المنهج<br />

: FindNearest<br />

يشبه المنهج السابق إلا أنه ينتقل إلى سجل مطابق أو إلى أقرب سجل مطابق أو إلى أقرب سجل مطابق للقيمة<br />

( False أو True<br />

المراد البحث عنها ، كما أنه لا يعيد قيمة )<br />

لا يعيد<br />

مثال :<br />

عدل التعليمة في حدث الضغط على الزر السابق لتصبح بالشكل<br />

ادخل في العنصر Edit1 جزء من اسم مسافر<br />

:<br />

Table1.FindNearest ([edit1.text]);<br />

"<br />

مح"‏ مثلا ً واضغط على الزر ستقوم التعليمات بوضع مؤشر السجل<br />

الحالي عند أول مسافر أسمه<br />

مح<br />

أو أسمه قريب إلى<br />

‏"محمود".‏ أو ‏"محمد"‏ مثل ‏"مح<br />

"<br />

"<br />

"<br />

: Filter<br />

(<br />

التصفية )<br />

الفلترة<br />

تستخدم التصفية لإظهار مجموعة من الحقول تحقق معايير محددة مثلا ً نريد من الجدول أن يعرض المسافرين من<br />

الجنسية السورية فقط في جدول المسافرين ، أو أن نظهر جميع الرحلات التي خرجت من مطار حلب في جدول<br />

الرحلات .<br />

. True القيمة Filter<br />

تستخدم لهذه العملية الخاصة Filter<br />

للعنصر<br />

Table ويجب أن تأخذ الخاصة<br />

التصفية أثناء التصميم :<br />

...<br />

مثال :<br />

سنظهر في جدول الرحلات الخارجة من مدينة حلب<br />

Table و DataSource و DBGrid و ، Button اربط<br />

ابدأ مشروعا ً جديدا ً واضف<br />

إلية العناصر التالية<br />

.<br />

العناصر مع بعضها بحيث يظهر جدول الرحلات<br />

Trips في العنصر<br />

DBGrid1 أثناء التصميم<br />

Filter القيمة :<br />

أعط الخاصة Filtered للعنصر Table1 القيمة<br />

True واكتب في الخاصة<br />

‏'حلب'‏ = GoFrom<br />

سيتم تطبيق التصفية مباشرة وسيظهر الجدول جميع الرحلات المغادرة من مطار حلب ، نستطيع الآن إزالة<br />

التصفية بإعطاء الخاصة Filtered القيمة . False<br />

الآن على فرض أننا نريد أن نعرف جميع الرحلات المغادرة من مدينة حلب إلى القاهرة ، لتحقيق ذلك نكتب في<br />

الخاصة<br />

Filter القيمة التالية<br />

‏'القاهرة'‏ = Arriveto and ‏'حلب'‏ = Gofrom<br />

( True<br />

الخاصة<br />

Filter يجب أن تأخذ القيمة<br />

)<br />

كما يمكن أن نبحث عن جميع الرحل المغادرة من حلب أو دمشق إلى القاهرة ... :<br />

‏'القاهرة'‏ = Arriveto and ‏('دمشق'‏ = GoFrom Or ‏'حلب'‏ = (Gofrom<br />

"<br />

كما يمكن أن نوجد جميع الرحل المغادرة من بلد يبدأ أسمه بحرف "<br />

ح<br />

‏'*ح'=‏ Gofrom<br />

:<br />

CardCount > 10<br />

Filter القيمة<br />

كما يمكن نعرف الرحل التي بقي فيها أكثر من 10 بطاقات :<br />

اكتب في الخاصة<br />

114


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التصفية أثناء التنفذ<br />

أعط الخاصة<br />

http://www.alshater.net<br />

:<br />

Filtered القيمة<br />

التي بقي فيها أكثر من<br />

True أثناء التصميم واكتب في حدث الضغط على زر التعليمة التالية لمعرفة الرحل<br />

10 بطاقات :<br />

Table1.Filter := ' CardCount > 10 '<br />

Edit النموذج :<br />

Table1.Filter := ' CardCount > '+ edit1.Text ;<br />

...<br />

ولمعرفة الرحل التي بقي فيها أكثر من عدد محدد من البطاقات أضف عنصر<br />

أدخل رقما ً في العنصر Edit1 حتى لا يحدث أخطاء<br />

لمعرفة الرحل المغادرة من مدينة ما نستخدم التعليمة التالية<br />

يعيد التابع<br />

:<br />

Table1.Filter := 'GoFrom = '+ Quotedstr(edit1.Text) ;<br />

) = '<br />

Quotedstr (<br />

Quotedstr النص المعطى في وسيطه إليه مضاف إليه إشارتي حصر مثلا ً<br />

وهكذا أعد تنفيذ الأمثله السابقة<br />

خواص العنصر<br />

...<br />

: Table<br />

يملك العنصر Table عدد من الخواص للتحكم به أثناء التنفيذ وهي<br />

:<br />

1 المنهج Open ‏:تسخدم التعليمة Table1.open لفتح الجدول وتكافئ التعليمة<br />

‏'حلب<br />

حلب<br />

Table1.Active := true<br />

.<br />

2 المنهج<br />

: Close<br />

تستخدم التعليمة Table1.Close لإغلاق الجدول وتكافئ التعليمة<br />

Table1.Active :=<br />

. False<br />

3 المنهج<br />

4 المنهج<br />

5 المنهج<br />

6 المنهج<br />

7 المنهج<br />

Table1.First<br />

Table1.Last<br />

First ‏:استخدم<br />

لوضع مؤشر السجل الحالي عند أول سجل في الجدول<br />

.<br />

)<br />

: Last<br />

تكون قيمة X سالبة<br />

استخدم<br />

لوضع مؤشر السجل الحالي في آخر الجدول<br />

.<br />

: Next استخدم<br />

Table1.Next للانتقال إلى السجل التالي في الجدول<br />

.<br />

: Prior استخدم<br />

Table1.Prior للانتقال إلى السجل السابق في الجدول<br />

.<br />

: MoveBy( x)<br />

.(<br />

استخدم ) 5 Table1.MoveBy( للانتقال خمس سجلات إلى الأمام<br />

8 المنهج : Bof تعيد هذه الخاصة القيمة True إذا كان السجل الحالي في بداية الجدول<br />

9 المنهج<br />

.<br />

: Eof<br />

تعيد هذه الخاصة القيمة True إذا كان السجل الحالي في نهاية الجدول<br />

10 المنهج : RecordCount يعيد هذه المنهج عدد سجلات الجدول<br />

.<br />

.<br />

.<br />

: RecNo<br />

11 المنهج يعيد هذا المنهج رقم السجل الحالي<br />

12 المنهج : Delete يقوم هذا المنهج بحث السجل الحالي ويضع مؤشر السجل على السجل التالي<br />

الحقول الحسابية<br />

يمكن أن<br />

..<br />

:<br />

115


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الوظيفة :<br />

1ً أنشئ الجداول التالية باستخدم البرنامج :DataBase Desktop<br />

1 جدول المؤلفين : Writer<br />

Wadress<br />

WName<br />

رقم المؤلف * Wno<br />

اسم المؤلف<br />

عنوان المؤلف<br />

1<br />

2<br />

2 جدول دور النشر : Publisher<br />

PubAdr<br />

PubName<br />

رقم الدار * PubNo<br />

اسم الدار<br />

العنوان<br />

3 جدول الكتب :<br />

رقم الكتاب<br />

BookNo<br />

اسم الكتاب<br />

رقم المؤلف<br />

رقم الدار<br />

تاريخ الإصدار<br />

Edate<br />

PubNo<br />

WNo<br />

Book<br />

ً 2 اربط بين الجداول بالشكل الذي تراه منسابا ً .<br />

.<br />

ً 3 عرف فهرس<br />

ثانوي على الحقل اسم المؤلف و الحقل اسم الدار والحقل اسم الكتاب<br />

ً 4 اعرض جدول المؤلفين وجدول الكتب على نموذج واحد بحيث يكون الأول تفصيلي والثاني ثانوي .<br />

ً 5 ضع عدد من الأزرار على النموذج للبحث عن اسم المؤلف باستخدام أساليب البحث المختلفة<br />

ً 6 أعرض في نموذج جديد جميع الكتب الموجودة والتي من إصدار دار شعاع.‏<br />

116


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة‎19‎<br />

الحقول الحسابية<br />

http://www.alshater.net<br />

:<br />

تستخدم الحقول الحسابية عادة لإعطاء نتيجة حسابية أجريت على عدد من حقول الجدول وهذه الحقول لا تخزن في<br />

القاعدة البيانات ولكن تظهر للمستخدم فقط<br />

في الجدول<br />

مثال<br />

)<br />

.... (<br />

:<br />

لا حاجة أصلا ً لتخزين هذه المعطيات لأنها معتمدة على حقول أخرى<br />

على فرض أن جميع الرحلات قادرة على حمل 350 مسافر نريد أن ننشئ حقل حسابي يعرض عدد<br />

البطاقات المحجوزة على رحلة ما بالاعتماد على العلاقة<br />

CardCount عدد البطاقات المحجوزة<br />

= 350 -<br />

ابدأ مشروعا ً جديدا ً أضف إليه العناصر<br />

الجدول<br />

التصميم<br />

Trips بحيث يظهر الجدول في<br />

: DBGrid و DataSource<br />

117<br />

Table و<br />

DBGrid أثناء<br />

...<br />

اعط الخاصة<br />

. False القيمة للعنصر Table1 Active<br />

اضغط مرتين على العنصر<br />

Table ليظهر<br />

محرر<br />

الحقول،‏ ثم اضغط بزر الفأرة اليميني وأضف جميع<br />

الحقول،‏ اضغط بزر الفأرة اليميني مرة أخرى واختر<br />

New field ستظهر عندها النافذة حقل جديد<br />

اكتب<br />

اختر<br />

CapCard في القسم<br />

Name وفي القسم<br />

Type<br />

Integer واختر<br />

اضغط على<br />

Calculated في القسم<br />

Field type<br />

. Ok<br />

أغلق محرر الحقول واختر العنصر<br />

OnClacFields واكتب فيه التعليمة التالية<br />

أعط الخاصة<br />

Table1 وانتقل إلى الصفحة<br />

اربط العناصر مع بعضها ومع<br />

Event في محرر الخواص وانتقل إلى الحدث<br />

:<br />

Table1CapCard.Value := 350 - table1Cardcount.value ;<br />

، CapCard عدل<br />

Active القيمة True للعنصر<br />

في أحد حقول CardCount ولاحظ التغير المباشر في الحقل<br />

مثال<br />

Table1 ونفذ البرنامج،‏ واستعرض الحقل الجديد<br />

... CapCard<br />

: 2<br />

الرحلة ستنطلق بتاريخ<br />

الحقل<br />

القسم<br />

نريد أن نضيف حقل جديد إلى الجدول السابق يعطي اسم اليوم الذي ستنطلق منه الرحلة<br />

15/9/2003 فإن قيمه هذا الحقل ستكون<br />

GoTime ولتحقيق ذلك أعط الخاصة<br />

)<br />

" ( الاثنين "<br />

Active للعنصر Table1 القيمة<br />

Name أكتب<br />

TheDay وفي القسم<br />

OnClacFields واكتب التعليمات التالية<br />

ملاحظة<br />

Type اختر<br />

:<br />

أي اذا كانت<br />

، سيعتمد هذا الحقل في قيمته على<br />

False وافتح محرر الحقول وفي<br />

، String اضغط على OK وانتقل إلى الحدث<br />

Case DayOfWeek ( Table1GoTime.AsDateTime ) of<br />

‏;'الأحد'=:‏ 1: Table1Theday.Value<br />

:<br />

لا تؤثر الحقول الحسابية على بنية قاعد البيانات<br />

، وإذا أردنا استخدام هذه الحقول في أكثر من نموذج علينا<br />

تعريفها من جديد في كل عنصر<br />

Table جديد .


http://www.alshater.net<br />

‏;'الاثنين'=:‏ 2: Table1Theday.Value<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

‏;'الثلاثاء'=:‏ 3: Table1Theday.Value<br />

‏;'الأربعاء'=:‏ 4: Table1Theday.Value<br />

‏;'الخميس'=:‏ 5: Table1Theday.Value<br />

‏;'الجمعة'=:‏ 6: Table1Theday.Value<br />

‏;'السبت'‏ := Table1Theday.Value 7:<br />

end;<br />

....<br />

يعيد التابع<br />

DayOfWeek رقم اليوم في الأسبوع حيث أن اليوم الأول الأحد والثاني الاثنين<br />

..........<br />

نفذ البرنامج وعدل في قيم الحقل<br />

GoTime ولاحظ النتائج<br />

SQL ( Structured Query Language )<br />

<strong>لغة</strong> الاستفسارات البنيوية :<br />

تعريف : <strong>لغة</strong><br />

SQL هي <strong>لغة</strong> برمجة خاصة للتعامل مع قواعد البيانات وتعتبر <strong>لغة</strong> برمجة عالية المستوى،‏ حيث<br />

يمكنها في سطر واحد إجراء عمليات با<strong>لغة</strong> التعقيد على قاعدة البيانات.‏<br />

:<br />

تستخدم<br />

SQL مجموعة من التعليمات للتعامل مع قواعد البيانات سنتعرف على بعض منها الآن<br />

التعليمة<br />

: Select<br />

التعليمات بين<br />

مهمة هذه التعليمة إحضار المعلومات من قواعد البيانات ولها الشكل العام التالي<br />

:<br />

Select FieldName1 , FieldName2 , FieldName13….<br />

From TableName1,TableName2 …<br />

[ Where Condition ]<br />

[ Group By FieldName1,…]<br />

[ Order By FieldName ]<br />

] [ اختيارية .<br />

تقوم هذه التعليمة بإحضار الحقول المحددة القسم<br />

From من الجدول المذكور اسمه في القسم Select<br />

مثلا ً إذا أردنا إحضار حقل اسم المسافر و الجنسية من جدول المسافرين نستخدم التعليمة التالية<br />

يتم التعامل في <strong>دلفي</strong> مع<br />

SQL باستخدام العنصر<br />

Query الموجود في الصفحة<br />

:<br />

Select PName , Nationality<br />

From Passengers<br />

BDE وهو عنصر يشابه العنصر<br />

Table بشكل كبير ولكنه لا يملك الخاصة<br />

TableName حيث يتم تحديد الجداول التي ستتعامل مع هذا العنصر<br />

SQL فيها .<br />

باستخدام الخاصة<br />

SQL التي يتم كتابة تعليمات<br />

SQL السابق<br />

مثال :<br />

تحقيق مثال تعليمة<br />

ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية Query و DataSource و DBGrid وDBNavigator<br />

.<br />

SQL<br />

...<br />

أعط الخاصة DataBaseName للعنصر Query1 القيمة<br />

Travel ‏،عند الضغط على<br />

في الخاصة<br />

Select PName , Nationality<br />

From Passengers<br />

تظهر نافذة اكتب فيها التعليمات التالية :<br />

118


http://www.alshater.net<br />

) True<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أعط الخاصة<br />

Active القيمة في حال ظهور رسالة خطأ تأكد من التعليمات ومن كتابتك لأسماء الحقول<br />

والجدول بشكل صحيح)‏<br />

أعط الخاصة DataSet للعنصر DataSource1 القيمة Query1 واربط DBGrid1 و DBNavigator1 مع<br />

. DataSource1<br />

نفذ البرنامج ولاحظ ظهور الأعمدة المطلوبة في عبارة<br />

Select داخل العنصر<br />

، DBGrid لاحظ أيضا ً أن أزرار<br />

تعديل وإضافة السجلات في العنصر DBNavigator1<br />

غير فعالة ، كما أنه لا يمكن التعديل في البيانات من<br />

خلال العنصر<br />

DBGrid1 مباشرة وذلك يعود إلى أن عبارة<br />

Select تستخدم لجلب البيانات من قاعدة البيانات ،<br />

أما إذا أردنا التعديل أو الإضافة أو الحذف فهناك تعليمات<br />

SQL خاصة بذلك،‏ ولكن العنصر<br />

Query يملك خاصة<br />

تجعل البيانات قابلة للتحرير وهي الخاصة<br />

، RequestLive فعند إعطاء هذه الخاصة القيمة<br />

True يمكن التعامل<br />

Table تمام ًا .<br />

مع العنصر Query كما<br />

كنا نتعامل مع العنصر<br />

مثال<br />

2 ‏:إذا أردنا إحضار حقول الجدول بالكامل نستخدم التعليمة<br />

* Select بدلا ً من ذكر أسماء الأعمدة ، عدل<br />

Select *<br />

From Passengers<br />

False إلى Query<br />

العبارة في المثال السابق<br />

)<br />

بعد أي تعديل على الخاصة<br />

داخل الخاصة SQL لتصبح بالشكل<br />

:<br />

SQL ستعود<br />

قيمة الخاصة<br />

Active للعنصر<br />

استخدام الشرط : Where<br />

تستخدم التعليمة<br />

Where داخل عبارة<br />

Select لتحقيق شروط معينة على البيانات التي<br />

سيحضرها الاستعلام .<br />

. 5<br />

مثال<br />

: 3 نريد عرض جميع حقول جدول المسافرين والذين أرقامهم أكبر من<br />

عدل التعليمات السابقة في الخاصة SQL لتصبح بالشكل<br />

مثال<br />

مثال<br />

مثال<br />

مثال<br />

Select *<br />

From Passengers<br />

Where PNo > 5<br />

:<br />

119<br />

: 4<br />

نريد عرض اسم المسافر الذي رقمه<br />

: 3<br />

: 5<br />

: 6<br />

نريد عرض جميع المسافرين الذين أرقامهم بين<br />

نريد عرض المسافرين الذين أرقامهم خارج المجال<br />

Select *<br />

From Passengers<br />

Where PNo = 3<br />

2 و : 5<br />

Select *<br />

From Passengers<br />

Where PNo Between 2 and 5 ;<br />

: 5 – 2<br />

Select *<br />

From Passengers<br />

Where PNo Not Between 2 and 5 ;<br />

:<br />

Select *<br />

: 7<br />

نريد عرض جميع المسافرين الذين اسمهم محمد


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

مثال<br />

مثال<br />

http://www.alshater.net<br />

From Passengers<br />

‏'محمد'‏ = PName Where<br />

: 8<br />

نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م<br />

Select *<br />

From Passengers<br />

‏'%م'‏ Where Pname Like<br />

: 9<br />

نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م وطول اسمهم أربع أحرف<br />

تستخدم % في تعليمة Like للإشارة إلى عدد من الأحرف<br />

تستخدم<br />

م<br />

:<br />

Select *<br />

From Passengers<br />

Where Pname Like '____ '<br />

.<br />

_<br />

استخدام الترتيب<br />

في تعليمة Like للإشارة إلى حرف وحيد<br />

.<br />

: Order By<br />

تستخدم تعليمة Order by لترتيب البيانات حسب حقل محدد<br />

مثال<br />

مثال<br />

مثال<br />

:<br />

:10<br />

نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />

5 بحيث يظهر ترتيب الأسماء تصاعديا ً<br />

Select * From Passengers<br />

Where PNo > 5<br />

Order By PName<br />

5 بحيث يظهر ترتيب الأسماء تصاعديا ً<br />

Select * From Passengers<br />

Where PNo > 5<br />

Order By PName desc<br />

:10<br />

نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />

11 ‏:نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />

ومن ثم لأ للجنسية )<br />

5 بحيث يتم ترتيب الجدول بالنسبة<br />

للأسماء أولا ً<br />

أي إذا تطابق اسمي مسافرين سيوضع ترتيبها في الجدول حسب ترتيب الجنسية أبجديا ً ( .<br />

Select * From Passengers<br />

Where PNo > 5<br />

Order By PName ,Nationality<br />

التوابع الجامعة في<br />

1 التابع<br />

مثال<br />

120<br />

: SQL<br />

: Count<br />

يعيد عدد السجلات التي تعيدها عبارة<br />

: Select<br />

:12<br />

لمعرفة عدد الرحلات المغادرة من مدينة حلب في جدول الرحلات<br />

سيظهر في الجدول حقل وحيد فيه عدد السجلات المغادرة من مدينة حلب ‏،عنوان هذا الحقل<br />

تغير هذا العنوان بتعديل تعليمة<br />

Select Count( * )<br />

From Trips<br />

‏'حلب'‏ = GoFrom Where<br />

Count(*) ، يمكن<br />

Select Count( * ) as Total ….<br />

Select إلى


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

2 التابع : Sum يعيد هذا التابع مجموع سجلات حقل ما<br />

SQL التالية :<br />

Select Sum(CardCount)<br />

From Trips<br />

‏'حلب'‏ = GoFrom Where<br />

مثال : 13<br />

لمعرفة مجموع بطاقات الرحلات المغادرة من حلب نستخدم عبارة<br />

3 التابع<br />

Avg ‏:يعيد هذا التابع المعدل الوسطي لمعطيات سجلات حقل ما<br />

Select Avg(CardCount)<br />

Form Trips<br />

: 14 مثال<br />

لمعرفة المعدل الوسطي لعدد البطاقات الموجودة بالنسبة لعدد الرحلات<br />

4 التابع : Max يعيد هذا التابع أكبر قيمة في الحقل<br />

:<br />

Select Max(CardCount)<br />

From Trips<br />

مثال<br />

لمعرفة أكبر عدد للبطاقات في حقل<br />

CardCount<br />

: 15<br />

5 التابع<br />

: Min يعيد هذا التابع أصغر قيمة في حقل ما<br />

.<br />

عبارة : Group By<br />

تستخدم ضمن تعليمة<br />

Select لإجراء عمليات على البيانات وفرزها ضمن مجموعات وهي مرتبطة بشكل وثيق مع<br />

التوابع الجامعة :<br />

:<br />

مثال<br />

: 16 لإظهار عدد الرحلات<br />

المغادرة من كل مطار<br />

Select GoFrom ,Count(GoFrom)<br />

From Trips<br />

Group by GoFrom<br />

:<br />

مثال<br />

: 17 لمعرفة عدد البطاقات للرحل المغادرة من كل مطار<br />

Select GoFrom ,Sum(CardCount)<br />

From Trips<br />

Group by GoFrom<br />

Select<br />

ملاحظة :<br />

جميع الحقول الواردة في تعليمة<br />

يجب أن ترد في تعليمة<br />

Group By ما عدا الحقول التي<br />

تستخدم التعليمات الجامعة .<br />

عبارة : Having<br />

.<br />

تستخدم تعليمة<br />

Having بعد التعليمة<br />

Group By لوضع شروط على عملية فرز البيانات<br />

121<br />

مثال : 18<br />

لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها أكبر من<br />

. 10<br />

Select GoFrom ,Sum(CardCount)<br />

From Trips<br />

Group by GoFrom<br />

Having Sum( CardCount) > 10<br />

Null<br />

Select GoFrom ,Sum(CardCount)<br />

مثال : 19<br />

لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها لا يساوي


http://www.alshater.net<br />

From Trips<br />

Group by GoFrom<br />

Having Sum( CardCount ) is not null<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

122


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة 20<br />

ربط الجداول :<br />

Where<br />

يمكن استخدام عبارة<br />

Select لإحضار بيانات من أكثر من جدول وبتطبيق بعض الشروط في عبارة<br />

نحصل على جداول مرتبة وأكثر فاعلية من الجداول التي يظهرها العنصر . Table<br />

Passengers و<br />

مثال 1:<br />

ربط الجدولين<br />

PassAndTrips لإظهار اسم المسافر بدلا ً من رقمه<br />

:<br />

SELECT Pname,TripNo,SeatNo,ClassNo<br />

FROM PassAndtrips, Passengers<br />

WHERE PassAndtrips.PNo = Passengers.PNo<br />

"<br />

تقوم هذه التعليمة بإحضار أسماء الأعمدة المختارة من جدولي المسافرين و "<br />

المسافرين والرحلات<br />

بتطبيق الشرط<br />

الأخير والذي يسمى شرط ربط الجداول )<br />

في حال تشابه اسم الحقل في جدولين نكتب اسم الجدول قبل اسم الحقل<br />

وبينهما نقطة Passengers.PNo<br />

: Trips و Passengers و PassAndTrips<br />

مثال<br />

2 ‏:ربط الجداول<br />

بحيث يظهر جدول فيه اسم المسافر و اسم<br />

الشركة التي سيسافر معها وبلد المغادرة و رقم المقعد ورقم الصف<br />

التعليمة<br />

هي تعليمة تستخدم للربط بين الجداول حيث يمكن كتابة عبارة<br />

:<br />

SELECT Pname, Company, GoFrom, SeatNo, ClassNo<br />

FROM Passandtrips, Passengers, Trips<br />

WHERE (PassAndtrips.PNo = Passengers.PNo)<br />

AND (PassAndtrips.TripNo = Trips.TripNo)<br />

: Inner join<br />

ويمكن كتابة عبارة SQL للمثال الثاني بالشكل<br />

ملاحظات<br />

SQL<br />

للمثال الأول بالشكل<br />

:<br />

SELECT Pname, TripNo,SeatNo, ClassNo<br />

FROM PassAndtrips<br />

INNER JOIN Passengers<br />

ON (Passengers.PNo = PassAndtrips.PNo)<br />

SELECT Pname, company, SeatNo, ClassNo<br />

FROM Passandtrips<br />

INNER JOIN Passengers<br />

ON (Passengers.PNo = Passandtrips.PNo)<br />

INNER JOIN Trips<br />

ON (Trips.TripNo = Passandtrips.TripNo)<br />

:<br />

:<br />

SQL<br />

1 هناك عبارات أخرى للربط مثل Outer Join و Left Join و<br />

Right Join يمكنك مراجعة كتب<br />

للتعرف عليها.‏<br />

SQL منها :<br />

1 بالإضافة لعبارة<br />

SELECT يوجد عبارات أخرى في<br />

العبارة<br />

العمل<br />

إنشاء جدول<br />

Create Table<br />

123


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إدخال قيم إلى جدول<br />

تعديل قيم جدول<br />

حذف سجلات من جدول<br />

Insert<br />

Update<br />

Delete From<br />

للتعرف على هذه الأوامر راجع كتب SQL المختصة ....<br />

البرنامج : SQL Builder<br />

يستخدم هذا البرنامج لكتابة<br />

تعليمات<br />

SQL بشكل مرئي<br />

وتفاعلي وبكلام آخر هو عبارة<br />

عن أداة تسهل كتابة تعليمات<br />

SQL كما تمكننا من استعراض<br />

النتائج ...<br />

لتشغيل SQL Builder<br />

ضع<br />

عنصر<br />

Query على النموذج<br />

واضغط عليه بزر الفأرة اليمني<br />

واختر SQL Builder من<br />

القائمة ستظهر عندها النافذة المجاورة<br />

: 1 مثال<br />

لإظهار حقول من جدول الرحلات<br />

:<br />

1<br />

من القائمة المنسدلة Database اختر اسم قاعدة المعطيات Travel عندها ستظهر جميع الجداول ضمن هذه<br />

القاعدة في النافذة المجاورة Table اختر منها<br />

Trips.db<br />

2 ستظهر عندها نافذة صغيرة تحوي جميع حقول جدول الرحلات وبجوار هذه الحقول صناديق خيار ، بتحفيز<br />

هذه الصناديق يمكن اختيار الحقول التي ستظهر في الاستعلام<br />

)<br />

حدد بعضا ً من هذه الحقول<br />

. (<br />

3<br />

اضغط على الزر Execute SQL من إزارا السرعة ستلاحظ مباشرة نتائج الاستعلام والذي يمكنك<br />

قراءة تعليماته بالضغط على الزر SQL المجاور للزر السابق<br />

4 أغلق البرنامج<br />

.<br />

SQL Builder<br />

ستشاهد التعليمات ضمن الخاصة<br />

سيسألك البرنامج إذا كنت تريد حفظ التغيرات إلى الاستعلام ، إذا اخترت نعم<br />

SQL للعنصر<br />

Query بشكل تلقائي<br />

..<br />

مثال<br />

: لإظهار جميع الرحلات المغادرة من مطار حلب قم بما يلي<br />

: 2 تعليمة Where باستخدام SQL Builder<br />

:<br />

124


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

:<br />

...<br />

1 ادخل إلى البرنامج SQL Builder<br />

كما في السابق<br />

2 حدد جميع حقول الجدول<br />

Trips.db بالضغط على صندوق الخيار المجاور لأسم الجدول<br />

) ضمن النافذة<br />

الصغيرة ( .<br />

Field Value واختر =<br />

: (<br />

3 ضمن الصفحة ) Criteria<br />

معايير<br />

اختر Trips.Gofrom من العمود الأيسر<br />

. (<br />

)<br />

Field Value<br />

من العمود<br />

Compare واكتب في العمود الأيمن<br />

حلب الكلمة<br />

...<br />

4 شاهد عبارة<br />

SQL ثم نفذها<br />

.<br />

:<br />

مثال 3<br />

سنضيف شرط جديد على المثال السابق وهو إظهار الرحلات التي غادرت حلب باتجاه القاهرة<br />

Compare<br />

في السطر التالي للشرط السابق اختر من العمود الأيسر<br />

Trips.ArriveTo واختر = من العمود<br />

1<br />

. (<br />

واكتب في العمود الأيمن )<br />

القاهرة<br />

تغير عناوين الحقول<br />

: يق SQL Builder اختر الصفحة Selection ستشاهد فيها جميع الحقول التي قمت<br />

)<br />

(<br />

Field<br />

)<br />

باختيارها من الجدول<br />

Trip يمكنك حيث يظهر في العمود الأيمن<br />

اسم الحقل ويظهر العمود الأيسر<br />

عنوان الحقل يمكنك في هذا القسم كتابة عنوان للحقل<br />

يمكنك استخدام ال<strong>لغة</strong> العربية<br />

،( يظهر<br />

(<br />

)<br />

( Output Name<br />

،<br />

( Query<br />

عنوان الحقل في القسم اسم الحقل في العنصر<br />

DBGrid المرتبط مع العنصر<br />

.<br />

نفذ عبارة<br />

SQL لتلاحظ النتائج<br />

ترتيب حقول الجدول :<br />

SQL Builder نختار<br />

وجدنا أن تعليمة<br />

Order By تستخدم لترتيب الجدول و لكتابة هذه التعليمة باستخدام<br />

الصفحة<br />

Sorting حيث تظهر في القسم الأيسر جميع الحقول المختارة من الجدول ، حدد أحد هذه الحقول واضغط<br />

على الزر<br />

Add ليضاف اسمه إلى القسم الأيمن من الصفحة<br />

، يمكنك إضافة أكثر من حقل كما<br />

( Sorted by<br />

)<br />

يمكنك تحديد طريقة الترتيب<br />

تصاعدي أم تنازلي<br />

باختيار الحقل في القسم<br />

Sorted By والضغط على أحد<br />

(<br />

)<br />

الزرين AZ أو Z A قي الوسط ....<br />

التجميع وشروط التجميع :Group by …Having<br />

.<br />

Group Criteria و Grouping<br />

يمكنك كتابة التعليمات Group by و Having<br />

باستخدام الصفحتين<br />

ربط الجداول باستخدام : SQL Builder<br />

حل المثال الأول :<br />

افتح البرنامج<br />

عن طريق الضغط بزر الفأرة اليميني على عنصر<br />

( Query اختر القاعدة<br />

) SQL Builder<br />

Travel واختر الجدول<br />

PassAndTrips ومن اللائحة<br />

Table ومن ثم اختر الجدول<br />

Passenegers من نفس<br />

اللائحة :<br />

Passengers<br />

ستظهر عندها نافذتي الجدولين ، اضغط بزر الفأرة الأيسر على الحقل<br />

PNo في نافذة الجدول<br />

وحرك يدك باتجاه الحقل<br />

PNo في نافذة الجدول<br />

PassAndTrips مع إبقاء الزر مضغوطا ً ، حرر زر الفأرة فوق<br />

الحقل<br />

PNo تماما ً ، سيظهر عندها خط يصل بين النافذتين دليل على عملية الربط<br />

) اختر بعض الحقول من<br />

الجدولين وشاهد النافذة<br />

SQL للمشاهدة التعليمات<br />

. (<br />

125


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

Trips<br />

لحل المثال الثاني :<br />

أضف الجدول<br />

من اللائحة<br />

Table ستظهر عندها نافذة الجدول<br />

Trips وبنفس الطريقة<br />

...<br />

:<br />

السابقة اربط بين الحقلين<br />

الاستفسارات الديناميكية<br />

TripNo في الجدولين<br />

(<br />

جميع الاستفسارات التي أجرينها حتى الآن تدعى استفسارات )<br />

استعلامات<br />

ستاتيكية وذلك لأنها شروطها تكون<br />

محددة أثناء التصميم فمثلا ً في المثال الذي بحثنا فيه عن الرحلات المغادرة من مطار حلب كتبنا العبارة<br />

‏'حلب<br />

' = GoFrom ، Where من الملاحظ أن هذا الاستفسار يعيد دائما ً الرحلات المغادرة من حلب ولا يستطيع<br />

المستخدم البحث عن الرحلات المغادرة من دمشق دون العودة إلى البرنامج إلى وضع التصميم و تغيير كلمة حلب<br />

إلى دمشق ...<br />

لذلك زودتنا <strong>دلفي</strong> بما يسمى بالاستفسارات الديناميكية والتي تمكن المستخدم<br />

من إعطاء الشرط أثناء التنفيذ وذلك عن<br />

طريق تعديل الشرط السابق بالشكل Where GoFrom = :ParamName حيث<br />

Query يعطى قيمة ما أثناء التنفيذ<br />

ParamName وسيط للعنصر<br />

.<br />

:<br />

مثال :<br />

إحضار معلومات من جدول الرحلات عن الرحلات المغادرة من بلد يحدده المستخدم<br />

ابدأ مشروعا ً جديد ًا وأضف عنصر<br />

Query و عنصر<br />

DataSource و عنصر<br />

DBGrid بالإضافة إلى عنصر<br />

Button و زر Edit<br />

اربط العناصر مع بعضها كالعادة<br />

حيث<br />

واكتب العبارة التالية في الخاصة<br />

للعنصر Query1 SQL<br />

...<br />

SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount<br />

FROM Trips<br />

Where GoFrom =:CityName<br />

)<br />

CityName هي عبارة عن وسيط ستمرر قيمته إلى العنصر<br />

. ( Button1<br />

Query1 أثناء التنفيذ<br />

عند الضغط على الزر<br />

، Edit Query1.Params<br />

...<br />

حدد الخاصة Params للعنصر<br />

Query1 واضغط على الزر المنقط<br />

لتظهر النافذة<br />

Data Type<br />

حدد الوسيط<br />

CityName من هذه النافذة<br />

لتظهر خواصه في محرر الخواص ومن ثم غير الخاصة<br />

إلى القيمة . ftString<br />

:<br />

في حدث الضغط على الزر<br />

Button1 اكتب التعليمات التالية<br />

query1.Close;<br />

query1.ParamByName('cityName').Value := edit1.Text;<br />

query1.Open<br />

( ... )<br />

نفذ البرنامج واكتب في العنصر<br />

Edit1 اسم البلد الذي تريد<br />

حلب ، دمشق<br />

واضغط على الزر ليحضر<br />

الاستعلام جميع الرحلات المغادرة من هذا البلد .<br />

مثال : 2<br />

يمكنك الاستعلام عن رقم الرحلة بشكل ديناميكي عن طريق الاستفسار التالي<br />

:<br />

SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount<br />

FROM Trips<br />

126


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

في النافذة<br />

http://www.alshater.net<br />

Where TripNo =: TripNumber ;<br />

. ftInteger إلى DataType<br />

Edit Query1.Params حدد الوسيط<br />

وفي حدث الضغط على الزر اكتب التعليمة التالية<br />

ملاحظة<br />

TripNumber وغير الخاصة<br />

:<br />

query1.Close;<br />

query1.ParamByName('TripNumber').Value := strtoint (edit1.Text) ;<br />

query1.Open ;<br />

:<br />

SQL Builder لا يدعم الوسطاء<br />

أردت التعديل في العبارة فعليك حذف الوسيط والدخول إلى البرنامج<br />

الخروج من البرنامج<br />

مناهج العنصر<br />

، Parameter ولا يمكن فتح البرنامج بعد إضافة وسيط إلى عبارة<br />

SQL وإذا<br />

.<br />

: Query<br />

جميع المناهج التي استخدمناها مع العنصر<br />

Table يمكن استخدامها مع العنصر<br />

SQL Builder ومن ثم إعادة الوسيط عند<br />

Query مثل ) Locate و<br />

( .... First و Eof و Bof و Lookup<br />

إلا أن العنصر Query لا يستخدم اسلوبي البحث<br />

FindNearest وذلك لأن الجداول التي يعيدها العنصر Query لا تعتمد على مفتاح أساسي<br />

مثال هام<br />

FindKey و<br />

..<br />

:<br />

ليكن قاعدة بيانات لشركة ما Company وليكن لدينا جدول الموظفين<br />

رقم<br />

الموظف<br />

Employees التالي :<br />

EmpNo<br />

10<br />

16<br />

20<br />

30<br />

اسم الموظف<br />

EmpName<br />

رقم المدير<br />

ManagerNo<br />

رقم الفرع<br />

Department_id<br />

تاريخ المباشرة<br />

Hiredate<br />

الراتب<br />

Salary<br />

9000<br />

12500<br />

11000<br />

14000<br />

10/1/2002<br />

06/08/2000<br />

09/01/2001<br />

05/07/2000<br />

3<br />

2<br />

3<br />

2<br />

200<br />

300<br />

100<br />

100<br />

Sara<br />

kala<br />

Dani<br />

Wleed<br />

أنشئ هذا الجدول باستخدام<br />

Database Desktop وأدخل البيانات إليه<br />

:<br />

ابدأ مشروعا ً جديدا ً وأضف إليه العناصر اللازمة كما في الشكل<br />

:<br />

127


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أربط العنصرين DBGrid و<br />

DBNavigator مع العنصر<br />

DataSource وسنقوم بربط<br />

DataSource مع ال<br />

Query أثناء التنفيذ .<br />

:<br />

كما تلاحظ لدينا ست عناصر<br />

Query وفيما يلي تعليمات<br />

SQL لكل منها<br />

Name للعنصر Query1 القيمة<br />

استعلام البحث عن موظف :<br />

أعط الخاصة<br />

QryEmpNo و اكتب<br />

1<br />

Select * from employees Where EmpNo = : No<br />

Name للعنصر Query2 القيمة<br />

التعليمات التالية في الخاصة : SQL<br />

2 استعلام البحث عن اسم موظف<br />

‏:أعط الخاصة<br />

QryEmpName وكتب في<br />

Select * from employees Where EmpName =:name<br />

Name للعنصر Query3 القيمة<br />

(<br />

استعلام الرواتب : )<br />

يعطي الرواتب التي بين قيمتين<br />

أعط الخاصة<br />

: SQl<br />

3<br />

Select * from Employees Where salary between :mn and :mx<br />

QryHireDate القيمة للعنصر Query4 Name<br />

Select * from Employees Where hiredate between :b and :e<br />

Name للعنصر Query5 القيمة<br />

Select Department_id ,sum(salary ) form employees<br />

Group by DepartMent_id<br />

128<br />

:<br />

... QrySal<br />

4 استعلام تاريخ المباشرة<br />

أعط الخاصة<br />

5 استعلام حساب مجموع الرواتب في كل قسم:‏ أعط الخاصة<br />

QrysumsalaryByDepartment


http://www.alshater.net<br />

Name للعنصر Query6 القيمة<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

استعلام البحث عن الموظفين الذين يتبعون لمدير معين<br />

أعط الخاصة<br />

QryManager:<br />

Select Empname From employees Where managerNo = :mno<br />

وفيما يلي نستعرض أحداث الضغط على الأزرار :<br />

(<br />

)<br />

QryEmpNo.Close;<br />

DataSource1.DataSet := QryEmpNo ;<br />

QryEmpNo.ParamByName ( 'No') .value := Strtoint ( Edit1.text ) ;<br />

QryEmpNo.Open;<br />

: (<br />

)<br />

QryEmpName.Close ;<br />

DataSource1.DataSat := QryEmpName ;<br />

QryEmpName.ParamesByName ( 'Name').Value := Edit2.text ;<br />

QryEmpName.Open ;<br />

(<br />

)<br />

QrySal.Close ;<br />

DataSource1.DataSat := QrySal ;<br />

QrySal.ParamByName( ' mn') .Value := strtoint ( edit3.text ) ;<br />

QrySal.ParamByName( ' mx') .Value := strtoint ( edit4.text ) ;<br />

QrySal.Open ;<br />

: (<br />

)<br />

QryHireDate.Close ;<br />

DataSource1.DataSat := QryHireDate;<br />

QryHireDate.ParamByName ( 'b').asdate := datetimepicker1.date;<br />

QryHireDate.ParamByName ( 'e').asdate := datetimepicker2.date;<br />

QryHireDate.Open ;<br />

: (<br />

QrysumsalaryByDepartment.Close ;<br />

DataSource1.DataSat := QrysumsalaryByDepartment;<br />

QrysumsalaryByDepartment.Open ;<br />

: (<br />

)<br />

6<br />

1 حدث الضغط على الزر<br />

2 حدث الضغط على الزر<br />

3 حدث الضغط على الزر<br />

4 حدث الضغط على الزر<br />

5 حدث الضغط على<br />

بحث عن اسم الموظف<br />

ابحث عن اسم الموظف<br />

استعلام الرواتب<br />

استعلام التاريخ<br />

) مجموع الرواتب في كل قسم<br />

6 حدث الضغط على الزر<br />

موظفي المدير<br />

QryManager.Close ;<br />

DataSource1.DataSat := QryManager;<br />

QryManager.ParamByName ( 'mno').Value := strtoint ( Edit5.text ) ;<br />

QryManager.Open ;<br />

While not QryManager.eof Do<br />

Begin<br />

Showmessage (QryManager.fieldByName ('EmpName').Value ) ;<br />

QryManager.Next ;<br />

End;<br />

129


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

سيظهر هذا الحدث اسم أول موظف يأتي به الاستعلام وعند الضغط على<br />

Ok سيظهر اسم الموظف التالي وهكذا<br />

130


http://www.alshater.net<br />

21<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

إنشاء الجداول ببرنامج<br />

:Access<br />

افتح برنامج Access XP ‏(وهو أحد تطبيقات<br />

يختلف الأمر كثير ًا<br />

،(Microsoft Office XP<br />

- يمكن استخدام<br />

office 2003 فلا<br />

-<br />

ومن قائمة ‏"ملف ّ"‏<br />

جانب واجهة التطبيق كما في الصورة التالية:‏<br />

..New اختر ‏"جديد"‏ File<br />

ستظهر لك نافذة ‏"ملف ّ جديد"‏<br />

New File في<br />

تحت شريط ‏"جديد"‏ اضغط الأمر ‏"قاعدة بيانات فارغة"..‏ سيظهر لك مربع حوار ‏"حفظ ملف ّ"‏ يطلب منك تحديد اسم<br />

قاعدة البيانات وموقع حفظها على الجهاز..‏ غير اسم قاعدة البيانات من الاسم الافتراضي إلى<br />

بحفظها في الموضع الذي تريده.‏<br />

ملاحظات<br />

،"Books.mdb" وقم<br />

:<br />

تخزن قاعدة بيانات أكسيس في ملف واحد من امتداد .Mdb على عكس قاعدة بيانات باردوكس التي تعتمد ملف<br />

مستقل لكل جدول أو فهرس<br />

....<br />

ليست هناك اختلافات كبيرة بين<br />

Access XP و Access 2000 و<br />

يمكنك أن تتبع معنا هذه الخطوات على أي من هذه النسخ.‏<br />

Access 97 فيما يتعل ّق بإنشاء الجداول،‏ لهذا<br />

بعد إغلاق مربع الحوار ستظهر لك نافذة قاعدة البيانات كما<br />

في الصورة التالية:‏<br />

131


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

انقر الأمر<br />

‏"إنشاء جدول في طريقة عرض التصميم"‏<br />

مرتين بالفأرة..‏<br />

ستظهر لك نافذة تصميم الجدول كما في<br />

الصورة التالية:‏<br />

الآن كلّ‏ ما عليك هو كتابة أسماء الحقول وتحديد نوعية البيانات في كلّ‏ منها..‏<br />

تعالَ‏ نبدأ بتصميم جدول أسماء<br />

المؤل ّفين..‏<br />

هذا الجدول سيتكون من العمودين التاليين:‏<br />

اسم الحقل<br />

نوع البيانات<br />

ترقيم تلقائي<br />

نص<br />

الوصف<br />

المفتاح الرئيسي لهذا الجدول<br />

اسم المؤل ّف<br />

ID<br />

Author<br />

بعد أن تنشئ هذه الأعمدة،‏ اضغط بزر الفأرة الأيمن على المربع الرمادي الموجود على يمين الحقل ،ID ومن<br />

القائمة الموضعية اضغط<br />

‏"مفتاح أساسي"‏<br />

وذلك لجعل هذا الحقل مفتاحا أساسيا للجدول.‏<br />

ستلاحظ ظهور رمز المفتاح أمام هذا الحقل..‏<br />

ستلاحظ كذلك أن خاصية<br />

‏"مفهرس"‏<br />

Indexed في المنطقة السفلى<br />

من النافذة ستتحول إلى<br />

‏"نعم بدون<br />

تكرار"،‏ وهو شيء متوق ّع،‏ فلقد اتفق ّنا أن قيم المفتاح الأساسي غير قابلة للتكرار.‏<br />

شيء آخر..‏<br />

اضغط بالفأرة على حقل اسم المؤل ّف<br />

،Author وفي المنطقة السفلى من النافذة غير قيمة خاصية<br />

20 حرفا.‏<br />

‏"حجم الحقل"‏<br />

إلى<br />

30 بدلا من<br />

50، بافتراض أن أطول اسم لمؤل ّف لن يزيد عن<br />

Authors<br />

الآن اضغط<br />

Ctrl+S لحفظ الجدول..‏<br />

سيظهر لك مربع إدخال يطالبك بإدخال اسم الجدول..‏<br />

سمه<br />

واضغط زر .OK<br />

ملحوظة:‏<br />

سم الجداول والأعمدة بأسماء أجنبية،‏ وذلك لأن هذه الأسماء ستدخل في كتابة الكود في<br />

،VB وسيكون من المرهق<br />

الانتقال من الإنجليزية إلى العربية والعكس أكثر من مرة أثناء كتابة الكود.‏<br />

132


http://www.alshater.net<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الآن لو أغلقت نافذة التصميم،‏ فستجد أن الجدول Authors قد أضيف إلى نافذة قاعدة البيانات..‏ انقره مرتين<br />

بالفأرة..‏ ستجد أن نافذة جديدة قد فتحت،‏ تعرض لك جدول المؤل ّفين..‏ أدخل البيانات التالية:‏<br />

توفيق الحكيم<br />

عباس العقاد<br />

محمد عبد الحليم عبد االله<br />

نبيل فاروق<br />

أحمد خالد توفيق<br />

محمد حمدي غانم<br />

منصور<br />

راتب<br />

عقل<br />

بنفس الطريقة صمم جدول الكتب كالتالي:‏<br />

اسم الحقل<br />

نوع البيانات<br />

ترقيم تلقائي<br />

نص<br />

نص<br />

الوصف<br />

المفتاح الرئيسي لهذا الجدول.‏<br />

اسم الكتاب<br />

رقم المؤل ّف<br />

ID<br />

Book<br />

AuthorID<br />

احفظ هذا الجدول باسم<br />

،Books وأدخل فيه البيانات التالية:‏<br />

AuthorID<br />

1<br />

1<br />

1<br />

2<br />

2<br />

2<br />

3<br />

4<br />

4<br />

Book<br />

أرني االله<br />

يوميّات نائب في الأرياف<br />

عصا الحكيم<br />

سارة<br />

عبقرية محمد<br />

عبقرية عمر<br />

شجرة اللبلاب<br />

مهنتي القتل<br />

الأفق الأخضر<br />

133<br />

ID<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

5<br />

5<br />

5<br />

6<br />

6<br />

6<br />

7<br />

8<br />

9<br />

10<br />

11<br />

12<br />

13<br />

14<br />

15<br />

16<br />

17<br />

18<br />

أسطورة الغرباء<br />

العاشر<br />

لا تدخلوا شيرود<br />

مجرد طريقة للتفكير<br />

حائرة في الحب<br />

بين قوسين من الخلود<br />

حياتي<br />

حياتي<br />

حياتي<br />

إنشاء علاقة بين جدولي المؤل ّفين والكتب:‏<br />

أعتقد أن ّك متشوق لمعرفة كيفية ربط حقلي رقم المؤل ّف بين الجدولين لتحقيق التكامل المرجعي<br />

Integration بين الجدولين..‏ ستجد الأمر غاية ً في البساطة:‏<br />

من قائمة أدوات Tools اضغط الأمر ‏"علاقات"‏<br />

الصورة التالية:‏<br />

Referential<br />

..Relationships<br />

ستظهر لك نافذة ‏"إظهار جدول"‏ الموضحة في<br />

اختر كلّ‏ جدول واضغط زر<br />

‏"إضافة"..‏<br />

بعد أن تضيف الجدولين أغلق هذه النافذة..‏<br />

ستبدو لك نافذة العلاقات<br />

كالتالي:‏<br />

134


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

حيث يظهر كلّ‏ جدول كمستطيل عليه عنوان الجدول،‏ وبه أسماء أعمدته.‏<br />

ولإنشاء علاقة بين الجدولين،‏ اسحب حقل ID بالفأرة من جدول المؤل ّفين،‏ وتحرك بالفأرة إلى الحقل AuthorID<br />

في جدول الكتب..‏ ستلاحظ تغير شكل مؤش ّر الفأرة..‏ اترك زر<br />

الفأرة الأيسر فوق هذا الحقل..‏ هنا ستظهر لك نافذة<br />

:<br />

إنشاء العلاقة بين الحقلين:‏<br />

اضغط اختيار ‏"فرض التكامل المرجعي"‏<br />

Enforce Referential<br />

،Integrity لتقوم قاعدة البيانات آليا بالتحق ّق من صحة البيانات بين<br />

الجدولين..‏ وفي هذا الصدد لديك اختياران:‏<br />

تتالي تحديث الحقول المرتبطة<br />

Cascade Update Related<br />

:Fields<br />

فمثلا،‏ لو غيرت رقم ‏(توفيق الحكيم)‏ من<br />

الكتب التي أل ّفها إلى<br />

1 إلى<br />

.10<br />

10، فسيتم تغيير رقم المؤل ّف AuthorID تلقائيا في سجلات كلّ‏<br />

ملحوظة:لن تستطيع تغيير قيمة رقم المؤل ّف ID في جدول المؤل ّفين،‏ لأن ّه ترقيم تلقائي‏..‏ ولو أردت تغييره،‏ فعليك<br />

بتغيير نوع الحقل من ترقيم تلقائي إلى رقم،‏ على أن يكون هذا قبل إنشاء العلاقة،‏ لأن ّه من غير المسموح تغيير نوع<br />

بيانات حقل داخل في علاقة.‏<br />

تتالي حذف السجلات المرتبطة<br />

:Cascade Delete Related Fields<br />

فمثلا،‏ لو حذفت سجلّ‏ ‏(نبيل فاروق)‏ من جدول المؤل ّفين،‏ يتم حذف كلّ‏ كتب<br />

اضغط زر ‏"إنشاء"‏ لإغلاق هذه النافذة.‏<br />

الآن سيظهر خط ّ يربط الجدولين كالتالي:‏<br />

‏(نبيل فاروق)‏<br />

تلقائيا من جدول الكتب.‏<br />

ولو أردت حذف هذه العلاقة،‏ فاضغط الخط ّ بزر الفأرة الأيمن،‏ ومن القائمة الموضعية اختر ‏"حذف".‏<br />

قم بحفظ التغييرات،‏ وأغلق نافذة العلاقات..‏ افتح الآن جدول المؤل ّفين..‏ ستلاحظ ظهور علامة<br />

حقل..‏ اضغط أيا منها،‏ وليكن ‏(توفيق الحكيم)..‏ ستجد أن علامة<br />

"+"<br />

"+"<br />

يحتوي على الكتب التي أل ّفها توفيق الحكيم قد ظهر..‏ ولإخفائه ثانية ً أعد ضغط علامة<br />

بجوار كلّ‏<br />

تحولت إلى علامة "-"، وأن جدولا صغيرا<br />

."-"<br />

135


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ويمكنك إدخال المزيد من كتب<br />

‏(توفيق الحكيم)‏ في هذا الجدول الفرعي‏،‏ دون أن ت ُدخل رقمه في خانة AuthorID<br />

في كلّ‏ مرة،‏ إذ ستتم كتابة هذا الرقم آليا،‏ مما يوف ّر لك الوقت ويعفيك من احتمالات الخطأ.‏<br />

ربط قواعد البيانات أكسيس مع عناصر BDE في <strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

وجدنا أنه تمكنا من ربط قاعدة البيانات Paradox مع العنصر<br />

Table في الخاصة<br />

البديل<br />

DataBaseName للعنصر عن طريق الاسم<br />

:<br />

Alias<br />

الذي تم إنشائه بواسطة البرنامج<br />

Database<br />

Desktop والسؤال المطروح هنا كيف يمكن أن نربط بين العنصر<br />

Table وجدول بيانات أكسيس<br />

:<br />

1 افتح لوحة التحكم في ويندوز واختر<br />

Adminstrative Tools →ODBC Data Sources<br />

ستظهر لك النافذة التالية<br />

اختر منها الصفحة<br />

System DNS<br />

2 اضغط على الزر Add لتظهر النافذة التالية<br />

اختر منها<br />

واضغط على الزر<br />

:<br />

Microsoft Access Driver ( *.mdb)<br />

. Finish<br />

3 تظهر عندها النافذة التالية<br />

:<br />

اكتب في القسم<br />

Data<br />

Source Name القيمة<br />

، Library واضغط بعدها على الزر<br />

136


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

( Books.mdb<br />

Select واختر قاعدة ملف قاعدة البيانات أكسيس )<br />

بعد تحديد الفهرس التي وضعته فيه ، اضغط<br />

بعدها على الزر Ok<br />

واخرج من . ODBC Data Source<br />

4 افتح البرنامج<br />

BDE Administrator من لوحة التحكم أو عن طريق<br />

Start Program Borland <strong>Delphi</strong> BDE Administrator<br />

مهمة هذا البرنامج هي تعريف ال Alias والتحكم في خصائص قواعد البيانات المستخدمة على الجهاز .<br />

حدد قاعدة البيانات<br />

Library من الصفحة<br />

، Database فتظهر خواص هذه القاعدة في<br />

الصفحة اليمينية ، Definition أكتب في<br />

الخاصة Database Name مسار قاعدة<br />

البيانات<br />

Books.mdb أو حدده عن طريق<br />

،<br />

الضغط على الزر ذو ...<br />

أغلق البرنامج BDE Administrator<br />

واضغط على الزر<br />

Yes عندما يطالبك بحفظ<br />

التغيرات .<br />

5 الآن يمكنك ربط قاعدة البيانات<br />

Library مع العنصر<br />

Table أو Query واستخدامها كما وجدنا في الأمثلة<br />

السابقة .<br />

ملاحظة :<br />

يمكن استخدام البرنامج لإضافة اسم بديل<br />

Alias لقاعدة بيانات<br />

Paradox وذلك باختيار الأمر New من القائمة<br />

Object ومثل اختيار النوع<br />

Standard ومن ثم تحديد كتابة الاسم البديل للقاعدة وتحديد مسارها في صفحة<br />

الخصائص .<br />

: بعد أن تعرفنا عن طريقة ربط قواعد البيانات بواسطة محرك قواعد بيانات ، Borland<br />

الصفحة ADO<br />

سنتعرف الآن على كيفية ربط البيانات مع محرك قواعد بيانات مايكروسوفت .<br />

تعتبر ADO أحدث من<br />

BDE وتستخدم خوارزميات أسرع في البحث والتعديل ، كما تقدم طرق قوية لربط قواعد<br />

معطيات موزعة مثل قواعد بيانات Oracle أو SQL Server<br />

:<br />

مثال :<br />

ربط قاعدة بيانات المكتبة بواسطة ADO<br />

ابدأ مشروعا ً جديدا ً واضف إلى النموذج العناصر التالية<br />

:<br />

137


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ADOTable من الصفحة ADO وأضف إليه أيضا ً العناصر DataSource و<br />

، ADOConnection<br />

. DBNavigator و DBGrid<br />

اضغط مرتين على العنصر<br />

ADOConnection لتظهر النافذة التالية :<br />

اختر زر الراديو Use Connection String<br />

Build<br />

:<br />

واضغط على الزر<br />

لتظهر النافذة التالية<br />

اختر من القائمة Microsoft Jet 4.0 OLE Db Provider<br />

واضغط على . Next<br />

ملاحظة<br />

إذا كنت تستخدم قاعدة بيانات<br />

Oracle فاختر<br />

:<br />

Microsoft OLE DB Provider for Oracle<br />

عند الضغط على<br />

Next تظهر الصفحة<br />

Connection في القسم<br />

Select Or Enter Database Name أدخل ملف قاعدة معطيات<br />

الكتب<br />

اضغط بعدها على الزر Ok لإنهاء المعالج<br />

138


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

:<br />

حدد الآن العنصر<br />

ADOTable1 وأعطه الخصائص التالية<br />

Authorsِ أعطها القيمة TableName<br />

الخاصة<br />

Connection أعطها القيمة<br />

ADOConnection1 و الخاصة<br />

والخاصة Active القيمة True<br />

أعط الخاصة DataSet للعنصر DataSource القيمة ADOTable1<br />

أعط الخاصة Datasource للعنصرين DBGrid1 و DBNavigator1 القيمة . DataSource1<br />

نفذ البرنامج ولاحظ النتائج .<br />

بنفس الطريقة يمكن ربط<br />

SQLConnection لاستخدام <strong>لغة</strong><br />

SQL في محرك ، ADO كما يمكننا استخدام نفس<br />

مناهج العنصرين<br />

Query للتعامل مع هذه العناصر<br />

.<br />

Table و<br />

139


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة 22<br />

:<br />

:<br />

برنامج دليل الهاتف<br />

1 قاعدة البيانات<br />

قبل الشروع بكتابة البرنامج علينا تحديد قاعدة البيانات المطلوبة وتحديد عدد الجداول وطرق الربط بين الجداول<br />

ونوعية البيانات والفهارس المطلوبة ...<br />

في برنامج دليل الهاتف سنحتاج إلى جدول واحد وهو<br />

s<br />

City<br />

Country<br />

Web<br />

Email<br />

Fax<br />

Mobil<br />

WPhon<br />

HPhon<br />

LName<br />

FName<br />

Num<br />

الاسم رقم<br />

الكنية<br />

هاتف<br />

هاتف<br />

الهاتف<br />

الفاكس<br />

البريد<br />

موقع<br />

الدولة<br />

المدينة<br />

المنزل<br />

العمل<br />

الخلوي<br />

الإلكتروني<br />

الانترنت<br />

)<br />

A(15)<br />

A(15)<br />

A(40)<br />

A(40)<br />

A(15)<br />

A(15)<br />

A(15)<br />

A(15)<br />

A(15)<br />

A(15)<br />

+<br />

حيث الحقل Num هو حقل مفتاح رئيسي .<br />

.<br />

سنحتاج أيضا ً إلى تعريف فهرسين ثانويين الأول لترتيب الجدول حسب الاسم والثاني لترتيب الجدول حسب الكنية<br />

وللبدء بإنشاء القاعدة :<br />

1 أنشئ المجلد<br />

MyPhon على القرص C وأنشئ داخله المجلد<br />

، Data حيث سنقوم بتخزين ملفات قاعدة<br />

البيانات في المجلد<br />

Data وسنخزن ملفات البرنامج في المجلد<br />

Data ‏(حاول دائما ً أن تضع ملفات قاعدة البيانات في<br />

مجلد منفصل وخاصة إذا كانت القاعدة تتألف من عدد من الملفات كما في قاعدة البيانات . Paradox<br />

BDE باستخدام C:\MyPhon\Data<br />

2 أنشئ اسم بديل Alias باسم<br />

Myphon ليشير إلى المجلد<br />

.<br />

Database Desktop أو باستخدام البرنامج Administrator<br />

أنشئ الجدول السابق في البرنامج<br />

Database Desktop باستخدام قاعدة البيانات<br />

Paradox و لا تنس إنشاء<br />

3<br />

الفهارس الثانوية كما يلي :<br />

Define<br />

أ اختر Secondary Indexes من اللائحة Table properties<br />

واضغط على الزر<br />

وأضف الحقلين<br />

Lname على الترتيب واضغط على<br />

Ok وأعط اسم للفهرس<br />

Fname و<br />

. FNameIndex<br />

ب اضغط على<br />

Define مرة أخرى وأضف الحقلين<br />

FName على الترتيب<br />

.... وأعط<br />

Lname و<br />

الفهرس اسم . LNameIndex<br />

أحفظ الجدول باسم<br />

Phonebook ضمن الاسم البديل<br />

Alias الذي أنشأته سابقا ً<br />

MyPhon أو داخل المجلد<br />

4<br />

. C:\MyPhon\Data<br />

بهذا نكون قد أنشأنا قاعدة البيانات وسننتقل إلى المرحلة الثانية :<br />

2 كتابة البرنامج :<br />

قبل الشروع بكتابة البرنامج يجب عليك أن تملك تصورا ً كاملا ً للشكل الذي تريد للبرنامج أن يظهر عليه ، ما هو<br />

شكل النافذة الرئيسية وماهي العناصر التي ستتوضع عليها وما هي النوافذ الأخرى الواجب وضعها في البرنامج<br />

)<br />

140


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

بكلمات أخرى ، أمسك ورقة وقلم وحاول أن ترسم ما تريد أن تفعله وما هو المطلوب من البرنامج أن يقدمه<br />

http://www.alshater.net<br />

، (<br />

حدد ما هي النقاط الأصعب في البرنامج وهل هي لعدم خبرتك البرمجية في التعامل مع هذه النقاط أو لعدم قدرة<br />

<strong>لغة</strong> <strong>البرمجة</strong> على تقديم ما تطلبه<br />

) عمليا ً <strong>لغة</strong> <strong>البرمجة</strong> عالية المستوى لا تكون قاصرة عن أداء شيئ معين ولكن<br />

على المبرمج أن يبحث كثيرا ً لتعلم كيفية التعامل مع مواضيع معينه<br />

، سأورد الآن بعض الأمثلة على هذه<br />

(<br />

المشاكل ، تصور أن المستخدم طلب أن<br />

يكون برنامجه قادرا ً على طباعة حقول معينة وأنت حتى الآن لم تتعلم<br />

شيئا ً عن الطباعة ستكون هنا الآن أمام طريقين :<br />

الأول:‏<br />

البدء بكتابة البرنامج وتعلم الطباعة عند الوصول إلى النقاط التي تحتاج الطباعة في البرنامج<br />

) عمليا ً يترك<br />

هذا النوع من المبرمجين النقاط الصعبة حتى آخر نقطة من البرنامج ( .<br />

.<br />

الثاني :<br />

تعلم الطباعة والتعرف على إمكانيات الطباعة التي تقدمها <strong>لغة</strong> <strong>البرمجة</strong> ومن ثم الشروع بكتابة البرنامج<br />

المشكلة في الطريق الأول<br />

تصور أنك عرفت بعض الحقول من النوع مذكرة<br />

Memo ثم اكتشفت أن <strong>لغة</strong> <strong>البرمجة</strong><br />

:<br />

لا تستطيع أن تطبع الحقول من نوع<br />

Memo أو على الأقل لا تستطيع طباعتها بالشكل الذي تريده ، ماذا ستفعل<br />

الآن ، إما أن تقوم بكتابة خوارزميات جديدة للطباعة وهذا صعب جدا ً بالنسبة لمبرمج عادي أو العودة إلى قاعدة<br />

البيانات وتحويل نوع هذه الحقول إلى النوع نص Alpha<br />

وبالتالي العودة إلى النماذج وتعديلها أيضا ً لملائمة التغيرات في القاعدة الأمر الذي قد يضطرك أحيانا ً لكتابة<br />

البرنامج من جديد .<br />

الطريقة الثانية هي الطريقة الأفضل وربما هي الطريقة الوحيدة التي تجعلك تنهي ما بدأت بالشكل الذي تريد .<br />

.<br />

والقاعدة هي :<br />

ابدأ أولا ً من أصعب النقاط وحاول حلها حتى تستطيع الوصول إلى النهاية<br />

سننشئ الآن النافذة الرئيسية والتي ستظهر بالشكل :<br />

أضف الآن العناصر التالية<br />

:<br />

141


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

1 أعط النموذج الأول الخصائص التالية<br />

الخاصة<br />

القيمة<br />

:<br />

bdRightToLeft<br />

BiDiMode<br />

Caption<br />

Hieght<br />

Width<br />

Position<br />

برنامج دليل الهاتف<br />

470<br />

750<br />

poScreenCenter<br />

2 أضف العنصر<br />

TabControl من الصفحة<br />

Win32<br />

وأعطه الخصائص التالية<br />

:<br />

alTop<br />

True<br />

tsButtons<br />

أكتب الحروف الأبجدية من أ إلى ي وكل حرف في سطر<br />

True<br />

Align<br />

MultiLine<br />

Style<br />

Tabs<br />

HotTrack<br />

3 أضف العنصر Panel من الصفحة<br />

: Panel<br />

142<br />

Standard<br />

alClient<br />

Align<br />

bvLowered Bevelinner<br />

bvRaised BevelOuter<br />

'' فراغ<br />

Caption<br />

4 العنصر<br />

: Table<br />

MyPhone DatabaseName<br />

Phonebook TableName<br />

FnameIndex IndexName<br />

True<br />

Active<br />

وأعطه الخصائص التالية :<br />

أدخل إلى محرر الحقول وأضف جميع الحقول ثم احذف الحقل Num لكي لا يظهر في الجدول ثم أعط لكل حقل<br />

اسمه بال<strong>لغة</strong> العربية في الخاصة DisplayLabel التابعة لكل حقل.‏<br />

5 العنصر : DataSource ضعه ضمن العنصر<br />

: Tabcontrol<br />

Table1<br />

Dataset<br />

6 العنصر<br />

: DbGrid<br />

alClient<br />

Align<br />

DataSource1 DataSource<br />

أدخل إلى محرر الأعمدة وأضف جميع الحقول ثم حددها واذهب إلى الخاصة Titel واضغط على<br />

الخاصة<br />

+<br />

taCenter إلى Aligment<br />

7 العنصر : GroupBox ضعه ضمن العنصر<br />

Caption<br />

ترتيب حسب<br />

وغير


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

8 العنصر : RadioButton1 ضعه داخل العنصر<br />

الاسم<br />

GroupBox1<br />

True<br />

RBTName<br />

Caption<br />

Checked<br />

Name<br />

9 العنصر : RadioButton2 ضعه داخل العنصر<br />

GroupBox1<br />

Caption<br />

Name<br />

الكنية<br />

RBTLname<br />

10 العنصر : Edit1 ضعه داخل العنصر<br />

: GroupBox1<br />

"<br />

Text<br />

فراغ<br />

11 العنصر : Button ضعه داخل العنصر<br />

GroupBox1<br />

Caption<br />

Name<br />

بحث حسب الاسم<br />

BtnSearch<br />

سنبدأ الآن بكتابة التعليمات اللازمة حتى هذه النقطة وسنعود لإكمال بقية العناصر لاحقا ً<br />

عندما يضغط المستخدم على زر الراديو الاسم سيتم ترتيب الجدول حسب حقل الاسم وسيكون البحث متاحا ً<br />

حسب اسم الشخص لذلك نكتب التعليمة التالية في حدث الضغط على زر الراديو الاسم<br />

: RBTName<br />

table1.IndexName := 'FnameIndex';<br />

‏;'بحث حسب الاسم'‏ =: btnSearch.Caption<br />

وفي حدث الضغط على زر الراديو الكنية سيرتب الجدول حسب حقل الكنية وسيكون البحث متاحا ً حسب حقل<br />

الكنية لذلك اكتب التعليمات التالية في حدث الضغط على زر الكنية<br />

عندما يضغط المستخدم على أي صفحة من صفحات العنصر<br />

: RBTLname<br />

table1.IndexName := 'LnameIndex';<br />

btnSearch.Caption := '<br />

';<br />

بحث حسب الكنية<br />

Tabcontrol سيتم إظهار الأسماء التي تبدأ<br />

بالحرف التي ضغط عليه المستخدم ، أما إذا كان المستخدم قد اختار الترتيب حسب الكنية فستظهر الحقول التي يبدأ<br />

فيها حقل الكنية بالحرف الذي ضغط عليه المستخدم لذلك اكتب في الحدث<br />

التعليمات التالية<br />

للعنصر Tabcontrol1 OnCahnge<br />

:<br />

if RBTName.Checked then<br />

table1.Filter := 'fname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*') else<br />

table1.Filter := 'Lname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*')<br />

لمعرفة عمل هذه التعليمات راجع المحاضرات السابقة ...<br />

: زر البحث<br />

143


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

(<br />

)<br />

سيتم البحث عن القيمة المكتوبة في العنصر<br />

Edit1 في حقل الاسم أو حقل الكنية<br />

حسب خيار المستخدم<br />

وفي<br />

حال عدم وجدوها سيتوقف مؤشر السجلات عند أقرب قيمة للبحث ، بما أن البحث سيتم في كامل الجدول فيجب<br />

إلغاء التصفية Filter قبل القيام بالبحث ، اكتب التعليمات التالية في حدث الضغط على الرز<br />

أضف بعض السجلات على سبيل التجربة<br />

: BtnSearch<br />

table1.Filtered := false;<br />

table1.FindNearest([edit1.text]);<br />

.............<br />

البحث عن رقم هاتف :<br />

عندما تريد أن تبحث عن رقم هاتف فلن يكون مهما ً أن تحدد في أي حقل أي لا يهم إن كان الهاتف الذي سنبحث<br />

عن صاحبه هو هاتف المنزل أو هاتف العمل فالمهم أن يعيد البحث اسم الشخص الذي نبحث عن رقم هاتفه لذلك<br />

ستبحث في الحقل<br />

HPhon فإذا لم نجد الرقم نبحث في الحقل<br />

WPhon فإذا لم نجد الرقم سنبحث في الحقل<br />

Mobil وإذا لم نجد الرقم تظهر رسالة تخبرنا بأن الرقم غير موجود<br />

لذلك أضف العناصر التالية إلى النموذج السابق :<br />

: Panel<br />

1 العنصر<br />

: GroupBox ضعه ضمن العنصر<br />

بحث عن رقم الهاتف<br />

Caption<br />

2 عنصر Edit2<br />

" فراغ<br />

Text<br />

:<br />

3 العنصر<br />

: Button<br />

Caption<br />

Name<br />

بحث<br />

BtnPhSearch<br />

وفي حدث الضغط على هذا الزر اكتب التعليمات التالية<br />

يمكنك الآن إضافة أزرار للبحث عن البريد الالكتروني و الفاكس و....‏<br />

Table1.Filtered := false;<br />

if not Table1.Locate('HPhon',edit2.text,[]) then<br />

if not Table1.Locate('WPhon',edit2.text,[]) then<br />

if not Table1.Locate('Mobil',edit2.text,[]) then<br />

; ) ‏'الرقم غير موجود'‏ showmessage(<br />

حفظ البرنامج<br />

‏:احفظ التطبيق في المجلد<br />

C:\MyPhon أعط الوحدة اسم<br />

Main.pas وأعط المشروع اسم<br />

. MyPhone<br />

أضف الآن العناصر التالية إلى النموذج :<br />

: Panel<br />

العنصر<br />

: GroupBox ضعه ضمن العنصر<br />

خيارات<br />

Caption<br />

144


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أربع أزرار<br />

الإدخال<br />

http://www.alshater.net<br />

Caption أعطها Button<br />

:<br />

جرت العادة على استخدام العناصر في الصفحة Data control لإدخال البيانات إلى القاعدة وعدم<br />

الاعتماد على العنصر DBGrid فقط وخاصة أنه لدينا حقل من نوع Memo الذي لا يمكن الإدخال إليه ضمن<br />

) DBGrid<br />

في أغلب الأحيان يعطى العنصر<br />

أنشئ نموذجا ً جديدا ً وأعطه الخصائص التالية<br />

DBGrid الخاصة<br />

ReadOnly وذلك لاستخدامه للعرض فقط<br />

. (<br />

:<br />

bdRightToLeft<br />

BiDiMode<br />

Caption<br />

Position<br />

Name<br />

إدخال<br />

poScreenCenter<br />

DataEnter<br />

وأضف اسم الوحدة Main إلى القسم Uses لهذه الوحدة وذلك لكي نتمكن من الوصول إلى العنصر<br />

النموذج الأول<br />

Table1 على<br />

:<br />

احفظ الوحدة باسم . DataEnterU<br />

ضع مجموعة من عناصر ال<br />

DBEdit وعناصر Label وعنصر<br />

:<br />

DBNavigator على النموذج كما في الشكل<br />

حدد جميع عناصر التعامل مع قواعد المعطيات<br />

الخاصة<br />

)<br />

جميع العناصر على النموذج عدا عناصر ال<br />

(<br />

Label<br />

. القيمة Form1.DataSource1 DataSource<br />

ثم اربط كل عنصر من عناصر DBEdit بحقل في الخاصة DataField وذلك حسب العنصر<br />

لإظهار هذا النموذج عد إلى النموذج الأول واكتب في حدث الضغط على الزر إدخال التعليمة التالية<br />

من المفيد إيضا ً ظهور هذا النموذج عندما يضغط المستخدم على اسم أحد الأشخاص داخل العنصر<br />

اكتب التعليمة التالية في الحدث<br />

وأعطها<br />

Label المجاور .<br />

:<br />

DataEnter.ShowModal ;<br />

DBGrid لذلك<br />

DataEnter.ShowModal ;<br />

للعنصر DBGrid1 OnDbClick<br />

145


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

: الطباعة<br />

يستخدم صفحة العناصر<br />

QReport للطباعة في <strong>دلفي</strong> وتستطيع هذه الصفحة التعامل مع قواعد البيانات كما يمكنك<br />

طباعة الصور والأرقام والحسابات عن طريقها :<br />

ملاحظة لمستخدمي <strong>دلفي</strong> : 7<br />

أضافت بورلاند صفحة مجموعة جديدة من العناصر في الصفحة<br />

Rave بدلا ً من الصفحة<br />

QReport وإذا أردت<br />

استخدام QReport في <strong>دلفي</strong> 7 أضف هذه الصفحة عن طريق<br />

أضف الوحدة dclqrt60.bpl من الفهرس Bin داخل مجلد<br />

:<br />

Commponnant install package add<br />

. <strong>Delphi</strong>7<br />

لطباعة دليل الهاتف :<br />

أضف وحدة جديدة إلى البرنامج وأضف اسم الوحدة<br />

Main إلى القسم<br />

Uses لهذه الوحدة وذلك لكي نتمكن من<br />

. Printform Name<br />

الوصول إلى العنصر Table1 على<br />

النموذج الأول وأعطها الخاصة<br />

:<br />

وأضف إليها العنصر<br />

QuickRep من الصفحة<br />

Qreport وأعطه الخصائص التالية<br />

HasColumnHeader و HasDetail و<br />

: Band<br />

أعط القيمة<br />

True للخصائص التالية الموجودة ضمن الخاصة<br />

. HasPagefooter و HasPageHeader<br />

الخاصة Dataset أعطها . Form1.DataSource1<br />

القيمة<br />

"<br />

" Caption<br />

أضف الآن العصر<br />

QRlabel إلى القسم<br />

Page Header أو أعطه ال<br />

برنامج دليل الهاتف<br />

:<br />

أضف لل<br />

Column Header عدد من العناصر<br />

QRlabel كما في الشكل<br />

Dataset كما<br />

أضف إلى<br />

Detail مجموعة من العناصر<br />

QRDbText واربطها مع الحقول المناسبة في الخاصة<br />

في الشكل السابق .<br />

... Page Number القيمة data<br />

أضف إلى Page Footer العنصر<br />

QRSysData وأعطه الخاصة<br />

احفظ الوحدة باسم . PrintUnit<br />

.<br />

اضغط بزر الفأرة اليميني على العنصر QUickRep1 واختر Preview<br />

لتشاهد النتائج<br />

:<br />

Printform.QuickRep1.Preview<br />

اكتب في حدث الضغط على الزر طباعة في النموذج الأول التعليمة التالية<br />

146


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

لمسات برمجية<br />

الجلسة<br />

http://www.alshater.net<br />

23<br />

:<br />

يمكن أن نعتبر برنامج الهاتف برنامج جاهز للتوزيع والنشر ولكن بإضافة بعض اللمسات إلى البرنامج يمكن أن<br />

نحول هذا البرنامج إلى برنامج سهل الاستخدام ومرغوب بشكل أكبر من قبل المستخدمين،‏ وأقصد باللمسات<br />

البرمجية بمجموعة الأعمال التي يقوم بها المبرمج والتي يمكن أن تأخذ وقت طويلا ً لتسهيل عمل المستخدم<br />

1 تمكين المستخدم من التعامل مع البرنامج بدون استخدام الفأرة وبأسرع الطرق الممكنة<br />

مثلا ً عندما يكتب المستخدم اسم للبحث عنه ضمن<br />

الزر لكي يتم تنفيذ البحث بل يكفي أن يضغط المستخدم على الزر إدخال<br />

ولتحقيق ذلك برمجيا ً<br />

حيث<br />

.<br />

:<br />

Edit1 فلا حاجة لأن يعود المستخدم إلى الفأرة ليضغط على<br />

( Enter )<br />

:<br />

اكتب التعليمات التالية في حدث<br />

VK_Return ثابت معرف في <strong>دلفي</strong> ويحوي شيفرة الأسكي للزر<br />

الثوابت والتي تحوي شيفرة الأزرار الافتراضية<br />

الأسهم و<br />

من لوحة المفاتيح ليتم البحث<br />

: للعنصر Edit1 OnKeyPress<br />

if key = char( VK_Return ) then<br />

btnsearch.Click ;<br />

( Virtual Key )<br />

End و Delete و Caps lock و Tab<br />

،Enter في الحقيقة يجود الكثير من هذه<br />

وهذه الأزرار هي المفاتيح F1..F12 و مفاتيح<br />

... ‏(أي مجموعة أزرار لوحة المفاتيح عدا الأحرف والأرقام)‏<br />

وللتعرف على هذه الثوابت راجع ملفات المساعدة في <strong>دلفي</strong> أو اكتب في مكان في محرر الشيفرة<br />

Windows.VK_ وستكمل <strong>دلفي</strong> بقية الثوابت.‏<br />

: ملاحظات<br />

أ يمكن الاستعاضة عن التعليمة السابقة بالتعليمة<br />

حيث<br />

13 هي القيمة التي يحويها الثابت<br />

If key = #13 then btnsearch.Click ;<br />

Enter و #<br />

:<br />

VK_Return وهي القيمة الاسكي للزر<br />

الأسكي لتحويل الرقم إلى حرف ، مثلا ً إذا كتبنا التعليمة التالية<br />

'You'<br />

ب يمكن الاستعاضة عن التعليمة السابقة بالتعليمة :<br />

بدلا ً من استخدام المنهج<br />

:<br />

تستخدم قبل شيفرة<br />

#89#111#117=:S فهذا يكافئ التعليمة<br />

S :=<br />

If key = #13 then BtnSearchClick (Sender);<br />

)<br />

Click للزر<br />

الإجراء BtnSearchClick قد تم تعريفة من قبل ال<strong>دلفي</strong> في القسم<br />

ضغطك على الزر<br />

BtnSearch نستخدم الإجراء الذي يقوم بهذه العملية مباشرة<br />

Implementation والقسم Type<br />

....<br />

لا حظ أن<br />

بمجرد<br />

2 من الملاحظ أننا نستخدم العنصر Edit2 لإدخال الأرقام فقط أو على الأقل رموز لوحة مفاتيح الهاتف<br />

وبالتالي يجب منع المستخدم من إدخال الحروف والرموز غير المرغوبة ولتحقيق ذلك اكتب التعليمة التالية<br />

:<br />

const s = ['0','1','2','3','4','5','6','7','8','9','p',char(VK_back)];<br />

begin<br />

if not ( key in s )<br />

then key:= char(vk_capital)<br />

147


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

نعرف مجموعة من الرموز التي يستخدمها الهاتف بالإضافة إلى الزر<br />

VK_back و هو زر الحذف ، فإذا لم<br />

يكن الزر المدخل من هذه المجموعة فحوله إلى الزر<br />

Vk_Capital وهو زر<br />

Caps Lock والذي لن يؤثر على<br />

.<br />

وضع الزر<br />

Caps Lock ولكنه سيصدر صوت ما<br />

في النافذة إدخال على المستخدم أن ينتقل من عنصر تحرير<br />

DBEdit إلى آخر بواسطة الضغط على الزر<br />

3<br />

Tab من لوحة المفاتيح على الرغم من أن معظم البرامج الجيدة تستخدم الزر<br />

Enter للتنقل بين عناصر الإدخال<br />

: DBEdit1<br />

If key = #13 then DBEdit2.SetFocus ;<br />

If key =#13 then dbedit3.SetFocus ;<br />

لذلك اكتب التعليمة التالية في الحدث<br />

واكتب في حدث OnKeyPress التعليمة التالية<br />

وهكذا في بقية العناصر<br />

OnKeyPress للعنصر<br />

:<br />

.<br />

(<br />

)<br />

المنهج<br />

SetFocus يستخدم لتحفيز<br />

تفعيل العنصر<br />

وهو يستخدم مع معظم العناصر في <strong>دلفي</strong> فمثلا ً التعليمة<br />

Button1.SetFocus ستظهر إطار شفاف داخل الزر والذي يعني أن هذا هو الزر الفعال والذي يمكن الضغط<br />

.<br />

عليه بواسطة الزر<br />

Enter أو الزر<br />

Space من لوحة المفاتيح<br />

4 التحكم بتحميل النوافذ في الذاكرة :<br />

افتح القائمة Project View Source<br />

سيظهر لك ملف المشروع<br />

MyPhone.Dpr وستجد فيه تعريف<br />

الوحدات في القسم Uses و ستجد التعليمات التالية في القسم<br />

التعليمة<br />

Begin<br />

Application.Initialize;<br />

Application.CreateForm(TForm1, Form1);<br />

Application.CreateForm(TDataEnter, DataEnter);<br />

Application.CreateForm(TForm2, Form2);<br />

Application.Run;<br />

TFom1,Form1) Application.CreateForm ( تقوم بإنشاء النافذة<br />

Form1 والتي من النوع<br />

TForm1 والمعرف في القسم Interface للوحدة<br />

Main.pas التي يتبع لها النموذج<br />

Form1 وكذلك الأمر بالنسبة<br />

لتعليمات CreateForm التالية ، ولكن ماذا يعني إنشاء نافذة....‏ عند استخدام التعليمة<br />

Application.CreateForm ( TFom1,Form1)<br />

1 سيتم إنشاء هذه النافذة في الذاكرة )<br />

أي حجز حيز في الذاكرة يحوي النافذة التي ستظهر<br />

. (<br />

2 سيتم إنشاء جميع العناصر الموجودة على هذه النافذة من أزرار و عناصر<br />

قواعد البيانات و....‏<br />

3 سيتم حجز المتحولات العامة وإعطاءها حيز من الذاكرة أيضا ً .<br />

. Form1<br />

4 سيتم تنفيذ التعليمات التي تم وضعها في الحدث<br />

OnCreate التابع للنموذج<br />

سيتم الآن تنفيذ هذه الخطوات بالنسبة للنوافذ الثلاثة المستخدمة في البرنامج ، لنقم الآن بدراسة<br />

بسيطة لحجم<br />

استخدام كل نافذة :<br />

النافذة الأولى<br />

: Form1 سيستخدم أي مستخدم هذه النافذة عند كل دخول إلى البرنامج وذلك لأنها تحوي<br />

1<br />

عناصر البحث والفهرسة بالإضافة إلى عرض البيانات.‏<br />

148


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

النافذة<br />

: DataEnter تستخدم هذه النافذة عدة مرات في الأسبوع الأول لاستخدام البرنامج لأن المستخدم<br />

2<br />

سيقوم بإدخال أرقام هواتفه إلى البرنامج وبعد ذلك لن يدخل المستخدم إلى هذه النافذة إلا مرة في الأسبوع أو الشهر<br />

أو حتى بالسنة .<br />

النافذة<br />

: Form2 هذه النافذة تحوي عناصر الطابعة وإذا فرضنا أن المستخدم يملك طابعة فإنه لن يطبع دفتر<br />

3<br />

هواتفه كل يوم .<br />

هذا يعني أننا نحجز حيز من الذاكرة لنافذتين لن يستخدمها المستخدم إلا مرات قليلة،‏ لهذا زودتنا <strong>دلفي</strong> بطريقة<br />

لإنشاء النموذج عن الحاجة إليه وذلك عن طريق :<br />

أ إزالة النموذج من قائمة التحميل التلقائي :<br />

افتح القائمة Project Options لتظهر النافذة التالية :<br />

حدد منها<br />

الصفحة<br />

Forms والتي فيها القائمة المنسدلة Main Form وهي تحدد<br />

النموذج الذي سيظهر عند تشغيل البرنامج.‏<br />

اللائحة<br />

Auto-Create Forms وتظهر فيها أسماء النماذج التي سيتم<br />

إنشاءها تلقائيا ً عند تشغيل البرنامج ،<br />

اللائحة Available Form وتحوي جميع بقية النوافذ في البرنامج<br />

والتي لا توجد في لائحة التشغيل التلقائي.‏<br />

حدد النوافذ التي لا تريد أن تعمل تلقائيا ً واضغط على السهم<br />

> لتنتقل هذه الاسماء إلى اللائحة Avialable Form<br />

.<br />

ب إنشاء النموذج عند الطلب :<br />

بما أنه النافذة لن تنشأ تلقائيا ً فعلينا أن نكتب بعض التعليمات لإنشائها قبل استخدام المنهج Show أو<br />

ShowModal أو حتى قبل طلب أي متحول ما منها لذلك لنكتب التعليمات التالية في حدث الضغط على الزر<br />

Dataenter := TDataEnter.Create(application);<br />

Try<br />

DataEnter.Showmodal;<br />

Finally<br />

DataEnter.Release ;<br />

end;<br />

) TDataEnter<br />

: إدخال<br />

التعليمة الأولى تقوم بإنشاء المتحول<br />

DataEnter من النوع<br />

المعرف في القسم<br />

Var التابع للقسم<br />

Interface في الوحدة<br />

ويأخذ المنهج<br />

Create لعناصر <strong>Delphi</strong> وسيطا ً وحيدا ً يدل على<br />

( DataEnterU.pas<br />

العنصر المالك للعنصر المراد إنشائه وتمرر هنا القيمة<br />

Application عادة لأن النموذج المنشأ سيعود لتطبيق<br />

. مباشرة<br />

149


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التعليمة DataEnter.Release هي عملية لإزالة النموذج من الذاكرة بعد انتهاء عمله والتي يمكن استبدالها<br />

بالتعليمة<br />

. بالفعل<br />

DataEnter.Free ولكن المنهج<br />

إذا كنا نستخدم المنهج Show بدلا ً من المنهج<br />

البرنامج بشكل صحيح<br />

في الحدث<br />

:<br />

OnClose<br />

Release يعتبر أفضل لأنه لا يعيد رسالة خطأ إذا لم يكن النموذج منشأً‏<br />

للنافذة DataEnter أضف التعليمة التالية<br />

واكتب الآن التعليمات التالية في حدث الضغط على الزر إدخال<br />

الحدث<br />

OnClose لنافذة يتم تنفيذه عندما يتم إغلاق النافذة<br />

الوسيط Action والذي يمكن أن يأخذ القيم التالية :<br />

القيمة<br />

:<br />

ShowModal فيجب إضافة التعليمات التالية للتأكد من عمل<br />

action := Cafree;<br />

DataEnter := nil;<br />

: (<br />

)<br />

If DataEnter = nil then<br />

DataEnter := TDataEnter.Create(application);<br />

DataEnter.Show;<br />

(<br />

CaNone<br />

CaFree<br />

CaHide<br />

في النموذج الأول<br />

) ضغط المستخدم على زر إغلاق<br />

المعنى<br />

لا يمكن إغلاق النافذة ولن يحدث شيء إذا ضغط المستخدم على الزر إغلاق<br />

سيتم إغلاق النافذة وتحرير كامل الذاكرة المستخدمة من قبلها<br />

ويأخذ هذا الحدث<br />

سيتم إخفاء النافذة بدلا ً من إغلاقها ويمكن إعادة إظهارها عن طريق المنهج Show وهو الخيار<br />

الافتراضي للنوافذ من النوع<br />

FormStyle :=<br />

fsNormal<br />

CaMinimize<br />

سيتم تصغير النافذة وهو الخيار الافتراضي مع النوافذ من النوع<br />

التعليمة DataEnter = Nil تقوم بتحميل قيمة اللاشيء<br />

فيما بعد أن الحدث<br />

ملاحظة<br />

fsMDIChild<br />

( Null )<br />

OnClose<br />

قد تم تنفيذه ومن ثم تنفيذ عملية إنشاء النموذج<br />

.<br />

:<br />

في المتحول DataEnter الأمر الذي يجعلنا<br />

هذه إحدى الطرق المستخدمة لإنشاء النافذة بشكل ديناميكي وهناك طرق أخرى متعددة<br />

.<br />

مسجل النظام<br />

: Windows Registry<br />

مسجل النظام عبارة عن مجموعة من الملفات يتم تخزين فيه جميع معلومات نظام التشغيل<br />

Windows<br />

بما فيها<br />

خصائص النظام واسم المستخدم واسم الكمبيوتر بالإضافة إلى أن معظم البرامج تضيف بعض المفاتيح إلى مسجل<br />

النظام للتحكم بطريقة إظهار البرنامج حسب خيارات يحددها المستخدم ، يدعى مسجل النظام بقاعدة بيانات النظام<br />

ويكون مخزن في الملفين<br />

System.dat و<br />

وتحريره افتح القائمة أبدأ و اضغط على<br />

User.dat الموجودين داخل فهرس الويندوز ‏،لمشاهدة مسجل النظام<br />

Run واكتب<br />

Regedit في النافذة تشغيل ثم اضغط على<br />

. Ok<br />

150


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ستظهر عندها النافذة التالية والتني تحوي في جهة<br />

اليمين ستة من المفاتيح الرئيسية تدعى عادة مفاتيح<br />

الجذر ، Root key بالضغط على إشارة +<br />

بجانب هذه<br />

المفاتيح تظهر لها مفاتيح فرعية و التي يمكن الوصول<br />

من خلالها إلى مفاتيح فرعية أخرى،‏ تدعى الرموز التي<br />

تظهر على القسم اليميني من النافذة بالقيم وهي على<br />

ثلاثة أنواع ،<br />

قيم عددية و قيم نصية وقيم منطقية ،<br />

قبل أن تعدل أي قيمة ما في مسجل النظام عليك أن تعرف ما تفعل لأن بعض التعديلات قد تؤدي إلى توقف النظام<br />

عن العمل أو تعطيل البرنامج الذي عدلته على الأقل ، يمكنك أن تأخذ نسخة عن مسجل النظام أو عن جزء منه<br />

ضع حدد بمؤشر الفأرة المفتاح الذي تريد أخذ نسخه منه واختر الأمر Regestry Export ستطالب بإدخال<br />

اسم ملف ما وسيتم بعدها حفظ نسخة عن المفتاح ، لاستعادة مسجل النظام اضغط مرتين على ملف الملف الذي<br />

كنت قد حفظته سابقا ً .<br />

سأشرح بشكل موجز ماهي المعلومات المخزنة في كل مفتاح رئيسي :<br />

يحوي هذا المفتاح معلومات عن كل أنواع الملفات المعرفة في النظام<br />

) لا حظ<br />

: HKEY_ClASSES_ROOT<br />

أنه يحوي قائمة بجميع امتدادات الملفات التي يتعامل معها ويندوز<br />

( بالإضافة إلى معلومات عن البرامج القادرة<br />

على التعامل مع هذه الملفات مثلا ً .jpg أو .Doc ...<br />

: HKEY_CURRENT_USER يحوي معلومات عن مستخدم النظام والقيم الافتراضية التي أعطاها لبعض<br />

برامج الويندوز بالإضافة إلى الخصائص لوحة التحكم والبرامج التي تنصبها المستخدم على الجهاز .....<br />

: HKEY_LOCAL_MACHINE يحوي معلومات عن جهاز الحاسوب بالكامل بما فيها أنواع الأجهزة<br />

المستخدمة في الجهاز بالإضافة إلى مشغلات هذه الأجهزة<br />

( Driver مثلا ً تستطيع معرفة نوعية كرت الشاشة<br />

)<br />

المستخدم ونوعية الشاشة المعرفة على الجهاز ....<br />

يحوي معلومات عن التشكيلات الجانبية للمستخدم<br />

) الخصائص التي يحددها المستخدم<br />

: HKEY_USERS<br />

لألوان سطح المكتب مثلا ً<br />

، بالإضافة إلى التشكيلات الجانبية الافتراضية التي ستعطى عندما يدخل مستخدم<br />

( ..<br />

جديد إلى الويندوز .<br />

: HKEY_CURRENT_CONFIG يعتبر جزء من المفتاح HKEY_LOCAL_MACHINE ولكن<br />

بطريقة عرض أخرى .<br />

Windows NT<br />

يحوي معلومات عن أجهزة النظام وطرق إعدادها<br />

) غير موجود في<br />

: HKEY_DYN_Data<br />

. (<br />

التعامل مع مسجل النظام يسمح لك بالتحكم بالنظام بشكل كامل ولا بد أنك سمعت عن برامج تتحكم بسرعة قائمة<br />

ابدأ و تغير أسم سلة المحذوفات وتغير الصورة التي تظهر بجانب قائمة ابدأ<br />

) الصورة المكتوب فيها<br />

151<br />

(<br />

WINDOWS Me مثلا ً و بالإضافة إلى تغير صورة جهاز كمبيوتر و بالإضافة إلى البرامج التي تضيف نفسها


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إلى القائمة التي تظهر عند الضغط بزر اليمين على سطح المكتب أو مستكشف ويندوز ، حتى أن البرامج التي<br />

تدعي أنها تتحكم بسرعة الاتصال انترنت تتعامل مع مسجل النظام<br />

( ......<br />

هذه موجز صغير جدا ً عن Windows Registry وإذا أردت أن تصبح مبرمجا ً محترفا ً عليك قراءة أحد الكتب<br />

المختصة بهذا الموضوع فكتاب<br />

التعامل مع Registry في <strong>دلفي</strong><br />

Windows 2000 Registry بحجم<br />

152<br />

800 صفحة تقريب ًا<br />

.<br />

:<br />

إذا لم تكن تريد أن تتحكم بنظام ويندوز من داخل برنامجك فأنت بحاجة إلى تخزين بعض المعلومات عن برنامجك<br />

داخل مسجل النظام الأمر الذي يطرك إلى التعامل مع النظام<br />

مثال<br />

.<br />

:<br />

سنقوم بإنشاء برنامج يقوم بمعرفة اسم المستخدم الذي سجل النظام باسمه ومن ثم تغيره<br />

)<br />

نستطيع معرفة<br />

اسم المستخدم عن طريق الضغط بزر الفأرة اليميني على أيقونة جهاز الكمبيوتر واختيار خصائص من القائمة<br />

اسم المستخدم يوجد داخل مسجل النظام تحت المفتاح<br />

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]<br />

افتح البرنامج Regedit للتأكد من ذلك<br />

ومخزن في القيمة النصية<br />

. (<br />

. (<br />

) RegisteredOwner<br />

ابدأ مشروعا ً جديدا ً وأضف زرين إلى النموذج وعنصر<br />

، Edit1<br />

للتعامل مع مسجل النظام عليك إضافة الوحدة Registry إلى القسم<br />

USES<br />

للقراءة من مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الأول<br />

التعليمة<br />

Var reg:tregistry ;<br />

Begin<br />

إنشاء المتحول وحجز مكان له في الذاكرة//‏ ; tregistry.Create reg:=<br />

try<br />

تحديد المفتاح الرئيسي ;// HKEY_LOCAL_MACHINE reg.RootKey :=<br />

reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;<br />

قراءة القيمة النصية المخزنة في الوسيط المذكور // reg.ReadString('RegisteredOwner'); edit1.text =:<br />

وسيطها الثاني<br />

reg.CloseKey ;<br />

إغلاق المفتاح //<br />

Finally<br />

تحرير الذاكرة بعد استخدام المتحول//‏ ; reg.Free<br />

end;<br />

OpenKey تقوم بفتح المفتاح المرر لها كوسيط أول وإذا لم يكن موجودا ً فتقوم بإنشاء هذا المفتاح إذا كان<br />

.True<br />

للكتابة إلى مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الثاني<br />

:<br />

Var reg:tregistry ;<br />

Begin<br />

إنشاء المتحول وحجز مكان له في الذاكرة //; tregistry.Create reg:=<br />

try<br />

تحديد المفتاح الرئيسي ;// HKEY_LOCAL_MACHINE reg.RootKey :=<br />

reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

كتابة القيمة المدخلة في عنصر التحرير إلى اسم // ;( reg.WriteString('RegisteredOwner',edit1.Text<br />

القيمة المحددة<br />

reg.CloseKey ;<br />

إغلاق المفتاح //<br />

Finally<br />

تحرير الذاكرة بعد استخدام المتحول // ; reg.Free<br />

end;<br />

:<br />

مثال : 2<br />

سنعود إلى برنامج الهاتف<br />

يقوم برنامجنا بالترتيب حسب الاسم دائما ً وعلى فرض أن المستخدم يفضل الترتيب حسب الكنية فإن عليه عن<br />

يضغط على زر الراديو الكنية كلما دخل إلى البرنامج ، سنضيف الآن مفتاح إلى مسجل النظام يقوم بتخزين الخيار<br />

الافتراضي للمستخدم ، وسنقوم بفحص قيمة هذا المفتاح كلما دخلنا إلى البرنامج :<br />

سنخزن قيمة عددية تحت أسم IndexBy في المفتاح :<br />

HKEY_CURRENT_USER\Software\MyPhone<br />

وعند تشغيل البرنامج سنفحص قيمة هذا المتحول فإذا كان هذا المتحول يحوي قيمة 1 فالفهرسة ستتم حسب الكنية<br />

وإلا فالفهرسة ستتم حسب الاسم .<br />

. "<br />

"<br />

أضف زر إلى النموذج الأول<br />

Form1 في برنامج الهاتف وأعطه العنوان<br />

فهرس دائما ً حسب الكنية<br />

وفي حدث الضغط على هذا الزر اكتب التعليمات التالية<br />

تقوم التعليمة<br />

OpenKey بإنشاء المفتاح إذا لم يكن موجودا ً وتقوم التعليمة<br />

:<br />

Var reg:tregistry ;<br />

Begin<br />

reg:= tregistry.Create ;<br />

try<br />

reg.RootKey := HKEY_CURRENT_USER ;<br />

reg.OpenKey('SOFTWARE\MyPhone',True ) ;<br />

if button4.Caption = فهرس دائما ً حسب الكنية'‏ ' Then<br />

reg.WriteInteger ('IndexBy',1 )<br />

else reg.WriteInteger ('IndexBy',0 )<br />

reg.CloseKey ;<br />

Finally<br />

reg.Free ;<br />

end;<br />

WriteInteger بإنشاء القيمة<br />

.<br />

IndexBy وتخزن فيها القيمة<br />

1 أو صفر حسب الشرط<br />

RBTLname<br />

reg:= tregistry.Create ;<br />

try<br />

reg.RootKey := HKEY_CURRENT_USER ;<br />

reg.OpenKey('SOFTWARE\MyPhone',True) ;<br />

if reg.ReadInteger ('IndexBy') = 1 then begin<br />

153<br />

الآن سنفحص هذا المفتاح عند تشغيل البرنامج :


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تفحص<br />

هذه التعليمات القيمة المخزنة<br />

IndexBy فإذا كانت تساوي<br />

http://www.alshater.net<br />

RBTLname.Checked := true;<br />

RBTLnameClick(Sender);<br />

; ‏'رتب دائما ً حسب الاسم ' =: button5.Caption<br />

؛end<br />

reg.CloseKey ;<br />

Finally<br />

reg.Free ;<br />

end;<br />

154<br />

1 فإنها تقوم بتحفيز زر الراديو الكنية وتنفيذ<br />

الحدث الخاص بالضغط على هذا الزر والذي فيه تعليمات تغيير الفهرس بالإضافة إلى تغير عنوان الزر إلى رتب<br />

دائما ً حسب الاسم<br />

.<br />

بهذا نكون قد تعلمنا التعامل مع مسجل النظام<br />

وظيفة<br />

.<br />

:<br />

فكر بطريقة تقوم بها بإضافة كلمة سر إلى برنامج الهاتف ، حيث ستظهر نافذة عند تشغيل البرنامج<br />

تطالب المستخدم بإدخال كلمة السر فإذا أدخل كلمة السر الصحيحة فستظهر النافذة الرئيسية وإلا فسيطالب بإدخال<br />

كلمة السر مرة أخرى وإذا فشل في الدخول ثلاث مرات<br />

النظام<br />

متتالية فيتم إغلاق البرنامج<br />

)<br />

. (<br />

توابع وثوابت الويندوز<br />

: Windows API<br />

خزن كلمة السر في مسجل<br />

توابع وثوابت الويندوز هي مجموعة هائلة من التوابع والثوابت المعرفة في ويندوز والموجودة ضمن مكتبات<br />

ويندوز في ملفات ذات الامتداد<br />

.DLL وتستخدم هذه النوافذ للتحكم في ويندوز وفي كل شيء في ويندوز ابتداء<br />

بلوحة المفاتيح وانتهاء مرورا ً بالذاكرة والمعالج و الشاشة بما في ذلك التحكم بالبرامج والنوافذ وطرق إظهارها<br />

يمكنك على سبيل المثال التحكم بارتفاع الصوت باستخدام توابع<br />

)<br />

Api و معرفة معلومات معينة عن الأجهزة مثل<br />

معرفة حجم السواقة الصلبة Hard Disk يمكنك الحصول على معلومات في برنامج آخر من برنامجك كأن تحصل<br />

على معلومات من ملف ورد والمزيد الذي لا يمكن حصره هنا<br />

سنشرح أمثلة عن التوابع وطرق التعامل معها<br />

1 إغلاق<br />

يستخدم التابع<br />

فيه<br />

.<br />

:<br />

: Windows<br />

) ExitWindowsEx( لإطفاء الجهاز أو إعادة التشغيل<br />

ابدأ برنامجا ً جديدا ً واضف زر إلى النموذج واكتب التعليمة التالية<br />

ExitWindowsEx(ewx_ShutDown,0) ;<br />

)<br />

:<br />

:<br />

(<br />

احفظ البرنامج وقم بتنفيذه ولا تضغط على الزر ‏،أغلق البرنامج وشغله من خارج ال<strong>دلفي</strong><br />

، اضغط على الزر الآن وسيتم إيقاف تشغيل ويندوز<br />

لإعادة إقلاع النظام استخدم التعليمة<br />

. ExitWindowsEx(ewx_Reboot,0)<br />

.<br />

:<br />

2<br />

التحكم ب<strong>لغة</strong> البرنامج الافتراضية<br />

:<br />

من المكان الذي حفظته<br />

إذا كانت ال<strong>لغة</strong> الافتراضية على الجهاز هي ال<strong>لغة</strong> الإنكليزية فإن برنامجك<br />

سيظهر المؤشر في عناصر التحرير بحيث يتم الكتابة بال<strong>لغة</strong> الإنكليزية وعلى المستخدم أن يحول إلى أسلوب الكتابة<br />

با<strong>لغة</strong> العربية كلما أراد الكتابة ، ويمكن حل هذه المشكلة عن طريق التعليمة<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ابدأ مشروعا ً جديدا ً وضع فيه عنصر تحرير<br />

البرنامج وستلاحظ أن المؤشر أصبح بجهة الكتابة با<strong>لغة</strong> العربية<br />

الرقم<br />

http://www.alshater.net<br />

LoadKeyboardLayout('00002801',klf_activate) ;<br />

OnCreate للنموذج<br />

.<br />

Edit وأضف التعليمة السابقة إلى الحدث<br />

وشغل<br />

00002801 هو الرقم الذي يرمز إلى لوحة المفاتيح العربية السعودية إذا أردت العودة إلى ال<strong>لغة</strong> الإنكليزية<br />

الأمريكية بدل هذا الرقم إلى<br />

تطبيق<br />

التابع<br />

. 00000409<br />

:<br />

اذهب إلى برنامج الهاتف وأضف هذه التعليمة للحدث OnCreate للنموذج الأول<br />

. Form1<br />

يوجد لدينا في النافذة إدخال في برنامج الهاتف حقلين يجب كتابتهما بال<strong>لغة</strong> الإنكليزية هما حقل البريد الإلكتروني<br />

وحقل موقع الانترنت لذلك يمكنك كتابة التعليمة التالية في الحدث OnEnter لهذين الحقلين :<br />

LoadKeyboardLayout('00000409 ',klf_activate) ;<br />

حيث سيتم التحول إلى ال<strong>لغة</strong> الإنكليزية عند دخول المؤشر إلى هذين الحقلين واكت التعليمة التالية في الحدث<br />

OnExit<br />

LoadKeyboardLayout('00002801',klf_activate) ;<br />

إذا أردت أن يعود المؤشر إلى ال<strong>لغة</strong> العربية عن خروج المؤشر من هذين الحقلين .<br />

: MessageBox<br />

تعاملنا مع التابعين<br />

ShowMessage وMessageDlg سابقا ً ولكن مشكلة هذين التابعين أن عناوين الأزرار تظهر<br />

با<strong>لغة</strong> الإنكليزية دائما ً لذلك يمكنك استخدام التابع<br />

تبعا ً ل<strong>لغة</strong> النظام<br />

.<br />

أكتب التعليمة التالية في حدث الضغط على الزر<br />

نفذ البرنامج ولاحظ أن الزر Ok سيظهر با<strong>لغة</strong> العربية<br />

اكتب التعليمة التالية في حدث الضغط على زر آخر<br />

MEssageBox من ويندوز<br />

Api الذي سيظهر عناوين الأزرار<br />

:<br />

MessageBox ( هذا عنوان الرسالة ' , ' هذا نصر الرسالة',‏‎0‎ ' , MB_Ok ) ;<br />

( موافق )<br />

إذا كنت تستخدم ويندوز با<strong>لغة</strong> العربية<br />

.<br />

:<br />

If MessageBox ( تغير لون النافذة ' , ' هل تريد تلوين النافذة باللون الأحمر',‏‎0‎ ' ,Mb_YesNo ) = IDYES<br />

then<br />

Form1.color := clred;<br />

لمزيد من التعليمات ضع المؤشر فوق اسم التابع MessagBox واضغط على . F1<br />

التعامل مع النوافذ<br />

:<br />

لكل نافذة في ويندوز مقبض أو ممسك يدعى Handle وهو من النوع Thandle وهو عبارة عن عدد صحيح<br />

طويل يتعامل النظام مع هذا المقبض للوصول إلى النافذة<br />

على النموذج مقبض أيضا ً فهناك مقبض للزر وللعنصر<br />

)<br />

لا يقصد بالنافذة هنا النموذج Form فقط بل لكل عنصر<br />

Edit و....‏ (<br />

، المقبض ليس له قيمة ثابتة إذ يعطى للنافذة<br />

رقم مقبض جديد عند كل إنشاء للنافذة ، عندما تقوم يتحريك نافذة ما على سطح المكتب فإن النظام يستدعي<br />

مجموعة من توابع Api لتنفيذ هذه الحركة<br />

.<br />

يوجد عدد هائل من التوابع المتعلقة بالنوافذ سنذكر بعض منها في هذه العجالة<br />

:<br />

155


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

1 برنامج يعيد أسماء جميع النوافذ الموجودة في الذاكرة<br />

أضف زر و عنصر<br />

ListBox إلى النموذج في برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />

var h:Thandle;<br />

p:pchar;<br />

begin<br />

getmem(p,250);<br />

h:= gettopwindow ( getdesktopwindow) ;<br />

getwindowtext(h,p,250);<br />

listbox1.Items.Add(p);<br />

while h > 0 do begin<br />

h:= getnextwindow( h,gw_hwndnext);<br />

getwindowtext(h,p,250);<br />

listbox1.Items.Add(p) ;<br />

end;<br />

freemem(p,200);<br />

end;<br />

:<br />

:<br />

شرح البرنامج<br />

) Pchar<br />

في البداية تم تعريف المتحول<br />

h وهو من النوع<br />

Thandle بالإضافة إلى المتحول<br />

P من النوع<br />

ملاحظة<br />

( Pchar<br />

جميع توابع<br />

Api تتعامل مع النوع<br />

. p<br />

التعليمة (200,p GetMem( تخصص<br />

200 بايت من الذاكرة للمتحول<br />

: GetDesktopwindow يعيد مقبض سطح المكتب في ويندوز .<br />

GetTopWindow يعيد النافذة الموجودة في أعلى النوافذ في حيز الذاكرة المخزن فيه مقبض النافذة الذي يمرر<br />

كوسيط لهذا التابع<br />

250<br />

يعيد هذا التابع في المتحول p<br />

عنوان النافذة التي مقبضها<br />

h ويعيد نص بطول<br />

:getwindowtext(h,p,250)<br />

حرف<br />

يعيد مقبض النافذة التي تلي النافذة<br />

h وفي حال وصلنا إلى آخر<br />

: GetNextWindow( h, gw_hwndnext)<br />

نافذة فيعيد القيمة . Nil<br />

2 برنامج إخفاء وإظهار شريط المهام :<br />

ابدأ مشروعا ً جديدا ً وأضف إليه زرين :<br />

1 عرف المتحول التالي في القسم Private للوحدة :<br />

hTaskBar: THandle;<br />

2 اكتب التعليمة التالية في الحدث<br />

OnCreate للنموذج :<br />

hTaskBar := FindWindow('Shell_TrayWnd', nil);<br />

تعيد هذه التعليمة النافذة التي نوعها مذكور في الوسيط الأول وعنوانها مذكور في الوسيط الثاني<br />

156


http://www.alshater.net<br />

ShowWindow(hTaskBar, SW_HIDE);<br />

:<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

3 أكتب التعليمة في حدث الضغط على الزر الأول<br />

:<br />

تقوم هذه التعليمة بإظهار أو إخفاء النافذة تبعا ً للوسيط الثاني<br />

4 أكتب التعليمة التالية في حدث الضغط على الزر الثاني<br />

ShowWindow(hTaskBar, SW_SHOW);<br />

نفذ البرنامج .<br />

ملاحظات :<br />

.<br />

1 للمزيد من المعلومات عن التوابع المذكورة سابقا ً اضغط F1<br />

فوق بعد وضع المؤشر فوق اسم التابع<br />

2 للحصول على اسماء معظم توابع<br />

Windows Api اكتب Windows في أي مكان من محرر الشيفرة و<br />

ضع النقطة ، فسيتم كتابة جميع الثوابت والتوابع المعرفة في الوحدة<br />

Windows.pas وهي مرتبطة مباشرة مع<br />

. Windows Api<br />

للحصول على معلومات وافرة عن<br />

Windows Api عليك مراجعة الكتب المختصة أو الحصول على<br />

3<br />

. MicroSoft Visual Studio<br />

مجموعة الأقراص الليزرية المسماة<br />

MSDN Library والتي تباع مع<br />

إعداد المهندس :<br />

محمد خالد ناصر آغا<br />

157


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

إضافة عناصر جديدة<br />

http://www.alshater.net<br />

24<br />

: ( Add new omponant )<br />

قبل إضافة عناصر جديدة إلى <strong>دلفي</strong> علينا أن نعرف ما هي العناصر:‏<br />

لقد تعاملنا مع مجموعة كبيرة من العناصر في <strong>دلفي</strong> منها المرئي ومنها المخفي وهي عبارة عن كتل برمجيه جاهزة<br />

يضعها المبرمج على النموذج لإعطاء برنامجه شكل وخصائص معينة،‏ وتختلف العناصر بطبيعتها فمنها البسيط<br />

العنصر TLabel أو عناصر معقدة كعناصر BDE وعناصر الطباعة<br />

.<br />

من المعروف أن <strong>لغة</strong> ال<strong>دلفي</strong> هي <strong>لغة</strong> برمجة غرضية التوجه object-oriented programming أي أننا نستطيع<br />

أن نكتب كتلنا البرمجية اعتمادا ً على كتل أخرى ، فعند إنشاء النموذج لسنا بحاجة إلى كتابة التعليمات لإنشاء<br />

النموذج وإظهاره ولسنا بحاجة أيضا ً لكتابة التعليمات البرمجية لإظهار كل عنصر على النموذج ، إذ يكفي أن<br />

نسحب العنصر ونضعه على النموذج لتقوم <strong>Delphi</strong> بإضافة التعليمات البرمجية اللازمة لإظهار العنصر وطرق<br />

التعامل مع هذه العناصر<br />

(<br />

تنحدر جميع العناصر في <strong>دلفي</strong> من العنصر<br />

Tobject<br />

وهو العنصر الرئيسي<br />

( الأب )<br />

في <strong>دلفي</strong> حيث تنحدر جميع<br />

العناصر منه وحيث تأخذ العناصر بعض خواص العنصر Tobject وتضيف إليها خواص جديدة أو تعدل في<br />

بعض هذه الخواص بما يلائم عمل كل عنصر والشجرة التالية توضح البناء الهيكلي للعناصر<br />

:<br />

لماذا يتم إنشاء عناصر جديدة<br />

:<br />

يقوم بعض المبرمجين المحترفين أو بعض المبرمجين الهواة بإنشاء عناصر جديدة حتى يجعلوا من <strong>البرمجة</strong> أمر<br />

سهل وممتع ، لأنك كمبرمج عادي لا تستطيع أن تبرمج كل شيء بنفسك وعليك أن تعتمد على الغير في أنشاء<br />

158


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

برامجك فلا حدود للإمكانيات التي تستطيع العناصر أن تقدمها وكل يوم نسمع عن عناصر جديدة وابتكارات جديدة<br />

http://www.alshater.net<br />

في عالم العناصر .<br />

طرق إضافة عناصر جديدة إلى لوحة العناصر :<br />

هناك العديد من الطرق لإضافة عناصر جديدة إلى صفحة العناصر وأفضل طريقة هي قراءة ملفات المساعدة التي<br />

تأتي مع العنصر ولكننا سنركز على بعض الطرق العامة :<br />

1 عن طريق استخدام المكتبة .bpl :<br />

:<br />

إذا وجدت في فهرس العنصر ملف من النوع bpl<br />

فاتبع الطريقة التالية لإضافة هذا العنصر إلى صفحة العناصر<br />

أ من الصفحة Component اختر Install Package<br />

تظهر عندها النافذة المجاورة اختر منها<br />

Add واذهب إلى المسار<br />

الموجود فيه العنصر الذي تريد إضافته واختر ملف .bpl واضغط<br />

على . Ok<br />

) مثال<br />

TIBEAntialiasButton02_all<br />

. (<br />

نفذ الطريقة السابقة على العنصر<br />

الموجود على الديسك المرفق<br />

أو حمله من الموقع<br />

http://www.ibe-software.com<br />

ستلاحظ أن العنصر وضع نفسه في الصفحة الأخير في لوحة<br />

العناصر .<br />

ب الآن يجب إضافة مجلد العنصر إلى مسار المكتبات<br />

المستخدمة في <strong>دلفي</strong> :<br />

من القائمة Tools Environment Options<br />

ستظهر عندها نافذة أختر منها الصفحة Library<br />

اضغط على الزر Library path لتظهر النافذة<br />

التالية :<br />

اضغط على الزر المجاور لعنصر التحرير بالأسفل<br />

( ... )<br />

159


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

وحدد مسار العنصر الذي قمت بإضافته<br />

حدد مسار ملفات<br />

bpl أو ملفات<br />

Dcu وملفات ( pas ثم اضغط على<br />

)<br />

Ok ومن Add<br />

بإمكانك الآن استخدام العنصر الجديد بالطريقة التي كنا نستخدمها مع<br />

أي عنصر سابق من عناصر <strong>دلفي</strong> ،(<br />

يفضل<br />

استعراض الأمثلة التي تأتي مع العنصر عادة في الفهرس ( Demo<br />

:<br />

2 استخدام ملفات .Dpk<br />

إذا وجد مع العنصر ملف من النوع<br />

ملف حزمة <strong>دلفي</strong><br />

( <strong>Delphi</strong> Package فاتبع الخطوات التالية<br />

) .Dpk<br />

لإضافة هذا العنصر إلى صفحة العناصر :<br />

:<br />

القائمة أ من<br />

File Open حدد الملف ذو الامتداد<br />

.Dpk واضغط على<br />

ok لتظهر النافذة التالية<br />

اضغط منها على الزر<br />

Install ستظهر عندها رسالة تعلمك<br />

بأنه قد تم تحميل العنصر .<br />

ب اعد الخطوة ب الطريقة السابقة .<br />

ملاحظة قد تظهر بعض المشاكل عن استخدام هذه الطريقة،‏<br />

لحل المشكلة اضغط على الزر<br />

option واختر من الصفحة<br />

Description وغير في القسم الموضح في النافذة التالية :<br />

ثم أغلق نافذة الخيارات واضغط على . Install<br />

‎3‎ في حال العنصر الجديد مكون من ملف واحد من الامتداد : Pas<br />

أ افتح الملف من القائمة File<br />

: Open<br />

اختر القائمة Component Install<br />

Component تظهر عندها النافذة<br />

المجاورة<br />

اختر الصفحة Into New package<br />

واكتب أي اسم تريد في الحقل<br />

ok واضغط على Package file name<br />

تظهر عندها النافذة الموضحة في الطريقة الثانية ، اضغط منها على<br />

. Install<br />

160


http://www.alshater.net<br />

.<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ب أعد الخطوة ب السابقة<br />

.<br />

( Setup<br />

4 بعض العناصر تأتي مع برنامج تنصيب )<br />

وتقوم بتنصيب نفسها تلقائي ًا<br />

لماذا هذه الطرق المتعددة :<br />

عمليا ً هناك طريقة واحدة لتركيب العناصر وهي الطريقة الثالثة ولكن بعض المبرمجين يحتاج<br />

إلى أكثر من وحدة<br />

، .Dpk<br />

Unit في عنصره ولذلك يقوم بحزم هذه الوحدات في ملف حزمة<br />

Package وبالتالي ينشأ عندنا ملف<br />

عندما تضغط على الزر<br />

Install في النافذة<br />

Package في الطريقة الثانية أو الثالثة ، تقوم <strong>دلفي</strong> بإنشاء الملف ذو<br />

)<br />

الامتداد<br />

Bpl وهو ملف المكتبات في <strong>دلفي</strong><br />

في <strong>لغة</strong> الفيجول سي أو الفيجول بيسك يتم اعتماد الملفات ذات الامتداد<br />

. ( OCX أو DLL<br />

تتميز <strong>دلفي</strong> عن لغات <strong>البرمجة</strong> الأخرى بأنه لا حاجة لإضافة ملفات<br />

Bpl إلى البرنامج عن توزيعه حيث يتم إدراج<br />

هذه الملفات تلقائيا ً في الملف التنفيذي<br />

.Exe بينما يجب عليك إدراج ملفات ال<br />

.DLL وOcx عند استخدام فيجول<br />

سي أو فيجول بيسك .<br />

إنشاء العناصر في <strong>دلفي</strong> :<br />

:<br />

‎1‎ الطريقة الأولى :<br />

سوف نتعرف الآن على أسهل طريقة لإنشاء العناصر في <strong>دلفي</strong><br />

سوف نقوم بإنشاء عنصر تحرير لا يقبل إدخال الأحرف ولعمل ذلك :<br />

ابدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />

حدد بعدها العنصر<br />

Edit واكتب التعليمات التالية في الحدث<br />

: OnKeyPress<br />

const s= [ '1','2','3','4','5','6','7','8','9','0',char(Vk_back)];<br />

begin<br />

if not (key in s ) then<br />

key := char(VK_CAPITAL )<br />

end;<br />

Component Create Component Template واختر Edit1<br />

تظهر عندها النافذة<br />

التالية :<br />

أكتب في الحقل<br />

Component name اسم العنصر التي تريد<br />

( TNumEdit في الحقل وحدد Palette Page اسم<br />

)<br />

الصفحة التي تريد أن يظهر فيها العنصر<br />

) بإمكانك أن تكتب<br />

اسم صفحة جديدة (<br />

كما يمكنك تحديد أيقونة للعنصر الجديد عن طريق الضغط<br />

على الزر . Change<br />

.<br />

اضغط على<br />

Ok سيظهر العنصر الجديد في الصفحة التي حددتها<br />

يمكنك عندئذٍ‏ استخدامه في جميع برامجك اللاحقة .<br />

.<br />

2 الطريقة الثانية<br />

: سنقوم بكتابة نفس العنصر السابق ولكن بطريق أفضل<br />

أغلق جميع الوحدات في <strong>دلفي</strong><br />

File Close All<br />

161


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اختر الأمر<br />

: Component New Component<br />

تظهر عندها النافذة التالية :<br />

اختر من اللائحة Ancestor type القيمة TCustemEdit<br />

وهي العنصر الأب الذي سيرث عنصرنا الجديد خواصه .<br />

في الحقل<br />

Class Name اكتب اسم الصنف الذي تريده<br />

لعنصرك أن<br />

TMyNumberEdit<br />

) يجب أن يبدأ بحرف ( T<br />

في الحقل<br />

Palette Page اكتب اسم الصفحة التي تريد أن<br />

. ( MyComponent<br />

يظهر بها العنصر )<br />

:<br />

اضغط على الزر<br />

ok ستظهر الوحدة<br />

MyNumEdit بالشكل التالي<br />

unit MyNumberEdit;<br />

interface<br />

uses<br />

Windows, Messages, SysUtils, Classes, Controls, StdCtrls;<br />

type<br />

T MyNumberEdit = class(TCustomEdit)<br />

private<br />

{ Private declarations }<br />

protected<br />

{ Protected declarations }<br />

public<br />

{ Public declarations }<br />

published<br />

{ Published declarations }<br />

end;<br />

procedure Register;<br />

implementation<br />

procedure Register;<br />

begin<br />

RegisterComponents('Standard', [MyNumberEdit]);<br />

end;<br />

end.<br />

سنشرح كل سطر من هذه الأسطر بشكل مبسط :<br />

1 class(TCustomEdit) TMyNumberEdit = هذه التعليمة تعرف نوع جديد باسم TMyNumEdit من<br />

TEdit<br />

) TEdit<br />

النوع<br />

TCustomEdit وهو النوع المشتق منه النوع<br />

النوع<br />

TCustomEdit هو النوع<br />

ولكن بدون أي خاصة أو حدث ، حيث سنقوم بإدخال الأحداث والخصائص المطلوبة بعد قليل<br />

. (<br />

162


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

يتم في<br />

: هذا القسم تعريف بعض المتحولات والتوابع والخصائص والتي يمكن الوصول إليها من<br />

2 protected<br />

.<br />

(<br />

)<br />

(<br />

قبل هذه الوحدة )<br />

الوحدة المعرفة بها<br />

ومن أي وحدة مشتقة<br />

موروثة<br />

من هذه الوحدة<br />

أي أننا إذا عرفنا<br />

متحول في هذه المنطقة فإننا يمكننا قراءة قيمته والكتابة فيه ضمن أي وحدة ترتبط مع الوحدة<br />

.MyNumberEdit<br />

يستخدم هذا القسم لتعريف الخصائص وهو يشبه القسم<br />

Public ويختلف عنه أن الخاصة<br />

:<br />

3 published<br />

... Event<br />

( Object inspector<br />

المعرفة هنا ستظهر في محرر الخواص )<br />

وفي صفحة<br />

سيتضح عمله فيما<br />

بعد .<br />

4 : procedure Register<br />

مهمة الإجراء هي استدعاء الإجراء [MyNumberEdit]); RegisterComponents('Standard',<br />

والذي<br />

.<br />

يقوم بإظهار العنصر<br />

MyNumberEdit في الصفحة<br />

Standard من صفحات العناصر<br />

الآن سوف نبدأ بإضافة بعض الخاصة<br />

About والتي ستظهر في صفحة الخواص الخاصة<br />

About وفيها اسم<br />

مبرمج العنصر .<br />

أضف التعليمة التالية في القسم<br />

: Public<br />

constructor Create(AOwner: TComponent); override;<br />

حيث Constructor هو منهج خاص يستخدم مع Create فقط ويقوم بإنشاء العنصر وتهيئته أي إعطاءه القيم<br />

. Procedure<br />

الابتدائية ويمكن اعتباره إجراء تستخدم فيه الكلمة المحجوزة<br />

Constructor بدلا ً من<br />

أضف في القسم<br />

ضع مؤشر التحرير<br />

Published<br />

: التعليمة التالية<br />

Property About : string Read FAbout Write Fabout;<br />

)<br />

مؤشر لوحة المفاتيح<br />

(<br />

عند هذا السطر واضغط على المفاتيح Ctrl + Shift + C سيضاف<br />

. private<br />

عندها المتحول<br />

FAbout من النوع<br />

String إلى القسم<br />

تقوم<br />

هذه التعليمة بتعريف خاصة من اسمها<br />

About من النوع<br />

String تأخذ هذه الخاصة قيمتها أثناء التصميم من<br />

التعليمة<br />

. Write FAbout وتأخذ قيمتها أثناء التنفيذ من التعليمة Read FAbout<br />

ضع مؤشر التحرير على المنهج<br />

Constructor واضغط على المفاتيح Ctrl + Shift + C سيضاف عندها<br />

هذا المنهج إلى القسم<br />

Implementation والذي سيبدأ بالتعليمة<br />

Inherited والتي تجعل هذا التابع يرث جميع<br />

خواص التابع الأصل المعرف في الوحدة . TCustomEdit<br />

FABout := 'M.Khaled Nasser Agha';<br />

أضف التعليمة التالية بعد التعليمة<br />

قم بحفظ الوحدة باسم<br />

: Inherited<br />

. MyNumberEdit<br />

افتح النافذة<br />

Component install component ستظهر النافذة المشروحة في الفقرة الثالثة من طرق<br />

تركيب عنصر جديد على كل حال افتح الصفحة<br />

into new package واكتب Editnumber في الحقل<br />

ok ستفتح عندها نافذة جديدة<br />

اضغط فيها على أحد الزرين<br />

Install أو<br />

Package File Name واضغط على الزر<br />

163


http://www.alshater.net<br />

) Standard<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

، Compile سيظهر عندها العنصر في آخر الصفحة<br />

إذا كنت قد كتبت التعليمات السابقة بدون<br />

.<br />

أخطاء (<br />

أغلق نافذة واحفظ الملفات إذا ط ٌلب ذلك<br />

ابدأ مشروعا ً جديدا ً وضع عليه العنصر الجديد ستجد أن أول خاصة له في محرر الخواص هي الخاصة About<br />

بالإضافة إلى أن الخواص مختصرة بشكل كبير ، افتح الصفحة<br />

Events ولاحظ عدم وجود أي حدث لهذا العنصر<br />

.<br />

سنقوم الآن بإضافة الخاصة Num لهذا العنصر حيث سيتم إدخال رقم إلى العنصر و الحصول منه على رقم من<br />

. ( TEdit<br />

خلال هذه الخاصة )<br />

ستحل هذه الخاصة محل الخاصة<br />

Text في العنصر من النوع<br />

أغلق الآن جميع النوافذ ومن القائمة File ReOpen اختر<br />

Editnumber.dpk ستظهر الآن النافذة المجاورة،‏ اضغط مرتين<br />

MyNumberEdit.pas ستظهر عندها هذه الوحدة في محرر<br />

الشيفرة ، نستطيع الآن إجراء التعديلات التي نريد على هذه الوحدة<br />

ومن ثم الضغط على الزر<br />

Compile للتنقل التعديلات إلى العنصر<br />

... Standard الموجود على الصفحة TMyNumberEdit<br />

أضف الآن السطر التالي إلى القسم . Published<br />

property Num: Extended read FNum write SetFNum;<br />

ضع مؤشر التحرير عند هذا السطر واضغط على Ctrl + Shift + C سيتم عندها تعريف المتحول FNum في<br />

القسم<br />

Private وتعريف الإجراء SetNum أيضا ً ، وفي القسم<br />

Implementation سيتم إضافة جسم الإجراء<br />

SetNum وستوجد فيه التعليمة التالية<br />

احفظ الوحدة وعد إلى النافذة السابقة<br />

FNum := Value :<br />

أضف إليها التعليمة التالية<br />

:<br />

Text := floattostr(value);<br />

Compile ثم<br />

)<br />

ستكون موجودة في الخلف عادة<br />

(<br />

اضغط منها على الزر<br />

Standard ستلاحظ<br />

أغلق هذه النافذة وابدأ مشروعا ً جديدا ً أضف إليه العنصر MyNumberEdit<br />

من الصفحة<br />

أن لهذا العنصر الخاصة Num أدخل فيها أي قيمة عددية لتظهر في العنصر أثناء التصميم ، أدخل مجموعة من<br />

.<br />

الأحرف واضغط على الزر<br />

Enter ستلاحظ عدم قبول هذه الخاصة لإدخال الأحرف<br />

نفذ البرنامج وأدخل حروف في العنصر ستلاحظ قبول العنصر لها وهذا يدفعنا إلى الخطوة التالية في تطوير<br />

العنصر وهي منع إدخال الأحرف إليه .<br />

. MyNumberEdit.pas<br />

افتح الحزمة<br />

EditNumber.dpk ثم افتح الوحدة<br />

سوف نضيف التابع<br />

KeyPress إلى وحدتنا وهذا التابع معرف في الوحدة<br />

TCustomEdit وهو المسؤول عن<br />

استقبال أحرف لوحدة المفاتيح لذلك أضف السطر التالي في القسم<br />

: Public<br />

procedure KeyPress(var Key: Char); override;<br />

اضغط على المفاتيح Ctrl + Shift + C ليضاف جسم الإجراء تلقائيا ً وتضاف فيه التعليمة Inherited<br />

لكي<br />

TCustomEdit<br />

يورث جميع التعليمات الموجودة في الإجراء<br />

KeyPress الموجود في الوحدة الأب المعرف فيها<br />

أضف الآن التعليمة التالية فوق التعليمة Implementation مباشرة :<br />

164


http://www.alshater.net<br />

const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];<br />

: Inherited<br />

If not (key in NumberChar ) Then key := char(VK_Capital);<br />

.<br />

Edit بالإضافة<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

وأضف التعليمة التالية في جسم الإجراء KeyPress وبعد التعليمة<br />

احفظ الوحدة واضغط على الزر Compile في نافذة المجموعة EditNumber.dpk ثم أغلقها<br />

ابدأ مشروعا ً جديدا ً وأضف إليه عنصرنا الجديد ونفذ البرنامج .<br />

بقيت مشكلة وحيدة في عنصرنا وهي عدم وجود عدد كبير من الخصائص الموجودة في العنصر<br />

إلى عدم وجود أحداث ولإضافتها افتح الحزمة Editnumber.dbk<br />

تحتاجها في عنصرك في القسم Published كما في الشكل<br />

وأكتب أسماء الخواص والأحداث التي<br />

property BiDiMode;<br />

property CharCase;<br />

property Color;<br />

property OnEnter;<br />

property OnKeyPress;<br />

property OnKeyDown;<br />

property OnKeyUp;<br />

:<br />

واحفظ الوحدة بعدها واضغط على<br />

الخواص فيه<br />

وفيما يلي النص الكامل للوحدة<br />

Compile ثم أضف عنصرنا الجديد إلى مشروع جديد لتلاحظ وجود هذه<br />

: MynumberEdit.pas<br />

unit MyNumberEdit;<br />

interface<br />

uses<br />

Windows, Messages, SysUtils, Classes, Controls, StdCtrls;<br />

type<br />

TMyNumberEdit = class(TCustomEdit)<br />

private<br />

FAbout: string;<br />

FNum: Extended;<br />

procedure SetFNum(const Value: Extended);<br />

{ Private declarations }<br />

protected<br />

{ Protected declarations }<br />

public<br />

constructor Create(AOwner: TComponent); override;<br />

procedure KeyPress(var Key: Char); override;<br />

{ Public declarations }<br />

published<br />

Property About : string Read FAbout Write Fabout;<br />

property Num: Extended read FNum write SetFNum;<br />

property BiDiMode;<br />

property CharCase;<br />

property Color;<br />

165<br />

.


http://www.alshater.net<br />

property Enabled;<br />

property Font;<br />

property ParentBiDiMode;<br />

property ParentColor;<br />

property ParentCtl3D;<br />

property ParentFont;<br />

property PasswordChar;<br />

property ReadOnly;<br />

property ShowHint;<br />

property TabOrder;<br />

property TabStop;<br />

property Visible;<br />

property OnChange;<br />

property OnClick;<br />

property OnDblClick;<br />

property OnEnter;<br />

property OnExit;<br />

property OnKeyDown;<br />

property OnKeyUp;<br />

{ Published declarations }<br />

end;<br />

procedure Register;<br />

const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];<br />

implementation<br />

procedure Register;<br />

begin<br />

RegisterComponents('Standard', [TMyNumberEdit]);<br />

end;<br />

{ TMyNumberEdit }<br />

constructor TMyNumberEdit.Create(AOwner: TComponent);<br />

begin<br />

inherited;<br />

FABout := 'M.Khaled Nasser Agha';<br />

end;<br />

procedure TMyNumberEdit.KeyPress(var Key: Char);<br />

begin<br />

inherited;<br />

if not (key in NumberChar ) then<br />

key := char(VK_Capital);<br />

end;<br />

procedure TMyNumberEdit.SetFNum(const Value: Extended);<br />

begin<br />

FNum := Value;<br />

Text := floattostr(value);<br />

end;<br />

end.<br />

166<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong>


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة 25<br />

: Drag and Drop<br />

السحب والإفلات :<br />

1 فهم الوسيط : Sender<br />

لا بد أنك لاحظت أن الوسيط<br />

Sender يدخل في جميع معالجات أحداث الصفحة<br />

Event ففي حدث الضغط على<br />

الزر يظهر الإجراء التالي والذي له وسيط واحد هو Sender من النوع . TObject<br />

procedure TForm1.Button1Click(Sender: TObject);<br />

مهمة هذا الوسيط هي إرجاع اسم العنصر الذي قام بالحدث أي أن قيمته عن الضغط على الزر Button1 هي<br />

. Button1<br />

ولفهم أعمق لهذا الوسيط نفذ المثال التالي :<br />

ابدأ مشروعا ً جديدا ً وأضف إليه زرين : Button<br />

1 اكتب في حدث الضغط على الزر Button1 أكتب التعليمة التالية<br />

:<br />

If sender = Button1 Then Showmessage ( ' You Click On Button1 ');<br />

If sender = Button2 Then Showmessage ( ' You Click on Button2 ');<br />

OnClick واختر<br />

2<br />

حدد الزر Button2 ثم انتقل إلى الصفحة Event واضغط على السهم المجاور للخاصة<br />

من القائمة<br />

. Button1Click<br />

نفذ البرنامج واضغط على الزرين ولاحظ النتائج .<br />

2 السحب والإفلات :<br />

: ListBox وعنصر Label<br />

:<br />

مثال 1<br />

أضف إلى النموذج في مشروع جديد ثلاثة عناصر<br />

سنقوم الآن بكتابة<br />

التعليمات <strong>البرمجة</strong> التي تمكننا من سحب العناصر<br />

Label وإفلاتها فوق العنصر<br />

ListBox بحيث يصبح لون<br />

العنصر اللائحة<br />

LIstBox1 بلون العنصر<br />

Label المسحوب،‏ لذلك أعط كل من<br />

العناصر<br />

Label لون مختلف<br />

وأعطهم جميعا ً في الخاصة DragMode القيمة . dmAutomatic<br />

Accept := Source is Tlabel;<br />

:<br />

اكتب في الحدث<br />

OnDragOver للعنصر<br />

يحوي الإجراء ListBox1DragOver الوسطاء التالية<br />

ListBox1 التعليمة التالية<br />

:<br />

العنصر الذي يستدعي الإجراء وهو . ListBox1<br />

هنا العنصر<br />

: Sender<br />

.<br />

العنصر الذي يتم سحبه وهو أحد العناصر<br />

Label في مثالنا<br />

: Source<br />

: X,Y إحداثيات مؤشر الفأرة .<br />

: State يحدد طريقة تحرك الفأرة فوق العنصر .<br />

عندما يأخذ هذا المتحول القيمة<br />

True فإن العنصر سوف يكون جاهزا ً لإفلات العنصر فوقه<br />

) سيتغير<br />

: Accept<br />

شكل مؤشر الفأرة ليظهر بالشكل الذي يبين أن الإفلات مقبول<br />

‏)وإلا فإن العنصر سيرفض إفلات العنصر المسحوب<br />

. فوقه<br />

167


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

http://www.alshater.net<br />

. Tlabel<br />

: Source Is Tlabel<br />

تعيد هذه التعليمة القيمة True إذا كان المتحول Source من النوع<br />

اكتب في الحدث OnDragDrop لنفس العنصر التعليمة التالية<br />

:<br />

( sender as Tlistbox ).color := (Source as Tlabel ).color ;<br />

Tlistbox نفسه<br />

.<br />

التعليمة Sender As TlistBox تسمح لنا بالتعامل مع الوسيط Sender كما نتعامل مع العنصر<br />

كذلك بالنسبة للعنصر<br />

مثال<br />

. Source As Tlabel<br />

نفذ البرنامج واسحب أحد العناصر Label وأتركه فوق العنصر ListBox1 ولاحظ النتائج<br />

.<br />

: 2<br />

أضف عنصر صورة<br />

الخاصة<br />

Image<br />

إلى المثال السابق واجعله يظهر صورة ما عن طريق الخاصة<br />

،Picture أعط<br />

DragMode القيمة<br />

في مكان على النموذج<br />

dmAutomatic سنكتب التعليمات اللازمة التي تمكننا من وضع العنصر<br />

Image1<br />

.<br />

اكتب في الحدث اكتب في الحدث<br />

OnDragOver للنموذج<br />

Form1 التعليمة التالية<br />

:<br />

accept := Source is Timage;<br />

اكتب في الحدث OnDragDrop للنموذج التعليمة التالية<br />

نفذ البرنامج وحرك العنصر<br />

فوق العنصر<br />

(Source as Timage).Top := y;<br />

(Source as Timage).Left := X;<br />

:<br />

.ListBox<br />

Image1 ولاحظ تنقله فوق أي مكان من النموذج ولاحظ أيضا ً أنه لا يمكن إفلاته<br />

168


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الرسم في <strong>دلفي</strong><br />

Timage ويمكننا<br />

يتم الرسم في <strong>دلفي</strong> فوق عنصر الكنفا<br />

Canvas وهو أحد خصائص العنصر TForm والعنصر<br />

رسم عدد من الأشكال الهندسية بواسطة توابع معرفة فوق عنصر الكنفا .<br />

رسم مستقيم :<br />

لرسم مستقيم يجب تحديد نقطة البداية ونقطة للنهاية<br />

أ يتم تحديد نقطة البداية عن طريق التعليمة Form1.Canvas.MoveTo(x,y) حيث<br />

x,y هما إحداثيات نقطة<br />

البداية،‏ إذا أردت من المستخدم أن يحدد نقطة البداية عن طريق الضغط على زر الفأرة فوق النموذج ضع هذه<br />

التعليمة في الحدث OnMouseDown للنموذج . Form1<br />

ب يتم تحديد نقطة النهاية للمستقيم ضمن تعليمة رسم مستقيم وهي Form1.Canvas.LineTo(x,y) حيث x,y<br />

هما إحداثيات نقطة النهاية لمستقيم ، وإذا أردت أن يتم رسم المستقيم في المكان الذي يحرر فيه المستخدم زر<br />

الفأرة ضع هذه التعليمات في الحدث OnMouseUp للنموذج . Form1<br />

نفذ الآن البرنامج واضغط على مؤشر الفأرة وأبقه مضغوطا ً ثم حرك الفأرة إلى مكان جديد وحرر زر الفأرة ،<br />

سيظهر عندها خط مستقيم بين نقطتي البداية والنهاية .<br />

لإظهار الخط أثناء تحريك الفأرة ضع التعليمة التالية ضمن الحدث<br />

OnMouseMove والذي يحدث أثناء<br />

تحريك الفأرة :<br />

Form1.Canvas.LineTo(x,y);<br />

تقوم هذه التعليمة بالرسم فوق النافذة عند تحريك الفأرة ، وإذا أردنا الرسم فقط عندما يكون زر الفأرة مضغوطا ً<br />

يجب إضافة التعليمات التالية:‏<br />

أ عدل القسم Var للوحدة بحيث يصبح بالشكل<br />

ب عدل التعليمات في الحدث<br />

var<br />

Form1: TForm1; Drawing : boolean = false;<br />

:<br />

Drawing := True;<br />

Canvas.MoveTo(x,y);<br />

:<br />

if Drawing Then Form1.Canvas.LineTo(x,y);<br />

:<br />

Drawing := false;<br />

:<br />

OnMouseDown لتصبح بالشكل<br />

ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />

د عدل التعليمات في الحدث OnMouseUp لتصبح بالشكل<br />

نفذ البرنامج واضغط على زر الفأرة وارسم الخط<br />

.<br />

إن مشكلة الحدث<br />

OnMouseMove هو أنه يرسم خط منحني ولا يرسم مستقيم بين نقطتين يحددهما المستخدم<br />

ولذلك نضيف متحول جديد على الوحدة يقوم بحفظ النقطة التي ضغط عليها المستخدم وهذا المتحول من النوع<br />

.<br />

TPoint هذا النوع عبارة عن سجل يحوي متحولين<br />

X,y من النوع<br />

Integer يخزن فيهما إحداثيات النقطة<br />

:<br />

أ أضف تعريف المتحول على القسم<br />

private كما يلي<br />

Origin : TPoint;<br />

169


http://www.alshater.net<br />

:<br />

Drawing := True; Canvas.MoveTo(x,y);<br />

Origin := point(x,y);<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ب عدل التعليمات في الحدث<br />

OnMouseDown لتصبح بالشكل<br />

ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />

:<br />

If Drawing then Begin<br />

Canvas.MoveTo(origin.X,origin.y) ; Form1.Canvas.LineTo(x,y);<br />

end;<br />

د عدل التعليمات في الحدث OnMouseUp لتصبح بالشكل :<br />

Canvas.MoveTo(origin.X,origin.Y);<br />

canvas.LineTo(x,y);<br />

Drawing := false;<br />

نفذ البرنامج واضغط على زر الفأرة وحركها سيتم رسم العديد من المستقيمات من نقطة التي ضغطت عليها إلى<br />

النقطة التي يتحرك مؤشر الفأرة فوقها ، ولكننا نريد فقط أن يظهر في النهاية المستقيم الذي يرسمه الحدث<br />

OnMouseUp ‏،لذلك سنقوم بمسح المستقيمات التي ترسم في الحدث<br />

لحذف مستقيم معين لذلك سنقوم برسم خط جديد فوق الخط الذي يرسم في الحدث<br />

، OnMouseMove لكن لاتوجد تعليمة<br />

OnMouseMove ولكن بلون<br />

الأرضية وبهذا يبدوا عمليا ً أن الخط قد تم مسحه،‏ ولتحقيق ذلك عدل التعليمات في الوحدة لتغدو بالشكل<br />

أ أضف على القسم<br />

:<br />

Private المتحول<br />

Movept من النوع Tpoint الذي سنخزن فيه قيمة آخر نقطة مر عليها<br />

الحدث OnMoseMove وبالتالي هي نفسها إحداثيات نهاية الخط الذي رسم باستخدام هذا الحدث<br />

ب أضف التعليمة في نهاية تعليمات الحدث الحدث<br />

.<br />

Origin,Movept :Tpoint;<br />

Movept := Point(x,y);<br />

:<br />

OnMouseDown<br />

ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />

عندما غيرنا الخاصة<br />

If Drawing then begin<br />

canvas.Pen.Mode := pmNotXor;<br />

canvas.MoveTo(origin.X,origin.y) ;<br />

Canvas.LineTo(Movept.x,movept.y);<br />

Canvas.moveto(origin.X,origin.y) ;<br />

Canvas.LineTo(x,y);<br />

end;<br />

movept := point(x,y);<br />

Canvas.Pen.Mode := pmCopy;<br />

end;<br />

:<br />

Mode للقلم<br />

pen وأعطيناها القيمة<br />

pmNotXor فإننا بذلك طلبنا دمج الخط مع عنصورات<br />

الأرضية وبذلك سيرسم الخط بنفس لون الأرضية وسيبدو وكأنه ممسوح وقد أعدنا القيمة<br />

تعليمة لكي يكون القلم جاهز لرسم الخط النهائي عندما نحرر زر الفأرة<br />

.<br />

1<br />

2<br />

PmCopy في آخر<br />

170


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التعليمتان 1 تقومان برسم خط بين النقطة التي حددها المستخدم وبين آخر نقطة مرت فوقها الفأرة<br />

http://www.alshater.net<br />

النقطة )<br />

المخزنة في المتحول<br />

وسيكون لون الخط بلون الأرضية<br />

) بما أننا نرسم خط جديد فوق خط سابق لونه<br />

( Movept<br />

(<br />

أسود فإن الخاصة<br />

mode ذات القيمة<br />

pmNotXor ستقوم بطرح اللونين من بعضهما وإعادة لون الخلفية<br />

التعليمتان<br />

2 تقومان برسم خط جديد بين النقطة التي ضغط عليها المستخدم والنقطة التي تتحرك الفأرة فوقها<br />

وسيظهر الخط باللون الأسود.‏<br />

OnMouseMove<br />

(<br />

إذا أردت أن تتأقلم مع التعليمات السابقة )<br />

أن تفهمها بشكل جيد<br />

عدل التعليمات في الحدث<br />

لتصبح بالشكل :<br />

If Drawing then begin<br />

canvas.Pen.Color := form1.Color ;<br />

canvas.MoveTo(origin.X,origin.y) ;<br />

Canvas.LineTo(Movept.x,movept.y);<br />

canvas.Pen.Color := clblack;<br />

canvas.moveto(origin.X,origin.y) ;<br />

Form1.Canvas.LineTo(x,y);<br />

end;<br />

movept := point(x,y);<br />

لكن عليك أن تعيدها على شكلها السابق لكي نكمل برنامجنا بالطريقة الصحيحة ...<br />

حتى الآن استطعنا أن نرسم مستقيم ولرسم بقية الأشكال الهندسية سنقوم بإضافة شريط أدوات للبرنامج للتمكن من<br />

:<br />

اختيار<br />

الشكل الذي نريد رسمه<br />

إضافة شريط أدوات للشكل :<br />

New Button من القائمة ، كرر<br />

أضف العنصر<br />

Toolbar إلى الشكل واضغط عليه بزر الفأرة اليميني واختر<br />

العملية لإضافة أربع أزرار.‏<br />

يجب إعطاء كل زر من الأزرار السابقة صور ما تدل على العمل الذي سيقوم به الزر،‏ فإذا كنت تملك أيقونات<br />

جاهزة فبإمكانك استخدامها وإلا فعليك أن ترسم هذه الأيقونات بنفسك ، قبل البدء بإنشاء الإيقونات قم بحفظ<br />

. ( Painting<br />

المشروع )<br />

احفظ الوحدة باسم<br />

Gragh واحفظ المشروع باسم<br />

إنشاء أيقونات جديدة :<br />

اختر من القائمة Tools الأمر Image Editor سيظهر<br />

عندها برنامج تحرير الصور كما في الشكل :<br />

اختر File New icon File<br />

ستظهر لك نافذة اختر منها Small Icon و 16 Color<br />

ستظهر عندها النافذة<br />

Icon1.ico كما في الشكل المجاور<br />

فيها مربع الأخضر وهو يدل على المساحة الشفافة في<br />

الأيقونة<br />

171


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

استخدم أداة رسم خط لرسم خط بين الزاوية اليسرى العلوية والزاوية اليمنى السفلية وبهذا نكون قد رسمنا أيقونة<br />

لزر رسم خط احفظ الملف باسم Line.ico وأغلقه ، ثم أنشأ الأيقونات الأخرى جديدة بنفس الطريقة بحيث تظهر<br />

الأشكال التالية فيها<br />

:<br />

لاتنس أن تحفظ كل أيقونة باسم مناسب<br />

نعود الآن إلى مشروعنا<br />

أضف العنصر<br />

172<br />

.<br />

:<br />

ImageList من الصفحة<br />

الأيقونات الأربعة التي رسمتها<br />

اختر العنصر<br />

Win32 واضغط عليه مرتين تظهر عندها نافذة أختر منها<br />

Add وأضف<br />

.<br />

Toolbar1 واعط القيمة<br />

على لكي تظهر الأيقونات بالترتيب التالي<br />

حدد العنصر ToolBars وأعط الخاصة<br />

Imagelist1 للخاصة<br />

. True القيمة Flat<br />

:<br />

حدد الأزرار الأربعة سوية وأعطها في الخاصة<br />

وأعطها في الخاصة<br />

زرين مضغوطين بنفس الوقت<br />

Grouped<br />

tbsCheck القيمة Style<br />

.<br />

Images ثم عدل الخاصة<br />

ImageIndex لكل زر<br />

القيمة ،True لتجميع هذه الأزرار مع بعضها<br />

، هذه الخاصة ستجعل أحد الأزرار مضغوطا ً فقط ولايمكن أن نبقي<br />

عندما نضغط على أحد الأزرار فإننا سنحدد الشكل الذي سترسمه الفأرة أثناء تحريكها لذلك سنعرف متحول يأخذ<br />

قيمة مختلفة عند الضغط على كل زر من الأزرار وأفضل طريقة هي تعريف نوع معطيات تعدادي ، هذا النوع<br />

سيربط بين سلسلة رمزية وبين رقم داخلي ويستبدله تلقائيا ً ‏،لذلك صرح عن نوع المعطيات التالي في القسم<br />

من الوحدة<br />

ملاحظة<br />

Type<br />

type<br />

TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);<br />

TForm1 = class(TForm)<br />

:<br />

const<br />

dtLine = 0;<br />

dtRectangle = 1;<br />

dtEllipse = 2;<br />

dtRoundRect = 3;<br />

: Private<br />

DrawingTool: TDrawingTool;<br />

:<br />

DrawingTool := dtLine;<br />

:<br />

DrawingTool := dtRectangle;<br />

:<br />

: Gragh<br />

:<br />

تعريف هذا النوع يكافئ التعريف التالي<br />

بما أننا عرفنا نوع فعلينا تعريف متحول من هذا النوع،‏ لذلك أضف تعريف المتحول التالي للقسم<br />

أكتب التعليمة التالية في حدث الضغط على الزر الأول<br />

والتعليمة التالية في حدث الضغط على الزر الثاني<br />

والتعليمة التالية في حدث الضغط على الزر الثالث


http://www.alshater.net<br />

DrawingTool := dtEllipse;<br />

DrawingTool := dtRoundRect;<br />

.<br />

OnMouseUp<br />

173<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

والتعليمة التالية في حدث الضغط على الزر الرابع<br />

وبهذا نكون قد أعطينا قيمة محددة للمتحول DrawingTool عند الضغط على كل زر من الأزرار<br />

الآن علينا أن نفحص قيمة DrawingTool عند رسم الأشكال لذلك نعدل التعليمات في الحدث<br />

للنموذج كما يلي<br />

case DrawingTool of<br />

dtLine:<br />

begin<br />

Canvas.MoveTo(Origin.X, Origin.Y);<br />

Canvas.LineTo(X, Y)<br />

end;<br />

dtRectangle: Canvas.Rectangle(Origin.X, Origin.Y, X, Y);<br />

dtEllipse: Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />

dtRoundRect: Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />

(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />

end;<br />

Drawing := False;<br />

End;<br />

ولكي نستطيع مشاهدة الشكل الذي يرسم أثناء تحريك الفأرة نعدل التعليمات في الحدث OnMuseMove لتصبح<br />

if Drawing then<br />

begin<br />

Canvas.Pen.Mode := pmNotXor;<br />

case DrawingTool of<br />

dtLine: begin<br />

Canvas.MoveTo(Origin.X, Origin.Y);<br />

Canvas.LineTo(MovePt.X, MovePt.Y);<br />

Canvas.MoveTo(Origin.X, Origin.Y);<br />

Canvas.LineTo(X, Y);<br />

end;<br />

dtRectangle: begin<br />

Canvas.Rectangle(Origin.X, Origin.Y, MovePt.X, MovePt.Y);<br />

Canvas.Rectangle(Origin.X, Origin.Y, X, Y);<br />

end;<br />

dtEllipse: begin<br />

Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />

Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />

end;<br />

dtRoundRect: begin<br />

Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />

(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />

Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />

بالشكل :


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

شرح بعض التعليمات الواردة في الحدثين السابقين<br />

تعليمة رسم مستطيل<br />

http://www.alshater.net<br />

(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />

end;<br />

end;<br />

end;<br />

MovePt := Point(X, Y);<br />

Canvas.Pen.Mode := pmCopy;<br />

end;<br />

:<br />

: ( Rectangle )<br />

تقوم هذه التعليمة برسم مستطيل بمعرفة إحداثيات نقطتي البداية والنهاية لأحد أقطاره<br />

تعليمة رسم قطع ناقص<br />

.<br />

: ( Ellipse)<br />

تقوم هذه التعليمة برسم قطع ناقص أو دائرة بمعرفة ‏:إحداثيات نقطتي قطر المستطيل الذي يمس القطع الناقص<br />

أقطاره الأربعة أضلاع<br />

تعليمة رسم مستطيل ذو زوايا مستديرة<br />

: ( RoundRect )<br />

تقوم هذه التعليمة برسم مستطيل ذو زوايا مستديرة بمعرفة نقطي القطر كما في رسم مربع<br />

الأولى<br />

)<br />

(<br />

تغير شكل الخط<br />

ومعرفة الطول الذي سيأخذه القوس من ارتفاع وعرض المستطيل<br />

.<br />

:<br />

يمكننا التحكم بشكل الخط،‏ حيث يمكن أن يظهر بشكل منقط أو خطوط متتالية أو خط ونقطة<br />

التحكم بلون الخط وعرضه.‏<br />

الوسطاء الأربعة<br />

...<br />

، كما يمكننا<br />

سنضيف الآن شريط أدوات جديد للتحكم بشكل الخط،‏ هذا الشريط سيبقى مخفيا ً حتى يضغط المستخدم على زر في<br />

شريط الأدوات السابق ولتحقيق ذلك<br />

:<br />

أ أضف شريط ادوات Toolbar من الصفحة Win32 وأعط الخاصة<br />

. False القيمة Visible<br />

ب أضف الآن ستة أزرار عن طريق الضغط على زر الفأرة اليميني والضغط على الزر<br />

ج أضف عنصر ImageList1 جديد واربط العنصر<br />

الصور إلى هذا العنصر<br />

اذهب إلى المجلد<br />

. New Button<br />

Toolbar2 معه<br />

)<br />

وأضف مجموعة من الأيقونات أو<br />

C:\Program Files\Borland\<strong>Delphi</strong>6\Demos\Doc\Graphex<br />

:<br />

solid.bmp - dashed.bmp - dotted.bmp - dashdot.bmp - dashdot2.bmp - clear.bmp<br />

:<br />

واضف الصور التالية منه على الترتيب<br />

بحيث يصبح في النهاية بالشكل<br />

حدد الأزرار الستة وأعط الخاصة Grouped لها القيمة<br />

د اضغط بزر الفأرة اليميني على العنصر<br />

الصور التالية إلى العنصر ImageList1 من المجلد السابق<br />

tbsCheck القيمة Style والخاصة True<br />

New Separator واختر toolbar1<br />

:<br />

174<br />

ثم أضف زر جديد وأضف


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أعط هذا الزر في الخاصة<br />

http://www.alshater.net<br />

pen.bmp - brush.bmp<br />

:<br />

tbsCheck القيمة Style<br />

ه في حدث الضغط على هذا الزر أكتب التعليمة التالية<br />

toolbar2.Visible := not toolbar2.Visible ;<br />

عند الضغط هذا الزر فسيظهر شريط الأدوات الثاني وسيختفي إذا كان ظاهرا ً .<br />

أكتب التعليمة التالية في حدث الضغط على الزر الأول في شريط الأدوات الثاني<br />

والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />

والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />

والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />

والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />

والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />

: Toolbar2<br />

canvas.Pen.Style := pssolid;<br />

canvas.Pen.Style := psDash;<br />

canvas.Pen.Style := psdot;<br />

canvas.Pen.Style := psdashdot ;<br />

canvas.Pen.Style := psdotdot ;<br />

canvas.Pen.Style := psclear ;<br />

:<br />

:<br />

:<br />

:<br />

:<br />

تغير لون القلم<br />

175<br />

:<br />

يمكن أن نرسم بألوان مختلفة باستخدام عنصر القلم Tpen ولتحقيق ذلك<br />

أ أضف العنصر ColorDialog إلى النموذج<br />

ب أضف إلى<br />

التعليمة التالية<br />

:<br />

.<br />

( Separator<br />

Toolbar2 فاصل )<br />

:<br />

ج أعط هذا الزر أيقونة مناسبة<br />

نفذ البرنامج ولاحظ النتائج<br />

تغير عرض القلم<br />

ومن ثم زر جديد وفي حدث الضغط على هذا الزر أكتب<br />

if ColorDialog1.Execute then<br />

Canvas.Pen.Color := ColorDialog1.Color;<br />

. (<br />

)<br />

.<br />

:<br />

الأيقونة<br />

colors.bmp من الفهرس السابق<br />

لكي يتمكن برنامجنا بالتحكم بعرض الخط المرسوم أضف ما يلي<br />

أ عنصر Edit ضعه فوق العنصر<br />

:<br />

. ToolBar2<br />

ب عنصر UpDown من الصفحة Win32 أعطه في القيمة Edit1 في الخاصة<br />

ج أضف التعليمة التالية في الحدث<br />

تغير نوع الفرشاة<br />

: Associate<br />

للعنصر :Edit1 OnChange<br />

canvas.Pen.Width := strtoint(edit1.Text );<br />

:<br />

تستخدم الفرشاة في <strong>دلفي</strong> لتحديد النمط الذي ستمتلئ به الأشكال في <strong>دلفي</strong><br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

سنضيف الآن شريط أدوات جديد للتحكم بالفرشاة على غرار شريط الأدوات المستخدم للتحكم بالقلم ولتحقيق ذلك<br />

أ أضف شريط أدوات جديد إلى النموذج<br />

http://www.alshater.net<br />

:<br />

.<br />

ب أضف زر جديد إلى شريط الأدوات Toolbar1 وأعط الخاصة Style لهذا الزر القيمة<br />

tbsCheck واكتب<br />

في حدث الضغط عليه التعليمة التالية :<br />

Toolbar3.Visible := Not Toolbar3.Visible ;<br />

ج أضف إلى شريط الأدوات الجديد تسعة أزرار ، حدد الأزرار الثمانية الأولى منها وأعط الخاصة Grouped<br />

لها القيمة<br />

True والخاصة Style القيمة<br />

tbsCheck وأعطها صور من المجلد السابق بحيث تظهر بالشكل<br />

:<br />

أكتب في حدث الضغط على الزر الأول التعليمة التالية<br />

وفي حدث الضغط على الزر التالي القيمة<br />

وفي حدث الضغط على الزر التالي القيمة<br />

:<br />

canvas.Brush.Style := bssolid;<br />

:<br />

canvas.Brush.Style := bsclear;<br />

:<br />

canvas.Brush.Style := bshorizontal;<br />

:<br />

bsVertical – bsFdiagonal – bsbdiaognal – bsColor – bsDiagCross<br />

كرر التعليمة وغير القيمة المحلقة بالمنهج Style للأزرار الباقية على التوالي<br />

تغيير لون الفرشاة<br />

:<br />

اكتب التعليمة التالية في حدث الضغط على الزر التاسع في شريط الأدوات<br />

: ToolBar3<br />

If ColorDialog1.Excetue then canvas.Brush.Color := ColorDialog1.Color ;<br />

إضافة شريط الحالة إلى النموذج<br />

:<br />

يستخدم شريط الحالة Status bar لإظهار معلومات عن حالات معينة ضمن التطبيق،‏ سيظهر برنامجنا معلومات<br />

عن موقع المشيرة الحالي بالإضافة إلى النقطة البدائية التي ضغط عليها المستخدم ولتحقيق ذلك<br />

أ أضف العنصر StatusBar من الصفحة<br />

:<br />

. Win32<br />

2<br />

إضغط عليه بزر الفأرة اليميني واختر Panel Editor ستظهر عندها نافذة تحرير اللوحات اضغط فيها على<br />

الزر Add New مرتين لإضافة لوحتين<br />

3 حدد اللوحة 0 وأعطها في الخاصة<br />

4 أضف التعليمة التالية في حدث<br />

5 أضف التعليمة التالية في الحدث<br />

Width القيمة . 150<br />

OnMouseDown للنموذج :<br />

StatusBar1.Panels[0].Text := Format ('origin = %d , %d',[x,y]);<br />

OnMouseMove للنموذج :<br />

StatusBar1.Panels[1].Text := Format ('Point = %d , %d',[x,y]);<br />

.<br />

176


http://www.alshater.net<br />

26<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

الرسم على عنصر صورة<br />

:<br />

بما أننا نرسم على النموذج مباشرة فلن نستطيع إجراء عمليات على الصور المرسومة كالنسخ واللصق والحفظ<br />

والطباعة،‏ لذلك علينا تطوير برنامجنا ليكون قادرا ً على الرسم فوق عنصر الصورة ، قبل إضافة عنصر الصورة<br />

إلى الشكل عليك<br />

.<br />

1 إضافة مساحة قابلة للتدرج<br />

:<br />

بما أنك سترسم فوق عنصر صورة فقد يكون حجم الصورة أكبر من حجم النموذج وبالتالي علينا إضافة أشرطة<br />

تمرير لكي يمكن المستخدم من الوصول إلى أجزاء الصورة الغير ظاهرة على النموذج ولتحقيق ذلك:‏<br />

أضف العنصر ScrollBox من الصفحة Win32 وأعط الخاصة<br />

. alClient القيمة Align<br />

2 إضافة عنصر صورة Image فوق العنصر ScrollBox1 وأعطاه الخصائص التالية<br />

True<br />

0<br />

True<br />

0<br />

AutoSize<br />

Left<br />

Stretch<br />

Right<br />

تحديد الحجم والصورة الابتدائية لعنصر الصورة<br />

:<br />

عندما وضعنا صور على الشكل فإننا لم نحدد صورة لعرضها ولكننا حددنا مكان لتعرض فيه الصورة،‏ وما علينا<br />

الآن إلا وضع صورة فارغة في الخاصة<br />

Picture للعنصر<br />

Image1 ويمكن تحقيق ذلك بطريقتين<br />

1 أثناء التصميم : إضافة صورة فارغة ذات لون أبيض ذات امتداد .Bmp إلى الخاصة<br />

الصورة<br />

:<br />

Picture لعنصر<br />

.<br />

2 أثناء التنفيذ<br />

التالية في الحدث<br />

:<br />

الرسم على عنصر الصورة<br />

إنشاء عنصر صورة نقطية Bitmap وإلحاقة بالصورة Image1 ولتحقيق ذلك اكتب التعليمات<br />

Var<br />

Bitmap : TBitmap ;<br />

Begin<br />

Bitmap := Tbitmap.Create ;<br />

Bitmap.Width := 200;<br />

Bitmap.Height := 200;<br />

Image1.Picture.Graphic := Bitmap;<br />

Bitmap.Free ;<br />

OnCreate للنموذج :<br />

:<br />

لن يختلف الرسم على عنصر الصورة عن الرسم على النموذج ، فعنصر الصورة يملك الخاصة<br />

الرسم بدون إجراء تغيرات كبيرة في البرنامج نفذ مايلي<br />

Canvas ولتحقيق<br />

:<br />

177


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

1 ضع مؤشر التحرير في أول الوحدة<br />

Graph واختر من<br />

الأمر Search Replace فتظهر النافذة :<br />

Canvas<br />

اكتب في الحقل Text To Find<br />

القيمة<br />

واكتب في Replace With القيمة Image1.Canvas<br />

واضغط على الزر Replace All<br />

سيتغير الآن كل سطر في الوحدة من Canvas.pen… مثلا ً<br />

Event واضغط<br />

إلى Image1.Canvas.pen..<br />

2 حدد عنصر الصورة وأذهب إلى الصفحة<br />

السهم المجاور للحدث<br />

OnMousemove واختر من القائمة<br />

Form1MouseUp للنموذج<br />

، FormMouseMove كذلك أربط الحدث<br />

OnMouseup للصورة مع الحدث<br />

وكذلك الأمر بالنسبة للحدث .. OnmouseDown<br />

نفذ البرنامج ولاحظ النتائج<br />

.<br />

178


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

إضافة قائمة إلى برنامج الرسم<br />

:<br />

سنضيف الآن قائمة إلى برنامج الرسم للتحكم بعنصر الصورة<br />

:<br />

أضف العنصر MainMenu من الصفحة Standard وأنشأ القائمة<br />

الموضحة بالشكل<br />

وأنشأ فيها القائمة<br />

File تحوي الأوامر<br />

:<br />

Edit التي يجب أن تظهر كما في الشكل<br />

:<br />

سنكتب الآن الأوامر التي يجب تنفيذها عند الضغط على كل زر من أزرار القائمة<br />

:<br />

:<br />

File<br />

Exit<br />

1 في حدث الضغط على الزر في القائمة اكتب التعليمة التالية<br />

Close ;<br />

2 عندما يضغط المستخدم على الزر New ستظهر نافذة تطلب من المستخدم تحديد ارتفاع وعرض الصورة<br />

الجديدة وعندما يضغط على الزر موافق سيتم إنشاء صورة فارغة<br />

أنشأ نموذج جديدا ً وأعطه الخواص المناسبة بحيث يبدو كما في<br />

الشكل<br />

:<br />

:<br />

أضف المتحول التالي في القسم<br />

الأولى<br />

Public للوحدة ) Graph الوحدة<br />

CurrentFile : String;<br />

(<br />

سنستخدم هذا المتحول لحفظ الملف لاحقا ً<br />

.<br />

في حدث الضغط على الزر New أكتب التعليمة التالية<br />

وفي حدث الضغط على الزر موافق في النموذج الثاني أكتب التعليمات التالية<br />

وفي حدث الضغط على الزر إلغاء الأمر أكتب التعليمة<br />

نفذ البرنامج<br />

وأنشأ صورة جديدة<br />

:<br />

Form2.ShowModal;<br />

:<br />

var bitmap : tbitmap;<br />

begin<br />

Bitmap := Tbitmap.Create ;<br />

Bitmap.Width := strtoint(edit1.Text );<br />

Bitmap.Height := strtoint(edit2.Text );<br />

form1.Image1.Picture.Graphic := Bitmap;<br />

bitmap.Free ;<br />

Form1.CurrentFile := '' ;<br />

close;<br />

Close; :<br />

.<br />

179


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

4 عند الضغط على الزر Open سيقوم البرنامج بفتح صورة في العنصر Image وبالتالي يمكن تحرير هذه<br />

الصورة أو الرسم فوقها<br />

http://www.alshater.net<br />

180<br />

:<br />

أضف العنصر OpenPictureDialog من الصفحة<br />

في حدث الضغط على الزر<br />

3 عندما يضغط المستخدم على الزر<br />

CurrentFile أما إذا كان<br />

Open من القائمة<br />

. Dialog<br />

File اكتب التعليمة التالية<br />

:<br />

if OpenPictureDialog1.Execute then<br />

begin<br />

CurrentFile := OpenPictureDialog1.FileName;<br />

Image1.Picture.LoadFromFile(CurrentFile); end;<br />

CurrentFile = ''<br />

: Saveas1Click<br />

Save سنقوم بحفظ الصورة في اسم الملف المخزن في المتحول<br />

فهذا يعني أن الصورة جديدة وبالتالي نستدعي الأجراء<br />

اكتب التعليمات التالية في حدث الضغط على الزر . Save<br />

if CurrentFile '' then<br />

Image1.Picture.SaveToFile(CurrentFile)<br />

else SaveAs1Click(Sender);<br />

4 عندما يريد المستخدم أن يحفظ الصورة في ملف جديد فإنه سيضغط على الزر : Save As<br />

اضف العنصر SavePictureDialog إلى النموذج واكتب في حدث الضغط على الزر<br />

File التعليمات التالية<br />

5 طباعة الصورة<br />

Save As من القائمة<br />

if SavePictureDialog1.Execute then<br />

begin<br />

CurrentFile := SavePictureDialog1.FileName;<br />

Image1.Picture.SaveToFile(CurrentFile); end;<br />

:<br />

تعاملنا سابقا ً مع الصباعة باستخدام صفحة العناصر<br />

سنستخدم أسلوبا ً جديد ًا<br />

)<br />

أ أضف الوحدة Printers إلى القسم<br />

File اكتب التعليمات التالية<br />

علما ً أن التعامل مع Qreport يبقى أفضل<br />

: (<br />

Uses للوحدة<br />

:<br />

يستخدم المنهج BeginDoc لإعطاء الطابعة إيعاز تبدأ عمليات الطباعة<br />

يستخدم المنهج Canvas.Draw لنسخ<br />

تستخدم التعليمة<br />

،QReport وبإمكننا استخدام هذه الصفحة للصباعة هنا ولكن<br />

Graph وفي حدث الضغط على الزر Print من القائمة<br />

printer.BeginDoc ;<br />

printer.Canvas.Draw(0,0,image1.Picture.Graphic );<br />

printer.EndDoc ;<br />

.<br />

( رسم )<br />

EndDoc<br />

الصورة Image1 في الخاصة Canvas لعنصر الطابعة<br />

لإنهاء تكليف الطابعة وعند هذا الأمر تبدأ عملية الطباعة<br />

.<br />

إذا أردت أن تتحكم بحجم الصورة استخدم التعليمة StretchDraw بدلا ً من التعليمة Draw مثال<br />

حيث التابع<br />

:<br />

printer.Canvas.StretchDraw(rect(0,0,4000,4000),image1.Picture.Graphic );<br />

Rect يحدد المستطيل الذي ستتمدد الصورة فيه .


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

استخدام الحافظة Clipboard في برنامجنا<br />

http://www.alshater.net<br />

:<br />

سنستخدم الحافظة لكي نتمكن من نسخ صورة ولصقها بلإضافة إلى قصها في برنامجنا<br />

:<br />

استخدمنا الحافظة سابقا ً للتعامل مع العنصر DbImage حيث كان لهذا العنصر المنهجين<br />

CopyToClipbord و<br />

CutToClipord بالإضافة إلى PasteFromClipboard ولكن للأسف العنصر Image المستخدم في برنامجنا<br />

لا يملك هذه المناهج ولذلك علينا التعامل مع الوحدة ClipBrd للتعامل في برنامجنا مع الحافظة ، لذلك أضف<br />

الوحدة ClipBrd إلى القسم<br />

1 نسخ الصورة إلى الحافظة<br />

Graph للوحدة Uses<br />

:<br />

اكتب التعليمة التالية في حدث الضغط على الزر<br />

تقوم هذه التعليمة بإلحاق هدف الصورة بهدف الحافظة<br />

Copy<br />

Clipboard.Assign(Image.Picture);<br />

. Clipboard<br />

2 قص الصورة إلى الحافظة<br />

181<br />

:<br />

لقص الصورة إلى الحافظة نقوم أولا ً بنسخ الصورة إلى الحافظة ومن ثم مسح الصورة<br />

اكتب التعليمات التالية في حدث الضغط على الزر<br />

النوع<br />

:<br />

: Cut<br />

Var ARect :TRect ;<br />

Clipboard.Assign(Image.Picture);<br />

image1.Canvas.CopyMode := cmwhiteness;<br />

ARect :=rect(0,0,image1.Width,image1.Height);<br />

image1.Canvas.CopyRect( ARect,image1.Canvas,ARect);<br />

image1.canvas.copymode := cmsrccopy;<br />

TRect عبارة عن نوع مستطيل وهو يعرف مستطيل من خلال معرفة إحداثيات البداية والنهاية للمستقيم<br />

الذي يمثل أحد الأقطار.‏<br />

: Canvas.CopyMode := cmWhiteness<br />

أن الصورة ستصبح بيضاء<br />

تعني أن عملية نسخ صورة إلى الحافظة ستتم باللون الأبيض<br />

)<br />

. (<br />

: ARect := Rect ( 0,0,…)<br />

تحدد أبعاد المستطيل بأبعاد العنصر<br />

Image الحالية .<br />

: Canvas.CopyRect( ARect,Image.Canvas,ARect)<br />

أي<br />

عملية نسخ إلى المستطيل المحدد بالوسيط الأول<br />

ARect من الكنفا المحددة بالوسيط الثاني والوسيط الثالث يحدد أبعاد المستطيل الذي سينسخ من الكنفا الأصل<br />

.<br />

بكلمات أخرى تقوم هذه التعليمة بنسخ مستطيل بحجم الصورة من عنصر الكنفا إلى عنصر الكنفا نفسه وستكون<br />

النتيجة صورة بيضاء لأننا الخاصة<br />

التعليمة الأخيرة<br />

. CopyMode := cmWhiteness<br />

: Canvas.CopyMode := cmsrcCopy<br />

تعيد الخاصة<br />

CopyMode<br />

.<br />

لصق الرسومات من الحافظة<br />

:<br />

عملية لصق صورة من الحافظة هي عملية معاكسة لعملية نسخ صورة إلى الحافظة وتتم بالتعليمة التالية<br />

إلى قيمتها الافتراضية<br />

:


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

ولكن تظهر لدينا هنا المشكلة التالية<br />

أي برنامج تحرير نصوص<br />

http://www.alshater.net<br />

image1.Picture.Bitmap.Assign(clipboard) ;<br />

)<br />

:<br />

(<br />

تصور أن الحافظة تحوي عنصر نص<br />

قد تكون نقلت نص إلى الحافظة في<br />

وبالتالي ستكون التعليمة السابقة تطلب لصق نص فوق عنصر صورة الأمر الذي<br />

سيظهر رسالة خطأ ولذلك علينا فحص نوع المعلومات في الحافظة قبل إجراء عملية اللصق<br />

اكتب التعليمات التالية في حدث الضغط على الزر<br />

تعيد التعليمة<br />

:<br />

if Clipboard.HasFormat(cf_BITMAP) then<br />

image1.Picture.Bitmap.Assign(clipboard) ;<br />

.<br />

: Paste<br />

(CF_BITMAP) HasFormat إذا كانت هناك صورة في الحافظة<br />

بهذا نكون قد انهينا برنامج الرسم وسننتقل الآن للتعامل مع الوسائط المتعددة<br />

: في <strong>دلفي</strong> ( الملتميديا )<br />

برمجة الأوساط المتعددة<br />

:<br />

إن مصطلح الأوساط المتعددة يشير إلى أي شكل من أشكال العروض المتحركة<br />

في الحاسب ،<br />

يستخدم العنصر<br />

( الأفلام )<br />

MediaPlayer<br />

ا تشغيل ملفات الأصوات<br />

مثال<br />

في الصفة System للتعامل مع الأوساط المتعدد في <strong>دلفي</strong><br />

:<br />

:<br />

: 1<br />

أبدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />

MediaPlayer وأعطه الخصائص التالية<br />

:<br />

C:\WINDOWS\MEDIA\ CHORD.WAV<br />

True<br />

Filename<br />

Autoopen<br />

والصوت والمستخدمة<br />

تحديد الملف الصوتي الذي سيعرضه<br />

العنصر<br />

إمكانية التشغيل التلقائي<br />

نفذ البرنامج واضغط على الزر الأخضر وستسمع الصوت إذا كانت أجهزة الصوت في حاسوبك جاهزة<br />

.<br />

مثال‎2‎ :<br />

تحديد الملف الصوتي أثناء التنفيذ<br />

:<br />

أضف زر وعنصر OpenDialog إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية<br />

عدل الخاصة<br />

:<br />

Filter للعنصر<br />

OpenDialog1 بحيث يعرض ملفات من الامتداد<br />

.WAV و الامتداد<br />

.MP3 فقط<br />

.<br />

أكتب التعليمة التالية في حدث الضغط على الزر<br />

التعليمة الأولى تعمل على إيقاف عمل العنصر<br />

MediaPlayer1.Close ;<br />

if openDialog1.Execute then begin<br />

MediaPlayer1.FileName := Opendialog1.FileName ;<br />

MediaPlayer1.Open ;<br />

end;<br />

MediaPlayer إذا كان يعرض ملف صوتي عند ضغط الزر .<br />

182


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

والتعليمة الأخرى تسند أسم ملف جديد إلى العنصر MediaPlayer ‏،أما التعليمة<br />

جعل العنصر فعالا ً ، نفذ البرنامج وحدد ملف ما واضغط على الزر الأخضر<br />

عرض ملفات الفيديو<br />

http://www.alshater.net<br />

Mediaplayer.Open فمهمتها<br />

.<br />

:<br />

لعرض ملفات الفيديو أضف العنصر<br />

Display القيمة<br />

Panel1 ‏،ثم عدل الخاصة<br />

Panel إلى النموذج السابق وأعط العنصر MediaPlayer في الخاصة<br />

Filter للعنصر<br />

OpenDialog1 بحيث يعرض ملفات<br />

.AVI و<br />

. .MPG و .DAT<br />

نفذ البرنامج الآن واضغط على الزر وحدد الملف<br />

واضغط على الزر<br />

Play وشاهد العرض<br />

سماع الصوت بدون استخدام العنصر<br />

ابدأ مشروعا ً جديدا ً وأضف إليه الزر<br />

أضف الوحدة MMSystem للقسم<br />

طبعا ً إذا كنت لا تملك غيره<br />

: (<br />

)<br />

C:\Program Files\Borland\<strong>Delphi</strong>6\Demos\CoolStuf\ speedis.avi<br />

.<br />

: MediaPlayer<br />

: SpeedButton<br />

Uses واكتب التعليمات التالية في الحدث<br />

OnMouseUP للعنصر<br />

SpeedButton<br />

PlaySound('C:\WINDOWS\MEDIA\DING.WAV',0,0)<br />

طبعا ً بإمكانك تحديد اسم الملف الذي تريد في الوسيط الأول .<br />

183


http://www.alshater.net<br />

27<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

التعامل مع الملفات<br />

ا نسخ ملف<br />

مثال<br />

:<br />

:<br />

:<br />

أنشئ صورة باستخدام برنامج الرسام واحفظها على القرص<br />

\:C باسم<br />

Test.Bmp وأنشأ المجلد<br />

وأبدأ مشروعا ً جديدا ً واكتب في حدث الضغط على زر التعليمات اللازمة لنسخ هذا الملف إلى المجلد<br />

الوسيط الأول<br />

الوسيط الثاني<br />

،C:\temp<br />

: C:\temp<br />

copyfile('c:\Test.bmp','c:\Temp\Test.bmp',False) ;<br />

. (<br />

:<br />

هو الملف المصدر<br />

: هو الملف الهدف<br />

)<br />

)<br />

الملف الذي سيتم نسخه<br />

أيضا ً تغير اسم الملف الهدق أي يمكن أن يكون الوسيط الثاني<br />

C:\test.bmp إلى الملف<br />

البيانات<br />

الملف الذي سيتم إنشاءه وسيكون نسخة عن الأصل في الملف الأول<br />

(<br />

.<br />

: الوسيط الثالث<br />

يمكن<br />

'C:\Temp\Des.bmp' وبهذا سيتم نسخ الملف<br />

C:\temp\des.bmp وبالتالي سيكون للملفين أسمين مختلفين ولكنهما سيحويان نفس<br />

في حال أعطيت هذا الوسيط القيمة<br />

True فإن التابع سيفشل في حال كان هناك ملف بنفس الأسم<br />

في المجلد الهدف وأما أن كانت قيمته False فهذا يعني أنه ستتم الكتابة فوق الملف الهدف إذا كان موجودا ً<br />

2 نقل ملف<br />

.<br />

:<br />

تقوم التعليمة التالية بنقل الملف من مكان إلى آخر مع إمكانية تغيير أسمه<br />

) :<br />

:<br />

أضف زر إلى المشروع السابق<br />

واكتب فيه التعليمة التالية<br />

Movefile('c:\temp\test.bmp','c:\movetest.bmp');<br />

الوسيط الأول هو الملف الأصل ، والوسيط الثاني هو الملف الهدف ، سيفشل التابع في حال كان الملف الأصل غير<br />

موجود أو في حال كان الملف الوجهة موجودا ً<br />

3 حذف ملف<br />

)<br />

ليس هناك هنا اكانية للكتابة فوق الملف<br />

. (<br />

:<br />

لحذف ملف ما استخدم التعليمة التالية<br />

DeleteFile('c:\movetest.bmp');<br />

:<br />

4 طرق أنشاء الملفات والتعامل معها في <strong>دلفي</strong><br />

:<br />

1<br />

ملفات <strong>لغة</strong> الباسكل<br />

:<br />

يمكنك إنشاء الملفات النصية والملفات محددة النوع والملفات غير محددة النوع<br />

)<br />

( Untyped File<br />

باستخدام التعليمات المعروفة في <strong>لغة</strong> تربو باسكل مثل(‏<br />

AssignFile و Reset و Rewrite و<br />

Readln و Writeln و<br />

ولكن تفضل الطرق الأخرى<br />

.<br />

2<br />

التعامل مع مقابض الملف في ويندوز<br />

.. CloseFile )، تعتبر هذه الطريقة غير متوافقة مع ويندوز ولكنها تعمل على أية حال<br />

: ( File Handles )<br />

ثم يتم التعامل مع هذا المقبض حيث تستدعي التوابع المستخدمة في هذه الحالة توابع<br />

وجميع هذه التوابع موجودة في الوحدة<br />

يتم تعين مقبض للملف عند إنشاءه أو فتحة ومن<br />

Windows Api لإتمام عملها<br />

.<br />

SysUtils<br />

184


http://www.alshater.net<br />

: File Streams ‏(معنى كلمة<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

3 ملفات ستريم<br />

Stream هو نهر أو جدول أو سيل ولا أعرف كيف أترجمها<br />

في هذه الحالة وقد جرت العادة بين المبرمجن الحديث عنها ب ستريم فيل (<br />

هذه الملفات من النوع TFileStream<br />

وهي ملفات تستطيع أن تخزن فيها أي نوع من البيانات كما يمكن أن تحفظ فيها بياناتك بطريقة مشفرة بحيث لا<br />

يستطيع أحد غيرك الإطلاع عليها تتعامل هذه الملفات مع النوعين TStream و TMemoryStream وهذا يمكنك<br />

من التعامل مع الذاكرة بشكل مباشر ويمكنك تحميل بياناتك إلى الذاكرة ومن ثم تخزينها في ملف أو يمكنك تحميلها<br />

بياناتك إلىالذاكرة ليتشارك عليها أكثر من جزء من برنامجك .<br />

: ( Working With File Handles<br />

التعامل مع الملفات عن طريق المقبض )<br />

سنوضح مثالا ً يبين طريقة التعامل مع هذه الملفات :<br />

:<br />

(<br />

أ الكتابة إلى )<br />

ملف في<br />

أكتب في حدث الضغط على زر التعليمات التالية<br />

في البداية نستخدم التعليمة<br />

:<br />

var FileHandle:integer;<br />

S:string;<br />

Begin<br />

if Not FileExists('c:\MyFile.mka') then<br />

FileHandle:= FileCreate('c:\MyFile.mka') Else<br />

FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;<br />

s:= 'khaled Nassr Agha' ;<br />

FileWrite(FileHandle,Pointer(s)^,length(s ));<br />

Fileclose(FileHandle);<br />

end;<br />

FileExists التي تعيد القيمة<br />

True في حال كان الملف موجودا ً وفي حال عدم وجود<br />

، FileHandle أما<br />

الملف نستخدم التابع<br />

FileCreate التي ينشأ الملف ويعيد رقم مقبض هذا الملف في المتحول<br />

في حال وجود الملف سابقا ً فنستخدم التابع<br />

FileOpen الذي يقوم بفتح الملف ويعيد رقم مقبض هذا الملف في<br />

المتحول<br />

، FileHandle والوسيط الثاني fmOpenReadWrite هو أحد القيم التي يأخذها هذا الملف ويعني انه<br />

سنستخدم الملف للقراءة والكتابة وهناك عدة قيم أخرى راجع ملفات المساعدة للحصول على<br />

معلومات عنها.‏<br />

FileHandle وبطول<br />

التابع<br />

FileWrite يقوم بكتابة القيمة<br />

S والتي هي من نوع مؤشر في الملف ذو المقبض<br />

المتحول الثالث والذي يشير هنا إلى طول السلسلة . S<br />

.<br />

التعليمة الأخيرة<br />

FileClose تقوم بإغلاق الملف المفتوح<br />

ب القراءة من ملف :<br />

أضف عنصر<br />

Memo و زرا ً<br />

جديدا ً واكتب في حدث الضغط عليه التعليمات التالية<br />

:<br />

var FileHandle,FileSize : integer;<br />

s:string;<br />

begin<br />

if FileExists ('c:\MyFile.mka') then begin<br />

FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;<br />

185


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

للتنقل ضمن الملف تستخدم التعليمة<br />

و Offset مقدار الإزاحة عن<br />

http://www.alshater.net<br />

FileSize:=getfilesize(FileHandle,nil);<br />

setlength(s,FileSize);<br />

Fileread(FileHandle,pointer(s)^,FileSize);<br />

Memo1.Text := s;<br />

Fileclose(FileHandle);<br />

end;<br />

: SeekFile ( Handle, Offset ,origin)<br />

Origin ويأخذ<br />

Origin القيم التالية<br />

:<br />

حيث Handle هو مقبض الملف<br />

186<br />

0<br />

يتم اعتبار الإزاحة Offset من أول الملف<br />

.<br />

1<br />

يتم اعتبار الإزاحة Offset من موقع المؤشر الحالي<br />

.<br />

2<br />

يتم اعتبار الإزاحة Offset من آخر الملف<br />

.<br />

م ثلا ً التعليم ة SeekFile(FileHandle,0,0) ت ضع مؤش ر المل ف ف ي بداي ة المل ف و التعليم ة<br />

Seekfile(FileHandle,12,2) تضع مؤشر الملف على بعد 12 حرف من آخر الملف<br />

.<br />

الملفات ستريم : File Stream<br />

سنأخذ مثالا ً بسيطا ً عن كيفية أنشاء هذا النوع من الملفات زمن القراءة والكتابة إليها<br />

إنشاء ملف من النوع TFileStream والكتابة إليه<br />

:<br />

:<br />

أضف زر إلى نموذج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />

التعليمة<br />

TFileStream.Create تنشأ الملف<br />

:<br />

Var FileStream : TFileStream ;<br />

buffer : String;<br />

begin<br />

FileStream := TFileStream.Create('c:\MyStream.tst',fmCreate) ;<br />

Buffer := ' This Line Will Be Save to File ' ;<br />

FileStream.Write(pointer(Buffer)^,Length(Buffer));<br />

FileStream.Free ;<br />

end;<br />

MyStream.Tst على القرص<br />

C أما الوسيط<br />

بإنشاء الملف إذا لم يكن موجدا ً وفي حال كان موجودا ً يفتح الملف في وضع للكتابة فقط<br />

التعليمة<br />

التعليمة<br />

القراءة من ملف<br />

.<br />

: FileStream.Write<br />

تقوم بكتابة النص في المتحول<br />

)<br />

Buffer<br />

لا تتعامل إلا مع المؤشرات<br />

fmCreate فإنه يقوم<br />

(<br />

: FileStream.Free<br />

تقوم بتحرير المتحول FileStream وإغلاق الملف المرتبط معه<br />

.<br />

: TFileStream<br />

أضف عنصر Memo إلى النموذج السابق واكتب التعليمات التالية في حدث الضغط على زر جديد<br />

:<br />

Var FileStream : TFileStream ;<br />

buffer : String;<br />

FileSize : integer;<br />

begin<br />

FileStream := TFileStream.Create('c:\MyStream.tst',fmOpenRead) ;<br />

FileSize := (FileStream.size );


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

قمنا اولا ً بفتح الملف للقراءة فقط في التعليمة<br />

الملف وأعطينا المتحول<br />

Buffer ووضعنا النتيجة في العنصر<br />

http://www.alshater.net<br />

Setlength(Buffer,FileSize);<br />

FileStream.read(pointer(Buffer)^,FileSize);<br />

memo1.text := Buffer;<br />

FileStream.Free ;<br />

end;<br />

Create ومن ثم استخدمنا التعليمة<br />

Buffer حجم هذا الملف عن طريق التعليمة<br />

. Memo1<br />

FileStream.Size لتحديد حجم<br />

SetLength ثم قرأنا من الملف إلى المتحول<br />

( Origin<br />

: ملاحظات<br />

التعليمة 1<br />

راجع الوسيط<br />

: FieStream.Seek<br />

Origin للتعليمة<br />

تقوم التعليمة Seek لنقل مؤشر الملف لمسافة محددة تبعا ً للوسيط<br />

SeekFile للإطلاع أكثر على وسطاء هذه التعليمة<br />

.(<br />

معلومات مفيدة<br />

187<br />

:<br />

ا تشغيل برنامج آخر من داخل برنامجك<br />

:<br />

بفرض أنك تريد تستدعي برنامج الآلة الحاسبة ضمن برنامج<br />

الملف<br />

:<br />

من المعلوم أن برنامج الحاسبة يتم تنفيذة عن طريق<br />

Calc.exe الموجود ضمن فهرس الويندوز ولاستدعاء هذا البرنامج من برنامج اكتب التعليمة التالية في<br />

حدث الضغط على زر<br />

WinExec('C:\Windows\Calc.exe' ,Sw_Show) ;<br />

:<br />

تقوم هذه التعليمة بإظهار بتشغيل برنامج الآلة الحاسبة .<br />

: ملاحظة<br />

تفترض هذه التعليمة أن مجلد الويندوز على جهازك هو<br />

عند تنصيب Windows 98 وMe Windows أما الفهرس الافتراضي ل<br />

C:\Windows وهذا يحصل بشكل افتراضي<br />

Windows و Windows 2000<br />

Xp فهو<br />

التعليمة<br />

C:\Win32 وكما تعلم يمكن للمستخدم تغير هذه الفهارس أثناء تنصيب نظام التشغيل لذلك تستخدم عادة<br />

GetWindowsDirectory<br />

للوصول إلى فهرس نظام التشغيل مثال<br />

GetWindowsDirectoy<br />

:<br />

;(200,p) حيث<br />

GetMem(p,200)<br />

p من النوع<br />

Pchar وسيكون فيه اسم مجلد الويندوز<br />

قبل هذه التعليمة والتعليمة<br />

2 تشغيل ملف تابع لبرنامج آخر من برنامج<br />

)<br />

FreeMem(p,200) بعدها .<br />

:<br />

بقرض أنك تريد من برنامجك أن يشغل برنامج مايكروسوفت وورد<br />

لتحقيق ذلك استخدم التعليمات التالية<br />

( Microsoft Word )<br />

:<br />

لاتنس استخدام التعليمة<br />

أضف أولا ً الوحدة ShellApi إلى القسم Uses ومن ثم أكتب التعليمة التالية في حدث الضغط على زر<br />

ويعرض أحد الملفات<br />

.<br />

shellapi.ShellExecute(0 ,'Open','C:\My Documents\Test.doc',Nil,Nil,0) ;<br />

تقوم هذه التعليمة بفتح الملف Test.doc الموجود في المجلد<br />

إذا أردت من برنامجك فتح الملف وطباعته مباشرة استبدل الوسيط<br />

. My Document<br />

. 'Print' بالوسيط 'Open'


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تقوم هذه التعليمة بالعودة إلى بيئة ويندوز لمعرفة البرنامج الافتراضي الذي تستخدمه لفتح هذا النوع الملفات ومن<br />

ثم تقوم بتشغيل البرنامج وفتح الملف بداخله فإذا اخترت استخدمت في التعليمة الملف C:\Mypicture.jpg ستقوم<br />

التعليمة التعليمة بالبحث عن البرنامج الافتراضي الذي يفتح هذا النوع من الصور فقد يكون فوتوشوب أو Internet<br />

. Explorer<br />

استخدام التعليمة السابقة لفتح مجلد ما :<br />

إذا أردت فتح مجلد ما في مستكشف ويندوز أكتب التعليمة التالية<br />

تقوم التعليمة السابقة بفتح مجلد<br />

:<br />

shellapi.ShellExecute(0 ,'Open','C:\My Documents',Nil,Nil,0) ;<br />

. C:\My Document<br />

188


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

الجلسة<br />

برنامج المفكرة<br />

http://www.alshater.net<br />

27<br />

:<br />

سنقوم الآن بكتابة برنامج يشابه برنامج المفكرة في ويندوز<br />

( Notepad )<br />

ويختلف عنه بأنه سيتعامل مع ملفات<br />

من النوع Rtf بالإضافة إلى الملفات ، Txt كما أنه سيكون من النوع MDI بحيث يمكننا أن نفتح أكثر من ملف<br />

. بنفس الوقت<br />

أبدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />

MainMenu والعنصر<br />

:<br />

عنصر النموذج<br />

الخاصة<br />

: Form1<br />

bdRightToLeft<br />

BiDiMode<br />

Caption<br />

FormStyle<br />

Name<br />

Position<br />

عنصر القائمة<br />

أعط الزر ‏(ملف<br />

برنامج المفكرة<br />

fsMDIForm<br />

MainForm<br />

poDesktopCenter<br />

: MainMenu<br />

أنشئ في هذا العنصر القائمة<br />

)<br />

OpenDialog وأعط الخصائص التالية للعناصر<br />

القيمة<br />

) والقائمة ( ملف<br />

)<br />

): إطار<br />

(<br />

قيمة الخاصة<br />

‏&جديد<br />

‏&فتح<br />

‏&خروج<br />

في الخاصة<br />

أعط الزر ‏(إطار)‏ في الخاصة<br />

قيمة الخاصة<br />

ترتيب<br />

تتالي<br />

FileMenu وأضف إليه الأوامر<br />

: التالية ( الأزرار<br />

Name القيمة<br />

Caption<br />

New<br />

قيمة الخاصة<br />

Name<br />

قيمة الخاصة<br />

Shortcut<br />

OpenFile<br />

CloseApp<br />

Name القيمة<br />

Window1 وأضف إليه الأوامر<br />

: التالية ( الأزرار )<br />

Caption<br />

قيمة الخاصة<br />

Name<br />

قيمة الخاصة<br />

Shortcut<br />

-<br />

العنصر<br />

: OpenDialog1<br />

.rtf<br />

DefaultExt<br />

Filter<br />

ضع في الخاصة Filter الأسطر التالية<br />

:<br />

Filter Name<br />

Filter<br />

Rich Text<br />

*.rtf<br />

Text File<br />

*.Txt<br />

All File<br />

*.*<br />

احفظ الوحدة باسم Main.pas والمشروع باسم<br />

. MyTextEditor.Dpr<br />

189


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

أضف إلى المشروع نموذجا ً جديد ًا File New Form وأضف أليه العناصر التالية<br />

و عنصر RichText من الصفحة<br />

أعط النموذج الجديد الخصائص التالية<br />

http://www.alshater.net<br />

MainMenu :<br />

190<br />

عنصر<br />

.FontDialog وعنصر PrintDialog و SaveDialog وعنصر Win32<br />

:<br />

bdRightToLeft BiDiMode<br />

fsMDIChild FormStyle<br />

EditForm Name<br />

أنشئ في العنصر MainMenu1 ثلاث قوائم باسم<br />

حسب الجدول التالي<br />

أعط الزر ‏(ملف<br />

قيمة الخاصة<br />

‏&جديد<br />

‏&فتح<br />

حفظ<br />

حفظ باسم<br />

طباعة<br />

إغلاق<br />

‏&خروج<br />

( تنسيق ) و ( تحرير ) و ( ملف )<br />

:<br />

(<br />

أعط الزر ‏(تحرير<br />

قيمة الخاصة<br />

نسخ<br />

قص<br />

لصق<br />

تحديد الكل<br />

أعط الزر ‏(تنسيق<br />

في الخاصة<br />

Name القيمة<br />

FileMenu وأضف إليه الأوامر<br />

( الأزرار )<br />

وأنشئ في كل منها أزرار<br />

: التالية<br />

Caption<br />

قيمة الخاصة<br />

Name<br />

قيمة الخاصة<br />

Shortcut<br />

New<br />

OpenFile<br />

Ctrl+S<br />

Save<br />

SaveAs<br />

PrintFile<br />

CloseFile<br />

CloseAll<br />

في الخاصة (<br />

EditMenu القيمة Name<br />

وأضف إليه الأوامر<br />

: التالية ( الأزرار )<br />

Caption<br />

قيمة الخاصة<br />

Name<br />

قيمة الخاصة<br />

Shortcut<br />

Ctrl+C<br />

CopyText<br />

Ctrl+X<br />

Cuttext<br />

Ctrl+V<br />

PasteText<br />

Ctrl+A<br />

SelectAll<br />

(<br />

قيمة الخاصة<br />

محاذاة إلى اليسار<br />

محاذاة إلى اليمين<br />

محاذاة إلى الوسط<br />

في الخاصة<br />

EditMenu القيمة Name<br />

وأضف إليه الأوامر<br />

: التالية ( الأزرار )<br />

Caption<br />

Left1<br />

قيمة الخاصة<br />

Name<br />

قيمة الخاصة<br />

Shortcut<br />

Right1<br />

Center1<br />

WordWrap1<br />

Font1<br />

-<br />

التفاف تلقائي<br />

خط<br />

حدد الأزرار الثلاثة الأولى من القائمة تنسيق وأعطها في الخاصة RadioItem القيمة True هذا سيجعلها تبدو


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

كأزرار الراديو ولا يمكن اختيار إلا واحد منها في ذات الوقت<br />

أعط العنصر Richedit1 الخصائص التالية<br />

http://www.alshater.net<br />

.<br />

:<br />

alClient<br />

Editor<br />

Align<br />

Name<br />

أعط العنصر Savedialog1 الخصائص التالية<br />

:<br />

.rtf<br />

DefaultExt<br />

Filter<br />

ضع في الخاصة<br />

Filter الأسطر التالية<br />

Filter Name<br />

Rich Text<br />

Text File<br />

:<br />

Filter<br />

*.rtf<br />

*.Txt<br />

_<br />

احفظ البرنامج وسمي الوحدة الجديدة باسم<br />

EditText.pas<br />

اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج : MainForm<br />

TEditForm.Create(Self);<br />

الوسيط Self وسيط معرف يعود إلى النموذج الذي يطلب فيه هذا الوسيط<br />

.<br />

- اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج :EditForm<br />

TEditForm.Create(Self);<br />

- في الحدث OnClose للنموذج EditForm اكتب التعليمة التالية<br />

Action := CaFree ;<br />

CaMinimized حيث<br />

:<br />

تمكننا هذه التعليمة من إغلاق النافذة الابن وتكون قيمتها الافتراضية في النموذج الابن هي<br />

يتم تصغير النموذج الابن بدلا ً من إغلاقه عند الضغط على الزر إغلاق<br />

عندما يقوم المستخدم بالضغط على الزر فتح من القائمة<br />

ابن جديدة وسنقوم تحميل الملف إلى العنصر<br />

الملف الذي نفتحه<br />

.<br />

)<br />

سواء في النافذة الأب أو الابن<br />

(<br />

( TrichEdit ) Editor<br />

.<br />

قبل البدء بكتابة التعليمات الخاصة بفتح ملف سنقوم بتعريف ما يلي<br />

عرف المتحول PathName من النوع String في القسم<br />

:<br />

سنقوم بإنشاء نافذة<br />

، كما سنغير عنوان النافذة ليكون باسم<br />

. EditText للوحدة Private<br />

عرف الثابت _<br />

const<br />

‏;'بدون عنوان'‏ = DefaultFileName<br />

:<br />

_<br />

أضف تعريف الإجراء التالي في القسم<br />

: EditText<br />

Procedure Open(const AFileName: string);<br />

public للوحدة<br />

ضع مؤشر لوحة المفاتيح عند السطر السابق واضغط الأزرار Ctrl+Alt+C سيتم عندها إضافة التابع السابق<br />

إلى القسم<br />

، Implementation اكتب التعليمات التالية في جسم التابع<br />

:<br />

PathName := AFileName;<br />

191


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

التابع<br />

http://www.alshater.net<br />

Caption := ExtractFileName(AFileName);<br />

with Editor do<br />

begin<br />

Lines.LoadFromFile(PathName);<br />

SelStart := 0;<br />

Modified := False;<br />

end;<br />

.<br />

: ExtractFileName ( AFileName)<br />

التعليمات ضمن الكتلة<br />

يعيد اسم الملف مع امتداده وبدون ذكر المسار<br />

End; With Editor Do begin …. تكافئ التعليمات :<br />

Editor.Lines.LoadFromFile(PathName);<br />

Editor.SelStart := 0;<br />

Editor .Modified := False;<br />

أي أننا نستخدم التعليمة Width لنتخلص من ذكر العنصر في كل سطر من سطور البرنامج .<br />

التعليمة =: 0 Editor.selstart ضع مؤشر التحرير للعنصر Editor في بداية الملف<br />

التعليمة Editorr.Modified تأخذ القيمة<br />

.<br />

True في<br />

حال عدل المستخدم في أي نقطة من الملف المفتوح<br />

في حدث الضغط على الزر فتح في القائمة ملف للنموذج MainForm اكتب التعليمة التالية<br />

.<br />

:<br />

If OpenDialog1.Execute Then<br />

TeditForm.Create(Self).Open(OpenDialog1.FileName ) ;<br />

تقوم التعليمة بعد Then بإنشاء نافذة جديدة ومن ثم طلب تنفيذ الإجراء Open الذي كتبناه سابقا ً .<br />

في حدث الضغط على الزر فتح في القائمة ملف للنموذج EditForm اكتب التعليمة التالية<br />

:<br />

MainForm.Openfile.Click ;<br />

_<br />

الحدث<br />

عند إنشاء ملف جديد سنعطي عنوان النافذة التي تفتح هذا الملف اسم افتراضي لذلك اكتب التعليمات التالية<br />

: EditForm للنموذج OnCreate<br />

أي أن المتحول PathName سيدل على الاسم الافتراضي للملف الجديد<br />

حفظ الملف<br />

العنصر<br />

بامتداد<br />

في<br />

PathName := DefaultFileName;<br />

.<br />

:<br />

Editor وهو من النوع<br />

rtf أو بالامتداد<br />

TRichEdit يقوم بحفظ الملفات بامتداد<br />

Txt لذلك سنستخدم متحول من النوع<br />

rtf فقط وعلى برنامجنا حفظ الملف<br />

Tstrings لنقل أسطر العنصر<br />

حفظ أسطر هذا المتحول على ملف ‏÷ذا طبعا ً عند اختيار المستخدم حفظ الملف بالامتداد<br />

. .Txt<br />

في حدث الضغط على الزر حفظ في القائمة ملف للنموذج EditForm اكتب التعليمات التالية<br />

Editor إليه ومن ثم<br />

:<br />

var S: Tstringlist;<br />

begin<br />

if PathName = DefaultFileName then<br />

SaveAsClick(Sender)<br />

else<br />

begin<br />

if uppercase(rightstr(PathName,3)) = uppercase( 'rtf' ) then<br />

Editor.Lines.SaveToFile(PathName) else<br />

try<br />

192


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تقوم التعليمات السابقة بفحص المتحول<br />

PathName فإذا كانت قيمته هي القيمة الافتراضية أي<br />

http://www.alshater.net<br />

S:=Tstringlist.Create ;<br />

s.AddStrings(Editor.Lines )<br />

finally<br />

s.SaveToFile(PathName) ;<br />

end;<br />

Editor.Modified := False;<br />

end;<br />

‏"بدون عنوان"‏<br />

يعني أن الملف جديد ولم يتم حفظه سابقا ً ‏،مما يستدعي طلب التعليمات التي تنفذ عند الضغط على حفظ باسم أما أذا<br />

كان PathName لا يساوي القيمة الافتراضية مما يدل أن للملف مسار وأسم محددين وسندرس هنا احتمالين<br />

1 أن يكون امتداد الملف هو rtf وبالتالي ننفذ التعليمة<br />

واضح أن الشرط الذي يسبق هذه التعليمة يقارن الأحرف الثلاثة الأخيرة في المتحول<br />

بعد تحويل القيمتين على أحرف كبيرة<br />

)<br />

:<br />

Editor.Lines.SaveToFile(PathName)<br />

PathName مع القيمة<br />

'rtf'<br />

.<br />

2<br />

أن يكون امتداد الملف هو Txt وبالتالي ننشئ المتحول S من النوع TStringList وننقل أسطر العنصر<br />

Editor إليه ومن ثم نحفظه ، ثم نعيد القيمة<br />

الحفظ الأخير<br />

False للخاصة<br />

.<br />

حفظ الملف باسم<br />

:<br />

Editor.Modified أي أن الملف لم يتم تعديله بعد<br />

اكتب التعليمات التالية في حدث الضغط على الزر حفظ في القائمة ملف للنموذج : EditForm<br />

SaveDialog1.FileName := PathName;<br />

if SaveDialog1.Execute then<br />

begin<br />

PathName := SaveDialog1.FileName;<br />

Caption := ExtractFileName(PathName);<br />

SaveClick(Sender);<br />

end;<br />

التعليمة الأولى تجعل صندوق الحوار حفظ باسم أن يظهر الاسم الحالي للملف كاسم افتراضي والتعليمات التالية<br />

تقوم بوضع اسم الملف الذي اختاره المستخدم في صندوق الحوار حفظ باسم في المتحول<br />

عنوان النافذة ليأخذ اسم الملف الجديد ‏.ومن ثم تستدعي الإجراء<br />

الامتداد الذي اختاره المستخدم<br />

إغلاق الملف<br />

PathName وتغير<br />

) Sender SaveClick ( ليتم حفظ الملف وفق<br />

.<br />

:<br />

اكتب التعليمة التالية في حدث الضغط على الزر إغلاق في القائمة ملف للنموذج : EditForm<br />

الخروج من البرنامج<br />

Close;<br />

:<br />

اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذجMainForm‏:‏<br />

Close;<br />

193


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذج : EditForm<br />

MainForm.CloseApp.Click ;<br />

يتم إغلاق جميع النوافذ الأبناء عند إغلاق النموذج الأب .<br />

أمامنا الآن مشكلة جديدة ، افرض أن المستخدم قد عدل الملف ثم ضغط على الزر إغلاق بدون حفظ الملف ،<br />

سيقوم البرنامج في هذه الحالة بإغلاق الملف دون حفظ ولذلك علينا إظهار رسالة حوار تسأل المستخدم إذا كان<br />

يريد أن يحفظ الملف أم لا .<br />

اكتب التعليمة التالية في حدث الضغط على الحدث<br />

: EditForm للنموذج OnCloseQuery<br />

Const<br />

‏;'هل تريد حفظ التغيرات المدخلة على الملف'‏ = SWarningText<br />

begin<br />

if Editor.Modified then<br />

begin<br />

case MessageDlg(Format(SWarningText + #13 + '%s', [PathName]), mtConfirmation,<br />

[mbYes, mbNo, mbCancel], 0) of<br />

mrYes: SaveClick(Self);<br />

mrCancel: CanClose := False;<br />

end;<br />

end;<br />

end;<br />

يتم تنفيذ الحدث OnCloseQuery عندما يضغط المستخدم على زر إغلاق وقبل أن يتم إغلاق النموذج ويجود مع<br />

هذا الحدث الوسيط<br />

CanClose والذي يأخذ قيمة افتراضية<br />

True ‏،وعند إعطاءه القيمة<br />

False يرفض البرنامج<br />

إغلاق النافذة .<br />

نفحص عندها المتحول<br />

Editor.Modified ‏(الذي يأخذ القيمة<br />

True إذا قام المستخدم بإجراء أي تعديل على<br />

:<br />

الملف (<br />

، وعندها نظهر صندوق حوار يسأل المستخدم إذا كان يريد حفظ الملف وهذا الصندوق ذو ثلاث أزرار<br />

. SaveClick إذا ضغط المستخدم على هذا الزر فإنه يريد حفظ الملف ونستدعي عندها التابع : Yes<br />

: No إذا ضغط المستخدم على هذا الزر فإنه لا يريد حفظ الملف وسيتم إغلاق النافذة .<br />

CanClose إذا ضغط المستخدم على هذا الزر فإنه لا يريد إغلاق الملف وبالتالي نغير قيمة الوسيط : Cancel<br />

.<br />

إلى<br />

False وبالتالي لن يستجيب البرنامج لحدث الضغط على الزر إغلاق<br />

الرمز<br />

#13 في التابع<br />

MessageDlg يجعل اسم الملف يظهر في السطر الثاني من الرسالة ، هذا يكافئ كتابة نص<br />

.<br />

الرسالة ومن ثم الضغط على زر<br />

Enter ومن ثم كتابة اسم الملف<br />

برمجة القائمة تحرير :<br />

Editor.CopyToClipboard;<br />

Editor.CutToClipboard;<br />

اكتب التعليمة التالية في حدث الضغط على الزر نسخ في القائمة تحرير<br />

اكتب التعليمة التالية في حدث الضغط على الزر قص في القائمة تحرير<br />

اكتب التعليمة التالية في حدث الضغط على الزر لصق في القائمة تحرير<br />

:<br />

:<br />

:<br />

194


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

Editor.PasteFromClipboard;<br />

اكتب التعليمة التالية في حدث الضغط على الزر تحديد الكل في القائمة تحرير :<br />

Editor.SelectAll;<br />

من الواضح أن الزرين نسخ و قص يجب أن يكونا غير فعالين إذا لم يحدد المستخدم نصا ً ما في العنصر ، Editor<br />

كما أن الزر لصق يجب أن يكون غير فعال في حال كانت الحافظة فارغة<br />

لتحقيق ذلك أكتب التعليمات التالية في حدث الضغط على الزر تحرير<br />

وأضف الوحدة ClipBrd إلى القسم<br />

المنهج<br />

حرف<br />

SelLength يعيد عدد الأحرف المحددة في العنصر<br />

)<br />

أو في حال كانت فيها صورة<br />

، (<br />

:<br />

Copytext.Enabled := editor.SelLength > 0;<br />

Cuttext.Enabled := editor.SelLength > 0;<br />

Pastetext.Enabled := clipboard.HasFormat(CF_text);<br />

. EditForm في للوحدة uses<br />

.<br />

برمجة القائمة تنسيق<br />

:<br />

اكتب في حدث الضغط على الزر محاذاة إلى اليسار التعليمات التالية<br />

ثم حدد الزرين<br />

Editor وهي تساوي الصفر إذا لم يحدد المستخدم أي<br />

:<br />

with Sender as TMenuItem do Checked := True;<br />

with Editor.Paragraph do<br />

if Left1.Checked then<br />

Alignment := taLeftJustify<br />

else if Right1.Checked then<br />

Alignment := taRightJustify<br />

else if Center1.Checked then<br />

Alignment := taCenter;<br />

OnClick في<br />

(<br />

)<br />

محاذاة إلى اليمين<br />

(<br />

و(محاذاة إلى اليسار<br />

الصفحة Event من محرر الخواص واختر من القائمة<br />

ثم أضغط على السهم المجاور للحدث<br />

. Left1Click<br />

اكتب التعليمة التالية في حدث الضغط على الزر التفاف تلقائي<br />

:<br />

with Editor do<br />

begin<br />

WordWrap := not WordWrap; { toggle word wrapping }<br />

if WordWrap then<br />

ScrollBars := ssVertical<br />

else<br />

ScrollBars := ssBoth;<br />

WordWrap1.Checked := WordWrap; { set menu item check }<br />

end;<br />

اكتب التعليمات التالية في حدث الضغط على الزر خط :<br />

FontDialog1.Font := Editor.Font;<br />

if FontDialog1.Execute then<br />

Editor.SelAttributes.Assign(FontDialog1.Font);<br />

195


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

يتميز العنصر RichEdit عن العنصر<br />

Memo بإنه يمكن تحديد نمط خط لكل سطر أي أنه يمكن تنسيق النص<br />

.<br />

المكتوب بداخله على عكس العنصر<br />

Memo الذي يمكنك استخدام خط وتنسيق واحد لكل الأسطر<br />

.TRichEdit<br />

والمنهج<br />

SelAttributes يعطيك أمكانية التحكم بتنسيق السطر المحدد في العنصر<br />

)<br />

برمجة القائمة إطار في النموذج : MainForm<br />

في البداية تلاحظ أن هذه القائمة لن تظهر أثناء تنفيذ البرنامج إذا كان أحد الأبناء ظاهرا ً<br />

أغلق جميع النوافذ الأبناء<br />

المفتوحة ولاحظ ظهور القائمة إطار من جديد (<br />

هذا يحدث لأن قائمة النموذج الابن تأخذ مكان قائمة النموذج الأب<br />

:<br />

وإذا أردنا إظهار قوائم النموذج الأب بجوار قوائم النموذج الابن علينا استخدام ما يدعى بدمج القوائم ولتحقيق ذلك<br />

. GroupIndex<br />

افتح محرر القوائم في النموذج الأب وحدد الزر إطار ثم اكتب القيمة<br />

1 في الخاصة<br />

لاحظ أن جميع قوائم النافذة الابن تأخذ القيمة الافتراضية<br />

0 في هذه الخاصة وإذا أعطيت القيمة<br />

1 لأحد هذه القوائم<br />

GroupIndex فإنها<br />

فإنها ستأخذ مكان القائمة إطار ، أما إذا أعطيت أحد قوائم النافذة الاين القيمة<br />

2 في الخاصة<br />

ستظهر بعد القائمة إطار .<br />

.<br />

إذا ً الخاصة<br />

GroupIndex تستخدم لدمج وترتيب القوائم بين النموذج الأب والنماذج الأبناء<br />

اكتب التعليمة التالية في حدث الضغط على الزر ترتيب الكل في القائمة إطار<br />

تقوم هذه التعليمة بترتيب النوافذ الأبناء بشكل أفقي<br />

:<br />

MainForm.Tile<br />

.<br />

)<br />

عليك أن تفتح أكثر من نافذة ابن لتلاحظ النتائج<br />

MainForm.Cascade;<br />

اكتب التعليمة التالية في حدث الضغط على الزر تتالي الكل في القائمة إطار:‏<br />

تقوم هذه التعليمة بصف النوافذ فوق بعضها البعض<br />

.<br />

إظهار أسماء النوافذ الأبناء ضمن القائمة إطار :<br />

عند<br />

الضغط على القائمة إطار في برنامج الوورد تظهر في نهاية القائمة أسماء جميع ملفات النصوص المفتوحة<br />

ولتحقيق ذلك في برنامجنا حدد النموذج MainForm ثم اذهب إلى الخاصة<br />

WindowsMenu وأعطاها القيمة<br />

اسم زر القائمة إطار<br />

، نفذ البرنامج الآن وافتح أكثر من ملف<br />

واضغط على القائمة إطار ستلاحظ<br />

(<br />

) Window1<br />

ظهور أسماء جميع هذه الملفات في القائمة الإطار ويمكنك التنقل بين هذه الملفات عن طريق الضغط على اسم<br />

الملف في هذه القائمة .<br />

أحفظ البرنامج الآن وانتقل إلى الخطوة التالية وهي عمل برنامج تنصيب<br />

لتوزيع برنامج المفكرة<br />

.<br />

( Setup<br />

)<br />

196


http://www.alshater.net<br />

:<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

البرنامج<br />

Install Shelled Express<br />

بعد أن يصبحك برنامجك جاهزا ً وخاليا ً من الأخطاء عليك أن تحضره ليعمل على أي حاسب وبأسهل طريقة<br />

ممكنة،‏ فليس من المعقول أن يكون المبرمج موجودا ً لتنصيب البرنامج على عند كل مستخدم للبرنامج لذلك جرت<br />

العادة على استخدام معالجات تنصيب<br />

وهي عبارة عن مجموعة من صناديق الحوار تسأل المستخدم عن مسار<br />

البرنامج وال<strong>لغة</strong> المستخدمة ومكان وضع الاختصارات .....<br />

تستطيع أن تكتب برنامج التنصيب بنفسك فهو في النهاية عبارة عن نسخ ملفات من قرص مرن أو قرص ليزري<br />

إلى الحاسب ولكن هناك برامج مختصة بهذه العملية ، ويأتي مع قرص <strong>دلفي</strong> البرنامج Install Shelled Express<br />

وهو نسخة مجانية من البرنامج Install Shelled Professional ولكنه يفي بالغرض .<br />

سنشرح الآن بشكل سريع البرنامج Install Shelled Express<br />

عمل برنامج تنصيب لبرنامج المفكرة :<br />

عليك أولا ً تنصيب البرنامج<br />

Install Shelled Express من قرص <strong>دلفي</strong> ومن تشغيله من القائمة<br />

:<br />

Start Program IntallShelled Express – Borland Limited Edition .<br />

تظهر عندها نافذة اختر منها : Create new project<br />

في الصندوق Project name and location أكتب C:\My Documents\MySetups\MyNotpad.ism ثم<br />

اضغط على الزر . Create<br />

تظهر عندها نافذة تتألف من نافذة تحوي شجرة على اليسار وتظهر في النافذة اليمنى خصائص الفرع المختار من<br />

هذه الشجرة .<br />

:<br />

اختر<br />

General Information من الشجرة فستظهر الخصائص التالية في النافذة المجاورة<br />

هناك بعض الخواص الواضحة<br />

والتي ليست بحاجة إلى شرح<br />

لذلك سأشرح أكثر الخصائص<br />

أهمية :<br />

: INSTALLDIR تحدد هذه<br />

الخاصة المجلد الافتراضي<br />

الذي سيتم فيه تنصيب<br />

البرنامج بالضغط على هذه<br />

الخاصة تظهر القيم التي يمكن<br />

أن تأخذها هذه الخاصة،‏ كما<br />

يمكنك كتابة المجلد الذي تريد<br />

لتنصيب برنامجك داخله .<br />

تحدد هذه الخاصة اسم البرنامج وسيظهر اسم البرنامج عند بداية التنصيب<br />

.<br />

: Product Name<br />

197


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اختر Setup Types من الشجر ة اليسارية فتظهر نافذ على اليسار تستخدم لتحديد نوع التنصيب وهناك ثلاث<br />

أنواع عادة لتنصيب الملف وهي إما تنصيب نموذجي<br />

أو تنصيب اصغري<br />

( Minimal أو تنصيب<br />

)<br />

( Typical<br />

)<br />

مخصص<br />

( Custom تتحكم طرق التنصيب بالملفات التي سيتم نسخها إلى الحاسب وبما أن برنامجنا مؤلف من<br />

)<br />

.<br />

ملف واحد فلا حاجه لأن يكون هناك ثلاث أنوا من التنصيب لذلك اختر فقط<br />

Typical من النافذة<br />

اختر<br />

Files من الشجرة تظهر عندها أربع نوافذ متجاور إلى في النافذة اليسرى ، سنحدد هنا الملفات التي سيتم<br />

نسخها إلى القرص الصلب وهي ملفات التي يحتاجها البرنامج<br />

) معظم البرامج المكتوبة با<strong>لغة</strong> <strong>دلفي</strong> لا تحتاج إلا إلى<br />

الملف ذو الامتداد<br />

.Exe إلا إذا كان برنامجك يتعامل مع ملفات خارجية،‏ كملفات صور أو نصوص أو صوت أو<br />

قاعدة بيانات ...<br />

اضغط بزر الفأرة اليميني على<br />

Destination Computer في النافذة اليسرى في الأسفل ستظهر لك قائمة حدد<br />

منها ، INSTALLDIR حدد بعدها الفهرس الذي حفظت فيه برنامج المفكرة في النافذة Source Computer's<br />

. Folder<br />

Destination إلى النافذة Source Computer's Files<br />

ثم أنقل الملف من<br />

TextEditor.Exe من النافذة<br />

Computer Files عن طريق سحب الملف إفلاته .<br />

:<br />

اختر : Object/ Merge Modules<br />

وحدد من النافذة المجاورة المكتبات التي يتعامل معها برنامج وأهمها<br />

حدد هذا الخيار إذا كان برنامجك يستخدم العناصر في الصفحة<br />

BDE في <strong>دلفي</strong> وبمجرد تحديد هذا<br />

: BDE_ent<br />

.<br />

الخيار يظهر نموذج حوار لتحديد نوع قاعدة المعطيات المستخدمة ولإنشاء<br />

Alias إذا كنت بحاجة لذلك<br />

... . QuickRep حدد هذا الخيار إذا استخدمت في برنامجك العناصر في الصفحة : QuickReport<br />

:<br />

اختر بعدها : Shortcuts /folder's<br />

فتظهر عندها النافذة التالية<br />

اضغط بزر الفأرة اليمني على القائمة<br />

Program Menu واختر New Folder وسم المجلد الجديد باسم شركتك ثم<br />

اضغط على بزر الفأرة اليميني على المجلد الجديد واختر من القائمة<br />

، New Shortcut أعط هذا الاختصار الاسم<br />

.<br />

Notepad ثم حدد الخصائص لهذا الاختصار كما هو موضح في الأعلى وهذا شرح<br />

لهذه الخصائص<br />

تظهر هذه الخاصة تلميح عندما يقف مؤشر فوق أيقونة الاختصار في Win2000 :Description<br />

تحدد هذه الخاصة الملف الذي سيتم تشغيله عند الضغط على الاختصار<br />

) لا حظ أن هذا الاختصار<br />

: Target<br />

يجب أن يحدد على الكمبيوتر الهدف وليس على حاسبك لذلك وضع داخل . INSTALLDIR\TextEditor.exe<br />

يتم تحديد في هذه الخاصة الأيقونة التي سيحملها الاختصار<br />

.<br />

: IconFile<br />

198


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

تحدد مجلد عمل البرنامج<br />

) هذه الخاصة ضرورية جدا ً إذا كان البرنامج يستدعي ملفات<br />

: Working Directory<br />

من مجلد البرنامج ).<br />

يمكنك عمل أكثر من اختصار لنفس الملف ، كما يمكنك أن تظهر اختصار لبرنامج على سطح المكتب و إذا أردت<br />

لبرنامجك أن يعمل في بداية تشغيل ويندوز ضع اختصارا ً له في القائمة . Startup<br />

اختر<br />

Registry من الشجرة اليسارية إذا كان برنامجك يتعامل مع ملف تسجيل ويندوز<br />

) إذا كان برنامجك يحتاج<br />

إلى إضافة قيم إلى مسجل النظام ليعمل بشكل جيد ( .<br />

اختر<br />

Dialog من الشجرة اليسارية لتحدد النوافذ التي ستظهر أثناء تشغيل برنامج التنصيب ، حدد منها النوافذ التي<br />

تريد أن تظهر ولاتنس أن تتحكم بخصائص هذه النوافذ<br />

) لا حظ أن كثرة النوافذ ستؤدي إلى زيادة حجم ملفات<br />

برنامج التنصيب ( .<br />

اختر<br />

إذا كان برنامجك مخصص ليعمل على نظام تشغيل محدد<br />

ويندوز<br />

2000 فقط مثلا ً<br />

( أو<br />

)<br />

Requirement<br />

انه بحاجة إلى معالج من طراز معين ، أو بحاجة إلى حد معين من الذاكرة ليعمل و...‏<br />

اختر<br />

Build your release واختر Custom من النافذة المجاورة وحدد الخصائص من النافذة المجاورة وفيما<br />

يلي شرح مختصر لهذه الخواص :<br />

حدد هنا حجم وسيلة التخزين التي تريد أن تخزن عليها برنامج التنصيب<br />

) إذا كان قرص مرن<br />

: Media Size<br />

أعط القيمة ( 1.38 .<br />

يمكنك أن تختار بين<br />

Mb أو Gb أي أن الحجم الذ‎1‎ي حددته في الخيار الأول سيقاس<br />

: Media Size Unite<br />

بالميغا بايت أو .<br />

في جيغا بايت<br />

.<br />

يمكنك أن تختار<br />

512 أو 1024 تبعا ً لوسيط التخزين المستخدم<br />

: Cluster Size<br />

أعط القيمة<br />

True لهذه الخاصة ليتم ضغط ملفات برنامجك و(‏<br />

يفضل أن تفعل ذلك إذا كنت<br />

: Compress Media<br />

تريد حجم التخزين أصغر ما يمكن ( .<br />

في برامج التنصيب الحديثة لم يعد الملف<br />

Setup.exe هو الملف المسؤول عن تنصيب البرنامج<br />

: Setup.exe<br />

ويقوم بتنصيب البرنامج الملفات ذات الامتداد<br />

Msi ومهمة البرنامج<br />

Setup.exe هي تحديد نظام التشغيل وتسليم<br />

العمل إلى برامج تنصيب ملفات<br />

Msi المناسبة،‏ يفضل أن تعطي هذه الخاصة القيمة<br />

True لأن أغلب المستخدمين<br />

تعود على تشغيل ملفات . Setup.exe<br />

سيضيف هذا الخيار الملف<br />

instmsia.exe وهو يقوم بتنصيب البرنامج الذي<br />

: Include Msi Win9x engine<br />

يستطيع التعامل مع ملفات<br />

الملف ذو الامتداد<br />

Msi ليس ملف تنفيذي ولذلك هو بحاجة لبرنامج آخر لتشغيله<br />

) Msi<br />

فإذا قمت بتنصيب برنامجك على حاسوب لا يحوي برنامج تشغيل ملفات<br />

Msi فلن يتم تنصيب البرنامج،‏ لذلك<br />

عليك أن تضيف الملف<br />

instmsia.exe الذي يحوي البرنامج المسؤول عن فتح الملفات من نوع<br />

، إذا كنت<br />

( Msi<br />

ستستخدم القرص المرن كوسيلة تخزين فأعط هذا الخيار القيمة . True<br />

.<br />

سيضيف هذا الخيار الملف<br />

.... instmsiw.exe نفس الشرح السابق<br />

: Include Msi Windows Nt engine<br />

199<br />

أعط هذا الخيار القيمة<br />

True إذا كنت ستنسخ برنامج إلى قرص ليزري أو قرص<br />

: Generate AutoRun.inf<br />

. DVD


<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

اختر الآن Build Custom من القائمة<br />

هذا يعني أن لم يحدث أي أخطاء أثناء عملية بناء ملفات التنصيب<br />

http://www.alshater.net<br />

.<br />

Build سيتم عندها إنشاء ملفات التنصيب ويجب أن تكون الرسالة الأخيرة<br />

build completed with 0 errors, 0 warnings<br />

Run Your<br />

اختر بعد ذلك<br />

Test Your Release من الشجرة واضغط على Custom في النافذة الجديدة ومن ثم<br />

، Setup سيتم الآن تنصيب البرنامج بشكل كامل لا حظ الخطوات وتأكد من أنها تعمل بشكل صحيح وإذا تم العمل<br />

بدون رسائل أخطاء ، ستجد الاختصارات التي وضعتها في القائمة أبدا ، كما يمكنك إزالة البرنامج من النافذة<br />

إضافة إزالة البرامج من لوحة التحكم .<br />

.<br />

في حال حدوث أخطاء يجب عليك التأكد من القيم التي اخترتها في النوافذ السابقة وإعادة بناء البرنامج ومن تجربته<br />

بعد الانتهاء ستجد نسخة من برنامج التنصيب في الفهرس الذي حددته لحفظ برنامج التنصيب وهو غاليا ً من الشكل<br />

C:\My Documents\MySetups\MyNotpad\Express\Custom\DiskImages\DISK1<br />

Distributed your release<br />

:<br />

حدد الخيار<br />

واختر Custom من الشجرة المجاورة ومن ثم حدد المكان الذي تريد<br />

أن تضع فيه برنامج التنصيب ‏،ليكن القرص \:A مثلا ً ...<br />

Install Shelled<br />

ملاحظة<br />

‏:هذه النسخة من<br />

لا تدعم ال<strong>لغة</strong> العربية وفي حال استخدام ال<strong>لغة</strong> العربية في عمليات<br />

إعداد برنامج التنصيب من المحتمل أن تشاهد الكثير من رسائل الأخطاء .<br />

وآخر دعواهم أن الحمد الله رب العالمين<br />

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم<br />

محمد خالد ناصر آغا<br />

200


http://www.alshater.net<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

المراجع<br />

<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />

مجموعة محاضرات في كلية الهندسة المعلوماتية جامعة<br />

حلب<br />

المهندس ياسر عقاد<br />

أسامة معراوي<br />

دار شعاع<br />

احتراف<br />

محمد حمدي غانم<br />

Visual Basic .Net<br />

http://www.arabdevelopers.com<br />

مواقع على الانترنت<br />

من أول وأقوى مواقع ال<strong>دلفي</strong> ولكنه للأسف لا يعمل في<br />

الوقت الحالي<br />

الفريق العربي للبرمجة<br />

موقع إنكليزي ولكنك بالتأكيد ستحب ال<strong>دلفي</strong> إذا فهمت<br />

http://www.arabteam2000.com<br />

http://www.delphiforfun.com<br />

برامج هذا الموقع<br />

201

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!