7. أغسطس, 2016

احسن كتاب عربي اطلعتو عليه في برمجة دلفي

بسم الله الرحمن الرحيم
لغة البرمجة دلفي
موقع الكِتاب على الإنترنت
http://goo.gl/R2U0yZ
يسمح بالنشر الإلكتروني أو الاقتباس أو النقل
على أن يتم الإشارة إلى المؤلف وموقع الكِتاب على الانترنت
ولا يسمح بأي شكل من الأشكال النشر الورقي للكتاب
إعداد
محمد خالد ناصر آغا
Support@alshater.net
http://goo.gl/R2U0yZ لغة البرمجة دلفي
2
إلى أمي، إلى أبي الذين لولا سهرهما وتعبهما لم أكن هنا لأكتب
هذا الكتاب.
إلى أناس لا أعرفهم ولا يعرفونني ولكنهم قدموا لي الكثير وخاصة
في مجال البرمجة كنت قد التقيت بهم على الانترنت في المنتديات
وساحات الحوار وكان عطائهم من دون طلب حتى أنهم لم يطلبوا
الشكر على المساعدة.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
3
الفهرس
الموضوع الصفحة
المقدمة ................................................................................ 5
نبذه عن دلفي .......................................................................... 7
البرنامج الأول ......................................................................... 10
15 .......................................................................... unit الوحدة
التعرف على العناصر ................................................................. 16
18 ..................................................... ( Events ) التعامل مع الأحداث
التعامل مع واجهة الدلفي ............................................................... 20
24 ................................................. Memo التعرف على عنصر المذكرة
إنشاء قوائم للنماذج .................................................................... 27
29 ........................................................ Data Type أنواع المعطيات
الإجراءات والتوابع ................................................................... 35
بعض التوابع المعرفة في دلفي ......................................................... 43
48 .............................................................. Dialog صناديق الحوار
52 ..................................................... MaskEdit التعرف على العنصر
التعامل مع السلاسل النصية ........................................................... 55
معالجة الأخطاء في دلفي .............................................................. 60
قواعد البيانات ........................................................................ 69
بناء تطبيقات قواعد البيانات ............................................................ 77
86 .......................................... Database Desktop بناء قواعد البيانات
التعامل مع قاعدة البيانات من خلال دلفي ............................................... 100
البحث في قواعد البيانات .............................................................. 111
الحقول الحسابية ....................................................................... 117
118 .................................................... SQL : لغة الاستفسارات البنيوية
ربط الجداول ......................................................................... 123
131 ...................................................... Access إنشاء الجداول ببرنامج
http://goo.gl/R2U0yZ لغة البرمجة دلفي
4
137 ................................................................................ ADO
برنامج دليل الهاتف ................................................................... 140
الطباعة ............................................................................... 146
لمسات برمجية ........................................................................ 147
150 ................................................ Windows Registry مسجل النظام
154 ............................................. Windows API توابع وثوابت الويندوز
إضافة عناصر جديدة .................................................................. 158
السحب والإفلات....................................................................... 167
الرسم في دلفي ........................................................................ 169
برمجة الأوساط المتعددة ............................................................... 182
التعامل مع الملفات .................................................................... 184
برنامج المفكرة ........................................................................ 183
197 ............................................. Install Shelled Express البرنامج
http://goo.gl/R2U0yZ لغة البرمجة دلفي
5
المقدمة
بسم الله والحمد لله والصلاة والسلام على رسول الله أما بعد:
هذه مجموعة من المحاضرات كنت قد اعددتها أثناء تدريسي للغة البرمجة دلفي سنة 2003 في مركز الشبيبة
للعلوم والحاسوب، ومن ذلك الوقت وأنا أفكر بنشر هذه المحاضرات على الإنترنت ولكن العمل أخذ كل وقتي منذ
ذلك الحين ولم أجد الوقت الكافي لإتمام ذلك.
وكنت قد فكرت حينها أنه يجب تنقيح هذه المحاضرات لغويًا وعلميًا قبل نشرها الأمر الذي جعلني أجد من نشرها
عم ً لا شاقًا ويأخذ الكثير من الجهد ولذلك قررت هذه العام 2006 أن أطرحها كما هي مع القليل القليل من التنقيح
فلا اعتقد أني سأجد الوقت المناسب لنشر هذه المحاضرات في المستقبل.
لماذا دلفي؟
ظهر كثيرًا من النزاع في مواقع الإنترنت حول أيهما أفضل فيجول بيسك أم دلفي ولا أريد هنا أن أدخل في هذه
المناقشات ولكني اخترت الدلفي لسببين :
1 – يدرس كل طلاب الهندسة المعلوماتية في سورية لغة الباسكال والتي هي اللغة الأم للدلفي وبالتالي يكون
الانتقال إلى دلفي سلس وسهل.
2 – الموضة : قد يفاجئ البعض من هذا السبب ولكن وبكل صراحة اقتنيت حاسبًا سنة 1997 وكنت في السنة
الثانية في الكلية وكانت نسخة الدلفي 2 قد ظهرت لأول مرة وكان الكثير يدرس الدلفي في الكلية بالرغم من أنها
غير مقررة في المنهاج الأمر الذي جعل الدلفي تنتشر كما تنتشر الموضة الجديدة بين النساء، بالنسبة لمن يرون أن
ولا أعرف أين ستتجه الموضة هذا C# تعبير موضة ليس في محله أذكرهم أن الموضة في عام 2005 كانت
العام.
رحلتي مع دلفي:
بدأت بدارسة الدلفي كما قلت في عام 1997 وبعدها أصبحت مدمنًا للدلفي كنت ألعب الدلفي بينما كان أصدقائي
يلعبون فيفا 98 أو رود رش .
ولكن في عام 2004 بدأت حياتي تأخذ مسارًا آخر فعملي أصبح يتطلب العمل على شبكات لينكس والتي تأخذ
والتي أصبحت تأخذ حياتي شيئًا فشيئًا، PHP الكثير من الوقت بالإضافة أنني تعرفت على لغة برمجة جديدة وهي
الأمر الذي جعلني أبتعد عن الدلفي حتى أني توقفت السنة الماضية عن العمل بها أو تدريسها تمامًا.
لمن هذا الكتاب ؟
بالرغم من أنني حاولت تبسيط الكتاب ما أمكن ولكنني توجهت في إعداد هذه المحاضرات إلى طلاب كلية الهندسة
المعلوماتية و كلية الحاسبات الأمر الذي جعلني أفترض أن قارئ هذا الكتاب لديه إلمام ولو بسيط بلغات البرمجة.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
6
لماذا أنشر هذا الكتاب :
لمؤلفة محمد حمدي غانم): Visual Basic.Net ( اقتبس هذه الكلام من مقدمة كتاب احتراف
أعر ُ ف أ  ن الكثيري  ن سيتساءلون: ما هو الدافع الذي حداك لبذل هذا المجهود؟.. وإّني لأجدها فرصً ة مناسب ً ة لأنقلَ
لكم فكرًة تعلمتها من احتكاكي بأناسٍ أك  ن لهم كلَّ الود والاحترام.. هذه الفكرُة تدو  ر حولَ كونِ الإنسانِ جز  ءا من
مجتمعِه، لهذا فمهما كانت أقدار هذا الإنسان، فإ  ن مصي  ره مرتبط بمصير هذا المجتمع، يسعدانِ معا ويشقيانِ معا.
فما فائدُة أن تملِ  ك في مجتمعٍ  معدم؟
وما جدوى أن تشع  ر في مجتمعٍ متح  جر؟
وما قيم ُ ة أن تعر َ ف في مجتمعٍ يجهل؟
وما هد ُ ف أن تفهم في مجتمعٍ متبّلد؟
وما مغزى أن ُتبد  ع في مجتمعٍ متدّني الذائقةِ والثقافة؟
لن يكو  ن لكلِّ هذا قيمٌ ة إذا لم يتشار  ك معك فيه أنا  س آخرون، بحيث تعم الفائدة على الجميع، في إطارٍ من التعاونِ
والود.
إ  ن الحاج َ ة للإحساسِ بالانتماءِ هي حاجٌ ة من حاجاتِ الإنسانِ الحيويةِ التي لا يستطي  ع العي َ ش بدونِها، تماما كالطعامِ
والشراب!.. ولكن.. هل يمكُنك أن تنتمي إلا لأناسٍ يرقو  ن لمستوى ُ خلقكِ ومبادئك وثقافتِك وإبداعك؟؟!!
إ  ن هذه دعوٌة لكلِّ من يقرأُ هذه الكلماتِ أن يحاولَ أن يشار  ك الآخري  ن في معرفتِه وعلمِه، على الأقلِّ حّتى يجد من
يقد  ر هذه المعرف َ ة ويحترم هذا العلم، في مجتمعٍ اختّلت به كلّ المقاييس!!، وحّتى ينطب َ ق عليه قول الرسولِ (صّلى
اللهُ عليه وسّلم): "خي  ر الناسِ أنف  عهم للناس".
وفي النهاية أرجوا من كل من يستفيد من هذا الكتاب أن يدعو لي بالهداية والتوفيق والنجاح وللأ  مة الإسلامية
بالنصر والع  زة والخروج م  ما هي فيه من محن..
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم
محمد خالد ناصر آغا
سورية - جامعة حلب
الحرم الجامعي الرقمي الفرانكفوني

http://goo.gl/R2U0yZ لغة البرمجة دلفي
7
الجلسة الأولى
نبذه عن دلفي :
RAD (Rapid Application من المعروف أن دلفي هي منتج بورلاند الأكثر مبيعًا للتطوير السريع للتطبيقات
والمستخدم لكتابة تطبيقات ويندوز ، ويمكن باستخدام الدلفي إنشاء تطبيقات ويندوز بسرعة Development)
أكبر وبسهولة أكثر من أي وقت مضى.
هذا يعني أنه نستطيع إنشاء واجهة المستخدم ( يقصد بواجهة المستخدم القوائم ومربعات الحوار والإطار
الرئيسي ..) للبرنامج مستخدمين تقنيات السحب والإفلات لمطور تطبيقات سريع ، ويمكن أيضًا وضع تحكمات
العناصر المستخدمة في فيجول بيسك ) على النماذج لإنشاء برامج متخصصة مثل برامج ) Active X أكتيف إكس
استعراض الويب في دقائق، تقوم دلفي بعمل جيد وذلك بإخفاء بعض التفصيلات التي تشكل أحشاء برنامج الويندوز
ولكن ليس بإمكانها كتابة البرامج بشكل كامل ، لذلك يجب في النهاية أن يكون المبرمج جيدًا، ويمكن لهذه العملية
أن تكون طويلة ، والخبر الجيد أن دلفي تجعل الرحلة غير متعبة وحتى أنها تجعلها ممتعة.
IDE نظرة سريعة على مكونات دلفي
سنتعرف في هذا القسم على بيئة التطوير المتكاملة للدلفي
IDE (Delphi Integrated Development Environment).
عندما تشغل برنامج الدلفي تظهر بيئة التطوير فيه والتي سنتعرف عليها كل على حده
بيئة دلفي مكونة من ثلاثة أقسام : 1 الإطار العلوي:
يمكن اعتباره الإطار الرئيسي يحتوي على أشرطة الأدوات ولوحة المكونات توصل أشرطة أدوات دلفي إلى
وظائف كالفتح والتخزين والبناء وتحتوي لوحة المكونات على كثير من مكونات دلفي التي يمكن وضعها في
البرنامج ( لافتة نصية ، علب تحرير ، مربعات سرد وأزرار وما شابه ذلك )، لتكون أكثر ملائمة فإن المكونات
مقسمة إلى مجموعات ، حتى تضع مكون على برنامجك انقر على المكون ومن ثم انقر على المكان حيث تريد
وضع المكون على النموذج.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
8
2 محرر الخواص : ( سنتعرف عليه بالتفصيل في دروس قادمة )
والذي يتم بواسطته تعديل الخصائص والأحداث للعنصر وسوف نستخدمه بشكل دائم
Properties خلال عملنا مع دلفي وهناك صفحتين محرر الخواص هما الخصائص
Events. والأحداث
يحتوي على خصائص لها قيم تحدد عمل العنصر Property مصطلح الخاصة
قائمة أحداث العنصر، تتشكل الأحداث نتيجة لتفاعل Events يتضمن باب الأحداث
المستخدم مع المكون مثلا عند نقر المكون يتولد حدث يخبرك بأن المكون قد نقر
بإمكانك كتابة أوامر تستجيب لهذه الأحداث.
هو شيء ما يحصل كنتيجة لتفاعل العنصر مع المستخدم أو Event مصطلح الحدث
مع ويندوز ( حدث ضغط على زر مث ً لا )
هو مقطع من البرمجة ينفذ استجابة للحدث. Event Handler مصطلح معامل الحدث
3 منطقة عمل دلفي :
الجزء الثالث هو منطقة عمل دلفي وعادة ما يظهر مشروعًا جديدًا ،في المقدمة مصمم النموذج وخلفه محرر
الشيفرة الذي تدخل عبره البرمجة عند كتابة برامجك.
وك ً لا من محرر الخواص ومصمم النموذج ومحرر الشيفرة تتفاعل فيما
بينها عند بناء التطبيقات لتولد البرنامج.
4 شجرة العناصر :
تظهر هذه النافذة العناصر الموضوعة على النموذج على شكل شجرة من العناصر
النافذة الرئيسية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
9
بالتفصيل لأنها أساس العمل مع البيئة ومن ثم باقي القوائم ستشرح في File أ القوائم : سنتعرف على القائمة
حينها :
وتحتوي على الأوامر التالية : : File Menu 1
وتظهر عنه قائمة فرعية : New
البدء بكتابة برنامج جديد ( يعمل تحت نظام ويندوز ) . : Application ( 1 )
البدء بكتابة برنامج جديد ( يعمل تحت نظام لينكس وويندوز ) . : CLX ( 2 )
إنشاء وحدة جديدة (يتم الوصول لها من جميع نماذج المشروع). :Data Model ( 3 )
إضافة نمودج جديد للمشروع . : Form ( 4 )
تصميم عنصر يحوي مجموعة من العناصر للاستخدام مع نماذج المشروع ( سيتم : Frame ( 5 )
شرحة فيما بعد بمثال خاص .
سيتم شرحها في حينها . : Others ( 6 )
موجودين مسبقًا . ( *.dpr ) أو ملف مشروع ( *.Pas ) لفتح ملف وحدة : Open
لفتح مشروع موجود مسبقًا . : Open Project
يقدم لائحة بآخر عدة ملفات تم فتحها لسهولة إعادة فتحها من جديد. : Reopen
تخزين آخر تعديل . : Save
الحالية باسم جديد . Unit تخزين الوحدة : Save As
باسم جديد . Main Program تخزين ملف البرنامج الرئيسي : Save Project As
إعادة تخزين جميع ملفات المشروع . : Save All
إغلاق النافذة الفعالة . : Close
إغلاق البرنامج بالكامل . : Close All
لاحقًا ) . Use ستشرح تعليمة ) Use لاستخدام وحدة أي وضع اسمها بعد تعليمة : Use Unit
لطباعة النموذج الحالية أو لطباعة الوحدة الحالية. : print http://
www.alshater.net لغة البرمجة دلفي
10
الجلسة الثانية
سنقوم الآن بكتابة برنامج يقوم بتغير لون النافذة:
أ مرحلة التصميم :
. File New Application 1 إبدأ مشروعا جديدا عن طريق القائمة
2 لنعطي النموذج الجديد الخصائص التالية :
أسم الخاصة القيمة شرح الخاصة
تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من اليمين bdRightToLeft BiDiMode
إلى اليسار ( لموافقة البرامج العربية )
280 تحديد ارتفاع النموذج Height
350 تحديد عرض النموذج Width
تغير الألوان تحديد عنوان للنموذج يظهر في شريط العنوان Caption
تحديد مكان ظهور النموذج ( ستشرح قيمها فيما بعد ) poDesktopCenter Position
ونعطي لكل منهم الخصائص Standard من صفحة العناصر ( Button) 2 نضع ثلاثة أزرار على النموذج
التالية :
: Button1
إعطاء اسم جديد للعنصر غير الاسم الافتراضي RedButton Name
أحمر تحديد عنوان للزر Caption
160 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
230 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
Button2
إعطاء اسم جديد للعنصر غير الاسم الافتراضي GreenButton Name
أخضر تحديد عنوان للزر Caption
190 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
203 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
Button3
إعطاء اسم جديد للعنصر غير الاسم الافتراضي CloseButton Name
إغلاق تحديد عنوان للزر Caption
200 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
24 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
http://goo.gl/R2U0yZ لغة البرمجة دلفي
11
ب كتابة التعليمات :
1 نضغط مرتين على الزر الأول فيظهر محرر الشيفرة نكتب فيه مايلي :
form1.Color := clred ;
وهي clred القيمة Color تقوم هذه العملية بتغير لون النموذج إلى اللون الأحمر عن طريق إعطاء خاصة اللون
قيمة محجوزة في الدلفي وتدل على اللون الأحمر.
2 نضغط مرتين على الزر الثاني فيظهر محرر الشيفرة نكتب فيه مايلي :
form1.Color := clgreen;
3 نضغط مرتين على الزر الثالث فيظهر محرر الشيفرة نكتب فيه مايلي :
close;
تقوم هذه التعليمة بإغلاق النافذة
وبذلك نكون قد أنهينا كتابة البرنامج ولحفظه نختار الأمر
File 􀃆Save Project As
والمشروع الأسم NewCloors لنعطي الوحدة الاسم
ChangeCloros
من القائمة Run أو نختار الأمر F ولتنفيذه نضغط على 9
Run
( Run 􀃆Run )
سنقوم الآن بتغير بعض خواص العناصر للتعرف على
خصائص جديدة :
1 خصائص النموذج :
من القائمة الموجودة في أعلى محرر الخواص : ( Form نختار النموذج بالنقر عليه أو باختيار اسمه ( 1
تظهر أمام هذه القائمة إشارة + بالنقر عليها تظهر لها أربع خيارات تأخذ كل منها القيمة : BorderIcons أ
صح أو خطأ وتتحكم هذه الخواص بأزرار شريط العنوان :
تختفي الأزرار الثلاثة . False بإعطاء هذه الخاصة القيمة : Bisystemmenu
يختفي زر التصغير . False بإعطاء هذه الخاصة القيمة : BiMinimize
. 􀂅 يختفي زر False بإعطاء هذه الخاصة القيمة : BiMaximize
يظهر الزر ؟ ( لا يظهر هذا الزر مع النوافذ العادية True بإعطاء هذه الخاصة القيمة : BiHelp
ستشرح مع الخاصة التالية .
ملاحظة : نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ .
تقوم هذه الخاصة بالتحكم بشكل النافذة وشريط العنوان وتأخذ إحدى القيم التالية . : Borderstyle ب http://
www.alshater.net لغة البرمجة دلفي
12
تقوم بإخفاء أزرار التكبير والتصغير بالإضافة إلى منع تغير حجم النموذج أثناء التنفيذ : bsDialog
. Bihelp للخاصة True ويظهر فقط زر الإغلاق والزر ؟ في حال تم إعطاء القيمة
يظهر النموذج بدون شريط عنوان ولا يمكن تغير حجمه أثناء التنفيذ. : bsNone
تظهر جميع أزرار شريط العنوان ولا يمكن تغير حجمه أثناء التنفيذ . : bsSingle
وهي القيمة الافتراضية ويظهر النموذج بشكله الطبيعي مع إمكانية التكبير والتصغير والتحجيم. : bsSizeable
فقط وتختلف الأولى عن الثانية × يظهر شريط عنوان صغير مع زر : bsToolWindow و bsSizeToolWin
بإمكانية تغير الحجم .
ملاحظة : نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ .
لإظهار النموذج في مكان ما على الشاشة وأهم قيمها : : Position ج
يظهر النموذج في المكان الذي حدد له أثناء التصميم . : poDesigned
يظهر النموذج في وسط الشاشة. : poDesktopCenter
يظهر النموذج في وسط الشاشة ( في حال وجود شاشة واحدة لهذه : poScreenCenter
الخاصة نفس نتيجة الخاصة السابقة ) .
تتحكم هذه الخاصة بشكل أيقونة النافذة ، وعند تحديد هذه الخاصة يظهر زر عليه ثلاث نقاط ... : Icon د
بالنقر عليه يظهر صندوق حوار لاختيار أيقونة ( يتم عادة جلب الأيقونات من الانترنت أو يتم رسمها
يدويًا كما سنرى لاحقًا ) يمكن اختيار أحدى الأيقونات من الدليل :
C:\Program Files\Common Files\Borland Shared\Images\Icons
هذه هي الخواص الأساسية للنموذج وسنتعرف على باقي الخواص لاحقًا .
1 خصائص الزر :
هناك بعض الخصائص المهمة : ( Top, Left, Width, Height, Caption ) بالإضافة للخصائص المعروفة
تم شرح هذه الخاصة سابقًا بالنسبة للنموذج ولكن من المهم أن نعلم أنه عند تغير هذه الخاصة : BiDiMode
في النموذج تتغير بشكل تلقائي في الزر .
تتحكم هذه الخاصة بنوع خط عنوان الزر بالإضافة إلى لون العنوان وحجمه. : Font
تظهر هذه الخاصة ملاحظة عند وقوف مؤشر الفأرة فوق الزر : Hint
حتى يتم تفعيل الخاصة السابقة . True يجب أن تأخذ هذه الخاصة القيمة : Showhint
من محرر الخواص واكتب النص Hint ثم اختر الخاصة RedButton مثال : أختر الزر
التالي ( عند الضغط على هذا الزر سيتحول لون النافذة إلى اللون الأحمر ) ثم أعط الخاصة
ونفذ البرنامج . True القيمة ShowHint
لهذه الخاصة لن يظهر الزر أثناء التنفيذ . False عند إعطاء القيمة : Visible
لهذه الخاصة سيظهر الزر بشكل باهت ولا يمكن الضغط عليه. False عند إعطاء القيمة : Enable
http://goo.gl/R2U0yZ لغة البرمجة دلفي
13
في لوحة المفاتيح يظهر إطار مربع Tab أثناء تنفيذ البرنامج وعند الضغط على الزر : TabOrder
وتقوم هذه الخاصة Tab داخل الزر وينتقل هذا الإطار من زر إلى آخر بالنقر على الزر
بتحديد ترتيب انتقال الإطار عند التنقل بين العناصر.
1 لنضيف الآن زر جديد إلى النموذج السابق ولنعطه الخصائص التالية :
إعطاء اسم جديد للعنصر غير الاسم الافتراضي BtnAbout Name
ح  ول تحديد عنوان للزر Caption
0 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
0 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
40 تحديد عرض الزر Width
: File 􀃆 New 􀃆Form ثم نضيف نموذج جديد للمشروع عن طريق القائمة
وبذلك يظهر نموذج جديد لنعطه الخصائص التالية :
إعطاء أسم جديد للنموذج About Name
تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من bdRightToLeft BiDiMode
اليمين إلى اليسار ( لموافقة البرامج العربية )
250 تحديد ارتفاع النموذج Height
300 تحديد عرض النموذج Width
معلومات حول البرنامج تحديد عنوان للنموذج يظهر في شريط العنوان Caption
تحديد مكان ظهور النموذج poDesigned Position
من أزرار السرعة أو باختيار نفس الأمر من القائمة Save الآن يمكن حفظ النموذج عن طريق الضغط على الزر
aboutunit من لوحة المفاتيح ، لنعط الوحدة أسم Ctrl + s أو بالضغط على File
والآن علينا كتابة الشيفر المناسبة لاستدعاء النموذج ( Form عند تنفيذ البرنامج لا يظهر إلا النموذج الأول ( 1
. Form من النموذج 1 About
لاستدعاء نموذج ثاني من نموذج أول يجب علينا أن نعلم النموذج الأول باسم الوحدة التابع لها النموذج الثاني ويتم
: Uses لوحدة النموذج الأول بعد عبارة implementation ذلك بإضافة اسم وحدة النموذج الثاني في القسم
والآن أضف العبارة التالية كما يلي :
implementation
uses aboutunit ;
الموجود على النموذج الأول ونكتب التعليمة التالية : BtnAbout الآن نضغط مرتين على الزر
about.Show;
أحفظ البرنامج واضغط على الزر حول لمشاهدة النتائج ). ) About بإظهار النافذة Show يقوم الأمر
: About لنكمل الآن تصميم النموذج
http://goo.gl/R2U0yZ لغة البرمجة دلفي
14
ولنعطه الخصائص التالية : Standard لوح ) من القائمة ) Panel 1 نضيف العنصر
تجعل العنصر يتوضع في أعلى النافذة وعلى عرضها بشكل كامل AlTop Align
( سيتم شرح قيم هذه الخاصة قريبًا )
تحديد عنوان للزر " " Caption
185 تحديد ارتفاع اللوح Height
تحديد طريقة عرض الحد الخارجي للوح bvLowered BevelOuter
مفعلة Align ستلاحظ أنها لا تتغير وذلك لأن الخاصة Width حاول إعطاء قيمة ما لخاصة
ونعطه الخواص التالية : Button 2 نضيف زر
إعطاء اسم جديد للعنصر غير الاسم الافتراضي BtnClose Name
إغلاق تحديد عنوان للزر Caption
192 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
112 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
Panel فوق العنصر Additional من الصفحة Image 3 نضيف عنصر الصورة
أي صورة إعطاء صورة للعنصر يمكن أختيار أي صورة مرغوبة ( يمكن أخذ picture
صورة من المجلد :
C:\Program Files\Common Files\Borland Shared\Images
\Splash\256Color
Image إظهار كامل الصورة داخل العنصر True Stretch
0 تحديد بعد الزر عن أعلى النافذة ( بكسل) Top
0 تحديد بعد الزر عن يسار النافذة ( بكسل ) Left
ونعطي الخصائص التالية: Panel فوق العنصر Label 3 نضيف عنصرين من النوع
Label1
تغير الألوان Caption
24 Top
168 Left
نغير الخط ونعطيه اللون الأزرق font
Label2
إعداد وتنفيذ : Caption
88 Top
212 Left
نعطي الخط اللون الأحمر Font
في محرر شيفرة ، ثم نحفظ المشروع وننفذه . Close ونكتب التعليمة BtnClose نضغط مرتين على الزر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
15
الجلسة الثالثة
بشكل مفصل . Unit أصبح الوقت ملائمًا الآن للتعرف على الوحدة
تتألف الوحدة سواء كانت مرتبطة بشكل أم لا من الأجزاء التالية :
unit Unit Name ;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
end.
. ( NewColors يليها مباشرة أسم الوحدة ( في مثالنا Unit 1 يبدأ رأس الوحدة بالكلمة المحجوزة
: Interface قسم الاتصال الخارجي
الذي يحدد بداية منطقة الاتصال الخارجي ، أي المنطقة من الوحدة التي يمكن أن تراها وحدات أخرى من وحدات
التطبيق وفيه :
توضع فيه جميع أسماء الوحدات التي تتعامل معها الوحدة سواء كانت الوحدات الخاصة : Uses أ القسم
بالدلفي أو الوحدات التي أنشأها المبرمج ( عند إضافة عناصر جديدة على النموذج تقوم دلفي بإضافة الوحدة
التابعة لهذا العنصر بشكل تلقائي ) .
صنف النموذج ) ، يضاف إلى ) TForm تعرف الوحدة هنا صنفًا جديدًا موروثًا من النوع : Type ب القسم
للوحدة Type الصنف الجديد أسماء جميع العناصر والأحداث المضافة إلى الوحدة ( قارن بين القسم
الجزأين : Type ويتضمن القسم ( AboutUnit والوحدة NewColors
وتوضع فيه المتحولات الخاصة بالوحدة نفسها. : Private
وتوضع فيه المتحولات العامة ( من أجل أن تتبادل الوحدة المعلومات مع الوحدات الأخرى ) : Public
.end; بالتعليمة Type وسيشرح هذين الجزأين بشكل مفصل فيما بعد ، ينتهي القسم
إلى Form ويشير 1 TForm من النوع 1 Form يتم فيه تعريف عن هدف ( غرض ) اسمه 1 : Var ج القسم
النموذج الذي نضيف له العناصر أثناء التنفيذ .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
16
: implementation قسم التنفيذ
يمكن أن يحتوي هذا القسم على تصريحات عن توابع وإجراءات ومتحولات خاصة بالوحدة نفسها بالإضافة إلى
جميع التوابع والإجراءات المستخدمة داخل الوحدة .
ملاحظة : قد يكون الجزء السابق صعبًا بعض الشيء لكنه ضروري لمتابعة العمل مع دلفي كما أننا سنتعرف عليه
بشكل أكبر كلما دعت الحاجة إلى ذلك .
سنعمل الآن على كتابة تطبيقات بسيطة الهدف منها التعرف على عناصر جديدة وخصائصها :
: Standard من القائمة checkbox 1 التعرف على صندوق الاختيار
ابدأ مشروع جديدًا وصغر حجم النموذج قلي ً لا وأضف أليه عنصر
: checkbox وعنصر Button الزر
من محرر الخواص واعطه الخاصة checkbox اختر العنصر 1
أظهر الزر " " : Caption
فيظهر OnClick واختر منها الحدث Event ثم انتقل إلى الصفحة
محرر الشيفرة اكتب فيه السطر التالي :
if checkbox1.Checked then button1.Visible := true else button1.Visible := false ;
في صندوق الاختيار 􀀻 في حال تم إظهار إشارة True تعيد القيمة checkbox للعنصر Checked الخاصة
في حال اختفاء الإشارة السابقة . False والقيمة
نفذ البرنامج وشاهد النتائج .
: Standard من القائمة ListBox 3 التعرف على عنصر صندوق اللائحة
يظهر هذا الصندوق قائمة بنصوص تم إدخالها أثناء التصميم
أو أثناء التنفيذ :
( Edit ) قم بإنشاء مشروع جديد وأضف إليه صندوق نص
وثلاثة أزرار ( ListBox ) وصندوق لائحة
كما في الشكل المرفق : ( Button )
من محرر Items أ أثناء التصميم : باختيار الخاصة
الخواص تظهر نافذ يمكن أن نكتب فيها سطور القائمة
مث ً لا أدخل " الجلسة الأولى " في السطر الأول و "
الجلسة الثانية " في السطر الثاني .
ب أثناء التنفيذ :
وأضف السطر التالي : Button أضغط مرتين على الزر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
17
Listbox1.items.add (edit1.text);
تقوم التعليمة السابقة بإضافة النص المكتوب في صندوق النص إلى صندوق اللائحة ( نفذ البرنامج وشاهد النتائج )
لحذف سطر واحد من عنصر اللائحة نضغط على الزر الثاني ونضيف السطر التالي :
listbox1.DeleteSelected ;
تقوم هذه التعليمة بحذف السطر الذي تم اختياره من اللائحة .
كذلك لحذف عناصر اللائحة أثناء التنفيذ اضغط على الزر الثالث مرتين واكتب السطر التالي :
Listbox1.items.clear ;
تقوم هذه التعليمة بمسح صندوق اللائحة بالكامل.
: ( RadioButtons ) 4 التعرف على أزرار الراديو
تعتبر أزرار الراديو مشابهة لعنصر صندوق الاختيار وتختلف عنه أنه
لا يمكن اختيار زري راديو بنفس الوقت أي أنه أمام المستخدم اختيار
زر واحد من بين الأزرار الظاهرة على النموذج.
كمثال على ذلك :
أبدأ مشروعًا جديدًا وأضف إليه ثلاثة أزرار راديو كما في الشكل :
وأعط النموذج True القيمة Checked أعط الزر الثالث الخاصة
. ClCream اللون
أضغط مرتين على الزر الأول وأضف التعليمة التالية :
form1.Color := clred;
وأضف التعليمة التالية للزر الثاني :
form1.Color := clblue;
وللزر الثالث التعليمة :
form1.Color := clcream;
نفذ البرنامج وشاهد النتائج .
: GroupBox 5 التعرف على صندوق المجموعة
في المثال السابق لنفرض أننا نريد إضافة مجموعة جديدة من أزرار الراديو لتغير لون الخط في النموذج ( كانت
الأزرار السابقة تغير لون النموذج ) ، فإذا أضفنا زرين آخرين على النموذج فلا يمكننا تغير الخط واللون معًا
لأنه لا يمكن اختيار زري راديو في نفس الوقت ، وهنا يأتي دور صندوق المجموعة حيث يؤمن هذا الصندوق
ربطًا بين أزرار الراديو بداخله فقط دون التأثير على أزرار الراديو خارجه ، كما يوضح المثال التالي :
أضف صندوق مجموعة للمثال السابق وضع عليه زرين راديو كما في الشكل
وأضف التعليمة التالية للزر الأول داخل الصندوق
form1.Font.Color := clgreen;
والتعليمة التالية للزر الآخر :
form1.Font.Color := clyellow
http://goo.gl/R2U0yZ لغة البرمجة دلفي
18
: ( Events ) التعامل مع الأحداث
للزر OnClick يوجد لكل عنصر في دلفي مجموعة من الأحداث التي يمكن أن ينفذها ، تعرفنا مث ً لا على الحدث
ويظهر معالج الشيفرة لكتابة التعليمات التي Onclick عند الضغط مرتين على الزر يتم تفعيل الحدث ) Button
تبين كيفية تعامل البرنامج مع هذا الحدث )،سنتعرف الآن على مجموعة جديدة من الأحداث.
الذين ( x,y ) يعمل هذا الحدث عن مرور الفأرة فوق العنصر ويعيد احداثيات : OnMouseMove 1 الحدث
أي بعد الفأرة عن شريط y = top أي بعد الفأرة عن اليسار، و X = left يشرين على مكان وجود الفأرة حيث
عنوان النافذة وكمثال على ذلك :
الأول في الأعلى وفي أقصى اليمين والثاني في الأسفل وفي أقصى Label أنشاء مشروع جديد وضع على عنصر
واضغط مرتين على Event اختر محرر الخواص وانتقل إلى الصفحة ( Form اليسار ،والآن حدد النموذج ( 1
ُفيظهر محرر الشيفرة التابع : OnMouseMove الخاصة
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
التعليمات التالية : End و Begin لنكتب بين السطرين
label1.Caption := inttostr(x);
label2.Caption := inttostr(y);
نفذ البرنامج .
يعمل هذا الحدث عن الضغط على زر الفأرة ويعيد الإحداثيات كما في الحدث : OnMouseDown 2 الحدث
من المثال السابق اختر محرر الخواص وانتقل إلى الصفحة ( Form السابق ، كمثال عليه : حدد النموذج ( 1
فيظهر محرر الشيفرة أكتب فيه التعليمات التالية : OnMouseDown واضغط مرتين على الخاصة Event
label1.Left := x;
label1.Top := y -10;
label2.Left := x+20;
label2.Top := y-10;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
19
في مكان الضغط على الفأرة ، ( تم إضافة وطرح الأرقام Label تعمل هذه التعليمات على وضع عنصري العنوان
فقط لإظهار النتائج بشكل أفضل ) . y و X من
يعمل هذا الحدث عند ابتعاد الفأرة عن العنصر : : OnMouseLeave 5 الحدث
لهذا العنصر واكتب التعليمة OnMouseMove جديد إلى الشكل السابق وحدد الحدث Label أضف عنصر
label3.font.color := clblue; : التالية
واكتب التعليمة التالية : OnMouseLeave ثم حدد الحدث
Label3.font.color := clblack;
يتحول إلى اللون الأزرق ثم يعود إلى لونه Label نفذ البرنامج ولاحظ أنه عند مرور الفأرة من فوق العنصر 3
الأسود عن مغادرة الفأرة له.
يعمل هذا الحدث عند الضغط مرتين على العنصر : : On DblClick 4 الحدث
Close; : واكتب التعليمة On DblClick ثم أختر الحدث Label حدد العنصر 3
للخروج من البرنامج . Label نفذ البرنامج واضغط مرتين على العنصر 3
http://goo.gl/R2U0yZ لغة البرمجة دلفي
20
الجلسة الرابعة
التعامل مع واجهة الدلفي :
1 إضافة عدة نسخ من العنصر نفسه :
من لوحة المفاتيح وإبقاؤه مضغوطًا Shift يمكن إضافة عدة نسخ من العنصر نفسه وذلك بالضغط على المفتاح
حتى نختار العنصر المراد إضافته من لوحة العناصر، عندئذٍ يظهر مربع أزرق يحيط بأيقونة العنصر ضمن لوحة
العناصر ، ننقر الآن فوق النموذج ليظهر العنصر وفي كل مرة ننقر على النموذج تظهر نسخة أخرى من العنصر
نفسه ، لإيقاف العملية نضغط أيقونة المؤشر ضمن لوحة العناصر ليختفي الصندوق الأزرق حول العنصر ، كمثال
انقل الفأرة إلى النموذج shift بمؤشر الفأرة مع الضغط على المفتاح Label على ذلك اضغط على العنصر
واضغط عدة مرات .
2 التحكم بمكان العنصر وحجمه على النموذج من لوحة المفاتيح :
كما رأينا يمكن التحكم بهذه الخواص بدقة عن طريق محرر الخواص ولكن هناك طريقة أخرى ومفيدة للتحكم بهذه
الخواص .
أ تحريك العنصر :
أزرار الأسهم فسيتم نقل العنصر باتجاه السهم المضغوط + Ctrl أختر العنصر المراد تحريكه اضغط على المفاتح
أزرار الأسهم . + Ctrl + Shift ، ولتحريك العنصر بسرعة أكبر أستخدم الأزرار
ب تغير حجم العنصر :
أزرار الأسهم وسيتم التكبير أو التصغير حسب + Shift اختر العنصر المراد تغير حجمه واضغط على المفتاح
السهم المضغوط .
3 اختيار أكثر من عنصر في نفس الوقت :
يمكن أن نختار أكثر من عنصر على نموذج في نفس الوقت على عن طريق الضغط على العنصر الأول ومن ثم
وهكذا ... ، وعند تنفيذ هذه العملية تظهر في محرر الخواص Shift الضغط على العنصر الثاني مع مفتاح
ستظهر الخواص Edit والثاني Label الخواص المشتركة للعناصر المختارة ( عند أختيار عنصرين الأول
( Caption, Text وستختفي بعض الخواص مثل ، ... Width, Height, left, top, المشتركة مثل
رصف العناصر :
يمكننا رصف العناصر نسبيًا وفق بعضها البعض ، أو نسبيًا وفق الشكل وذلك من خلال اختيار العنصر المراد
من القائمة Alignment أو View من القائمة Alignment palette رصفه ومن ثم استخدام لوحة الرصف
: Edit
: Alignment palette أ لوحة الرصف
كل زر في هذه اللوحة له مهمة ما وسيتم شرح كل منها على حدة :
ترصف جميع العناصر المختارة إلى الجهة اليسارية لأول عنصر تم اختياره
.
نفس العمل السابق ولكن الرصف يتم للجهة اليمينية
http://goo.gl/R2U0yZ لغة البرمجة دلفي
21
ترصف العناصر جميع العناصر المختارة إلى منتصف العنصر الأول الذي تم اختياره بشكل أفقي ( تجعل
جميع العناصر على عمود واحد )
نفس عمل الزر السابق ولكن الرصف يتم بشكل عمودي،(تجعل جميع العناصر المختارة على صف واحد).
تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل أفقي .
تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل عامودي .
تجعل المسافة بين العناصر الأفقية متساوية ( تثبت العنصر الأول والأخير وتحرك العناصر التي بينهما
لتأخذ مسافات متساوية .
نفس الخاصة السابقة للعناصر العامودية .
تحريك العناصر إلى نفس الناحية السفلية لأول عنصر تم اختياره .
تحريك العناصر إلى نفس الناحية العلوية لأول عنصر تم اختياره .
ستظهر النافذة التالية : Edit من القائمة Align أختر : Alignment ب
عمل هذه النافذة يشبه عمل النافذة السابقة ولكن تم
الاستعاضة عن الأيقونات بأزرار راديو ليتم الاختيار
منها.
تثبيت موقع العناصر :
بعد أن نعطي العناصر مواقعها يمكننا تثبيت هذه المواقع لكي لا تتحرك العناصر بطريق الخطأ وذلك عن طريق
عندها لن نستطيع تحريك هذه ، Edit من القائمة Lock Controls اختيار العنصر ومن ثم استخدام الأمر
العناصر حتى نختار نفس الأمر مرة أخرى .
قص ونسخ ولصق العناصر :
يمكن قص أو نسخ العناصر ولصقها على نفس النموذج أو على نموذج آخر عن طريق اختيار العناصر وقصها او
من نفس القائمة : Paste ولصقها عن طريق الأمر Edit في القائمة Copy أو Cut نسخها عن طريق الأوامر
ملاحظة العنصر الملصق يأخذ جميع خصائص العنصر الأصل بالإضافة إلى جميع أحداثه .
عنوان البرنامج :
يمكن وضع عنوان للبرنامج ( عنوان البرنامج يظهر على شريط المهام بقرب أيقونة البرنامج ) أختر الأمر
Application واكتب في القسم ، Application وانتقل إلى الصفحة وانتقل إلى الصفحة File 􀃆 Options
النص الذي تريد، نفذ البرنامج ولاحظ العنوان على شريط مهام ويندوز . Title قرب setting
http://goo.gl/R2U0yZ لغة البرمجة دلفي
22
أيقونة برنامج :
تعلمنا سابقًا تغير أيقونة نافذة ( نموذج ) وسنتعلم الآن تغير أيقونة البرنامج ( أيقونة البرنامج هي نفس أيقونة الملف
الذي ينتج عند تنفيذ البرنامج وتظهر أيقونة البرنامج على شريط المهام وفي أي اختصار يوضع للبرنامج )، EXE
Load اضغط على الزر ، Application انتقل إلى الصفحة Project 􀃆 Options من نفس الصفحة السابقة
واختر أيقونة جديدة للبرنامج ( يمكن اختيار أيقونات من الفهرس Icon
C:\Program Files\Common Files\Borland Shared\Images\Icons
نفذ البرنامج ولاحظ النتائج .
صناديق الرسائل :
: ShowMessage أ الصندوق
لإظهار رسالة للمستخدم حيث تظهر نافذة صغيرة تحوي نص showmessage (S : string) يستخدم الإجراء
فقط ويكون عنوان هذه النافذة هو أسم الملف التنفيذي للبرنامج Ok الرسالة وعلى الزر
وأضف التعليمة التالية عند حدث Button كمثال على ذلك أنشأ مشروعًا جديدًا وأضف إليه
الضغط على الزر :
showmessage(' ;('أه ً لا بكم مع دلفي
نفذ البرنامج واضغط على الزر لتشاهد صندوق الرسالة
: MessageDlg ب الصندوق
هذا الصندوق يشبه الصندوق السابق ولكنه يتوقع من المستخدم أن يعيد قيمه للبرنامج من خلال الضغط على أزرار
وتعليمات أخرى في Yes هذا الصندوق فرضًا سيقوم البرنامج بتنفيذ تعليمات معينة إذا ضغط المستخدم على الزر
يتم استدعاء هذا الصندوق عن طريق التابع التالي : ، NO حال الضغط على الزر
Function MessageDlg(const Msg: string ; DlgType: TMsgDlgType; Buttons:
TMsgDlgButtons ; HelpCtx: Longint): Word
نص الرسالة المطلوب إظهارها . : Msg حيث
تحديد نوع لصندوق الرسالة ويأخذ أحدى القيم التالية : : Dlgtype
يظهر في صندوق الرسالة أيقونة على شكل مثلث أصفر له إشارة تعجب . : mtWarning
. × يظهر في صندوق الرسالة أيقونة على شكل دائرة حمراء داخلها إشارة : mtError
يظهر في صندوق الرسالة أيقونة على شكل داخلها إشارة تعجب . : mtInformation
يظهر في صندوق الرسالة أيقونة على شكل داخلها إشارة ? . : mtConfirmation
لا يظهر في صندوق الرسالة أيقونة . : mtCustom
يعتمد نوع صندوق الرسالة على نوع الرسالة المراد إظهارها للمستخدم هل هي للتنبيه أو لإعلام المستخدم
بحصول خطأ ما أو إعطاءه معلومة جديدة .... .
: Buttons
تحدد الأزرار التي ستظهر في صندوق الرسالة وتأخذ القيم التالية :
!
!
http://goo.gl/R2U0yZ لغة البرمجة دلفي
23
mbYes,mbNo,mbOK,mbCancel,mbAbort,mbRetry,mbIgnore,mbAll,mbNoToAll,mbYesT
oAll, mbHelp
توضع الأزرار بين قوسين [ ] وتوضع بينهما فاصلة .
لاحقًا ). *.HLP توضع فيه رقم السطر في ملف المساعدة المرتبط مع الزر ( سيشرح ملف المساعدة :HelpCtx
يعيد التابع قيمة تتبع للزر الذي ضغط عليه المستخدم حسب الجدول
mrok سيعيد التابع القيمة OK التالي : أي أنه عند الضغط على الزر
.
وهكذا .
: ( مثال ( 1
واكتب التعليمة التالية Button أبدأ مشروعًا جديدًا وضع عليه الزر
عند حدث الضغط عليه :
if MessageDlg(' هل تريد إغلاق البرنامج ',mtConfirmation
,[mbyes,mbno],0)= mryes then close;
تظهر هذه التعليمة الصندوق التالي مع
. Yes وتغلق البرنامج في حال تم الضغط على زر No و Yes الزرين
: مثال 2
أضف زر جديد إلى المشروع السابق واكتب التعليمة التالية عند حدث الضغط
عليه:
messagedlg( ' تجربة ',mterror,[mball,mbyestoall,mbNoToAll,mbIgnore],0) ;
: InputBox 3 الصندوق
وله الشكل التالي : Cancel و Ok مع الزرين Edit يظهر هذا الصندوق على شكل نافذة فيها عنصر
InputBox( const ACaption, APrompt, ADefault: string ): string ;
هو عنوان الصندوق . : ACaption حيث
نص الرسالة . : Aprompt
قيمة افتراضية تظهر في الصندوق . : ADefault
. Edit يعيد التابع النص المدخل في العنصر
مثال : أضف زر جديد إلى المشروع السابق واكتب التعليمة التالية :
form1.Caption := inputbox(' ;('جديد ','أدخل أسمًا جديدًا للنموذج','تغير عنوان النموذج
mbOK mrOk
mbCancel mrCancel
mbYes mrYes
mbNo mrNo
mbAbort mrAbort
mbRetry mrRetry
mbIgnore mrIgnore
mbAll mrAll
mbNoToAll
mrNoToAll
mbYesToAll mrYesToAll
http://goo.gl/R2U0yZ لغة البرمجة دلفي
24
الجلسة الخامسة
: Memo التعرف على عنصر المذكرة
يستخدم عنصر المذكرة لكتابة نص طويل ( أكثر من 256 حرف ) كما يمكن فيه كتابة نص من عدة سطور .
في محرر الخواص ،كما لها بعض الخصائص Lines تتم الكتابة في المذكرة أثناء التصميم عن طريق الخاصة
المهمة مثل :
يقوم المؤشر بالإنتقال إلى السطر التالي عند الوصول True في حال كانت قيمة هذه الخاصة : WordWrap
إلى آخر السطر الحالي .
Tab فإنه ستتم إضافة 6 فراغات عند الضغط على الزر True في حال كانت قيمة هذه الخاصة : WantTabs
أثناء التنفيذ .
Enter سيتم إضافة سطر جديد عند الضغط على الزر True في حال كانت قيمة هذه الخاصة : Wantreturns
. False وستتم الكتابة على سطر واحد في حال قيمتها
لا يمكن الكتابة في العنصر أثناء التنفيذ . True في حال كانت قيمة هذه الخاصة : ReadOnly
تظهر طريقة عرض النص في المذكرة وتأخذ إحدى القيم التالية : : Alignment
يظهر النص في الجهة اليمينية( في حال كانت الخاصة : taRightJustify
( bdRightToLeft تساوي BiDiMode
يظهر النص في الجهة اليسارية ( في حال كانت الخاصة : taLeftJustify
( bdRightToLeft تساوي BiDiMode
يظهر النص في وسط العنصر . : taCenter
أعط الزر الأول الخاصة ، Button وزرين Memo مثال : أنشئ مشروعًا جديدًا وأضف إليه عنصر مذكرة
حفظ " واكتب التعليمة التالية بعد الضغط عليه : " Caption
Memo1.Lines.SaveToFile( 'c:\a.txt') ;
تقوم هذه التعليمة بحفظ النص المكتوب داخل عنصر المذكرة (أثناء التنفيذ ) إلى الملف المحدد بين القوسين ( هنا
. ( a.txt
فتح " واكتب التعليمة التالية بعد الضغط عليه : " Caption أعط الزر الثاني الخاصة
Memo1.lines.LoadFromFile ('c:\a.txt') ;
تقوم هذه التعليمة بتحميل النص من الملف ( المذكور اسمه بين القوسين ) إلى المذكرة .
: Bitbtn التعرف على عنصر الزر
يشبه هذا العنصر عنصر الزر إلى حد بعيد ويختلف عنه في :
. ( Caption ) 1 إمكانية تغير لون خط العنوان
2 إمكانية إضافة صورة لهذا الزر وذلك عن طريق :
. Kind أ الصور الافتراضية الموجودة في الخاصة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
25
التي يمكن أن نختار منها صورة ما للزر ( يوجد بعض صور للأزرار في المجلد Glyph ب الخاصة
C:\Program Files\Common Files\Borland Shared\Images\Buttons
عبارة عن ثلاث صور متجاورة بنفس الحجم Glyph يمكن تغير صورة الزر عند الضغط عليه باختيار الصورة
إلى 3 ، حيث تكون الصورة الأولى للزر NumGlyph كما في الصورة التالية : وتغير قيمة الخاصة
والصورة الثالثة تظهر False تساوي Enabeled في الوضع الافتراضي والصورة الثانية في حالة كانت الخاصة
عند الضغط على الزر .
: SpeedButton التعرف على الأزرار السريعة
بالإضافة إلى الخصائص التالية : BitBtn هي عبارة عن أزرار تستخدم في أشرطة الأدوات ولها خصائص الزر
تعطي مظهر مستوي للزر ويصبح المظهر ثلاثي البعد عند مرور الفأرة فوقه . : Flat 1
عند إعطاء مجموعة من أزرار السرعة قيمة واحدة لهذه الخاصة أكبر من الصفر تعمل : GroupIndex 2
هذه الأزرار كأزرار الراديو .
مثال :
Glyph أضف لكل زر صورة عن طريق الخاصة Speedbutton أنشأ مشروعًا جديدًا وأضف أليه أربع أزرار
القيمة 1، نفذ البرنامج ولاحظ أنه لا يمكن لأكثر من زر من هذه GroupIndex وأعط جميع الأزرار الخاصة
المجموعة أن يكون مضغوطًا في نفس الوقت .
: ( MDI و SDI ) أنواع النماذج
أي إظهار نافذة واحدة SDI تقسم كل واجهات التطبيقات التي نصممها إلى نوعين هما : واجهة الوثيقة الواحدة
وتعتمد على عدد من النوافذ الأبناء تظهر ضمن النافذة الأب . : MDI للبرنامج ،وواجهة الوثائق المتعددة
والتي تأخذ إحدى القيم التالية : FormStyle يمكن تحديد نوع التطبيق الذي نصممه من خلال الخاصة
عملها ملاحظات FormStyle
SDI تنشئ شك ً لا وحيدًا من النوع fsNormal
تنشئ شك ً لا أبًا (شكل رئيسي للتطبيق) يمكن لهذا الشكل أن يحتوي على fsMDIForm
أشكال أخرى أثناء التنفيذ .
تنشئ شك ً لا ولدًا ، أي شكل ثانوي fsMDIChild
متعلق بشكل آخر
هذا الشكل سوف يحتوي من قبل
الشكل الأب أثناء التنفيذ.
تنشئ شك ً لا وحيدًا يبقى ظاهرًا في fsStayOnTop
الأمام مهما كانت التطبيقات المفتوحة
أن يحتوي شك ً لا ولدًا سنقوم بما يلي : MDI وحتى نشرح كيف يستطيع الشكل الأب من النوع
. fsMDIForm القيمة Form للنموذج 1 Formstyle 1 ننشئ مشروعًا جديدًا ونعطي الخاصة
. fsMDIChild له القيمة Formstyle 2 نضيف نموذج جديد للمشروع ونعطي الخاصة
3 نفذ البرنامج ولاحظ أن النموذج الثاني يظهر ضمن حدود النموذج الأول ولا يمكن تحريكه خارجه .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
26
: fsStayOnTop المثال التالي يشرح الخاصة
نفذ البرنامج ، fsStayOnTop القيمة Form للنموذج 1 Formstyle ابدأ مشروعًا جديدًا وأعط الخاصة
ولاحظ أن النافذة ستظهر على الشاشة ولا يمكن لأي نافذة أخرى الظهور فوقها ( حاول مث ً لا فتح نافذة جهاز
الكمبيوتر أو نافذة سلة المحذوفات ولاحظ أن هذه النوافذ ستظهر خلف نافذة البرنامج ) .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
27
إنشاء قوائم للنماذج :
تعطي القوائم طريقة سهلة للمستخدم للوصول إلى عدد من الأوامر وهناك نوعين من القوائم
. ( Popup Menu ) والقائمة المنبثقة ( Main Menu ) القائمة الرئيسية
للقائمة الرئيسية الشكل التالي : : ( Main Menu) القائمة الرئيسية
مثال :
Standered من القائمة MainMenu 1 ابدأ مشروعًا جديدًا وأضف إلى النموذج عنصر
عن طريق : ( Menu Desigenr ) 2 افتح مصمم القوائم
من محرر الخواص أو الضغط مرتين على عنصر القائمة أو الضغط على العنصر بالزر Items الخاصة
اليميني
Menu Item ) من القائمة عند ذلك سيظهر مصمم القوائم وفيه عنصر قائمة Menu Desigenr واختر
ضمن محرر الخواص . Caption ) فارغ مضاء وستضاء أيضًا الخاصة
القيمة ( &ملف ) : ستلاحظ ظهور عنصر القائمة ملف وظهور خط صغير تحت Caption 3 أعط الخاصة
. Caption الحرف م في كلمة ملف وذلك لأننا وضعنا الرمز & قبل هذا الحرف في الخاصة
للزر الظاهر تحت عنصر القائمة ملف القيمة ( &جديد ) . Caption 4 أعط الخاصة
فتح ) . & ) Caption 5 وسيظهر عندها زر جديد تحت الزر السابق أعطه
للزر الأخير القيمة – وذلك لإظهار خط فاصل بين أوامر القائمة . Caption 6 أعط ال
أوامر القائمة
عناصر القوائم ضمن شريط القوائم
أمر يفتح قائمة فرعية
مفتاح تسريع
اختصارات لوحة المفاتيح
شريط فاصل
http://goo.gl/R2U0yZ لغة البرمجة دلفي
28
لآخر زر ناتج القيمة & إغلاق . Caption 7 أعط ال
تحرير . & Caption 8 أختر عنصر القائمة الموجود بجانب العنصر ملف وأعطه ال
وتقوم هذه الخاصة Ctrl + c القيمة Shortcut القيمة نسخ، والخاصة Caption 9 أعط الزر الذي تحته ال
بتنفيذ عملية الضغط على عنصر القائمة عند طريق استخدام لوحة المفاتيح .
. Ctrl + X القيمة Shortcut قص ، والخاصة Caption 10 أعط الزر التالي ال
. Ctrl + V القيمة Shortcut لصق ، والخاصة Caption 11 أعط الزر التالي ال
إنشاء قائمة فرعية لقائمة رئيسية :
نمط الخط ، اضغط عليه بزر الفأرة اليميني Caption 12 أعط الزر الذي يلي الزر لصق ال
ستظهر عندئذ قائمة فرعية أعط فيها الأوامر الثلاث التالية : Create SubMenu واختر
غامق ، مائل ، تحته خط .
العمل مع عناصر القائمة :
أو نضغط بزر الفأرة الأيمن ونختار Delete 1 لحذف عنصر قائمة نختار أي عنصر ونضغط على الزر
من القائمة . Delete
من Insert 2 لإضافة عنصر جديد بين عنصرين نختار العنصر السفلي ونضغط بزر الفأرة الأيمن ونختار
القائمة .
3 لتغيير موقع عنصر قائمة أو لإعادة ترتيب قائمة نسحب العنصر الذي نريد نقله ( نضغط بزر الفأرة على
العنصر ونبقيه مضغوطًا ) ثم نحرر زر الفأرة ليتوضع في المكان الجديد .
أو إلى mbBreak لأمر القائمة المطلوب إلى Break 4 لإظهار عناصر قائمة متجاورين أفقيًا نغير الخاصة
وحيث تظهر الثانية خط عمودي بين الأوامر ، ولإعادة القائمة إلى الحالة الافتراضية نختار mbBarBreak
. mbNone
حدث الضغط على عنصر قائمة :
5 تستخدم القوائم لتنفيذ تعليمات معينة ولكتابة هذه التعليمات نضغط على الأمر في القائمة أو نختاره ونضغط
في محرر الخواص . Event من الصفحة OnClick على الحدث
ويمكن دمج قوائم النافذة الأبن مع نوافذ النافذة الأب MDI 6 غالبًا ما تستخدم القوائم مع البرامج متعددة الوثيقة
وسندرس ذلك لاحقًا.
: ( Popup Menu ) القائمة المنبثقة
هي عبارة عن قائمة تظهر عند الضغط على زر الفأرة اليميني ويمكن ربطها مع النموذج أو أي عنصر آخر
. Main Menu وتصميهما مشابه لتصميم القائمة الرئيسية
مثال :
كذلك . Panel إلى مشروع جديد وأضف عنصر PopUpMenu أضف عنصري قائمة منبثقة
أضف إلى عنصر القائمة الأولى الأوامر التالية : الأمر الأول ، الأمر الثاني ، الأمر الثالث .
أضف إلى عنصر القائمة الثانية الأوامر التالية : الرابع ، الخامس .
'لقد ضغطت على الأمر الأول من القائمة' 'الأولى
http://goo.gl/R2U0yZ لغة البرمجة دلفي
29
اضغط على الأمر الأول واكتب التعليمة التالية:
Showmessage ( "you click the first button" );
اضغط على الأمر الثاني واكتب التعليمة التالية :
Showmessage ( "you click over the second button " );
اضغط على الرابع واكتب التعليمة التالية :
Showmessage ("you click over the third button")
اضغط على الخامس واكتب التعليمة التالية :
Showmessage ("you click over the fifth button" )
. PopUpMenu التابعة للنموذج وأعطها القيمة 1 PopUpMenu اختر الخاصة
.PopUpMenu وأعطها القيمة 2 Panel التابعة لل PopUpMenu اختر الخاصة
. Panel نفذ البرنامج واضغط بزر الفارة الأيمن على كل من النموذج وال
: ( Comments) إضافة ملاحظات إلى البرنامج
يستخدم المبرمج الملاحظات ليتذكر عمل مقطع برمجي محدد ، وليترك فكرة عما يريد أن يطوره مستقب ً لا في
سطور برمجية معينه .
يمكن إضافة ملاحظات إلى البرنامج :
1 { أكتب أي نص تريده بين هذين القوسين ، ويمكن أن يكون على عدة أسطر } .
2 (* أكتب أي نص تريده بين إشارتي القوس والنجمة ، ويمكن أن يكون على عدة اسطر *) .
3 // أكتب أي نص تريده بعد هذين الإشارتين ، النص على سطر واحد فقط .
لكتابة الملاحظات في اللغة العربية : اضغط بمؤشر الفأرة الأيمن في وسط محرر الشيفرة واختر من القائمة
إلى Editor Font وغير الخاصة Display أختر منها الصفحة Property Editors فتظهر النافذة properties
... Ok اضغط على ، Courier New ( Arabic) القيمة
:Data Types أنواع المعطيات
عددًا من أنواع المعطيات مسبقة التعريف بحيث تمكننا من التصريح (Object Pascal) تملك لغة باسكال الهدفية
مباشرة عن متحولات تنتمي لهذه الأنواع. والجدول التالي يعرض أنواع المعطيات مسبقة التعريف في هذه اللغة:
الأنواع الصحيحة :
نوع المعطيات وصفها
هي أعداد بدون فاصلة عشرية. تقع هذه الأعداد ضمن المجال من ( - 2147483648 )وحتى Integer
2147483647 ) ، وتتطلب أربع بايتات من الذاكرة لتخزينها ( كان حجمه في تربو باسكال )
2 بايت ) لذلك ليس من الضروري ان تتطابق أنواع المعطيات بين دلفي و تربو باسكال) .
هي أعداد بدون فاصلة عشرية. تقع في المجال بين (- 128 ) وحتى( 127 ) وتتطلب بايتًا واحدًا Shortint
من الذاكرة .
وهي أعداد بدون فاصلة عشرية وتقع في المجال بين (- 32768 )وحتى ( 32767 ) وتتطلب Smallint
http://goo.gl/R2U0yZ لغة البرمجة دلفي
30
بايتين من الذاكرة لتخزينها
هي أعداد بدون فاصلة عشرية، وتقع في المجال بين( 2147483648 -)وحتى Longint
2147483647 )وتتطلب أربع بايتات من الذاكرة لتخزينها )
هي أعداد بدون فاصلة عشرية وبدون إشارة تقع في المجال بين ( 0) وحتى ( 225 )وتتطلب Byte
بايتًا واحدًا من الذاكرة .
هي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين ( 0)وحتى( 65535 )وتحتاج Word
بايتين من الذاكرة.
وهي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين( 0) وحتى Cardinal
2147483647 ) وتحتاج أربع بايتات لتخزينها. )
2*1063- 2- ) وحتى المجال ( 1 * وهي أعداد بدون فاصلة عشرية وتقع ضمن المجال ( 1063 Int64
) وتحتاج إلى ثمان بايتات من الذاكرة
الأنواع الحقيقية
هي أعداد تحتوي فاصلة عشرية وجزءًا عشريًا فيه ( 7 ) أو ( 8 ) أرقام وتقع في المجال Single
3.4 وتحتاج إلى أربع بايتات من الذاكرة * 1.5 وحتى 1038 * 10- من 45
هي أعداد تحتوي فاصلة عشرية وجزءًا عشريًا فيه ( 11 ) أو ( 12 ) وتقع ضمن المجال Real
1.7 وهي تحتاج إلى ست بايتات من الذاكرة وتستخدم للتوافق مع نسخ * 2.9 إلى 1038 *10-39
أولى Double أو Extended باسكال القديمة وإلا فإن استخدام
هي أعداد تحتوي فاصلة عشرية وجزءًا عشريًا فيه ( 15 ) أو ( 16 ) وتقع ضمن المجال Double
1.7 وتحتاج إلى ثماني بايتات من الذاكرة . * 5.0 إلى 10308 *10-324
هي أعداد تحتوي فاصلة عشرية وجزءًا عشريًا فيه ( 19 ) أو ( 20 ) رقم وتقع في المجال Extended
1.1 وتحتاج إلى عشرة بايتات من الذاكرة * 3.4 وحتى 104932 *10-4932
وهي أعداد حقيقية ذات فاصلة ثابتة بخلاف باقي الأنواع ذات الفاصلة العائمة ، وهي ملائمة Currency
للحسابات المالية وتملك جزءًا عشريًا من ( 19 ) أو ( 20 رقم ) وتقع ضمن المجال
-922337203685477.5808 وحتى 922337203685477 ويتطلب تخزينها ثمان بايتات
.
هي أعداد تحتوي فاصلة عشرية وجزءًا عشريًا فيه ( 19 ) أو ( 20 ) رقم وتقع في المجال Comp
9.2 وتحتاج إلى ثمان بايتات من الذاكرة . * -9.2 وحتى 1018 *1018
http://goo.gl/R2U0yZ لغة البرمجة دلفي
31
الأنواع البوليانية :
ويحتاج False أو True هو نوع منطقي يمكن أن تأخذ المتحولات المنتمية إليه إحدى قيمتين Boolean
إلى بايت واحد من الذاكرة .
ويحتاج إلى بايت واحد من C يستخدم للتوافق مع لغات أخرى مثل Boolean مثل نوع ByteBool
الذاكرة
ويحتاج إلى بايتين من الذاكرة C يستخدم للتوافق مع لغات أخرى مثل Boolean مثل نوع Wordbool
ويحتاج إلى أربع بايتات من C يستخدم للتوافق مع لغات أخرى مثل Boolean مثل نوع Longbool
الذاكرة
الأنواع الرمزية :
هو نوع رمزي يحتاج إلى بايت واحد من الذاكرة لتخزين شيفرة أسكي المقابلة لرمز معين AnsiChar
. Character
) Unicode هو نوع رمزي يحتاج إلى بايتين من الذاكرة لتخزين رمز بالشيفرة الموحدة WideChar
وهي عبارة Windows 2000,Xp الشيفرة الموحدة تم اعتمادها منذ فترة في أنظمة التشغيل
تمثيل يضم جميع لغات العالم ( عدى لغات شرق آسيا ) ويحتاج كل رمز فيها إلى 16 بت .
WideChar ولكنه قد يشير إلى Windows 98,Me تحت بيئة AnsiChar هو نفس النوع Char
. Windows 2000,Xp في بيئة
أنواع السلاسل الرمزية :
هو عبارة عن مصفوفة من الرموز غير محدودة الطول يبدأ حجمها 4بايت وينتهي ب 2 جيغا AnsiString
بايت
. ( وتبدأ رموزها من الحجرة الأولى 1 ( لا وجود للحجرة 0
هو عبارة عن مصفوفة من الرموز حدها الأقصى 256 رمز ويأخذ حجمها بين 2 بايت و Sortstring
256 بايت ويخزن في الحجرة الأولى منها ( الحجرة رقم 0 ) طول المصفوفة
يبدأ حجمها 4بايت وينتهي Unicode هو عبارة عن مصفوفة من الرموز بالشيفرة الموحدة WideString
. ( ب 2 جيغا بايت وتبدأ رموزها من الحجرة الأولى 1 ( لا وجود للحجرة 0
أو AnsiString بشكل افتراضي تعريف متحول من هذا النوع يكافئ تعريف متحول String
في حال أضفنا Shortstring حسب نظام التشغيل ، ويمكن أن يشير إلى WideString
{$H-} implementation التعليمة التالية في بداية القسم
http://goo.gl/R2U0yZ لغة البرمجة دلفي
32
. ( Null ) السلاسل الرمزية المنتهية بلا شيء
Null هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز PAnsiChar
AnsiChar ورموز هذه السلسة من النوع
Null هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز PWideChar
WideChar ورموز هذه السلسة من النوع
Char نفس النوعين السابقين ويؤشر على النوع Pchar
المؤشر
وهو مؤشر غير محدد النوع أي يؤشر إلى أي نوع من المعطيات ،ويحتاج إلى أربع حجرات Pointer
من الذاكرة .
النوع المتنوع ( المتغير )
نوع متغير متوافق مع جميع انواع المعطيات ويمكن أن يخزن قيمًا وفق أي نوع . Variant
أمثلة :
: Boolean 1 النوع
وأكتب التعليمات التالية Edit وعنصري Button أنشأ مشروعًا جديدًا وأضف إليه زر
var a:Boolean;
i,j:integer;
begin
i:=strtoint(edit1.text);
j:= strtoint(edit2.text);
a:= i>j;
if a then showmessage (' العدد اللأول أكبر من الثاني ' ) else showmessage ('العدد الثاني أكبر من
الأول')؛
: Shortstring 2 النوع
إلى مشروع جديد : واكتب التعليمات التالية عند الضغط على الزر : Edit و عنصر Label أضف زر وعنصري
var a:shortstring;
begin
a:=edit1.text;
form1.Caption := inttostr(word(a[0]);
if word(a[0]) >= 4 then
label1.Caption := a[3]+a[4];
يساوي 65 واستخدم هذا التابع لأن طول Word('A') بإعادة شيفرة الأسكي لرمز معين مث ً لا Word يقوم التابع
السلسة مخزن كرمز وليس كرقم .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
33
الجلسة السادسة
: String 2 النوع
هو السلسة المطلوب حساب طولها S حيث Length('s') للحصول على طول سلسلة رمزية نستخدم التابع
مثال :
إلى مشروع جديد واكتب التعليمات التالية عند حدث الضغط على الزر : Edit و label أضف زر وعنصر
var a:string;
begin
a:=edit1.text;
label1.Caption := inttostr(length(A);
label2.Caption :=inttostr(length('asdfgh');
: Pchar 3 النوع
Var P:pchar; : Pchar من النوع P لنفرض أنه عرفنا متحول
'Hello ;Form1.Caption := p : التعليمة التالية Begin ثم كتبنا في القسم
p:= All…….'
هذا يكافئ كتابة التعليمات التالية :
s: string;
begin
s:= 'HELLO ALL......'#0 ;
p:= @s[1];
form1.Caption := p;
. Null ب s ووضعه هنا ينهي السلسلة Null حيث 0# هو رمز الأسكي ل
. s @ يعيد عنوان موقع الذاكرة المخزن فيه الحرف الأول من السلسلة
: Variant ( 4 النوع المتغير ( المتنوع
اكتب التعليمات التالية في حدث الضغط على زر :
var v1,v2,v3 :variant;
begin
v1:= 5;
v2:= 20;
v3 := v1+v2 ;
form1.Caption := v3;
: EvariantError التعليمات التالية تعطي رسالة خطأ من النوع
v1:= 5;
v2:= 'asd';
v3 := v1+v2 ;
ولكن التعليمات التالية لا تعطي هذا الخطأ :
v1:= 5;
v2:= '123';
v3 := v1+v2 ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
34
دائمًا : لاحظ أن هذا المتحول ضد التو  جه العام للغة باسكال و ضد أعراف Variant لماذا لا نستخدم النوع
لن يحذرك من compiler البرمجة الجيدة، هذا النوع يتم فحص نوعه و يتم حسابه في وقت التشغيل، والمج  مع
احتمالات الأخطاء، و التي لن يستدلّ عليها إلا بعد اجراء اختبارات مكثفة، بصورة عامة، يمكنك اعتبار أجزاء
لأنه، مثل أي لغة تفسيرية، العديد من ،interpreted الترجمة التي تستخدم هذا النوع هي ترجمة فورية
العمليات لا يمكن التقرير بشأنها وحّلها إلا في وقت التشغيل، هذا يؤثر بصفة خاصة في سرعة التنفيذ.
المتحولات العامة والخاصة :
لكل وحدة قسم خاص بالمتحولات المستخدمة داخل الوحدة نفسها ويدعى Interface يوجد في القسم
والمتحول المعرف في هذا القسم يمكن استخدامه في جميع إجراءات وتوابع هذه الوحدة لكن لا private
يمكن الوصول إليه من خارجها .
وهناك قسم آخر يشبه القسم السابق ويختلف عنه بإمكانية الوصول إليه من وحدات خارجية مرتبطة مع الوحدة
. Public المعرف فيها هذا المستخدم ويدعى
مثال :
المتحول التالي : Private أنشئ مشروعًا جديدًا وأضف إليه زرًا وعرف في القسم
private
I :integer;
المتحول التالي : Public وعرف في القسم
public
x:integer;
الخاص بالنموذج واكتب فيه التعليمات التالية : OnCreate أذهب إلى الحدث
I := 4 ; X := 24;
يتم تنفيذه عند يقوم ويندوز بإنشاء النافذة والتعليمات السابقة تعطي قيم ابتدائية للمتحولين OnCreate الحدث
أي procedure TForm1.FormCreate لاحظ استخدام هذين المتحولين ضمن الإجراء ) X,I
يمكن استخدامها ضمن أي جزء من البرنامج ) .
أضف نموذجًا جديدًا وأضف إليه زرًا الآن اذهب إلى النموذج الأول واكتب التعليمة التالية في حدث الضغط على
الزر :
form2.Show ;
. ( Uses نفذ البرنامج حتى يتم ربط الوحدة الثانية مع الأولى بشكل آلي ( أو اكتب أسم الوحدة الأولى في القسم
في حدث الضغط على الزر الموجود في النموذج الثاني أكتب التعليمة التالية :
Form2.Caption := inttostr ( Form1.X) ;
نفذ البرنامج لربط الوحدات مع بعضها آليًا ثم نفذ البرنامج، الزر في النافذة الأولى سيقوم بإظهار النافذة الثانية،
من الوحدة الأولى ويضعها في عنوان النافذة . X والزر في النافذة الثانية سيأخذ القيمة
Implementation قبل Var هناك طريقة أخرى لتعريف متحول خاص بالوحدة عن طريق تعريفه بالقسم
ويتميز تعريف المتحول هنا بإمكانية إعطاء قيمة مبدئية له مباشرة .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
35
Implementation قبل Var مثال : عرف المتحولات التالية في القسم
Y: string = 'abcd'; F : double = 55;
: Const الثوابت
الثابت هو حجرة من الذاكرة تحمل قيمة معينة طوال فترة تنفيذ البرنامج :
فتكون ثوابت عامة ، ويمكن تعريفها Implementation قبل Type يمكن تعريف الثوابت خارج القسم
وتكون ثوابت خاصة بالوحدة .ويكون تعريفها بالطريقة التالية : Implementation في القسم
Const
pi=3.14;
pi2=22/7;
programmer = 'Khaled';
ويمكن تعريفها بطريقة أخرى :
Const
Pi :Real = 3.14;
pi2:single =22/7;
programmer :string= 'Khaled';
الإجراءات والتوابع :
مبدئيا هي سلسلة من التعليمات تحت اسم خاص، و التي يمكن تنفيذها في كل م  رة باستخدام اسمها، بهذه الطريقة
تتجنب معاودة كتابة التعليمات مرة بعد أخرى، فتتح  صل على مجموعة واحدة من التعليمات يمكنك استدعائها في
كامل البرنامج.
function و تابع procedure يمكن افتراضها بشكلين: إجراء routine في دلفي الإجرائية
نظريا، يستخدم الإجراء عندما نريد من الحاسب القيام بعمل ما دون أن يعيد قيمة معينة ،والتابع هو عبارة عن
إجراء ينفذ مجموعة من التعليمات ليعيد قيمة معينة يطلبها المبرمج . هذا الفرق يؤ ّ كده حقيقة أن التابع له نتيجة
قيمة مسترجعة، بينما الإجراء ليس كذلك، كلا النوعين من الاجرائيات يكمن أن يكون لهما عدة ،result
من أنواع بيانات تعطى لها . ، parameters متحولات
عمليًا، الفرق عموما بين التوابع و الإجراءات محدود جدا: يمكنك استدعاء تابع لإنجاز عمل ما ثم تتخ ّ طى النتيجة
(التي قد تكون رمز خطأ اختياري أو ما شابه) كما بامكانك استدعاء إجراء يم  رر نتيجته ضمن متحولاته.
وهذا مثال لتعريف إجراء :
procedure Hello;
begin
ShowMessage (' ;('مرحبًا بكم في دلفي
end;
وهذا مثال لتعريف تابع :
function Double (Value: Integer) : Integer;
begin
Double := Value * 2;
end;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
36
ولاستدعائها، أضف زرين واكتب التعليمة Implementation تكتب هذه الإجراءات أو التوابع في القسم
التالية في حدث الضغط على الزر الأول :
Hello
والتعليمة التالية في حدث النقر على الزر الثاني :
Form1.caption := inttostr( Double(6));
المتحولات داخل إجراء أو تابع :
1 الحالة العامة
Procedure ProcedureName ( var1,var2,var3: anytype ;
var4,var5:any type) ;
Begin
….

end;
مثال :
Procedure Add( x,y : integer) ;
Begin
Y:= x+y ;
End;
واكتب فيه التعليمات التالية : Label أضف زر وعنصري
var i,j:integer;
begin
i:=1;j:=2;
add(i,j);
label1.Caption := inttostr(i);
label2.Caption := inttostr(j);
ولكنه لا يعيد أي نتيجة . y إلى x الذي يقوم بإضافة Add يقوم هذا البرنامج باستدعاء التابع
2 المتحولات ( الوسطاء ) المتغيرة :
Procedure ProcedureName ( var1,var2,var3: anytype ;var
var4,var5:any type) ;
Begin
….

end;
مثال :
ليصبح كتالي ونفذ البرنامج Add عدل الإجراء
procedure add(x:integer;var y:integer);
begin
y:= x+y;
end;
. j وبالتالي تتغير قيمة y ولكنه يعيد قيمة y إلى x الذي يقوم بإضافة Add يقوم البرنامج باستدعاء الإجراء
http://goo.gl/R2U0yZ لغة البرمجة دلفي
37
ملاحظات :
Add ( ولكن لا يمكن استدعائه بالشكل Add( 1,j) المعدل بالشكل Add أ يمكن استدعاء الإجراء
وذلك لأن الوسيط الثاني لهذا الإجراء يجب أن يكون متحول حتى تتم إعادة Add( أو بالشكل ( 1,2 I,2)
النتيجة فيه .
ب قد يتبادر إلى الذهن هنا السؤال التالي بما أنني أريد من الإجراء أن يعيد قيمة ما فلماذا لا أستخدم تابع؟
والجواب هنا أنه بهذه الطريقة يمكن أن يعيد الإجراء أكثر من قيمة بينما يعيد التابع قيمة وحيدة، على كل حال هذه
الطريقة يمكن أن تستخدم مع الإجراءات والتوابع على حد سواء أي انه يمكن أن نعرف تابع يعيد قيمة ما عن
طريق إسمه وقيم أخرى عن طريق متحولاته ( وسطاءه ) .
3 الوسطاء الثابتة :
Procedure ProcedureName ( const var1,var2,var3: anytype ;
var4,var5:any type) ;
Begin
….

end;
ولا يفيد ذلك إلا Const عندما لا نكون بحاجة لتغير قيمة الوسيط ضمن التابع يمكن أن نعرفه من النوع الثابت
في زيادة سرعة البرنامج .
ليصبح بالشكل : Add عدل التابع
procedure add(const x:integer;var y:integer);
begin
y:= x+y;
end;
نفذ البرنامج ولن تلاحظ أي فرق في النتائج .
أما إذا عدل البرنامج ليصبح بالشكل
procedure add(const x:integer;const y:integer);
begin
y:= x+y;
end;
وتعني Left side cannot be assigned to : فسيعطي تنفيذ البرنامج رسالة الخطأ التالية
لأنها من النوع الثابت . Y أنه لا يمكن إعطاء قيمة ل
5 إجراءات القيمة الافتراضية :
يمكن إعطاء وسيط ما قيمة إفتراضية والاستغناء عن تمرير قيمه له عند الطلب :
Procedure ProcedureName(var1,var2,var3: anytype ; var4:
anytype = Value ; var5:anytype= value) ;
Begin
….

end;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
38
ليصبح بالشكل Add مثال : عدل الإجراء
procedure add(var x:integer;var y:integer=5);
begin
x:= x+y;
end;
بأحد الشكلين التاليين : Add الآن يمكن أن نطلب الإجراء
Add ( I,j) or Add( I )
في الحالة والثانية سيقوم الإجراء باستخدام القيمة الافتراضية المعطاه في تعريف الإجراء .
ملاحظة : الوسطاء الافتراضية يجب أن تكون آخر الوسطاء المعرفة في التابع
: overload 4 تعريف تابع فوق تابع أو إجراء فوق إجراء
تمكننا هذه الطريقة من تعريف مجموعة توابع لها نفس الأسم ولكل منها وظيفة محددة .
إلى مشروع جديد واكتب الإجراءات التالية Label مثال : أضف ثلاثة أزرار وعنصري
procedure change( i :integer; var s :string) ; overload;
begin
s:=inttostr(i);
end;
procedure change( i:tdatetime; var s :string) ; overload;
begin
s:= datetostr(i)
end;
procedure change( i:tdatetime; var s1,s2 :string) ;
overload;
begin
S1:= datetostr(i);
S2 := datetostr( i+1);
end;
في حدث الضغط على الزر الاول أكتب التعليمة التالية :
Var a:string ;
begin
change ( 5,a) ;
Label1.Caption := a ; end;
وفي حدث الضغط على الزر الثاني أكتب التعليمات التالية :
Var B:String ; begin
Change ( date,b);
Label2.Caption := b; End;
وفي حدث الضغط على الزر الثالث أكتب ما يلي :
Var A,B:string; begin
http://goo.gl/R2U0yZ لغة البرمجة دلفي
39
Change ( date,a,b);
Label1.Caption := A; Label2.Caption := B; end;
: Result 6 متحول النتيجة
هو عبارة عن متحول افتراضي في بيئة دلفي توضع قيمة التابع : Result
بأحد الشكلين : Add يمكن كتابة التابع
Function add( x,y:integer) :
integer;
Begin
result := x+y;
End;
Function add( x,y:integer) :
integer;
Begin
Add := x+y;
End;
جعل الإجراء مرئي من قبل وحدات أخرى :
نعلم أنه كي نستطيع استدعاء متحول أو تابع من وحدة إلى أخرى يجب أن تكون موجودة في القسم
. Interface
مث ً لا : Var قبل Interface 1 وضع أسم الإجراء في القسم
Procedure Add( x,y : integer) ;
: Implementation في القسم ( Begin… end ) ثم نكتب الإجراء مع جسمه
Procedure Add( x,y : integer) ;
Begin
Y:= x+y ;
End;
بهذه الطريقة نستطيع طلب الإجراء من أي وحدة أخرى مرتبطة بالوحدة التي عرف في الإجراء عن طريق ذكر
اسمه فقط .
. Type 2 يمكن أن نضيف اسم الإجراء مع وسطائه إلى القسم
Private قبل Type مثال : أضف السطر التالي في القسم
Procedure Add( x,y : integer) ;
بالشكل التالي : Implementation في القسم Add على أن نعرف الإجراء
Procedure Tform1.Add( x,y : integer) ;
Begin
Y:= x+y ;
End;
بالشكل التالي : Form العائد لل 1 Add أضف وحدة أخرى إلى البرنامج وأطلب منها التابع
Form1.add ( x,y ) ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
40
الجلسة السابعة
التوابع ذات الوسطاء المتعددة :
Procedure procedureName ( var parameter1 : array of anytype
; par2,par3:anytype );
Begin
……………………
……
end;
يعرف في هذه الإجراءات ( التوابع ) وسيط على أنه من نوع مصفوفة غير محدودة العناصر
مثال :
Function add( a:array of integer): string ;
var h,i,s : integer;
begin
s:=0;
h := high(a);
for i:= 0 to h do s:= s + a[i];
result:= inttostr(s);
end;
الذي يعيد رقم آخر عنصر في مصفوفة ( إي إذا عرفنا مصفوفة ما بالشكل High استخدمنا هنا التابع
2] سيعيد القيمة 3 وإذا عرفت بالشكل .. 0] سيعيد التابع القيمة 3 وإذا عرفنها بالشكل [ 3 ..3]
. 22 ] سيعيد 88 ..88]
في حدث الضغط على زر أكتب التعليمات التالية :
form1.Caption := add([1,3,4,89])
سيقوم البرنامج بجمع الأعداد ووضع الناتج في عنوان النافذة
وتنتهي بحسب العناصر التي أدخلها A[ ملاحظة : المصفوفات المتغيرة تبدأ دائمًا بالعنصر رقم صفر أي [ 0
من الصفر . Add المستخدم ( لذلك بدأت الحلقة المستخدمة في التابع
: ProgressBar شريط العمل
أي Setup هو شريط يؤشر إلى كمية إنجاز العمل حتى لحظة معينة ( نفس الشريط الذي يظهر عند بدأ تنصيب
برنامج ) كما يمكن استخدامه لإظهار قيمة معينة .
مثال :
إلى مشروع جديد : Timer و Win من الصفحة 32 Progress Bar أضف
التعليمات التالية : OnTimer للمؤقت القيمة 100 واكتب في الحدث Interval أعط الخاصة
if progressbar1.Position < 100 then
progressbar1.Position := progressbar1.Position+1;
الخصائص المهمة التالية : ProgressBar ل
و Min وتأخذ قيمة بين ProgressBar تعطي موقع الشريط الأزرق داخل : Position 1
. Max
http://goo.gl/R2U0yZ لغة البرمجة دلفي
41
. Postion تحدد أصغر قيمة يمكن أن تأخذها الخاصة : Min 2
. Postion تحدد أكبر قيمة يمكن أن تأخذها الخاصة : Max 3
طول الخطوة وتحدد المسافة التي يقطعها الشريط الأزرق في كل مرة تنفذ فيها التعليمة : : Step 4
progressbar1.Position := progressbar1.Position+1;
لهذه الخاصة يظهر الشريط الأزرق بدون تقطيعات . True عند إعطاء القيمة : Smooth 5
يعمل بشكل ProgressBar ال ، pbVertical عند إعطاء القيمة : orientation 6
قيمة كبيرة 100 مث ً لا ) ProgressBar ل Height عمودي ( لملاحظة ذلك أعط الخاصة
: TrackBar: شريط القيمة
يشبه هذا الشريط الشريط السابق ولكنه يختلف عنه بإمكانية تحريك مؤشره بواسطة الفأرة ومكان المؤشر سيعيد
قيمة ليستخدمها البرنامج
القيمة 1000 Max وأعط الخاصة Win من الصفحة 32 TrackBar مثال : أضف إلى المشروع السابق
القيمة 1 Min والخاصة
التعليمة التالية Onchange واكتب في الحدث
timer1.Interval := trackbar1.Position ;
trackbar كلما تغير موقع مؤشر ال 1 Interval تقوم هذه التعليمة بتغير الخاصة
لتصبح بالشكل : ontimer عدل التعليمات الموجودة في
if progressbar1.Position < 100 then
progressbar1.Position := progressbar1.Position+1
else progressbar1.Position := 0;
نفذ البرنامج وحرك المؤشر لتلاحظ كيف يمكن أن نتحكم بسرعة المؤقت أثناء التنفيذ.
التعامل مع الحلقات :
لن أشرح هنا الحلقات ولكن سأتعرض لبعض الحلقات ومشاكلها :
حلقة التأخير الزمني :
والهدف منها تأخير ( For ,Repeat ,While ) حلقة التأخير الزمني يمكن تمثيلها بأي نوع من الحلقات
إلى مشروع جديد واكتب التعليمات التالية progressbar عمل ما لفترة زمنية بسيطة مثال : أضف زر و
في حدث الضغط على الزر :
var i :integer;
begin
for i := 0 to 100 do
progressbar1.Position := i
نلاحظ أن مؤشر الخط الأزرق قد تحرك بسرعة كبيرة ( غير ملحوظة ) لذلك نضيف حلقة للتأخير الزمني ( عدل
التعليمات السابقة كما يلي:
var i,j :integer;
begin
for i := 0 to 100 do begin
for j := 0 to 90000 do ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
42
progressbar1.Position := i
end;
لا تنفذ شيء لكنها تعيق تنفيذ التعليمة التالية بعض for j := 0 to 10000 do ; نلاحظ أن الحلقة
الوقت .
أضف الآن إلى البرنامج السابق زر جديد واكتب في حدث الضغط عليه التعليمة التالية :
Form1.color := clred;
حاول الضغط على الزر الثاني أثناء تنفيذ الحلقة ( إضغط على الزر الأول ثم الثاني ) ولاحظ أنه لا يمكن الضغط
عليه حتى ينتهي تنفيذ الحلقة .
لا يؤثر ثلك على بقية البرنامج ولكن عند استخدام progressbar عندما نستخدم المؤقت لتحريك ال
الحلقات لا يمكن تنفيذ حدث جديد حتى الخروج من الحلقة ولحل هذه المشكلة أضافت دلفي التعليمة التالية في حلقة
التأخير الزمني
For j := 0 to 90000000 do
Application.ProcessMessages ;
تقوم هذه الرسالة بإعطاء البرنامج فرصة لتنفيذ تعليمات أخرى خارج الحلقات ( أي يمكنك الآن الضغط على الزر
الثاني وتنفيذ التعليمات المرتبطة به على الرغم من أن الحلقة تعمل ) .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
43
الجلسة الثامنة
بعض التوابع المعرفة في دلفي :
أً توابع التعامل مع الأعداد :
للوحدة التي تستدعي هذه Uses لذلك يجب إضافتها إلى القسم Math معظم هذه التوابع موجودة في الوحدة
التوابع .
أسم التابع عمله
x يعيد القيمة المطلقة لعدد معطى Abs(x)
eX يعيد التابع القيمة Exp(x)
Floor (2.8) = مثال : ; 2 X يعيد أقرب عدد طبيعي أقل أو يساوي Floor(x)
Floor(-2.8) = -3
Frac(234.987)= مثال : 0.987 X يعيد الجزء العشري للعدد Frac(x)
Int(234.987)= تعيد القسم الطبيعي من عدد حقيقي 234 Int(x)
مثال XY يعيد القيمة IntPower(X,y)
intpower(2,3)=8;intpower(2,2)=4
يسعى إلى اللانهاية .( لا حظ المثال في X في حال كان True يعيد القيمة Isinfinite(X)
الأسفل )
X*2Y يعيد التابع القيم LdExp(x,y)
Len(e) = 1 : X يعيد اللوغاريتم الطبيعي للعدد Ln(x)
Log10(10) = 1 : X يعيد اللوغاريتم العشري للعدد Log10(X)
Y بالنسبة للأساس X يعيد لوغاريتم القيمة LogN(Y,X)
Max(3,6) = يعيد قيمة الرقم الأكبر : 6 Max(X,Y)
Min(3,6) = يعيد قيمة العدد الأصفر : 3 Min ( X,Y)
يعيد القيمة 3.14159265358932358 Pi
Poly ( x,y:array
of double)
لاحظ Y[0]*X0+Y[1]*X1+…..+Y[n]*Xn يعيد قيمة السلسة
المثال في الأسفل
XY يعيد القيمة Power ( X,Y)
Round ( 1.5) = : X يعيد تدوير العدد الحقيقي Round ( X)
2;Round(1.4)=1;Round(1.6) =2
X= سالبًا و 0 إذا كان 0 X موجبًا و 1- إذا كان X يعيد القيمة 1 إذا كان Sing(X)
X يعيد القيمة 2 Sqr(x)
X يعيد القيمة Sqrt(x)
Trunc(5.022) = : X يعيد الجزء الطبيعي من العدد Trunc(x)
http://goo.gl/R2U0yZ لغة البرمجة دلفي
44
5;Trunc(5.999)=5
مثال :
: Isinfinite(X) 1
أضف زر واكتب في حدث الضغط عليه التعليمات التالية :
var v: variant;
x:double;
begin
x:=1/0;
v:= isinfinite(x);
if v then
form1.Caption := 'true';
. Integer من النوع X 1 والتي لن تقبل في حال كون / القيمة 0 X لاحظ أننا وضعنا في
: Poly ( x,y:array of double) 2
أضف زر واكتب في حدث الضغط عليه التعليمات التالية :
var v: variant;
begin
v:= poly (4,[2,3,4,5]);
form1.Caption := v;
2ً توابع قلب وتحويل الأنواع : ترفض لغة دلفي إلحاق الأنواع المختلفة بعضها ببعض لذلك وجدت بعض
التوابع والإجراءات التي تقوم بقلب بين الأنواع التي لها نفس الحجم ومن هذه التوابع :
Integer ('A') = 65; Integer ('a') = 97;
Char ( 97 ) = 'a'; Char (48) = '0'; char (65)= 'A';
Boolean(0) = false; Boolean ( 1 ) = true;
كما يمكن التحويل بين الأنواع المختلفة في الحجم بواسطة توابع معرفة مسبقًا :
الجدول التالي يوضح بعض توابع تحويل الأنواع :
أسم التابع عمله
int ولكنه يحول النص المعطى إلى النوع 64 Strtoint يشبه التابع Strtoint64
إلى نص : X يحول العدد الحقيقي Floattostr(X)
Floattostr(5.5e3)='5500';Floattostr(5.5)='5.5'
إلى نص ولكن بشكل محدد ( أنظر الأمثلة في الأسفل ) . X يحول العدد الحقيقي FloattostrF(x,,,,)
Strtofloat(3.3)= إلى رقم ذو فاصلة عائمة : ; 3.3 S يحول النص Strtofloat(s)
Strtofloat( 3.3e4)=33000
إلى رقم من النوع عملة . S يحول هذا التابع النص Strtocurr(S)
عدد أرقام النتيجة لا y إلى عدد ست عشري وتمثل X يحول هذا التابع العدد الصحيح Inttohex(X,y)
حظ المثال :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
45
أمثلة :
function FloatToStrF(Value: Extended; Format: : التابع
TFloatFormat ; Precision, Digits: Integer):string ;
بعدة طرق حسب الوسطاء المعطاه في التابع وخاصة الوسيط Value 1 يظهر هذا التابع العدد الحقيقي
الذي يأخذ عدة قيم سيتم شرحها مع الأمثلة : Format
: ( مثال ( 1
Format = FFGeneral 1
إلى أقرب عدد بالفاصلة الثابتة أو العائمة مع إزالة كافة الأصفار على Value تقوم هذه التعليمة بتحويل العدد
التي تحدد العدد الأعظمي لأرقام النتيجة .والقيمة Precision يسار الفاصلة وتتأثر هذه الخاصة بالقيمة
التي تحدد عدد أرقام الأس Digits
أضف إلى حدث الضغط على زر التعليمة التالية :
form1.caption := floattostrf(55.2723e+3, ffgeneral,5,2);
يساوي 5 ، غير الآن Precision سيعيد هذا التابع القيمة 55272 متجاه ً لا القيم بعد الفاصلة لأنه الوسيط
الرقم 5 إلى 7 ولاحظ تغير النتيجة إلى الشكل 55272.3 ، غير الرقم السابق إلى 4 ولاحظ ظهور النتيجة
. 527e بالشكل : 4
Format = FFExponent 2
وتحدد الخاصة (ddd.edd) ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذي فاصلة عائمة من الشكل
0 وتحدد عدد أرقام الأس . .. تتراواح بين 4 Digits هنا عدد أرقام النتيجة والقيمة Precision
form1.caption := floattostrf(52.34, ffexponent,8,3);
5.2340000 في حال تغير الرقم 8 إلى 4 والرقم 3 إلى 2 تصبح النتيجة : e+ سيعيد التابع النتيجة 001
5.234E+01
Format = fffixed 3
ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذو فاصلة ثابتة حيث يحدد عدد الأرقام بعد الفاصلة بالقيمة
: Digits
form1.caption := floattostrf(100.36, fffixed,6,1);
سيعيد التابع القيمة 100.4 لأنه لإظهار رقم واحد بعد النتيجة قام التابع بتدوير النتيجة .
أصغر من عدد أرقام العدد سيعيد التابع النتيجة بالفاصلة العائمة . Precision في حال كانت قيمة
Format = ffNumber 4
تشبه الحالة السابقة ولكن مع إظهار فواصل بين الآلاف مع تقريب النتيجة .
form1.caption := floattostrf(195784430.36, ffnumber,10,5);
. سيعيد التابع القيمة 195,784,430.4000
http://goo.gl/R2U0yZ لغة البرمجة دلفي
46
: Format = ffcurrency 5
سيعيد التابع نفس القيمة السابقة ولكن مع ذكر ل.س بجانب الناتج ( يعيد التابع اسم العملة المحددة في الجهاز عن
طريق اعدادات إقليمية الموجودة في لوحة التحكم ) .
form1.caption := floattostrf(195784430.36, ffcurrency,10,5);
ل.س 195,784,430.4000
: Inttohex(X,Y) التابع
سيعيد القيمة 929 التي تكافئ العدد العشري 2345 inttohex( مثال : ;( 2345,1
لا حاجة لتحويل العدد الست عشري إلى عدد طبيعي في دلفي لأنه يمكن إلحاق الإعداد الست عشرية مباشرة في
تكافئ J:=$F و I:= تكافئ 2345 I:= $ أو الحقيقية ... ( 929 Integer المتحولات الطبيعية
( J=15
هناك آلاف التوابع والإجراءات المعرفة في دلفي ولا يمكن شرحها كلها لذلك سنتعرف الآن على طرق البحث عن
تابع ملفات في ملفات المساعدة الموجودة في دلفي :
الحالة الأولى : التابع معروف ولكننا بحاجة إلى تذكر الوسطاء التابعة له :
سيظهر شرح كامل للتابع باللغة الإنكليزية ، إذا كان F اكتب إسم التابع في أي مكان في محرر الشيفرة وإضغط 1
سيظهر نوع هذا ( Floattostrf للتابع Format لأحد الوسطاء عدة قيم ( كما هي الحالة في الوسيط
الوسيط باللون الأخضر يمكننا بالضغط عليه الانتقال لصفحة تشرح هذه القيم .
الحالة الثانية : التابع غير معروف ولكننا نتذكر تابع قريب أو مشابه له :
نحن نعلم بوجود ، Currency فرضًا أريد أن أجد التابع الذي يحول النص إلى العدد الحقيقي من نوع عملة
لذلك نكتب اسم هذا التابع في محرر الشيفرة ونضغط Strtofloat تابع يحول النص إلى عدد حقيقي وهو
باللون الأخضر See Also ستلاحظ الآن وجود الكلمة ، Strtofloat سيظهر الآن شرح للتابع ، F1
في أعلى الصفحة ، في حال الضغط عليها ستظهر هذه الوصلة قائمة بالتوابع المتعلقة بالتابع المذكور أو التوابع
في ) Category كما يوجد أحيانًا الوصلة بعد العنوان ،( Strtocurr المشابهة له ( يمكن أن نختار منها
بالضغط عليها ستظهر كل التوابع ( Floating point Conversion Routines مثالنا
في مثالنا ( ستظهر كل التوابع المتعلقة بتحويل العدد الحقيقي إلى Strtofloat المتصلة بموضوع التابع
صيغة أخرى ) .
الحالة الثالثة : نريد أن نبحث عن تابع له صفة معينة :
Math ( فرضًا نريد أن نبحث عن تابع رياضي ) من المعروف أن معظم التوابع الرياضية تنتمي إلى الوحدة
سيظهر شرح التابع F مث ً لا ) ونضغط 1 Power التابع ) math لذلك يمكن أن نكتب ( أي تابع ينتمي للوحدة
مع ظهور أسم الوحدة في الأعلى ( بالضغط عليه تظهر قائمة بجميع التوابع الموجودة في الوحدة Power
.( math
. Sysutil موجودة في الوحدة ( ..... Strtoint ) ملاحظة : معظم توابع التحويل
http://goo.gl/R2U0yZ لغة البرمجة دلفي
47
الحالة الرابعة : لانعرف أي شيء من الحالات السابقة :
Help 􀃆 نريد أن نوجد تابع ما يقوم بعملية معينة ( تابع الجيب جب ( يه ) مث ً لا ) من قوائم الدلفي نختار
Delphi help
لأول مرة يظهر صندوق حوار لتحديد طرق Find عند الضغط على الصفحة ) Find نختار بعدها الصفحة
البحث (أختر الخيارات الأفتراضية)
في مثالنا ) فيظهر في الأسفل جميع Sin ) يظهر بعدها صندوق حوار نكتب فيه اسم التابع في اللغة الإنكليزية
ويظهر أسفل هذه القائمة قائمة أخرى ( Sin ) الكلمات المكتوبة في ملفات المساعدة والتي تبدأ بالأحرف المكتوبة
بالعنوانين التي تحوي هذه الكلمة حاول أن تختار منها طلبك واضغط عليه مرتين فيظهر نص المساعدة المرتبط
Help وللعودة إلى القائمة أختر السابقة Other Standard routine بهذا العنوان ( في مثالنا
. ( topic
ملاحظات :
. F لمعرفة عمل أي عنصر في دلفي أختره وأضغط على 1
.... F لمعرفة عمل أي خاصة تابعة لعنصر ما في دلفي أختر هذه الخاصة واضغط على 1
http://goo.gl/R2U0yZ لغة البرمجة دلفي
48
الجلسة التاسعة
: Dialog صناديق الحوار
ومهمتها فتح نوافذ خاصة بنظام التشغيل ( لفتح Dialogs هي عبارة عن صناديق جاهزة موجودة في الصفحة
وحفظ ملف ولتحديد لون ولفتح ملف صورة وللطباعة وللبحث .... ) وسندرس بعض هذه الصناديق بالتفصيل :
: OpenDialog صندوق الحوار فتح ملف
يستخدم لفتح ملف ما ،حيث يظهر النافذة المعروفة لفتح
ملف الموجودة في الويندوز وحيث يمكننا من هذه
( Open ) النافذة اختيار الملف والضغط على فتح
وسيعيد العنصر أسم الملف المختار بالخاصة
FileName
سنبدأ بمثال بسيط وسنحاول التعرف على العنصر
بشكل أفضل لاحقًا :
وزر إلى مشروع Memo مثال : أضف عنصر مذكرة
Opendialog جديد بالإضافة إلى العنصر
في حدث الضغط على الزر أكتب التعليمات التالية :
IF Opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.FileName ) ;
open واضغط على ( TXT ) نفذ البرنامج واضغط على الزر سيظهر صندوق الحوار أختر أي ملف نصي
سيمكنك الآن مشاهدة محتويات الملف في المذكرة .
في حال True تقوم بإظهار نافذة الحوار فتح ملف وتعيد القيمة OpenDialog1.Execute التعليمة
وفي هذه الحالة ( Open ) اختار المستخدم أحد الملفات وضغط على الزر فتح
في حال أغلق المستخدم False ستحتوي على اسم الملف، وتعيد القيمة opendialog1.FileName
وفي هذه الحالة ( Cancel ) صندوق الحوار أو ضغط على الزر إلغاء الأمر
ستحتوي على فراغ. opendialog1.FileName
من Filter تحدد هذه الخاصة نوع الملفات التي ستظهر في النافذة ، اختر الخاصة : Filter الخاصة
Filter محرر الخواص واضغط على النقاط الثلاث ... فتظهر النافذة التي تحدد نوع الملفات في العمود
أغلق النافذة ونفذ البرنامج ستلاحظ أن صندوق *.txt أكتب Filter أكتب ملف نص ، والعمود Name
وستظهر في أسفل الصندوق في العنوان الذي ، Txt الحوار لا يظهر إلا المجلدات والملفات من النوع النصي
أدخل في السطر الثاني Filter ملف نص " ، عد إلى الخاصة " Files Type يشير إلى نوع الملفات
ثم في السطر التالي العمود الأول " "*.Bat " Filter ملف دفعي "وفي العمود " Filter Name للعمود
جميع الملفات " وبجانبه " *.* " .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
49
نفذ البرنامج الآن واضغط على الزر سيظهر صندوق فتح الملفات حيث يمكنك الآن اختيار نوع الملفات التي
. Files Type ستظهر عن طريق
تستخدم هذه الخاصة لتحديد نوع الملفات الافتراضي وتأخذ القيمة 1 لتشير إلى : FilterIndex الخاصة
الفلتر الأول و 2 إلى الثاني ....
تقوم هذه الخاصة بتحديد الفهرس الابتدائي الذي سيعمل فيه الصندوق أكتب في هذه : InitialDir الخاصة
... C:\ وسيفتح عندها الصندوق في الفهرس C:\ الخاصة القيمة
تمكنك إظهار الخاصة من إظهار نص معين في شريط العنوان لنافذة فتح الملفات ادخل القيمة : Title الخاصة
"أختر ملف ما ليقوم البرنامج بفتحه ".
ينبثق عن هذه الخاصة العديد من الخواص حاول مراجعة تعليمات دلفي للحصول على : Option الخاصة
معلومات عن عمل كل خاصة.
: SaveDialog صندوق الحوار حفظ ملف
يقوم هذا الملف بفتح صندوق الحوار حفظ ملف وهو يشبه الصندوق السابق بطريقة الاستدعاء والخصائص لذلك لا
داعي لإعادة شرح الخصائص .
مثال :
للزر القيمة " حفظ " ثم أعط Caption إلى البرنامج السابق وأعط الخاصة SaveDialog أضف زر و
الخصائص التالية : SaveDialog
*.txt ........ ملف نص : Filter 1 الخاصة
*.bat ....... : ملف دفعي
هذه القيمة ضرورية لتحديد امتداد الملف الذي سيتم حفظه . : .Txt القيمة : Defaultext 2 الخاصة
في حدث الضغط على الزر اكتب التعليمات التالية :
if savedialog1.Execute then
memo1.Lines.SaveToFile(savedialog1.FileName )
نفذ البرنامج واضغط على الزر حفظ واكتب الاسم الذي تريد ....
OfOverwritePrompt هي الخاصة Option إحدى الخصائص المهمة لهذا العنصر والتابعة للخاصة
لكي يتم تنبيه المستخدم قبل أن يحفظ ملف فوق ملف من نفس الإسم . Ture أعط هذه الخاصة القيمة
: OpenPictureDialog صندوق الحوار
صندوق الحوار هذا يشبه صندوق الحوار فتح ملف ويختلف عنه بظهور قسم يجانب الملفات لإظهار الصور قبل
لهذا العنصر مجهزة بأنواع الملفات التي يمكن للدلفي التعامل معها . Filter فتحها ، من الملاحظ أن الخاصة
مثال:
. OpenPictureDialog إلى مشروع جديد وأضف كذلك العنصر Image أضف زر وعنصر
في حدث الضغط على الزر أكتب التعليمة التالية :
if OpenPictureDialog1.Execute then
image1.Picture.LoadFromFile(OpenPictureDialog1.FileName )
http://goo.gl/R2U0yZ لغة البرمجة دلفي
50
نفذ البرنامج واضغط على الزر واختر أي صورة لتلاحظ ظهورها إلى يمين صندوق الحوار وبالضغط على الزر
. Image ستظهر الصورة في العنصر Open
أثناء التنفيذ وإذا *.jpg لا تظهر الملفات Filter في الخاصة Jpg ملاحظة : رغم وجود ملفان من النوع
. Uses إلى القسم Jpeg أردت إظهارها قم بإضافة اسم الوحدة
: SavePictureDialog صندوق الحوار
.......................................................................................... ( نفس الكلام السابق )
.............
مثال :
SavePictureDialog إلى البرنامج السابق و أعط SavePictureDialog أضف زر وعنصر
الخاصة
واكتب في حدث الضغط على الزر التعليمة التالية : .Bmp القيمة DefaultExt
if SavePictureDialog1.Execute then
image1.Picture.SaveToFile(SavePictureDialog1.FileName)
نفذ البرنامج ثم افتح صورة عن طريق الزر الأول واحفظها عن طريق الزر الثاني ( يمكنك أيضًا تغير امتداد ملف
. ( Save As Type الصورة أي تغير نوعها عن طريق تغير الامتداد في أسفل صندوق الحوار
: FontDialog صندوق الحوار الخطوط
يقوم هذا العنصر بإظهار صندوق الحوار اختيار خط حيث يمكننا هذا الصندوق من تحديد نوع ونمط وحجم ولون
الخط .
إلى برنامج جديد واكتب في حدث الضغط على الزر FontDialog و عنصر Label أضف زر وعنصر
التعليمة التالية :
if Fontdialog1.Execute then
label1.Font := fontdialog1.Font ;
: ColorDialog صندوق الحوار تحديد لون
يقوم هذا العنصر بإظهار صندوق حوار لاختيار لون حيث يمكن اختيار اللون من عدد كبير جدًا من الألوان .
إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية : ColorDialog أضف زر وعنصر
if colorDialog1.Execute then
form1.Color := colordialog1.Color ;
بالضغط عليه Define Custom colors يظهر فيه زر عنوانه ColorDialog صندوق الحوار
كتابة في حال معرفتها . RGB يظهر لوح الألوان الذي يمكن من خلاله تحديد اللون أو يمكن كتابة
نظام التشغيل المستخدم، أي أنها ستختلف حسب نظام التشغيل Dialog ملاحظة : تتبع جميع صناديق الحوار
وبالتالي سيختلف شكل الصندوق من نظام Xp فصندوق الحوار فتح ملف في ويندوز 98 يختلف عنه في ويندوز
تشغيل إلى آخر ولكنه سيؤدي نفس الوظيفة بنفس التعليمات ، كما تتأثر هذه الصناديق بلغة النظام أي أنها ستظهر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
51
باللغة العربية في حال كانت واجهات نظام التشغيل المستخدم بالعربية وباللغة الإنكليزية في حال كانت واجهات
نظام التشغيل باللغة الإنكليزية .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
52
الجلسة العاشرة
( Additional الصفحة ) : MaskEdit التعرف على العنصر
ويختلف عنه بإمكانية تحديد شكل النص المدخل وللتعرف على هذه اميزة Edit يشبه هذا العنصر عنصر التحرير
من محرر الخواص وبالضغط على ... ستظهر النافذة التالية : Editmask اذهب إلى الخاصة
مثال :
من Editmask إلى برنامج جديد واختر الخاصة Additional من الصفحة MaskEdit 1 أضف عنصر
عندها سيظهر Ok واضغط على Date ( Sample Masks ) محرر الخواص واختر من النافذة السابقة في القسم
العنصر بالشكل __/__/__ الآن نفذ البرنامج وحاول الإدخال إلى العنصر ولاحظ أنه لا يمكنك إدخال سوى
الأرقام .
تحديد القناع :
أو … فماذا تعني هذه الرموز : L نلاحظ أن القيم في الحقل تحديد القناع عبارة عن 0 أو 9 أو
9 : يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف مع إمكانية عدم إدخال أي رقم (
مث ً لا في حال كان القناع 99999 ،يستطيع المستخدم إدخال عدد مكون من خمس أرقام أو أربع أو ثلاث .... ولا
يستطيع إدخال الأحرف )
، 0 : يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف ( في حال كان القناع 00000
فعلى المستخدم إدخال خمس أرقام حصرًا ولا يمكن أربعة ...) وفي حال ادخل المستخدم أربعة سيصدر البرنامج
رسالة خطأ عن خروج المؤشر من العنصر .
فعلى LLLL يستطيع المستخدم، إدخال أحرف مكان هذا الرمز ولا يمكن إدخال الأرقام ( في حال كان القناع : L
المستخدم إدخال أربع أحرف حصرًا ).
إدخال أحرف فقط مع إمكانية عدم الإدخال ..... : l
تحديد القناع
الرمز الذي سيظهر
مكان الفراغ
لتجربة النص المدخل
أقنعة جاهزة
( أمثلة )
تحميل أقنعة جاهزة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
53
إدخال أحرف مع أرقام مع إمكانية عدم الإدخال .... : a
إدخال أحرف مع أرقام ... حصرًا . : A
يوجد مجموعة أخرى من الرموز يمكن مراجعتها في ملفات المساعدة التابعة للدلفي ............
( Win الصفحة 32 ) : MonthCalendar العنصر
يستخدم هذا العنصر لإظهار التاريخ، ويستطيع المستخدم إدخال التاريخ عبره ...
في حال أردنا من العنصر إظهار تاريخ اليوم في كل مرة نفتح البرنامج، علينا إدخال التعليمة التالية في الحدث
للنافذة التي تحوي العنصر : OnCreate
MonthCalendar1.Date := date;
للحصول على التاريخ المدخل من قبل المستخدم نكتب التعليمة التالية في حدث الضغط على زر أو حدث الضغط
على العنصر نفسه :
form1.Caption := datetostr(MonthCalendar1.Date);
يظهر مفكرة بعدة أشهر ( حسب حجم النموذج ) .. alClient لهذا العنصر القيمة Align عن إعطاء الخاصة
وهو يشبه العنصر السابق إلى حد ما . Calendar العنصر Sample ملاحظة : يوجد في الصفحة
( Win الصفحة 32 ) : DateTimePicker العنصر
يستخدم هذا العنصر لإظهار ( إدخال ) التاريخ أو الوقت :
ويمكن تغير التاريخ عن طريق مفاتيح الأسهم dtkDate تساوي Kind 1 يظهر التاريخ في حال كانت الخاصة
MonthCalendar أو عن طريق الضغط على السهم المجاور للعنصر حيث يظهر عندها شكل مشابه للعنصر
يظهر سهمين dmUpDown إلى DateMode الذي يمكن تحديد التاريخ من خلاله، كما يمكن تغير قيمة الخاصة
أعلى وأسفل لإدخال التاريخ ....
Timer وحتى يتم تحديث الوقت يجب إضافة dtkTime تساوي Kind 2 يظهر الوقت في حال كانت الخاصة
: OnTimer وكتابة التعليمة التالية في الحدث
DateTimePicker1.Time := time;
3 يمكن الحصول على الوقت من هذا العنصر عن طريق التعليمة التالية :
Form1.Caption := TimeToStr(DateTimePicker1.Time );
ويكون الحصول على التاريخ عن طريق التعليمة :
Form1.Caption := Datetostr(DateTimePicker1.date );
( Win الصفحة 32 ) : PageControl العنصر
يقوم هذا العنصر بإظهار صفحات مستقلة وللتعرف على هذا العنصر سنبدأ بمثال :
مثال :
اضغط على العنصر ،Win من الصفحة 32 PageControl ابدأ مشروعًا جديدًا وأضف إليه عنصر الصفحات
أعد الخطوة ، Tabsheet عندها ستظهر صفحة جديدة باسم 1 New Page بزر الفأرة اليميني وأختر من القائمة
. TabSheet و 3 TabSheet الأخيرة مرتين لإظهار 2
http://goo.gl/R2U0yZ لغة البرمجة دلفي
54
التاريخ " وأضف في داخلها العنصر " Caption وأعطها الخاصة Tabsheet اختر الصفحة الأولى 1
. MonthCalendar
الوقت " وأضف إليها العنصر " Caption وأعطها الخاصة TabSheet اختر الصفحة الثانية 2
ولا تنس إضافة مؤقت لتحديث الوقت... dtkTime القيمة Kind وأعطه الخاصة DateTimePicker
التاريخ والوقت " وأضف إليها عنصرين " Caption وأعطها الخاصة TabSheet اختر الصفحة الثالثة 3
.... dtkTime القيمة Kind أعط إحداهما الخاصة DateTimePicker
نفذ البرنامج ولاحظ كيفية الانتقال بين الصفحات ..
من ESC يمكن الانتقال من عنصر ابن إلى عنصر أب بالضغط على المفتاح ) PageControl اختر العنصر
عندها سيأخذ العنصر حجم النموذج بالكامل . alClient القيمة Align لوحة المفاتيح ) وأعطه الخاصة
Add واضغط علية مرتين يظهر صندوق حوار اختر منه Win من الصفحة 32 ImageList أضف العنصر
وأعط الخاصة PageControl عد بعدها إلى العنصر ،Ok لإضافة مجموعة من الصور، اضغط بعدها على
وعندها ستظهر الصور بجانب عنوانين الصفحات، نستطيع اختيار صور محددة ImageList القيمة 1 Images
... ImageIndex ثم كتابة رقم الصورة المطلوبة في الخاصة tabSheet لصفحة ما باختيار الصفحة
حيث يمكن أن تكون في الأسفل أو TapPosition يمكن تحويل موضع اختيار الصفحات عن طريق الخاصة
على اليمين أو على اليسار
بإعطائها القيمة PageControl للعنصر Style يمكن تحويل شكل الصفحات إلى أزرار عن طريق الخاصة
tpTop تساوي TapPosition لا تعمل هذه الخاصة إلا إذا كانت قيمة الخاصة ) tsFlatButtons أو tsButtons
. (
تحدد الصفحة الفعالة عند تنفيذ البرنامج . ActivePage الخاصة
يتحول لون خط عنوان الصفحة إلى اللون الأزرق True عند إعطاء هذه الخاصة القيمة : HotTrack الخاصة
عند مرور الفأرة فوقه ( في وقت التنفيذ ) .
( Win الصفحة 32 ) : TabControl العنصر
ويختلف عنه بكونه لا يعطي صفحات مستقلة حيث أنه مكون من PageControl يشبه هذا العنصر العنصر
صفحة واحدة ( أي أن العناصر توضع في صفحة واحدة ويتم تطبيق تغيرات على هذه العناصر عندما يضغط
المستخدم على أزرار الصفحات :
. مثال : سنقوم بكتابة برنامج يعطي جدول ضرب العدد 5
أكتب القيم 1,2,3,4,5,6,7,8,9 كل Tabs في الخاصة ، TabControl ابدأ مشروعًا جديدًا وأضف إليه العنصر
منها في سطر
. TabControl داخل العنصر Label أضف عنصري
أكتب التعليمات التالية : OnChange مستقل وفي الحدث
var i :integer;
begin
http://goo.gl/R2U0yZ لغة البرمجة دلفي
55
i := strtoint(tabcontrol1.Tabs[tabcontrol1.tabindex] );
label1.Caption := inttostr(i) + ' * 5 = ';
label2.Caption := inttostr(i * 5);
تعيد رقم الصفحة التي ضغط المستخدم عليها . TabControl1.TabIndex حيث
تعيد عنوان الصفحة التي يوجد رقمها بين القوسين [ ] . Tabcontrol1.Tabs[ ] و
نفذ البرنامج واضغط على الصفحات ولاحظ النتائج ...
بالنسبة لباقي الخصائص فهي مشابهة تمامًا لخصائص العنصر السابق .
( Win الصفحة 32 ) : UpDown العنصر
واعط الخاصة UpDown إلى مشروع جديد ، حدد العنصر 1 Edit وعنصر UpDown أضف عنصر
Edit ولاحظ تغير الرقم داخل UpDown نفذ البرنامج واضغط على أسهم العنصر ، Edit القيمة 1 Associate
. Edit للعنصر تحدد مقدار الزيادة أو النقصان في العدد داخل ال Increment الخاصة
. Edit تحددان القيمة الدنيا والعليا للعدد داخل Max و Min الخاصتان
تحدد القيمة الابتدائية للعنصر . Position الخاصة
تحدد اتجاه الأسهم ( عامودي أو أفقي ) . Orientation الخاصة
يتحول العدد من القيمة السفلى إلى العليا عند الضغط على True عند إعطاء هذه الخاصة القيمة : Warp الخاصة
. Up بعكس عند الضغط على الزر Down الزر
الذين يشبهان عمل هذا العنصر SpinButton و SpinEdit العنصرين Sample ملاحظة : يوجد في الصفحة
إلى حد ما .
التعامل مع السلاسل النصية :
: Concat 1 التابع
Concat ( s1, [s2..sn]) :string
مع بعضها S1..Sn يقوم هذا التابع بوصل السلاسل
مثال :
أكتب التعليمات التالية في حدث الضغط على زر :
var s1,s2,s3 : string;
begin
s1:= 'abc';
s2 := 'efg';
s3:= 'hij';
form1.caption:=concat(s1,s2,s3)
يشبه هذا التابع عملية جمع السلاسل النصية أي أن النتيجة ستكون مشابه لو كانت التعليمة الأخيرة
Form1.Caption := s1+s2+s3;
: Copy 2 التابع
Copy ( S:string , Index,Count :Integer ) :String
. Count وبطول Index تبدأ من الحرف الذي ترتبه S يعيد هذا التابع سلسلة رمزية جزئية من السلسة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
56
... Copy ( 'Hello All',5,1) = o ; Copy ( 'Hello All',2,6) = ello A : مثال
: Delete 3 الإجراء
Delete ( Var S:string ,Index,Count ) ;
وبطول Index قيمة نفس السلسلة بعد حذف الرموز ابتداء من الرمز الذي ترتيبه S يعيد هذا الإجراء في المتحول
Count
مثال :
اكتب في حدث الضغط على زر التعليمات التالية :
var s1 : String;
Begin
s1:= 'Hello All' ;
Delete (s1,1,3);
Form1.Caption := s1;
ستكون Delete ( S وإذا غيرنا وسطاء الإجراء إلى الشكل ( 1,4,3 ، lo All ستكون نتيجة تنفيذ البرنامج القيمة
. HelAll النتيجة
: DupeString 4 التابع
DupeString ( S: String ,Count :Integer) :String;
مرة Count مكررة S يعيد هذا التابع القيمة
DupeString( 'Ha ',5) = Ha Ha Ha Ha Ha : مثال
StrUtils ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة
: Insert 5 الأجراء
Insert ( S1:String , var S:string ; Index :Integer ) ;
. S ويعيد النتيجة في S في السلسة Index ابتداء من الرمز S في السلسة S يقوم هذا الإجراء بحشر السلسة 1
مثال : تكتب التعليمات التالية في حدث الضغط على زر :
var s : string;
begin
s:= 'Hello Friends' ;
insert ( 'All ' ,s,7);
form1.Caption := s;
: StuffString التابع
StuffString( s:string , start, length :integer , S1:string ) :string;
مع حذف عدد من Start ابتداء من الرمز الذي ترتيبه S في قيمة السلسلة S يقوم هذا التابع بحشر السلسة قيمة 1
: Length بطول S الرموز من قيمة
قام التابع بحذف ستة أحرف ابتداء من الحرف stuffstring('Hello Friend',7,6,'all') = 'Hello all' : مثال
. Insert في حال تغير الرقم 6 إلى 0 سيعمل التابع عمل الإجراء ، all السابع وحشر السلسة
يختلف هذا التابع عن سابقة ب :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
57
1 التابع يقوم بحذف قسم من السلسة وإدراج غيره .
يعيد السلسة StuffString ستعاد قيمة التابع فيه بينما التابع S بحاجة إلى متحول Insert 2 الإجراء
النتيجة بدون التأثير على وسطاءه ) .
StrUtils ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة
: LeftStr التابع
LeftStr(S:String ,Count : integer) :string
: Count وبطول S يعيد هذا التابع سلسلة نصية تبدأ من يسار السلسلة
. LeftStr( 'Good Morning,4 ) = Good ، LeftStr( 'Hello Frind',6) = Hello : مثال
يشبه التابع السابق ولكنه يعيد ابتداء من نهاية السلسة : : RightStr التابع
Rightstr( 'Hello Friend',6)=Friend : مثال
: LowerCase التابع
بعد تحويل جميع حروفها إلى حروف صغيرة ( الأحرف اللاتينية ) . S يعيد هذا التابع السلسلة
LowerCase(Hello Friend) = hello friend : مثال
: UpperCase التابع
UpperCase (' Hello Friend') = HELLO FRIEND عكس التابع السابق ،مثال
: Trim التابع
S يقوم هذا التابع بحذف الفراغات من بداية ونهاية السلسة
مثال :
إلى برنامج جديد وفي حدث الضغط على الزر اكتب التعليمات التالية : Edit أضف زر وعنصر
edit1.Text:= Trim(edit1.Text );
واضغط ' Hello All ' وحاول ترك فراغات في بداية هذه النص أو آخرة Edit أكتب نصًا ما في العنصر 1
. 'Hello All' على الزر فيقوم التابع بحذف الفراغات وإعادة القيمة
لهما نفس التأثير غير أنهما يحذفان الفراغات من بداية السلسة أو نهايتها على TrimRight و TrimLeft التابعين
التوالي .
: Format التابع
Format ( S :String ; A:array of const ) ;
يعيد هذا التابع السلسلة S بعد إدراج القيم في A... داخلها وفقًا لبعض المعايير
مثال :
أضف التعليمات التالية في حدث الضغط على زر :
var s1:string;
var i,j :integer; z:real;
begin
i:= 200;j:=5; z:= i/j;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
58
s1:= format('If You Divide %d by %d the result will be %g',[i,j,z]);
form1.Caption := s1;
. If You Divide 200 by 5 the result will be سيعيد التابع القيمة 40
%d وقيمة العنصر الثاني إلى الوسيط %d إلى الوسيط ( I ) قام التابع بإعطاء قيمة العنصر الأول في المصفوفة
. %g إلى الوسيط Z الثاني وقيمة العنصر الثالث
من إدراج مجموعة من الثوابت داخل الجملة عن طريق كتابة الرمز % داخل الجملة Format إذًا يمكنك التابع
ملحقًا برمز يدل على نوع الوسيط المراد إدراجه حسب الجدول التالي :
عشري، قيمة العدد الصحيح يح  ول إلى جملة من الخانات العشرية. d (decimal)
x
ست عشري، قيمة الرقم الصحيح ُتح  ول إلى جملة من الخانات الست عشرية. (hexadecimal)
مؤ ّ شر، قيمة المؤشر يح  ول إلى جملة معبر عنها بأعداد ست عشرية. p (pointer)
يتم نسخها في مخرجات الجملة. PChar قيمة الجملة، الحرف، أو نوع s (string)
e
مرفوع القوة، قيمة النقطة العائمة تح  ول إلى جملة مبنية على ترميز مرفوع القوة. (exponential)
f (floating
نقطة عائمة، قيمة النقطة العائمة تح  ول إلى جملة مبنية على ترميز النقطة العائمة. point)
عام، قيمة النقطة العائمة تح  ول إلى جملة عشرية بأقرب ما يمكن مستخدمة إما ترميز النقطة g (general)
العائمة أو مرفوع القوة.
رقم، قيمة النقطة العائمة تح  ول إلى جملة نقطة عائمة لكنها أيضا تستخدم فواصل الآلاف. n (number)
m (money)
نقود، قيمة النقطة العائمة تح  ول إلى جملة تمثل مقدار العملة. التحويل يعتمد على التوصيف
Currency and : الإقليمي لبيئة التشغيل- انظر ملف مساعدة دلفي تحت موضوع
.date/time formatting variables
مثال :
وزر إلى برنامج جديد ، اكتب في حدث الضغط على الزر التعليمة التالية : Edit أضف عنصر
ShowMessage( Format (' مرحبًا %s',[Edit1.Text]));
وأضغط على الزر ...... Edit نفذ البرنامج واكتب أسمك في العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
59
الجلسة الحادية عشرة
اللوائح النصية :
لتعريف اللوائح النصية حيث يقوم هذا النوع بتخزين عدد من السلاسل النصية ضمن TSrings يستخدم النوع
التابعة لعنصر المذكرة Lines والخاصة ListBox التابعة ل Items سطور وقد تعاملنا معه في السابق فالخاصة
. Tstrings من النوع Memo
التي تقوم بحجز مكان لهذا النوع في الذاكرة، TStringList.Create بالتعليمة TStrings يبدأ التعامل مع النوع
علمًا أن هذا النوع قد يأخذ مجال كبير من الذاكرة تبعًا لحجم السلاسل النصية المراد تخزينها فيه، وينتهي استخدام
لتحرير الذاكرة المستخدمة من قبل هذا العنصر . Free هذا النوع بالتعليمة
ملاحظة :
مشغو ً لا Tstrings سيبقى حيز الذاكرة المحجوز من قبل المتحول Free عند إنهاء البرنامج دون استخدام التعليمة
مما يعطل موارد الجهاز ( تظهر هذه المشكلة مع العديد من البرامج العربية ) .
وتقسم اللوائح النصية إلى قسمين :
1 اللوائح النصية قصيرة الأمد :
تكون اللائحة قصيرة الأمد إذا تم إنشاؤها وتحريرها في نفس الإجراء أو التابع .
مثال :
أكتب في حدث الضغط على ، Edit وزر وعنصر ListBox أنشئ مشروعًا جديدًا وأضف إليه عنصر اللائحة
الزر التعليمات التالية :
var a:TStrings;
Begin
a := TStringList.Create; // إنشاء اللائحة وحجز مكان لها في الذاكرة
a.Add(Edit1.text); // إضافة النص الموجود في صندوق النص إلى الائحة
Form1.Caption := a.Strings [ وضع السطر ( 0 ) من سطور اللائحة في عنوان النموذج // ;[ 0
ListBox1.Items.AddStrings(a); // إضافة عناصر اللائحة إلى عنصر اللائحة
a.Free ;
end;
TsrtingList.Create حاول استخدام البرنامج بدون التعليمة
2 اللوائح النصية طويلة الأمد :
وهنا علينا تحريره عند إغلاق TStrings تكون اللائحة طويلة الأمد عند تعريف متحول عام أو خاص من النوع
النموذج الذي قام بإنشائه :
مثال :
من برنامج جديد . Puplic في القسم TStrings من النوع A أضف متحول
للنموذج أكتب التعليمة التالية : OnCreat في الحدث
A := TStringList.Create;
ListBox a
http://goo.gl/R2U0yZ لغة البرمجة دلفي
60
اكتب التعليمة التالية : OnDestroy في الحدث
A.Free;
بإمكانك الآن استخدام عنصر اللائحة في أي جزء من البرنامج .
يتم تنفيذه عند إغلاق النافذة . OnDestroy الحدث
عند انتهاء التعامل معها، وهذه الطريقة تشبه Free تحتاج إلى Create ملاحظة : معظم الأنواع التي تحتاج إلى
طريقة التعامل مع المؤشرات حيث يجب إنهاء المؤشر بعد الانتهاء منه .
معالجة الأخطاء في دلفي :
يجب على كل تطبيق جيد أن يعالج جميع احتمالات الأخطاء وأن يوجه المستخدم إلى حل ما للخروج من حالة
الخطأ أو يقوم بإنهاء البرنامج بأسلوب جيد على الأقل ....
وهي عبارة عن أهداف ( متحولات، توابع ، Exceptions تدعى حالات حدوث الخطأ في دلفي بالاعتراضات
إجراءات معرفة ) تحوي معلومات عن وقوع الخطأ ومكان حدوثه.
لحماية كتل التعليمات والتي لها شكلين سنشرح كل منهما بالتفصيل . Try تستخدم التعليمة
: Try. . . . . . Except 1 التعليمة
بفرض أننا نتوقع حدوث خطأ ما في كتلة من التعليمات ( مجموعة تعليمات ) لمعالجة هذا الخطأ نضع هذه
لتوجيه البرنامج لتنفيذ عمليات End قبل Except وتستخدم ، End والتي تنتهي ب Try التعليمات ضمن الكتلة
محددة عند حدوث الخطأ .
مثال :
إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية : Edit أضف زر و
var i :integer;
begin
i:= strtoint(edit1.text);
لا تكتب أرقام ) واضغط على الزر سيتوقف عندها تشغيل البرنامج وتظهر ) Edit نفذ البرنامج واكتب نصًا في
دلفي الرسالة التالية :
الرسالة الموضحة لسبب الاعتراض أسم الإعتراض أسم البرنامج
http://goo.gl/R2U0yZ لغة البرمجة دلفي
61
مع رسالة "النص الذي أدخلته " ليس عدد EconvertError والتي تعني أن البرنامج قد رفع اعتراضًا من النوع
صحيح ، تم إيقاف العملية اضغط على تنفيذ مرة أخرى لإكمال عمل البرنامج .
عند الضغط على تنفيذ تظهر الرسالة التالية :
والتي تعني أن النص المدخل ليس عدد صحيح ..
، Exception ونفذه .. ثم اذهب إلى فهرس البرنامج وشغل الملف التنفيذي 1 Exception احفظ البرنامج باسم 1
أكتب نصًا واضغط على الزر ستلاحظ ظهور الرسالة الثانية فقط .. ، إذًا فهذه هي الرسالة التي ستظهر للمستخدم
وعلى فرض أن المستخدم لا يعرف اللغة الإنكليزية فإنه لا يفهم سبب المشكلة وسيعتقد أن البرنامج سيئ .
لمعالجة هذا الخطأ عدل البرنامج السابق ليصبح بالشكل :
Var i :integer;
Begin
Try
i:= strtoint(edit1.text );
Except
Showmessage ( ‘ ( ’أدخل عدد صحيح من فضلك
end;
نفذ البرنامج الآن بالطريقة السابقة وستلاحظ ظهور الرسالة الأولى نفسها ( تظهر هذه الرسالة لتنبيه المبرمج عن
من Except وجود خطأ هنا ) ولكن الرسالة الثانية لن تظهر ولكن ستنفذ مكانها التعليمات التي وردت بعد القسم
. Try التعليمة
أحفظ البرنامج و أعد تشغيله من فهرس البرنامج ولاحظ النتائج .
لم تمنع حدوث الخطأ ولكنها تعاملت مع الخطأ بأسلوب متطور Try . . End ملاحظة : من الواضح أن الكتلة
والبرامج الأقوى هي البرامج التي تمنع حدوث الخطأ قدر المستطاع قبل التعامل معه فمث ً لا في برنامجنا هنا من
وبالتالي لن يحدث الخطأ. Edit الأفضل منع المستخدم من إدخال الأحرف داخل
تحديد نوع الخطأ :
: مثال 2
إلى البرنامج السابق وعدله ليصبح بالشكل : Edit أضف عنصر
var i,j :integer;z:real;
Begin
Try
i:= strtoint(edit1.text);
j:= strtoint(edit2.text );
z:= i/j;
edit3.Text := floattostr(z);
Except
http://goo.gl/R2U0yZ لغة البرمجة دلفي
62
Showmessage ( ‘ ;( ’أدخل عدد صحيح من فضلك
end;
أو في Edit في حال حدوث الخطأ عند إدخال نص في 1 Except احفظ البرنامج ونفذه ولاحظ تنفيذ القسم
End و Except سوف تخضع للفحص و جميع التعليمات بين Except و Try أي أن جميع التعليمات بين Edit2
سيتم تنفيذها في حال حدوث خطأ .
القيمة / 0 / نفذ البرنامج وستظهر دلفي Edit القيمة / 232 / وأدخل في 2 Edit نفذ البرنامج الآن وأدخل في 1
والرسالة الثانية ستظهر من قبل برنامج ( " أدخل عدد صحيح من فضلك" ) EzeorDivide رسالة خطأ من النوع
بالرغم من قيامك بإدخال عدد صحيح لذلك أوجدت دلفي أسلوبًا لتحديد نوع الخطأ وتنفيذ التعليمات المناسبة للتعامل
معه ، عدل الآن البرنامج السابق ليصبح بالشكل :
Var i,j :integer;z:real;
Begin
Try
i:= strtoint(edit1.text);
j:= strtoint(edit2.text);
z:= i/j;
edit3.Text := floattostr(z);
Except
On Econverterror Do Showmessage ( ‘ ;( ’أدخل عدد صحيح من فضلك
On EZeroDivide Do shOwmessage(' ; ( 'لا يمكن القسمة على صفر
end;
Do نفذ التعليمة بعد EconvertError تعني : عند وقوع خطأ من النوع On Econverterror Do التعليمة
وبذلك نستطيع تحديد كيفية التعامل مع كل خطأ على حدى ...
الاعتراضات الرياضية : EmathError ) هناك عدد كبير من الاعتراضات والتي تصنف في مجموعات رئيسية
أو EzerDivide اعترضات الأعداد الصحيحة .... ) ينبثق عنها اعتراضات جزئية ( مثل EintError أو
وأفضل طريقة للتعرف على هذه الإعتراضات هي التعامل معها أثناء ظهورها حيث يمكننا ( ErangeError
EconvertError الحصول على اسم الاعتراض من الرسالة التي تظهرها دلفي عند حدوثه كما رأينا عند ظهور
............
: Try .. .. Finally 2 التعليمة
سنبدأ بالمثال التالي لشرح هذه التعليمة :
: مثال 1
أضف في حدث الضغط على زر التعليمات التالية :
Var a:tstrings ;
i:integer;
begin
a:= Tstringlist.Create ; // إنشاء المتحول وحجز مكان له في الذاكرة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
63
i:= strtoint(edit1.text);// وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير
i:= i * 5;
a.Add(inttostr(i)); // إضافة قيمة المتحول إلى اللائحة
Form1.Caption := 'Done'
a.Free ;
ولم يدخل أرقامًا سينشئ عندها الاعتراض Edit لنفرض أن المستخدم أدخل نصًا في عنصر التحرير
مما سيؤدي إلى بقاء الذاكرة a.Free وسيخرج البرنامج من الإجراء قبل تنفيذ التعليمة EConvertErrorr
جميع التعليمات التي تلي مكان الاعتراض لا يتم تنفيذها ولو عاد البرنامج إلى ) ، a محجوزة من قبل المتحول
التي لم يتم تنفيذها في حال حدث Form1.Caption := 'Done' العمل، لا حظ مث ً لا التعليمة
الاعتراض)
عدل البرنامج السابق بحيث يصبح بالشكل :
Var a:tstrings ;
i:integer;
begin
Try
a:= Tstringlist.Create ; // إنشاء المتحول وحجز مكان له في الذاكرة
i:= strtoint(edit1.text);// وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير
i:= i * 5;
a.Add(inttostr(i));
Finally
Form1.Caption := 'Done' ;
a.Free ;
end;
تم Finally وستجد أن التعليمات في القسم Run نفذ البرنامج ، ولاحظ حدوث الاعتراض ، أعد الضغط على الزر
تنفيذها ( لا حظ تغير عنوان النافذة ) .
سواء حدث الاعتراض أم لم Finally بأنها ستقوم بتنفيذ التعليمات بعد Try Finally أكثر ما تتميز به التعليمة
قد تم تنفيذه ) . Finally ولاحظ أن القسم Edit يحدث ( نفذ الإجراء وأدخل عدد صحيح في العنصر
تسمى هذه التعليمة بتعليمة تحرير الموارد لأن أكثر استخداماتها تكون عند الحاجة لإنشاء متحولات وتحريرها بعد
انتهاء عملها .
: Try تداخل تعليمات
مع بعضها البعض إذا كانت من نفس النوع كما يلي : Try يمكن أن تتداخل تعليمات
http://goo.gl/R2U0yZ لغة البرمجة دلفي
64
Try
…….
Try
…..
Finally
……….
End;
……..
Finally
………
End;
Try
…….
Try
…..
Except
……….
End;
……..
Except
………
End;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
65
والثانية لحماية الموارد ( ( Except الأولى لمعالجة الاعتراض ( القسم Try كما أنها يمكن أن دمج نوعي عبارة
وذلك لتزويد البرنامج بحماية أكبر ، ولكن يجب الحذر عند استخدام هذا التداخل لمعرفة أي منهما ( Finally القسم
يحدث أو ً لا .
تنقيح البرنامج :
بعد الانتهاء من كتابة البرنامج لا بد من فحص الأخطاء التي قد تحدث والتي لا يمكن التنبه لها عند تنفيذ البرنامج
ويوجد مع دلفي العديد من الأدوات التي تمكن المبرمج من فحص ( Bugs ) لأول مرة وتدعى هذه الأخطاء ب
برامجه والتأكد من خلوها من الأخطاء قبل النشر ، تسمى عمليات فحص البرنامج والتخلص من أخطائه ب (
( Debug
1 التحكم بتنفيذ برنامج :
من المفيد معرفة قيم متحولات البرنامج أثناء التنفيذ ومعرفة كيفية تغير قيم هذه المتحولات ، ولهذا أوجدت دلفي
طرقًا لتنفيذ جزء من تعليمات البرنامج ثم التوقف أو تنفيذ تعليمات البرنامج خطوة خطوة وفحص قيم المتحولات
عند نقطة معينة ثم العودة للتنفيذ .
تنفيذ البرنامج خطوة خطوة :
أو عبر Run والذي يمكن اختياره من القائمة Trace into يوجد أمرين لتنفيذ البرنامج خطوة خطوة أولاهما الأمر
الضغط على الزر
Run الذي يمكن تنفيذه من القائمة Step Over من لوحة المفاتيح والثاني F من أزرار السرعة أو الضغط على 7
. F أو الضغط على الزر أو الضغط على 8
يقوم بتنفيذ التعليمة الأولى من البرنامج ثم نضغط عليه مرة ثانية لتنفيذ التعليمة Trace Into عند اختيار الأمر
الثانية وهكذا وإذا صادف هذا الأمر إجراء أو تابعًا ينتقل إليه لينفذ تعليماته كذلك .
ولكنه إذا صادف إجراء أو تابعًا فإنه ينفذه بالكامل ويعود إلى Trace Into يشابه الأمر Step Over والأمر
التعليمة التي تلي طلب هذا الإجراء .
مثال :
إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية : ListBox أضف زر وعنصر لائحة
Var s:string ;
i , j ,z :integer;
begin
for i := 0 to 500 do
begin
j:= i * 5;
z:= j * 2 ;
s:= inttostr ( j ) + ' ' + inttostr(z);
Form1.Caption := s;
listbox1.Items.Add(s)
http://goo.gl/R2U0yZ لغة البرمجة دلفي
66
end;
تعليمات تهيئة البرنامج ويدخل في جملة التعليمات Trace Into عدة مرات حتى ينهي الأمر F أضغط على 7
مرة أخرى ولاحظ انتقال تنفيذ البرنامج إلى التعليمة التالية حيث يظهر F المكتوبة في الأعلى ، أضغط الآن على 7
في المرة التالية . F سهم أخضر على يسار التعليمة التي ستنفذ عن الضغط على 7
حرك الآن مؤشر ، listbox1.Items.Add(s) حتى يصل السهم الأخضر إلى التعليمة F كرر الضغط على 7
I ستظهر عندها القيمة المخزنة في I الفأرة ليقف فوق المتحولات في جسم الحلقة مث ً لا أوقف المؤشر فوق المتحول
....S و Z وكذلك في
ولاحظ أنه يمكنك الحصول على قيمة j:= i * مرتين حتى يقف السهم الأخضر بجانب التعليمة 5 F أضغط على 7
قد أخذت قيمتها الجديدة بينما باقي I ويعود السبب لأن s و Z و j الجديدة ولا يمكنك الحصول على كل من قيمة I
القيم لم يتم إعطائها قيم جديدة بعد .
ملاحظة :
حتى يتم تنفيذ التعليمة Trace Into بنفس الطريقة ولكن عليك بدأ تنفيذ البرنامج ب Step Over يستخدم الأمر
يعتبرها تعليمة واحدة وينفذ البرنامج بعدها بالكامل . Step Over لأن الإجراء Application.Run
: Run To Cursor الأمر
قد يكون أحيانًا من الصعب تنفيذ البرنامج خطوة خطوة للوصول إلى مجموعة تعليمات نريد فحصها لذلك وجد هذا
من Run To Cursor الأمر حيث يكفي أن تضع مؤشر الكتابة في السطر البرمجي الذي تريد ثم تختار الأمر
عندها سيتم تنفيذ البرنامج حتى التعليمة التي وقفت عندها . F أو الضغط على 4 Run القائمة
ملاحظة : لا تستخدم هذه الطرق الثلاث لمعرفة قيم المتغيرات فحسب ، فهي تستخدم في البرامج الكبيرة وخاصة
عندما يعطي البرنامج في أماكن معينة نتائج غير متوقعة أو نتائج غير المطلوبة ، حيث تقوم هذه الأوامر بإعطائك
معلومات عن سير البرنامج ومعرفة النقطة التي يحدث فيها الخلل، كما أن دلفي قد تعطيك بعض رسائل الأخطاء
التي لا يمكن تحديد مكانها بسهولة .
نقاط التوقف :
تستخدم نقاط التوقف لإيقاف البرنامج في نقاط محددة حيث يستمر تنفيذ البرنامج حتى وصول البرنامج إلى السطر
بأننا نستطيع إضافة عدد كبير من نقاط التوقف في Run To Cursor المحدد وتختلف نقاط التوقف عن الأمر
البرنامج .
Add Breakpoint ولإضافة نقطة توقف في البرنامج نضع المؤشر في السطر المراد التوقف عنده ونختار الأمر
أو الضغط على يسار السطر F في صندوق الحوار أو الضغط على 5 Ok ثم الضغط على Run من القائمة
بالفأرة وتتميز السطور المعلمة بنقاط توقف بلونها الأحمر .
سنتعلم الآن كيفية التعامل مع نقاط التوقف وسنتعلم لاحقًا كيفية الاستفادة منها .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
67
التعامل مع نقاط التوقف :
1 عرض جميع نقاط التوقف :
يمكن توزيع نقاط التوقف في كل وحدات البرنامج بنفس الوقت ولعرض قائمة بجميع أوامر التوقف نختار من
View القائمة
View 􀃆 Debug Window 􀃆 Breakpoints
حيث تظهر نافذة تظهر نافذة تخبرك باسم الوحدة الموجودة فيها نقطة التوقف وفي أي سطر من الشيفرة .
2 تعطيل نقاط التوقف :
Enable يمكن تعطيل نقاط التوقف مؤقتًا بالضغط على الدائرة الحمراء بزر الفأرة اليميني والضغط على الخيار
من القائمة المنبثقة حيث يتحول لون نقطة التوقف إلى اللون الأخضر ويمكن إعادة النقطة إلى العمل بتكرار العملية
3 حذف نقطة توقف :
يتم حذف نقطة التوقف بالطريقة التي تم إنشاءها بها ( أي بإمكانك الضغط على الدائرة الحمراء بزر الفأرة اليساري
( .... F أو الضغط على 5
ومن View 􀃆 Debug Window 􀃆 Breakpoints يمكن حذف جميع نقاط التوقف عن طريق عرض الائحة
.... Breakpoint 􀃆 Delete All ثم الضغط على إحدى النقاط في اللائحة بزر اليمين للفأرة واختيار الأمر
4 استخدام نقاط توقف شرطية :
يمكنك تحديد شرط لنقطة التوقف حيث لا يتوقف البرنامج إلا إذا حصل هذا الشرط ( مث ً لا في المثال السابق وصول
إلى القيمة 500 ) ويتم ذلك عن طريق الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار j المتحول
j = ) في النافذة مث ً لا أكتب الشرط Condition ومن ثم كتابة الشرط في القسم Breakpoint Properties
( 500
5 استخدام عدد مرات العبور :
يمكن أن نطلب من البرنامج أن يقف عن نقطة التوقف عند تنفيذها لعدد معين من المرات، ويتم ذلك عن طريق
ومن ثم كتابة عدد Breakpoint Properties الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار
Pass count المرات المطلوبة في القسم
ب 100 نفذ البرنامج الآن Pass Count ثم حدد listbox1.Items.Add(s) مث ً لا أضف نقطة توقف عن السطر
وستلاحظ توقف البرنامج عن العمل عندما تنفذ الحلقة 100 مرة .
مراقبة التعابير والمتحولات :
تستخدم المراقبة لمعرفة قيم تعابير ومتحولات محددة أثناء سير البرنامج ،ولإضافة نقطة مراقبة اتبع إحدى الطرق
التالية :
Debug 􀃆 Add 1 حدد المتحول الذي تريد إضافة نقطة مراقبة له واضغط بزر الفأرة اليميني وأختر الأمر
Watch at Cursor
. Ctrl F أو اضغط 5 Run من القائمة Add Watch 2 اختر
View 􀃆 Debug Windows 􀃆 watches View من القائمة Watch List 3 إظهار النافذة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
68
. Expression عندئذٍ سيظهر صندوق الحوار التالي حيث يمكنك كتابة القيمة المراد مراقبتها في القسم
بعد إضافة المتحولات المطلوب مراقبتها عليك تنفيذ البرنامج خطوة خطوة أو استخدام نقاط التوقف، حيث ستبقى
نافذة المراقبة مفتوحة وتعطيك قيمة المتحولات في كل لحظة يتوقف فيها البرنامج .
View 􀃆 Debug Windows 􀃆 : التعامل مع عناصر المراقبة :أفتح أو ً لا لائحة عناصر المراقبة عن طريق
watches
ولحذف عنصر ، Disable يمكنك تعطيل عنصر مراقبة عن طريق الضغط عليه بزر الفأرة اليميني واختيار الأمر
. Delete مراقبة نهائيًا نختار
فتظهر النافذة : Edit Watch للتغير في عنصر المراقبة نختار الأمر
هو التعبير المراد مراقبته Expression حيث
ونستطيع هنا أن نكتب تعبرًا ما فرضًا يمكن
رغم أن هذه التعليمة غير i+j مراقبة قيمة
موجودة في سطور البرنامج .
تستخدم مع الأنساق : Repeat Count
والسجلات فبفرض لدينا مصفوفة من أربع
أسم Expression عناصر فنكتب في القسم
المصفوفة وفي الحقل
القيمة / 4/ عندها ستظهر جميع عناصر المصفوفة أثناء المراقبة . Repeat Count
سيظهر قيمة المتحول Hexadecimal كما يمكن تحديد كيفية ظهور المعطيات من جزء النافذة في الأسفل فاختيار
عدد الأرقام بعد الفاصلة عند إظهار الرقم بالفاصلة العائمة Digits في النظام الست عشري ويحدد الحقل
. Floating Point
رؤية استدعاء الروتينات :
View 􀃆 Debug Windows 􀃆 call يمكننا مشاهدة المكدس الذي يحوي على استدعاء الاجراءات عن طريق
Stack
حيث يتوضع في أعلى النافذة التابع المستدعى حاليًا والسطر الذي يليه التابع الذي قام باستدعائه .
Add ( مثال : اكتب في حدث الضغط على زر التعليمة التالية : ; ( 10
Procedure Add ( x ) ; : بالشكل التالي Add وعرف الإجراء
Begin
X := x +1;
If X < 50 then Add ( x ) ; // سيعيد هذا التابع تنفيذ نفسه حتى وصول المتحول إلى القيمة 50
End; نفذ الآن البرنامج خطوة خطوة ولاحظ تغير
النتائج .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
69
الجلسة الثاثثة عشر
ما هي قاعدة المعطيات؟:
هي تركي  ب تستطيع من خلاله تخزين كمي ً ة ضخم ً ة من المعطيات التي تربطها علاقات Database قاعدة المعطيات
أو مجموعة ملّفات ُتخ  زن على القرص الصلب File معينة، وحقيق ُ ة الأمر، فإ  ن قاعدة المعطيات ما هي إلا مل ّ ف
ككلّ الملّفات العادية، ولك  ن ما يميزها عن باقي الملّفات، هو قدرتك على كتابة المعطيات فيها Hard Disk
وقراءتها منها، باستخدام الوسائل التي تمنحها لك برامج قواعد المعطيات، دون الحاجة إلى التعامل مع المل ّ ف
مباشرًة، وهو ما يجعل الأمر أكثر سهول ً ة وتنظي  ما بالنسبة لك.
ولا مان  ع أن تخ  ز  ن بياناتك في مل ّ ف خا  ص بك بالطريقة التي تريحك، ولك  ن استخدام قواعد المعطيات يوّفر لك
الكثير من الوقتِ والجهد.
( في بدايات قواعد المعطيات كان كل مبرمج ينشئ ملف معطيات خاص به ويقوم بالتعامل مع هذا الملف بالطرق
التي تتيحها لغات البرمجة للتعامل مع الملفات ( سنتعرف عليها لاحقًا ) ولكن مع الوقت تطورت قواعد البيانات
وأصبح المستخدمون بحاجة إلى قواعد بيانات ذات حجم كبير و إلى القدرة إلى الحصول على المعلومات المطلوبة
بشكل سريع بالإضافة إلى إمكانية التشارك على المعلومات أي إمكانية إدخال المعلومات والحصول عليها من ملف
( ملفات ) قواعد المعطيات من قبل عدة مستخدمين بنفس الوقت، الأمر الذي جعل من المستحيل أن يقوم مبرمج
عادي بتحقيق هذه الشروط )
وهناك أنواع كثيرة من قواعد المعطيات، تبعا للشركة التي تنتجها والبرامج التي تنشئها، فهناك قواعد بيانات
وهما من إنتاج ميكروسوفت، وهناك عشرات البرامج غيرهما من إنتاج SQL Server وبرنامج Access برنامج
شركات أخرى.
ومه  متها ،Database Management Systems (DBMS) " وتس  مى هذه البرامج "أنظمة إدارة قواعد المعطيات
الأساسية أن تمنحك الوسائل والأدواتِ اللازمة لإنشاءِ قواعدِ المعطيات والتعاملِ معها، بأسهلِ طريقةٍ وأفضلِ
إمكانيات، بحي ُ ث تقوم بدور الوسيط بينك وبي  ن المعطيات المخ  زنة في مل ّ ف قاعدة المعطيات.
ومهما كا  ن نوع قاعدة المعطيات التي تتعامل معها، ومهما كانت طريقة تخزينها في المل ّ ف، فإ  ن كلّ قواعد
المعطيات تتبع قواعد أساسية وتحّقق شروطا معينة متعارفا عليها دوليا، كما أّنها كّلها بلا استثناء تستخدم "لغة
وهي لغة خا  صة لحفظ واسترجاع وتحديث ،Structured Query Language (SQL) " الاستعلام المر ّ كبة
المعطيات في قواعد المعطيات.
مما تتألف قواعد المعطيات:
العنصر الأساسي في أي قاعدة بيانات هو الجدول ويتألف الجدول من أعمدة وأسطر يدعى كل سطر سجل وكل
عمود بحقل وبالتالي فإن السجل مكون من عدة حقول، لنفرض أنه لديك قاعدة بيانات لمكتبة فسيكون لديك الجدول
التالي :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
70
رقم الكتاب اسم الكتاب اسم المؤلف تاريخ
الإصدار
دار النشر
1255 لغة البرمجة
دلفي
1997 دار شعاع /1/ ياسر عقاد 2
محمد حمدي VB.Net 1256
غانم
2002/2/9 كتاب
إلكتروني
1944 مصر /3/ 1257 شجرة الحكم توفيق الحكيم 3
1258 الأيدي
الناعمة
2000 مصر /4/ توفيق الحكيم 2
1990 مصر /3/ شهرزاد توفيق الحكيم 12
ملاحظة : ( المعلومات في هذا الجدول غير دقيقة ).
السجل الحالي : هو السجل الذي يقف مؤشر قاعدة البيانات عنده والحقل الحالي هو تقاطع السجل الحالي مع
العامود الحالي حيث يمكنك دائمًا تحرير قاعدة البيانات عند السجل الحالي وفي الحقل الحالي ( سنتآلف مع هذه
المعلومات لاحقًا ).
يمكن أن تتكون قاعدة المعطيات من عدة جداول وهذه الجداول قد تكون مخزنة في ملف واحد ( قاعدة بيانات
أكسيس مث ً لا ) أو أن يكون كل جدول في ملف على حدة كما في قاعدة بيانات بارادوكس .
يعرف كل حقل ( عمود ) في قواعد المعطيات نوع المعطيات التي سيحويها فمث ً لا الحقل رقم الكتاب من النوع
حسب حجم المكتبة بينما أسم الكتاب و اسم المؤلف ودار النشر تكون من النوع نص LongInt أو Integer
. Date وتاريخ الإصدار من النوع
وأكثر من ذلك عندما نعرف الحقل من نوع نص علينا تحديد عدد الأحرف التي سيحويها هذا النص مث ً لا أسم
الكتاب عشرين حرف علمًا أنه لا يسمح بكتابة أكثر من الحد المعطى ، كما أن حجم الحقل سيكون بحجم النص (
عشرين بايت ) سواء أكان أسم الكتاب من عشرين حرف أو أقل ، ( سنتعرف لاحقًا على أنواع الحقول في قواعد
البيانات ، بالإضافة إلى قواعد البيانات التي تأخذ حقول متغيرة ) .
قواعد المعطيات العلائقية :
في الجدول السابق وضعنا أسم المؤلف ضمن الجدول ، ومن الممكنِ أن يحتوى الجدول على أكثر من كتابٍ لنفس
المؤّلف.. في هذه الحالة سيتم تكرار اسم المؤّلف أكثر من م  رة، م  ما سيعمل على زيادة حجم قاعدة المعطيات،
وإبطاء عمليات البحث.. إذن ما الحلّ؟
لكلّ مؤّلف.. وفي جدول الكتب ننشئ ID الحلّ هو تخصيص جدولٍ للمؤّلفين، هذا الجدول يحتوي على رقم مسلسل
عمودا نضع فيه رقم مؤّلف الكتاب.. فمثلا لو كان رقم (توفيق الحكيم) في جدول المؤّلفين هو 100 ، فإ  ن خانة رقم
أسماء الأعمدة ( أسماء الحقول )
سجلات
السجل الحالي الحقل الحالي
http://goo.gl/R2U0yZ لغة البرمجة دلفي
71
المؤّلف في جدول العناوين لا بد أن تكون 100 لكلّ من الكتب التالية "شهرزاد" و"الأيدي الناعمة" و"أرني الله"
و"شجرة الحكم" وسيصبح لينا جدولين بالشكل :
رقم الكتاب اسم الكتاب اسم المؤلف تاريخ
الإصدار
دار النشر
1255 لغة البرمجة
دلفي
1997/1/2 50 دار شعاع
2002/2/9 56 كتاب VB.Net 1256
إلكتروني
1944 مصر /3/ 1257 شجرة الحكم 3 100
2000 مصر /4/ 1258 الأيدي الناعمة 2 100
1990 مصر /3/ شهرزاد 12 100
جدول الكتب
رقم المؤلف أسم المؤلف
50 ياسر عقاد
56 محمد حمدي غانم
100 توفيق الحكيم
114 سعيد الصافي
م  ما يعني ،Byte ولكي تستوعب مقدار التوفير في الحجم، يجب أن تعرف أ  ن كلّ حرف في الن  ص يخ  زن في بايت
أن الن  ص "توفيق الحكيم" يحتا  ج إلى 12 بايت ، وتكراره أربع م  رات يعني أّنه يحتاج إلى 48 بايت !.. بينما تخزين
رقم يصل إلى 32000 لن يحتاج إلا إلى بايتين فقط، م  ما يعني أ  ن تخزين رقم 100 أربع م  رات يحتاج إلى 8 بيتات
فقط.. طبعا الفرق واضح.
ولي َ ت الأمر يقتصر على هذا.. إ  ن إنشاء عمود يحتوي على أسماء المؤّلفين يقتضي تصميمه ليستوعب أطول اسم
من هذه الأسماء.. افترض أ  ن أطول اسم لمؤّلف هو 20 حرفا، في هذه الحالة لو كان جدول الكتب يحتوي على 30
600 ألف بايت ، أي 600 كيلو = 20 × ألف كتاب، فإ  ن هذا معناه أن عمود أسماء المؤّلفي  ن يحتاج إلى 30000
بايت!
بينما لو استعضنا عن ذلك بعمود أرقام المؤّلفين، فإّنه سيحتاج إلى 60 ألف وحدة، أي 60 كيلو بايت فقط.
طبعا ستتساءل: ولكّننا في كلّ الأحوال سننشئ عمودا لأسماء المؤّلفين بالإضافة لعمود رقم المؤّلف في جدول
المؤّلفين.. نعم، ولك  ن عدد المؤّلفين قد لا يزيد عن 3 آلاف مؤّلف (باعتبار أ  ن كلّ مؤّلف له عشر كتب)، وهو ما
66 كيلو بايت. = (2 + 20) × سيحتاج إلى 3000
126 كيلو بايت، = 66 + إذن فإ  ن المجموع الكّل  ي لمساحة التخزين في حالة تقسيم المعلومات على جدولين = 60
أي حوالي خمس المساحة المستهلكة عند وضع أسماء المؤّلفين في نفس جدول الكتب!
http://goo.gl/R2U0yZ لغة البرمجة دلفي
72
هذا بالإضافة إلى سرعة عملية البحث، فالكمبيوتر يكو  ن أسرع بكثير عند البحث عن رقم 100 عنه عند البحث عن
الن  ص "توفيق الحكيم".
ليس هذا فحسب.. افترض أ  ن الذي يدخل أسماء المؤّلفين أخطأ وكتب اسم (توفيق الحكيم) كالتالي: "تفيق الحكيم"..
في هذه الحالة ما عليه إلا أن يعدل الخطأ م  رة واحدة في جدول المؤّلفين.. أ  ما لو كانت أسماء المؤّلفين في نفس
جدول الكتب، فإ  ن تكرار كتابة اسم المؤّلف يجعل احتمالات الخطإ أكبر، بالإضافة إلى تضييع الوقت والجهد في
كتابتها، وصعوبة تعديلها كّلها!
طبعا نفس هذا الكلام ينطبق على جدول دار النشر.
قاعدة هامّة:
كّلما كان ممكنا، قم بتقسيم المعطيات التي تتك  رر أكثر من م  رة على أكثر من جدول، خا  صً ة إذا كانت هذه المعطيات
ولها الكثير من القواعد، وإن كان ،Normalization تستهلك مساحة تخزين كبيرة.. إ  ن هذه العملية تس  مى التطبيع
من الممكن استنتاجها منطقيا ( تدرس في قسم المادة النظري ) .
تسمى هذه القواعد التي تعتمد الطريقة السابقة بقواعد المعطيات العلائقية أو بقواعد المعطيات المترابطة
:Relational Databases
حيث قامت هنا علاقة بين جدولين وسيعتمد احدهما على الآخر في الحصول على معلوماته .
بين جدولي الكتب والمؤّلفين، حيث إ  ن الرابط بينهما هو Relationship رأينا في المثال السابق أ  ن هناك علاق ً ة
حقل رقم المؤّلف.. وهنا يجب أن تعرف هذه المصطلحات:
.Key field " - يس  مى الحقل المشترك في كلا الجدولين "حقل مفتاحي
وذلك لأّنه متف  رد ،Primary Key " - يس  مى حقل رقم المؤّلف في جدول المؤّلفين باسم "المفتاح الأساس  ي
غير قابل للتكرار.. ولا يحتوي الجدول على أكثر من مفتاح أساس  ي واحد. Unique
لأّنه موضوع في هذا ،Foreign Key " - يس  مى حقل رقم المؤّلف في جدول الكتب باسم "المفتاح الفرع  ي
الجدول ليربطه بجدول آخر.. وطبعا يمكن أن تتك  رر قيمة هذا العمود بدون أدنى مشكلة.. ويمكن أن يحتوى
الجدول على أكثر من مفتاح فرعي يربطه بعدد من الجداول الأخرى.
وجدول أسماء الكتب باسم "جدول التفاصيل" ،Master " - يس  مى جدول المؤّلفين باسم "الجدول الرئيس  ي
حيث يمكنك أن تحصل منه على معلومات عن الكتب المتوافرة لكلّ مؤّلف. ،Detail
..Join " - تس  مى عملية مطابقة الصفوف بين الجدولين المترابطين عن طريق الحقل المفتاح  ي، عملية "ربط
مثل أن تحاول معرفة اسم مؤّلف كتاب معين، أو أن تحاول أن تعرف كلّ الكتب التي كتبها نفس المؤّلف.
وذلك لأ  ن مؤّلًفا واحدا ،One-to-many Relationship " - تس  مى ال  علاقة بين الجدولين علاقة "واحد بمتعدد
يمكن أن يكون له أكثر من كتاب.
وذلك لو كان لدينا كتب اشترك ،Many-to-many Relationship " - يمكن أن توجد علاقة "متعدد بمتعدد
في تأليفها أكثر من مؤّلف.. في هذه الحالة سيكون لدينا جدول ثالث هو جدول "مؤّلفو الكتب"، يحتوى على
عمود يمّثل رقم الكتاب في جدول عناوين الكتب، وعمود آخر يمّثل رقم المؤّلف في جدول المؤّلفين،
كالتالي:
http://goo.gl/R2U0yZ لغة البرمجة دلفي
73
AuthorID BookID
23 1
106 1
8 2
8 3
حيث اشترك المؤّلفان رقما 23 و 106 في تأليف الكتاب رقم 2، بينما قام المؤّلف رقم 8 بتأليف الكتابين
رقمي 2 و 3.. هذه هي علاقة متعدد بمتعدد.
:Referential Integrity صحّة المرجع
ماذا سيحدث لو تم حذف سجلّ توفيق الحكيم من جدول المؤّلفين؟.. ستظلّ هناك روايات في جدول الكتب تشير
لسجلّ توفيق الحكيم، بينما هو محذوف.. إ  ن هذا وضع مثال  ي لحدوث أخطاءٍ مزعجة في تطبيقك!
والحلّ؟
بين الجداول، فلو قمت بحذف سجلّ Referential Integrity يج  ب أن تراعي منطقية وص  حة العلاقات المرجعية
توفيق الحكيم من جدول الكتب، فيجب أيضا أن يتم حذف كلّ الروايات والكتب التي أّلفها من جدول الكتب.
عا  م ً ة اطمئ  ن، فكما ذكرنا من قبل، فإ  ن برامج قواعد المعطيات مص ممة لتريحك من معظم العمل اليدو  ي، لهذا فهي
ستعينك على التحّقق من ص  حة العلاقات المرجعية بين الجداول، كما سنرى بعد قليل.
العمليات على قواعد المعطيات :
قاعدة المعطيات عبارة عن مخزن يتم فيه تخزين المعطيات ويجب أن يتمتع هذا المخزن بالخصائص التالية :
1 الإضافة : أي إمكانية إضافة سجلات جديدة إلى الجداول .
2 الحذف : أمكانية حذف قيم من الجداول دون أن يؤثر ذلك على القاعدة .
3 التعديل : يجب أن نكون قادرين على تعديل حقول قاعدة البيانات ، أفرض مث ً لا أن هناك حقل في جدول
يحوي على عدد النسخ من الموجودة من الكتب ، علينا أن نعدل هذا الحقل كلما إشترى أحد الزبائن كتابًا ما .
4 البحث : يجب الحصول على المعلومة المطلوبة بأسرع وقت ممكن .
5 الترتيب والفرز : القدرة على إظهار البيانات للمستخدم بالشكل الذي يريد ( في جدول يمكن ترتيب الكتب
حسب أسم الكتاب أو حسب أسم المؤلف .
عليك أن تعرف أيضًا الفرق بين تخزين المعطيات والفائدة التي يمكن أن تجنيها من هذه المعطيات ، فالعمليات على
المعطيات هي التي تعطي المعلومات والتي يحتاجها مستثمر قاعدة البيانات ليتخذ قراره، تستخدم قواعد البيانات في
بلادنا في مجال المحاسبة وإصدار الفواتير وفي مجالات الإحصاء على أكثر تقدير ( قليل من الشركات تعرف
الاستفادة من المعلومات الإحصائية ) بينما تستخدم قواعد المعطيات في الخارج كالولايات المتحدة الأمريكية مث ً لا
للحصول على كم هائل من المعلومات لا يمكن لإنسان عادي أن يتصوره ، افرض أن الزبون سعيد قد اشترى من
المكتبة عدة كتب تتعلق بلغات البرمجة خلال سنة ، يتكون من هذه المعطيات أن سعيد يحب قراءة كتب البرمجة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
74
ويقوم صاحب المكتبة بإرسال إعلانات إلى سعيد كلما صدر مؤلف جديد في لغات البرمجة، لنفرض أيضًا أنه في
الكتاب الذي حصد أكبر مبيعات في العالم في الشهر السادس ) Harry potter أسبوع ما كثر الطلب على كتاب ما
2003 ) ، عندها يقوم صاحب المكتبة بتعديل ترتيب الكتب الموضوعة على الرفوف ليكون هذا الكتاب على
الرفوف في واجه المكتبة .( طبعًا لا يمكن تطبيق هذه الأمثلة عندنا هكذا ، لأن أي مكتبة في الولايات المتحدة يكون
لها فروع في أكثر من ولاية ومدينة مما يعني عدد زبائن يفوق المليون زبون، مما يعطي إحصائيات واسعة عن
حركة البيع والشراء )
خطوات تصميم قواعد المعطيات :
1 تحديد الغرض من قاعدة المعطيات .
2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات .
3 تحديد حقول الجداول التي نحتاج إليها .
4 تعيين الحقول المفتاحية .
5 تحديد العلاقات بين الجداول
6 إدخال المعطيات .
1 تحديد الغرض من قاعدة المعطيات :
يجب المعرفة أو ً لا ماذا يريد المستخدم من قاعدة المعطيات وثم معرفة المعطيات التي يجب تخزينها في القاعدة لأن
أي زيادة في المعطيات سينتج عنه زيادة في حجم القاعدة بدون سبب ، وأي نقص في المعطيات سيتطلب منا تعديل
الجدول فيما بعد والذي قد يؤدي بدوره إلى تعديل في الجداول المرتبة وبالتالي تعديل القاعدة بالكامل .
2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات :
بعد تحديد المعطيات المطلوب تخزينها يجب علينا العمل على تخطيط الجداول التي ستخزن هذه المعلومات .
3 تحديد حقول الجداول التي نحتاج إليها :
يجب أن لا يتضمن الجدول معلومات متكررة ،كما أنه لا يجب تكرار المعلومة الواحدة بين الجداول ، هذا يضمن
تحديث المعلومة في مكانها ويقضي على احتمال إدخال معلومات متباينة لتلك المعلومة فيما لو وجدت في مكانين
مختلفين .
........
قواعد المعطيات في دلفي : .....
1 برامج قواعد المعطيات : هي البرامج التي تسمح للمستخدم بالتعامل مع المعطيات المخزنة ضمن قاعدة
المعطيات، وعند كتابة برنامج لقاعد معطيات يجب أن تكون على علم كاف ببنية قاعدة المعطيات التي تتعامل معها
( الجداول والحقول ) حيث يمكنك ذلك من تصميم الواجهات التي تسمح للمستخدم بتعامل مع هذه المعطيات (
استعراض ، إضافة ، حذف ، بحث ....... ) .
2 أنواع قواعد المعطيات :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
75
اختيار نوع قاعدة المعطيات التي ستخدم يعتمد على ثلاث نقاط رئيسية :
1 حجم المعطيات التي سيحويه كل جدول .
2 كم هو عدد المستخدمين الذين سيتشاركون العمل على هذه القاعدة .
3 سرعة الأداء المطلوبة من قاعدة المعطيات .
وعلى هذا المبدأ تقسم قواعد المعطيات إلى قسمين :
أ قواعد المعطيات المحلية :
تعمل قواعد المعطيات المحلية على جهاز واحد أو على شبكة محلية صغيرة ، وهي سريعة عمليًا ولكنها أبطئ في
حالات التشارك على قواعد المعطيات ( تصور عدد من الموظفين يقومون بإدخال الكتب الجديدة الواصلة إلى
المكتبة بنفس الوقت ، عندها على قاعدة المعطيات العمل على جعل ذلك متاحًا للموظفين ) تقوم قواعد المعطيات
المحلية على قفل الملف ( الجدول ) للمستخدم الحالي ومنع التعديل في هذا الجدول من قبل مستخدم آخر حتى ينهي
المستخدم الحالي تعديله ( يوجد خوارزميات كثيرة لتطبيق هذا العمل ) واعتماد قواعد المعطيات على هذا النوع من
القفل جعلها محدودة الحجم نوعًا ما ( هناك عدد أعظمي للسجلات التي يمكن لقاعدة المعطيات التعامل معها ) .
سرية المعلومات في هذه القواعد ضعيفة جدًا ويمكن كسرها بسهولة.
. Paradox, dBASE, FoxPro, and Access. : كمثال على قواعد المعطيات المحلية لدينا
ب قواعد المعطيات الموزعة :
تسمح هذه القواعد لعدة مستخدمين ( آلاف المستخدمين ) بالتعامل مع الجداول وتستخدم خوارزميات معقدة لتحقيق
Microsoft SQL ذلك ( جميع شركات الطيران في العالم موصولة إلى قاعدة بيانات واحدة) ، قاعدة معطيات
تستخدم القفل على مستوى السجل أي تسمح لعدة مستخدمين بتعديل نفس الجدول بنفس الوقت ولكنها لا Server
تسمح لهم بتعديل نفس السجل .
يمكن أن يصل حجم قواعد المعطيات هذه إلى كميات هائلة ( بلغ حجم معطيات إحدى شركات التسويق في أمريكا
3.6 ) كما أنه يمكن لقواعد المعطيات هذه أن توجد على أجهزة مختلفة . TB
سرية المعلومات في هذه القواعد قوية جدًا ، كما أنها تعطي سماحيات للمستخدمين ، فموظف المكتبة المسئول عن
إدخال أسماء الكتب لا يحق له الإطلاع على كمية المبيعات ...
Structured Query Language (SQL) تشترك قواعد المعطيات هذه باستخدامها للغة الاستفسارات البنيوية
InterBase, Oracle, Sybase, Informix, Microsoft SQLserver, : كمثال على قواعد المعطيات الموزعة لدينا
and DB2.
3 بنية برنامج قواعد المعطيات:
يبن الشكل المجاور بنية تطبيق قواعد
المعطيات والذي يتألف من
أ واجهة المستخدم : وهي النوافذ
التي يصممها المبرمج ليسمح
للمستخدم بالتعامل مع المعطيات .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
76
تستخدم للوصول إلى قواعد المعطيات وهي عبارة عن ربط بين : Data Access ) : ب عناصر الوصول
عناصر التحكم بالمعطيات مع واجهة المستخدم .
ج عناصر التحكم بالمعطيات : تزود المستخدم بواجهة التعامل مع جداول المعطيات .
من المهم أن تلاحظ أن التطبيق ( البرنامج ) مستقل عن قاعدة المعطيات، حيث توفر دلفي أدوات للوصول إلى
قواعد المعطيات ولالكنها لا تتدخل بكيفية تعامل القاعدة مع المعلومات المدخلة ( عند إدخال سجل إلى جدول
لا تهتم لغة البرمجة ولا حتى المبرمج بكيفية تخزين هذا السجل والطرق الخوارزمية المتبعة في Oracle معطيات
ذلك و لا حتى طرق البحث ، فعمل لغة البرمجة هنا يقتصر على طلب أوامر محددة من قاعدة المعطيات والتي
Data تقوم بدورها بتنفيذها وإعادتها إلى البرنامج وتدعى عناصر دلفي المسئولة عن ذلك بعناصر الوصول
.Access
http://goo.gl/R2U0yZ لغة البرمجة دلفي
77
الجلسة الرابعة عشر
بناء تطبيقات قواعد المعطيات :
يأتي مع دلفي قواعد معطيات جاهزة تستخدم كأمثلة على قواعد المعطيات وطرق التعامل معها، لذلك سنتعامل مع
هذه القواعد حتى يصبح الوقت جاهزًا لإنشاء قواعدنا الخاصة .
مثال 1 : بناء نموذج فيه جدول وحيد :
من القائمة ( Form Wizard ) أسهل طريقة لكتابة برنامج قواعد المعطيات هي استخدام معالج النماذج
. Database
أو File 􀃆 Close للبدء بالعمل أنشئ مشروعًا جديدًا ثم أغلق النموذج الأول ( الافتراضي ) عن طريق الأمر
ستظهر لك نافذة تسألك إن كنت تريد حفظ الوحدة Ctrl+F التحويل إلى محرر الشيفرة والضغط على المفتاحين 4
أجب بلا .
بهذه الطريقة نكون قد حصلنا على مشروع بدون نموذج أولي لأننا سننشئ هذه النافذة من خلال معالج النماذج
من قوائم الدلفي : Database 􀃆 Form Wizard اختر الأمر
ستظهر النافذة التالية : اترك الخيارات
الافتراضية وستتعرف على خيارتها لاحقًا .
Next اضغط على الزر
ستظهر عندها النافذة المجاورة والتي تطالبك
بتحديد الجدول الذي سيتعامل معه النموذج ،
من القسم DBDEMOS لتحديد الجدول أختر
سيشرح معنى ذلك ) Drive or Alias Name
لاحقًا)
DBDEMOS ستظهر جميع الجداول في القاعدة
Country.db اختر منها الجدول
http://goo.gl/R2U0yZ لغة البرمجة دلفي
78
. Next اضغط على
تظهر عندها النافذة المجاورة والتي تطالبك بتحديد
الحقول التي تريد إظهارها في الجدول .
لإظهار حقل ما أختر هذا الحقل واضغط على الزر
>
ولإظهار جميع الحقول اختر الزر <<
لتراجع عن اخيار حقل اختر هذا الحقل وأضغط على
الزر >
للتراجع عن اختيار جميع الحقول اختر الزر >>
أضف الآن جميع الحقول ( << ) .
للمتابعة Next واضغط على
ستظهر نافذة تطالبك بطريقة عرض البيانات :
أفقي أو عامودي أو في جدول
( In grid ) حدد الخيار في جدول
Next واضغط على
تظهر النافذة الأخيرة ( خيارات هذه النافذة سيتم
توضيحها لاحقًا )
Generate a main form فعل الخيار
إذا كان النموذج هو النموذج الرئيسي في برنامجك
لإظهار النموذج التالي . Finish اضغط على
http://goo.gl/R2U0yZ لغة البرمجة دلفي
79
عند الانتهاء يظهر النموذج التالي :
لقد قام معالج النماذج بإنشاء نموذج وضع عليه عدد من عناصر التحكم بالمعطيات وعناصر أخرى للوصول إلى
المعطيات .
نفذ التطبيق الآن ولاحظ ما يلي :
1 عناصر الوصول على المعطيات لا تظهر أثناء التنفيذ .
بيانات الجدول المرتبط معه حيث أعمدة هذا الجدول هي أسماء الحقول DBGrid 2 يظهر عنصر الشبكة
وتكون ظاهرة في السطر الأول و سطور هذه الجدول هي السجلات ويوجد سهم صغير يدل على السجل
الحالي،كما أن الحقل الحالي يكون مفع ً لا باللون الأزرق .
عنصر التحكم
TDBnaviagtor
عنصر التحكم
DBGrid
عنصر الوصول
TDataSouce
عنصر الوصول
TTable
أسماء الحقول
مؤشر إلى السجل الحالي
السجل الحالي
http://goo.gl/R2U0yZ لغة البرمجة دلفي
80
يمكن أن نقوم نحن بوضع العناصر على نموذج فارغ للحصول على النموذج السابق بدون استخدام معالج الأشكال.
سنشرح الآن كل عنصر من هذه العناصر على حدى :
: Table العنصر
وهي DataSet يستخدم هذا العنصر للربط بين البرنامج وقاعدة المعطيات وهو عنصر من مجموعة عناصر تدعى
عبارة عن عناصر لها القدرة على التعامل مع محرك قاعدة المعطيات للوصول للجداول ومن هذه العناصر .
Table, Query, AdoTable, AdoQuery,
وقد ربطه معالج النماذج مع قاعدة المعطيات اعتمادًا Table في مثالنا يحتوي النموذج على عنصر واحد من النوع
على الخصائص التالية :
الخاصة القيمة ملاحظات
هي عبارة عن اسم معرف مسبقًا يشير إلى مكان DBDEMOS القيمة DBDEMOS DataBaseName
تواجد
( مسار ) الجداول ( نستطيع أن نكتب مسار فهرس قاعدة المعطيات
بد ً لا منها
اسم الجدول الذي سيرتبط مع العنصر country.db TableName
اسم العنصر ( يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في دلفي Table1 Name
(
لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم True أعط القيمة False Active
: DataSource العنصر
وعناصر DataSet ويستخدم هذا العنصر للربط بين عناصر الوصول Table يرتبط هذا العنصر مع العنصر
التحكم بالمعطيات وله الخصائض التالية :
الخاصة القيمة ملاحظات
تجعل هذه الخاصة المعطيات في وضع التحرير ( أمكانية التعديل ) أما True AutoEdit
إذا أردنا استعراض ( قراءة دون تغيير ) المعطيات فقط فنعطي هذه
False الخاصة القيمة
Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1 Dataset
للحصول على المعطيات .
اسم العنصر ( يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في دلفي Datasource1 Name
http://goo.gl/R2U0yZ لغة البرمجة دلفي
81
(
: ( DBGrid ) عنصر التحكم بالمعطيات
ليحصل منه على أسماء الحقول Datasource يستخدم هذا العنصر لعرض وتحرير المعطيات ويرتبط مع العنصر
وقيم الجدول وأعطاه معالج النماذج الخصائص التالية :
الخاصة القيمة ملاحظات
بالمعطيات DBGrid تحدد هذه الخاصة العنصر الذي سيزود Datasource1 Datasource
اسم العنصر Dbgrid1 Name
: DBNavigator عنصر التحكم
يحوي هذه العنصر العديد من الأزرار مهمتها تحريك مؤشر السجل والقيام بأعمال الإضافة والحذف والتراجع عن
للخاصة True اعط القيمة ، DataSource عن طريق الخاصة Datasource التعديل ويرتبط هذا العنصر مع ال
التابعة لهذا العنصر . ShowHint
لفتح الجدول وإظهار Table1.Open يضيف معالج النماذج أيضًا سطر برمجي واحد في حدث إنشاء النموذج هو
. True القيمة Table للعنصر Active سجلاته ويمكن الاستعاضة عن هذه التعليمة بإعطاء الخاصة
: ( Database Engine ) محرك قواعد المعطيات
محرك قاعدة المعطيات يحدد أسلوب تعامل البرنامج مع القاعدة وهي عبارة عن مجموعة مكتبات جاهزة تربط بين
عناصر الدلفي وقواعد المعطيات ومن أهم المحركات في دلفي :
: Borland Database Engine : BDE 1
ويتعامل مع قواعد معطيات من النوع Bde يتعامل هذا المحرك مع عناصر الوصول الموجودة في الصفحة
وغيرها كثير . Dbase أو Pardox
: Microsoft ActiveX Data Objects : ADO 2
أو Access ويستخدم مع قواعد معطيات مثل Ado يتعامل هذا المحرك على العناصر الموجودة في الصفحة
. Oracle أو SQL SERVER
:Interbase 3
ويستخدم مع قواعد معطيات Interbase Express يتعامل هذا المحرك على العناصر الموجودة في الصفحة
التي يمكن تحميلها من القرص الذي توجد عليه دلفي . Interbase
مثال 2 : بناء نموذج لإدخال المعطيات :
( Vertical أعد خطوات المثال السابق حتى تصل إلى النافذة التي تطالبك بطريقة عرض المعطيات ( اختر منها
Finish ثم Next أضغط على ( Left وستظهر بعدها نافذة تسألك عن طريقة عرض عناوين الحقول ( اختر منها
ليظهر النموذج التالي :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
82
لاحظ ظهور حقول المعطيات بد ً لا من الجدول وتظهر
والتي ترتبط مع Dbedit هذا الحقول في العناصر
Datasource قاعدة المعطيات عبر الخاصة
للتنقل بين DBNavegator نفذ البرنامج واستخدم
الحقول ( السجل الحالي هو الحقل الذي تظهر قيمه
داخل الحقول )
DataSource القيمة 1 Datasource وأعطه الخاصة Datacontrole من الصفحة DBGrid أضف عنصر
تبعًا DBEdit بالفأرة ولاحظ كيف تتغير قيم الحقول في DBGrid نفذ البرنامج وحاول التنقل بين السجلات في
لتغير السجل الحالي .
:( Master \ Detail Form ) مثال 3:بناء نموذج من النوع الرئيسي تفصيلي
وجدنا سابقًا في مثال المكتبة كيف يمكن لمجموعة من الجداول أن ترتبط مع بعضها البعض لتشكل قاعدة معطيات،
كما وجدنا :كيف أن جدول المؤلفين هو جدول رئيسي بينما جدول الكتب هو جدول ثانوي وقلنا أن هذه هي علاقة
رأس بأطراف أو واحد إلى مجموعة لنفترض الآن أن المستخدم بحاجة لمعرفة جميع الكتب التي كتبت من قبل
مؤلف ما، تدعى النماذج التي تقدم هذه المعلومات بالنماذج ذات النوع الرئيسي تفصيلي.
Customer.db سنستخدم في مثالنا الآن معالج النماذج لإنشاء نماذج من هذا النوع وسنعتمد على الجدول الرئيسي
وقبل البدء سأشرح كل من الجدولين . Orders.Db والجدول التفصيلي
يحوي معلومات عن الزبائن ( رقم الزبون ، الأسم ، العنوان ، المدينة ، : Customer.db : جدول الزبائن
الهاتف ...... ) ، المفتاح الرئيسي فيه هو رقم الزبون.
يحوي معلومات عن طلبات الزبائن ( رقم الطلبية ، رقم الزبون ، تاريخ التسليم ، : Orders.db جدول الطلبات
طريقة التسليم .... )
من الواضح أن المفتاح الرئيسي لهذا الجدول هو رقم الطلبية ، كما أن هناك مفتاح ثانوي هو رقم الزبون ) .
سننشئ الآن نموذجًا يظهر فيه جدولي الزبائن والطلبيات ولكن السجلات الظاهرة في سجل الطلبيات هي السجلات
التابعة للزبون الحالي في جدول الزبائن .
Database􀃆 Form Wizard ابدأ مشروعًا جديدًا، أغلق النموذج الافتراضي ، اختر الأمر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
83
واضغط على Form Option من القسم Create Master Detail Form من النافذة الأولى للمعالج حدد الخيار
Next
واختر الجدول Driver or alias name في DBDEMOS النافذة الثانية تطالبك بإدخال الجدول الرئيسي حدد
ومن النافذة التي تليها حدد جميع حقول هذا الجدول ، وفي النافذة التالية حدد طريقة العرض Customer.db
. in a grid بجدول
واختر بعدها جميع الحقول DBDEMOS من Orders النافذة التالية تطالبك بتحديد الجدول التفصيلي أختر
وطريقة العرض جدول
تظهر بعدها النافذة المجاورة ( اختر من القسم
CustNo القيمة Available Indexes
القيمة Master Fields واختر من اللائحة
CustNo
CustNo القيمة Detail Fields ومن اللائحة
ثم على Next ثم على Add إضغط بعدها على
مرة أخرى .سيظهر عندها النموذج رئيسي Next
تفصيلي :
ولا Master نفذ البرنامج وتنقل بين حقول الجدول
... Detail حظ التغيرات على الجدول
وقام بالربط بينهما في Datasource بالإضافة إلى عنصري Table لقد أضاف معالج النماذج هنا عنصري
الحقول التالية :
Tabel في العنصر 2
الخاصة القيمة الشرح
المرتبط مع الجدول الرئيسي DataSource يعرف عنصر Datasource1 MasterSource
يحدد الحقل الذي سيقوم بترتيب وفهرسة السجلات في الجدول CustNo IndexName
بعد أن تعلمنا كيفية تنفيذ تطبيقات قواعد باستخدام معالج النماذج سنعيد الأمثلة السابقة باستخدام العناصر مباشرة :
: مثال 1
DBDemos الموجود ضمن القاعدة Country.db سنقوم بكتابة برنامج يعرض الجدول
ابدأ مشروعًا جديدًا وأضف إلى النموذج العناصر التالية :
BDE من الصفحة Table 1 العنصر
. Data Access من الصفحة DataSource 2 _ العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
84
. Data Control من الصفحة DBNavigator و DBGrid 3 العنصر
الخصائص التالية : Table أعط العنصر
الخاصة القيمة ملاحظات
هي عبارة عن اسم معرف مسبقًا يشير إلى DBDEMOS القيمة DBDEMOS DataBaseName
مكان تواجد
( مسار ) الجداول ( نستطيع أن نكتب مسار فهرس قاعدة المعطيات
بد ً لا منها
اسم الجدول الذي سيرتبط مع العنصر country.db TableName
لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم True أعط القيمة True Active
الخصائص التالية : DataSource أعط العنصر
الخاصة القيمة ملاحظات
تجعل هذه الخاصة المعطيات في وضع التحرير ( أمكانية التعديل ) أما True AutoEdit
إذا أردنا استعراض ( قراءة دون تغيير ) المعطيات فقط فنعطي هذه
False الخاصة القيمة
Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1 Dataset
للحصول على المعطيات .
الخاصة التالية : DBNavigator والعنصر DBGrid أعط العنصر
الخاصة القيمة ملاحظات
بالمعطيات DBGrid تحدد هذه الخاصة العنصر الذي سيزود Datasource1 Datasource
نفذ البرنامج .
: مثال 2
بدون استخدام المعالج : Master Detail Form إنشاء
وعنصر DBGrid وعنصري DataSource وعنصري Table ابدأ مشروعًا جديدًا وأضف إليه عنصري
. DBNavigator
: ( Master ) 1 ربط الجدول الرئيسي
الخصائص التالية : Table أعط العنصر 1
الخاصة القيمة ملاحظات
هي عبارة عن اسم معرف مسبقًا يشير إلى DBDEMOS القيمة DBDEMOS DataBaseName
مكان تواجد
( مسار ) الجداول ( نستطيع أن نكتب مسار فهرس قاعدة المعطيات
بد ً لا منها
http://goo.gl/R2U0yZ لغة البرمجة دلفي
85
اسم الجدول الذي سيرتبط مع العنصر Customers.db TableName
لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم True أعط القيمة True Active
. Table القيمة 1 DataSet الخاصة DataSource أعط العنصر 1
. DataSource القيمة 1 DataSource الخاصة DBNavigator و 1 DBGrid أعط العنصرين 1
: Detail 2 ربط الجدول التفصيلي
الخصائص التالية : Table أعط العنصر 2
الخاصة القيمة ملاحظات
هي عبارة عن اسم معرف مسبقًا يشير إلى DBDEMOS القيمة DBDEMOS DataBaseName
مكان تواجد
( مسار ) الجداول ( نستطيع أن نكتب مسار فهرس قاعدة المعطيات
بد ً لا منها
اسم الجدول الذي سيرتبط مع العنصر order.db TableName
لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم True أعط القيمة True Active
. Table القيمة 2 DataSet الخاصة DataSource أعط العنصر 2
. DataSource القيمة 2 DataSource الخاصة DBGrid أعط العنصرين 2
أنه جدول تفصيلي للجدول Table بهذا نكون قد ربطنا العناصر مع الجدول ولآن علينا أن نعلم الجدول 2
. Table1
القيمة MasterField و الخاصة Datasouce القيمة 1 MasterSource الخاصة Table أعط العنصر 2
CustNo
http://goo.gl/R2U0yZ لغة البرمجة دلفي
86
الجلسة الخامسة عشر
بناء قواعد البيانات :
يوجد العديد من برامج بناء قواعد البيانات ويعتمد الأمر على نوع القاعدة التي تريد استخدامها فلبناء قاعدة محلية
Oracle ولبناء جداول تستخدم Borland Paradox هناك البرنامج ( Paradox ) تستخدم جداول باردوكس
وهكذا وقد زودتنا دلفي بأداة سهلة لإنشاء قواعد البيانات وتعديل الجداول بدون العودة Oracle 9i هناك البرنامج
الذي يمكن عن طريقة Database Desktop إلى تلك البرامج، حيث يوجد ضمن مجموعة أدوات دلفي البرنامج
تصميم العديد من أنواع جداول البيانات .
: DataBase Desktop
أفضل طريقة لتعلم هذا البرنامج هي نبدأ بمثال :
المطلوب إنشاء جداول تتعلق بحركة الركاب في المطار باستخدام جداول الباردوكس وهذه الجداول هي :
( Passengers ) جدول المسافرون
اسم الحقل نوع الحقل الشرح
عدد * رقم المسافر Pno
نص اسم المسافر Pname
نص الجنسية Nationality
عدد رقم جواز PassNo
السفر
جدول المسافرون والرحلات
TripsAndPassengers
اسم الحقل نوع الحقل الشرح
عدد رقم المسافر Pno
عدد رقم الرحلة TripNo
عدد رقم المقعد SeatNo
عدد رقم الصف ClassNo
( Trips ) جدول الرحلات
اسم الحقل نوع الحقل الشرح
عدد * رقم الرحلة TripNo
نص اسم الشركة Company
نص بلد المغادرة GoFrom
نص بلد الوصول ArriveTo
تاريخ ووقت وقت المغادرة GoTime
تاريخ ووقت وقت الوصول ArriveTime
عدد عدد البطاقات CardCount
المتوفرة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
87
تدل النجمة ( * ) على أن هذا الحقل مفتاح رئيسي .
وتبين الأسهم طريقة ربط الجداول .
. رقم المقعد يجب أن يأخذ قيمة بين 1 و 200
حيث سيتم وضع قاعدة البيانات في هذا الفهرس . C على القرص AirLines 1 في البداية أنشأ الفهرس
: Database Desktop 2 تشغيل البرنامج
يمكنك تشغيل البرنامج خارج إطار دلفي عن طريق القائمة
Start 􀃆 Programs 􀃆Borland Delphi 􀃆Database Desktop
Tools 􀃆 Database Desktop أو من داخل دلفي عن طريق القائمة
2 تحديد فهرس العمل :
إن فهرس العمل في قواعد البيانات يعني المكان الذي سيبحث فيه
البرنامج عن الملفات وسيكون هو الفهرس الافتراضي وسيظهر
ضمن صندوقي فتح وحفظ الملفات ، ولتحديد الفهرس الافتراضي
اختر الأمر
File 􀃆 Working Directory
C:\ واختر Browse فتظهر عندها النافذة ، اضغط على الزر
AirLines
للخروج . ok اضغط بعدها على
: Alias 3 تعريف اسم بديل
قلنا أن الاسم البديل عبارة عن أسم يستخدمه النظام
للوصول إلى فهرس قاعدة البيانات ولتعريف اسم بديل
Alias Manger نختار الأمر C:\AirLines للفهرس
Database Desktop في البرنامج Tools من القائمة
:
Database واكتب في اللائحة New اضغط على الزر
Alias
( Travel ) السلسلة
) STANDARD القيمة Driver Type وفي اللائحة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
88
إذا كانت قاعدة البيانات من النوع Standard تحدد هذه اللائحة نوع قاعدة البيانات المستخدمة وتعطى القيمة
بارادوكس ).
( Browse يمكن أن تكتبه كتابة أو تختار الزر ) Path في القسم C:\AirLiens حدد بعدها مسار القاعدة
ستظهر رسالة تسألك إن Ok لإضافة القاعدة الجديدة إضغط بعدها على الزر Keep New اضغط بعدها على الزر
لحفظ القاعدة الجديدة . Yes عليك أن تجيب على IDAPI32.CFG كنت تريد حفظ التغيرات في
ملاحظات :
1 يستخدم الاسم البديل في لغات البرمجة لإعطاء المستخدم الحرية في اختيار مكان تخزين قاعدة البيانات، لاحظ
إن معظم البرامج تعطي المستخدم حرية في اختيار مكان وضع البرنامج أثناء التنصيب، تصور مث ً لا أنك لم
عندها عليك C:\AirLiens القيمة Table للعنصر DatabaseName تستخدم الاسم البديل وأعطيت الخاصة
أن تضع قاعدة البيانات في هذا الفهرس على جميع الأجهزة التي ستستخدم برنامجك .
2 إحدى فوائد الاسم البديل الأخرى هي العودة إلى جداول سابقة وخاصة في برامج المحاسبة، تصور إن
عندها عليك تغير D:\ المستخدم يريد العودة إلى مدخلات سنة 1998 حيث كان قد حفظها على الفهرس 1998
مسار الاسم البديل فقط دون التغير في البرنامج .
3 يمكن إنشاء وحذف الاسم البديل برمجيًا .
جديد في Alias سيتم تعريف Public Alias في حال إزالة الخيار Alias Manger 4 في النافذة السابقة
من الدلفي مث ً لا . Alias فقط ولا يمكن الوصول إلى هذا ال Database Desktop البرنامج
لحذف اسم بديل . Remove 5 يستخدم الزر
البدء بجدول جديد :
File 􀃆 New 􀃆 Table للبدء بجدول جديد اختر الأمر
تظهر النافذة المجاورة لتحديد نوع الجدول حيث يمكن إنشاء العديد من
) Database Desktop أنواع قواعد البيانات باستخدام البرنامج
واضغط على موافق. Paradox اضغط على زر اللائحة لمشاهدة هذه الأنواع ) ، اختر من اللائحة 7
Database معظم العمل في البرنامج
يتم في هذه النافذة لذلك Desktop
ستشرح بشيء من التفصيل
: Field roster جدول الحقول
يتم في هذا الجدول تعريف حقول الجدول
وتتألف من
: Field Name 1 اسم الحقل
http://goo.gl/R2U0yZ لغة البرمجة دلفي
89
يوضع في هذا القسم اسم الحقل، وأسماء الحقول في جداول الباردوكس يجب أن لا تتجاوز 25 حرف، كما يمكن
أن تحتوي على فراغات ويمكن أن يكون اسم الحقل باللغة العربية ولكن ينصح باستخدام أسماء حقول إنكليزية دائمًا
كما يجب الابتعاد عن بعض الأسماء المحجوزة في لغة ، SQL وعدم احتوائها على فراغات وخاصة عند استخدام
... Date أو From أو SELECT مثل SQL
: Type 2 نوع الحقل
يصف هذا الحقل نوع المعطيات الذي سيخزن في هذا الحقل وهناك عدد من الأنواع التي يمكن أن ينتمي إليها
Space أو اضغط على مفتاح المسافة Type الحقل ولمعرفة هذه الأنواع إضغط بزر الفأرة اليميني في العمود
: Paradox فعا ً لا ، والجدول التالي يبين الأنواع التي توفرها جداول Type عندما يكون العمود
النوع الحجم الرمز ملاحظات
نص عادي يمكن أن يحتوي رموزًا أو أرقام ويحدد حجم الحقل طول A 255 – 1 Alpha
السلسلة التي سيأخذه الحقل
عدد حقيقي N Number
نفس النوع السابق ولكن بصيغة مالية $ Money
Integer عدد صحيح طويل بطول بايتين من النوع S Short
Longint عدد صحيح طويل من النوع I Long Integer
0 # عدد صحيح عشري مضغوط ( التمثيل الثنائي لإعداد الفاصلة .. 32 BCD
( العشرية ) ( 1
تاريخ D Date
وقت T Time
يدمج التاريخ والوقت في حقل واحد @ TimeStamp
( نص بحجم كبير.( 2 M 1..240 Memo
Formatted
Memo
نص بحجم كبير مع تخزين طريقة تنسيق هذا النص ( لون النص و F 0.. 240
( نوع الخط ..) ( 2
( صورة ( 3 G 0..240 Graphic
( مث ً لا ) ( 3 Excel يمثل حاوية لربط وإدراج الكائنات ( إدراج ملف O 0..240 OLE
False أو True يمثل قيمة منطقية L Logical
عدد صحيح طويل يزداد تلقائيًا + Auto increment
( 3 ) .Mb يخزن المعلومات ثنائيًا داخل ملفات B 0..240 Binary
Db معطيات بالصيغة الثنائية تخزن ضمن ملف قاعدة البيانات Y 1..255 Byte
1 ) : الرقم في العمود حجم تحدد عدد الأرقام بعد الفاصلة )
http://goo.gl/R2U0yZ لغة البرمجة دلفي
90
في حال النصوص التي يبلغ حجمها أكثر من 255 حرف وتخزن عادة خارج ملف Memo 2 ) : يستخدم النوع )
ويدل الرقم المدخل في عمود الحجم على عدد الأحرف الذي سيخزن داخل MB الجدول في ملفات ذات امتداد
بفرض أعطينا القيمة 30 في عمود الحجم عندها في حال أدخل المستخدم 30 حرف أو أقل ) .Db ملف الجدول
ستخزن البيانات داخل ملف القاعدة أما إذا إدخل المستخدم أكثر من 30 حرف ستخزن عندها البيانات داخل ملف
.Mb من النوع
3 ) يمكن عدم تحديد حجم هذا النوع . )
كما هو ملاحظ في الجدول السابق هناك بعض أنواع الحقول بحاجة لتحديد حجمها لنأخذ Size 3 حجم الحقل
وبحجم 20 ، نستطيع A بفرض أنه عرفنا حقل اسم المسافر من النوع Alpha مثا ً لا على ذلك الحقل من نوع
عندها إدخال أسماء المسافرين ذات طول عشرين حرف أو أقل أما إذا كان اسم أحد المسافرين أطول من عشرين
حرف فسيتم تخزين العشرين حرف الأولى وتجاهل الباقي ، مشكلة أخرى يمكن أن تظهر ، بفرض أن اسم أحد
المسافرين مكون من عشرة أحرف " محمد آغا " مث ً لا فإن اسم هذا المستخدم سيخزن في القاعدة بحجم عشرين
بايت ، أي أنه جميع حقول العمود في جدول الباردوكس تأخذ نفس الحجم مهما كان طول المعلومات المدخلة .
اضغط بزر الفأرة الأيسر في هذا الحقل إذا أردت أن يكون هذا الحقل : Key ( 4 المفتاح الرئيسي ( الأساسي
مفتاح رئيسي وإذا أردت مزيد من المعلومات عن المفاتيح الرئيسية اقرأ الفقرة التالية :
حول المفاتيح الأساسية
تأتي فاعلية نظام قاعدة البيانات العلائقية من القدرة على العثور على المعلومات المخزنة في جداول منفصلة بسرعة
وتجميعها معًا باستخدام استعلامات ونماذج وتقارير. لكي يتم ذلك، يجب أن يحتوي كل جدول على حقل أو
مجموعة حقول تقوم بتعريف كل سجل مخزن في الجدول بشكل فريد، وتسمى هذه المعلومة المفتاح الأساسي
للجدول( رقم المسافر يعرف المسافر بشكل فريد ، كذلك رقم الرحلة يعرف رحلة وحيدة أي بمجرد معرفة رقم
الرحلة نستطيع معرفة المعلومات المتعلقة باسم شركة الطيران وبلد المغادرة وبلد الوصول وساعة المغادرة وساعة
الوصول .. )
في حقول المفتاح الأساسي. Null " متى قمت بتعيين مفتاحًا أساسيًا للجدول، يمنع إدخال أي قيم مكررة أو قيم "خالية
هناك ثلاثة أنواع من المفاتيح الأساسية التي يمكن تعريفها :
المفاتيح الأساسية من نوع الترقيم التلقائي
يمكن إعداد حقل الترقيم التلقائي لإدخال رقم تسلسلي تلقائيًا عند إضافة كل سجل إلى الجدول. تعد أبسط طريقة
Auto لإنشاء مفتاح أساسي هي تعيين مثل هذا الحقل كمفتاح أساسي ولتعريف حقل ترقيم تلقائي اختر
. Increment
المفاتيح الأساسية من نوع الحقل المفرد :
إذا كان لديك حق ً لا يتضمن قيم فريدة مثل رقم الهوية الشخصية، يمكنك تعيين هذا الحقل على أنه المفتاح الأساسي.
ويمكنك تحديد مفتاح أساسي لحقل يحتوي بالفعل على بيانات طالما لا يحتوي هذا الحقل على قيم مكررة أو قيم
.Null " "خالية
المفاتيح الأساسية من نوع الحقل المتعدد :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
91
في الحالات التي لا يمكنك فيها ضمان وجود حقل فردي، قد يكون بإمكانك تعيين حقلين أو أكثر باعتبارهما مفتاحًا
أساسيًا. والحالة الأكثر شيوعًا التي يحدث فيها ذلك هي الجدول المستخدم لربط جدولين آخرين في علاقة أطراف
على سبيل المثال، يمكن أن يربط جدول "مؤلفي الكتب" بين جدولي "الكتب" .( Many to Many ) بأطراف
و"المؤلفين". ويتكون مفتاحه الأساسي من حقلي: "رقم الكتاب" و"رقم المؤلف".
إذا كان لديك أي شك حول إمكانية تحديد تركيب مناسب من الحقول لمفتاح أساسي متعدد الحقول، فربما يجب عليك
إضافة حقل "ترقيم تلقائي" وتعيينه كمفتاح أساسي بد ً لا من ذلك. على سبيل المثال، فإن ضم حقلي "الاسم الأول"
و"الاسم الأخير" لتكوين مفتاح أساسي لا يعتبر اختيارًا صائبًا، بسبب إمكانية مصادفة تكرار في ضم هذين الحقلين
في المستقبل.
إنشاء جدول المسافرين :
مازلنا في النافذة السابقة، لإضافة الحقل رقم المسافر أكتب في العمود
أي أن الحقل من النوع ترقيم + Type والعمود " PNo " Filed Name
Key تلقائي ( لا حاجة لتحديد حجم هذا النوع ) وضع إشارة في الحقل
لأن هذا الحقل سيكون مفتاح أساسي .
Field لإضافة الحقل اسم المسافر أكتب في السطر الثاني من العمود
اكتب القيمة 30 ، أي أن Size لأن الحقل من نوع نص ، في العمود "A" Type والعمود Pname القيمة Name
فارغًا واكمل كما في الشكل المجاور . Key طول الحقل 30 حرف ، واترك العمود
القيمة Alias سيظهر لك صندوق الحوار حفظ باسم اختر من اللائحة Save As لحفظ الجدول اضغط على الزر
واضغط على حفظ . Passengers أدخل اسم الملف Travel
إنشاء جدول الرحلات :
من القائمة Paradox واختر 7 File􀃆 new􀃆 table اختر الأمر
فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :
. Trips باسم Travel احفظ الجدول ضمن
إنشاء جدول المسافرون والرحلات :
من القائمة Paradox واختر 7 File􀃆 new􀃆 table اختر الأمر
فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :
PassAndTrips باسم Travel احفظ الجدول ضمن
في نوعين من الملفات : Paradox ملاحظة : تخزن قواعد البيانات
حيث يتم تخزين معظم بيانات الجدول . Db 1 ملفات من الامتداد
حيث يتم تخزين الأجزاء الكبيرة مثل المفكرات و الصور .... Mb 2 ملفات من الامتداد
فتح جدول :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
92
تظهر عندها النافذة فتح ملف اختر منها الملف File􀃆Open 􀃆 Table لفتح جدول المسافرين أختر الأمر
Passengers.db
تعديل جدول :
بفرض أنك بحاجة لإضافة حقل جديد إلى جدول أو حذف أحد الحقول أو تغير نوعه يمكن ذلك عن طريق فتح
الجدول ومن ثم اختيار الأمر
تظهر عندها نافذة بناء الجداول يمكنك العمل فيها كما تعلمنا سابقًا. Table 􀃆 Restructure
في نافذة إنشاء جدول أو نافذة تعديل جدول . Table properties سنتعرف الآن على عناصر القائمة
: Validity Checks 1 ضبط المدخلات
يحدد هذا الخيار طريقة عرض وقبول البيانات في كل حقل وله الفروع التالية :
عند تفعيل هذا الصندوق ينبغي إدخال قيمة في هذا الحقل ولا يمكن أن يترك فارغًا : Required Field 1
.
يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا . : Minimum 2
يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا . : Maximum 3
القيمة المحدد في هنا ستكون القيمة الافتراضية ويمكن تعديلها فيما بعد : Default Value 4
حيث يمكن تحديد طريقة إدخال البيانات في MaskEdit تشبه هذه الخاصة في عملها العنصر : Picture 5
لاختيار قوالب جاهزة . Assist حقل ما، اضغط على الزر
مثال :
اجعل الحقل اسم الشركة مطلوبًا و الحقل عدد البطاقات المتوفرة يجب أن يأخذ قيمة Trips في جدول الرحلات
بين 0 و 350
فتظهر النافذة تعديل Table􀃆 Restructure ثم نختار File􀃆Open 􀃆 table من القائمة Trips نفتح الجدول
الجدول
Required ونفعل الخيار Company ثم نختار الحقل Table Properties من اللائحة Validity Checks
.Field
. القيمة 350 Maximum القيمة 0 وفي Minimum ونضع في CardNo ثم نختار الحقل
لحفظ التغيرات . Save نضغط على الزر
: Table Lookup 2 تحديد جدول البحث
يمكن تحديد قيمة لحقل ما في جدول عبر لائحة من
القيم من جدول آخر ، يدعى الجدول الآخر بجدول
البحث .
مثال : نعلم أن قيمة الحقل رقم المسافر في جدول
المسافرون والرحلات يجب أن تكون مساوية
لإحدى قيم العمود رقم المسافر في جدول
http://goo.gl/R2U0yZ لغة البرمجة دلفي
93
المسافرون كما أن القيمة رقم الرحلة في جدول المسافرون والرحلات يجب أن تكون مساوية لإحدى قيم العمود
رقم الرحلة في جدول الرحلات لتحقيق ذلك :
Table 􀃆 Restructure وادخل إلى النافذة تعديل الجدول PassAndTrips افتح الجدول
Define واضغط على الزر Table Properties من اللائحة Table LookUp واختر PNo اختر الحقل
تظهر النافذة المجاورة :
. Ok واضغط على Passengers.db اختر الجدول Lookup Table من اللائحة
. Trips في الجدول TripNo أعد نفس الخطوات للبحث عن قيمة
لن نشرح هذه الميزة بمزيد من التفصيل لأن تطبيقها برمجيًا أسهل .. ولكن سنتعلم فائدتها عند إدخال قيم إلى
الجدول .
:Secondary index 3 الفهرسة الثانوية
تستخدم الفهرسة الثانوية لترتيب الجدول بترتيب مختلف عن الترتيبب المفتاحي للجدول ( أي يختلف عن ترتيب
المفتاح الرئيسي ) .
ماذا تعني الفهارس الثانوية ( للإطلاع ):
افترض أّنك تريد أن تبحث عن قيمة معينة في أحد الأعمدة، كأن تريد البحث مثلا عن (أحمد سعيد) في حقل اسم
المسافر .. أ  ول ما سيجول بذهنك هو أ  ن الكمبيوتر سيفحص أسماء المسافرين واحدا وراء الآخر من البداية
للنهاية.. للأسف: ربما تبدو هذه الطريقة سهلة، ولكّنها أسوأ طريقة يمكن أن يتم البحث بها، لأّنها قد تتسبب في بطءٍ
شنيع في أداء البرنامج، خا  صة وأ  ن العمود قد يحتوي على عدد كبير من الصفوف، قد يزيد عن عشرة آلافٍ أو
أكثر.
لهذا فإ  ن هناك العديد من الطرق لتسريع البحث، تبدأ بترتيب العمود أبجديا، وذلك لأ  ن البحث في عمود مرّتب
أسرع بكثير من البحث في عمود عشوائ  ي، خا  صة مع استخدام طريقة بحث جيدة،ولكن، رغم سرعة هذه البحث
بعد الترتيب، إلا إ  ن الترتيب نفسه قد يكون مأساة!.. هل تتخيل كم من الوقت يمكن أن يضيعه برنامجك لترتيب
خمسين ألف ن  ص مثلا؟.. فما بالك إذن حينما يقوم البرنامج بتكرار البحث في نفس العمود أكثر من م  رة؟!
إذن ما الحل؟
بسيط جدا: نرّتب العمود في قاعدة البيانات منذ البداية!
جميل، ولكن ماذا لو كان الجدول يحتوي على أكثر من عمود تحتاج للبحث فيها، فتبعا لأ  ي منها سوف نرّتب
الجدول؟!!
تخيل معي أّننا طلبنا من قاعدة البيانات إنشاء فهرس لعمود اسم ..Indexes هنا يبرز الحلّ العمل  ي: الفهارس
المسافر .. هنا ستقوم قاعدة البيانات بترتيب هذا العمود، مع إنشاء ما يشبه عمودا جديدا تضع فيه الترتيب الرقم  ي
، لكلّ مسافر.. فمثلا، سيأخذ (أحمد سعيد) رقم 1 في هذا العمود الخف  ي، بينما سيأخذ (توفيق الحكيم) رقم 2
وهكذا... .
بهذه الطريقة سنحّقق ما يلي:
http://goo.gl/R2U0yZ لغة البرمجة دلفي
94
لن نحتاج لتغيير ترتيب عرض البيانات في قاعدة البيانات، وبالتالي سنترك للمستخدم حرية ترتيب البيانات كما
يحلو له.
يمكننا إنشاء أكثر من فهرس لأكثر من عمودٍ في نفس الجدول، م  ما يعني قدرتنا على ترتيب كلّ هذه الأعمدة.
سنوّفر وقت ترتيب العمود، أثناء البرمجة، وإن كان هذا الوقت سيستهلك عند إنشاء الفهرس لأ  ول م  رة.
ستكون عملية البحث أسرع، حيث سيتم البحث في السجلات حسب ترتيب فهارسها.
وفي الإمكان كذلك إنشاء فهرس لأكثر من عمود معا، حيث سيتم الترتيب تبعا للعمود الأ  ول، فإن تماثلت قيم بعض
الصفوف، يتم ترتيب هذه الصفوف على أساس العمود الثاني.
ولكن.. طبعا لا توجد طريقة مثالية.. هناك عيبان أساسيان لهذه الطريقة:
الفهارس المنشئة يتم حفظها في قاعدة البيانات، م  ما يعمل على زيادة حجمها.. لهذا إذا كان حجم قاعدة بياناتك
كبيرا، فلا بد أن توازن بين حاجتك لتوفير الوقت وحاجتك لتوفير الحجم!
وكقاعدة: لا تنشئ فهارس إلا للحقول التي تتوّقع أ  ن برنامجك سيحتاج للبحث فيها بغزارة.
عند تعديل قيمة أ  ي خانة في العمود أو حذف أو إضافة أ  ي ص ّ ف، لا بد من إعادة تحديث الفهارس لمراعاة
الاختلاف الذي أحدثته القيمة الجديدة.. مثل هذا الأمر يسبب عيبا خطيرا، هو بطء عمليات التحديث والحذف
والإضافة بطريقة ملحوظة، تزداد سوءا مع ازدياد طول الجدول.. هنا يجب أن توازن في برنامجك، بين حاجتك
لسرعة البحث وحاجتك لسرعة التحديث والحذف والإضافة.. فإذا كان من المتوّقع أن يقوم برنامجك بمئات من هذه
العمليات بطريقة متتالية، فمن الأفضل حذف الفهرس إلى أن تنتهي هذه العمليات، ثم إعادة إنشائه م  رة أخرى قبل
الشروع في عمليات البحث، رغم ما تضيعه عملية إعادة إنشاء الفهرس من وقت!
لإنشاء فهرس ثانوي :
بفرض أننا نريد إنشاء فهرس ثانوي للحقل اسم المسافر في جدول المسافرين .
من اللائحة Table􀃆 Restructure قم بفتح الجدول ثم اختر
واضغط Secondary Index اختر القيمة Table Properties
عندئذ ستظهر النافذة المجاورة : Define على الزر
􀃆 واضغط على Fields من اللائحة PName اختر الحقل
نلاحظ Indexed Fields سيظهر عندها اسم الحقل في القائمة
: Index Option وجود الخيارات التالية في القسم
فعل هذا الخيار إذا كانت قيمة هذا الحقل فريدة : Unique 1
أي لا يمكن أن تتكرر ( في مثالنا قد يكون هناك مسافرين لهما
نفس الاسم لذلك لا يمكن تفعيل هذا الخيار ) .
فعل هذا الخيار إذا أردت من قاعدة البيانات تحديث جدول الفهرس كلما تم تعديل البيانات : Maintained 2
في الجدول وفي حال عدم تفعيله يتم تحديث جدول الفهرس فقط عند استخدام الفهرس .
فعل هذا الخيار إذا أردت من الفهرس التميز بين الحروف الكبيرة و الصغيرة . : Case Sensitive 3
فعل هذا الخيار إذا أردت ترتيب الحقول تنازليًا . : Descending 4 http://
www.alshater.net لغة البرمجة دلفي
95
. PNameIndex ستطالب بإعطاء اسم للفهرس أعطه الاسم Ok اضغط على الزر
ملاحظة :
1 يمكن تطبيق الفهارس الثانوية على أكثر من حقل ( لكل حقل فهرس ثانوي ) .
2 يمكن تطبيق فهرس ثانوي واحد على مجموعة من الحقول يمكن مث ً لا إنشاء فهرس ثانوي لحقلي اسم المسافر
والجنسية تستخدم هذه الطريقة في حال كنا نبحث في جدول ما على الحقلين معًا .
3 ستتضح هذه الأمور لاحقًا عند دراسة البحث في قواعد البيانات .
: Referential Integrity تعريف علامة مرجعية متكاملة
وجدنا سابقًا كيف يتم الربط بين جداول قاعدة البيانات بشكل نظري ( الربط بين جدولي المؤلفين والكتب والربط
بين جدولي المسافرين وجدول المسافرين والرحلات ) أي بعبارة أخرى سنقوم الآن بتعريف مفتاح ثانوي في جدول
ما يأخذ قيمة من جدول آخر .
إذا أنشأنا علامة مرجعية متكاملة بين الجدولين "المسافرين" و"المسافرين والرحلات" فهذا يعني أن الحقل رقم
المسافر في جدول "المسافرين والرحلات " سيأخذ قيمه من الحقل رقم المسافر في جدول المسافرين .
يدعى الجدول الذي سنحصل منه على القيم بالجدول الأب والجدول الذي سيخزن القيم بالجدول الابن .
لإنشاء علامة تكامل مرجعية :
Referential واختر القيمة Table􀃆 Restructure واختر الأمر PassAndTrips افتح الجدول الإبن
: Define واضغط على الزر Table Properties من اللائحة Integrity
تظهر عندها النافذة التالية :
Table ثم نختار جدول المسافرين من اللائحة 􀃆 من لائحة الحقول ونضغط على الزر PNo نختار الحقل
􀃅 ونضغط على الزر
Update Rule يجب بعد ذلك تحديد نوع التعديل في الصندوق
هذا الخيار يعني أنه أي تعديل في الحقل الموجود في الجدول الأب سيؤدي إلى تعديلات : Cascade 1 الخيار
في الحقول المربوطه معه في جدول الابن ( في حال حذف الحقل سجل ما من جدول المسافرين سيتم حذف
السجلات المرتبطة معه في جدول " المسافرين والرحلات " ،
http://goo.gl/R2U0yZ لغة البرمجة دلفي
96
يمنع هذا الحقل تحديث الحقول في جدول الأب إذا كانت مرتبطة مع حقول في جدول : Prohibit 2 الخيار
الابن ( لا يمكن حذف سجل من جدول أب مرتبط مع سجلات في الجدول الابن ) .
فعل هذا الخيار إذا كنت ستستخدم قواعد البيانات هذه مع برامج قديمة : Strict Referential Integrity 3
.Dos تعمل تحت النظام
ستطالب عندها باختيار اسم للعلامة المرجعية أدخل أي اسم تريده واضغط على Ok اضغط على بعدها على زر
موافق ...
ملاحظات :
ولا يمكن الاستفادة من الخيار Paradox هو الخيار الذي تعمل به قواعد البيانات Prohibit 1 الخيار
الحديثة. SQL إلا في حال استخدام بعض برامج Cascade
2 لحذف سجل أب مرتبط مع سجلات أبناء عليك أن تحذف جميع السجلات في الجدول الابن المرتبطة مع هذا
السجل .
بنفس الطريقة أربط بين رقم الرحلة في الجدول " المسافرين والرحلات " مع رقم الرحلة في جدول الرحلات .
5 وضع كلمات سر للجداول :
قد نحتاج في بعض الأحيان إلى حماية جداول أو الحقول من أن يصل إليها أو يستخدمها غيرنا، لذلك يمكن وضع
كلمة سر للجدول كام ً لا أو لحقل أو عدد من حقوله فقط .
ولإعطاء الجدول كلمة سر لجدول المسافرين
Table من اللائحة Table Security واختار Table 􀃆 Restructure 1 افتح الجدول واختر الأمر
سيظهر عندها صندوق الحوار Define واضغط على الزر properties
التالي :
وأعد كتابتها في الحقل Master Password اكتب كلمة السر في الحقل
.Ok واضغط على Verify Master Password
أما لتحديد كلمة سر للحقول نعيد الخطوات السابقة ونختار بعدها
فتظهر عندها النافذة (في الأسفل). Auxiliary Password
وحدد سماحيات Current Password أكتب كلمة السر في الحقل
Add واضغط على Table rights الوصول من
يمكنك أن تعطي أكثر من كلمة سر للحقل الواحد
أو لمجموعة حقول ،بالنسبة لسماحيات الوصول
فتحدد طريقة تعامل المستخدم مع الجدول فإذا
فلا يمكن للمستخدم Read Only كانت القيمة
إدخال البيانات .... ، كل مرة يتم فتح الجدول
فيها سيطالب المستخدم بإدخال كلمة السر و
http://goo.gl/R2U0yZ لغة البرمجة دلفي
97
تعطى السماحيات لهذا المستخدم تبعًا لكلمة السر المدخلة .
لحذف كلمة سر وضعت على جدول أعد الخطوات في 1
. Delete واختر بعدها الزر Modify واضغط على الزر
ملاحظة هامة :
فهناك مئات البرامج التي تستطيع اكتشاف Paradox إذا كانت سرية قاعدة البيانات تهمك فلا تستخدم قواعد بيانات
كلمة سر القاعدة ، ويستطيع أي هاوي أن يدخل إلى جداولك والحصول على معلوماتها وتعديلها ،عمليًا أقوى قواعد
Oracle و MySQL البيانات من حيث السرية والسماحيات أيضًا هي قواعد البيانات
. MS SQL Server و
: Table Language 6 تحديد لغة الجدول
من اللائحة خصائص Table Language لتحديد لغة الجدول اختر
الجدول
إذا كانت بيانات الجدول التي تدخلها باللغة العربية فأبق هذا
. 'Ascii' ANSI الصندوق على الخيار الافتراضي
: Dependent Table 7 عرض الجداول التابعة الجدول
بعد أن ننشئ علاقة ربط متكاملة بين الجداول نكون قد عرفنا علاقة بين جدول أب وجدول ابن ولرؤية هذه العلاقة
:
من اللائحة Dependent Table ونفتح النافذة تعديل الجدول ثم نختار ( Passengers ) نفتح الجدول الأب
. ( PassAndTrips ) عندئذ تظهر الجداول المرتبطة مع هذا الجدول Table properties
ملاحظات :
ويكون إنشاء جداول من أنواع أخرى مشابهة لهذه Paradox 1 إلى هنا نكون قد تعلمنا إنشاء جداول من النوع
مث ً لا تختلف عن أنواع الحقول في جداول Dbase الطريقة ولكن تتغير بعض الأشياء فأنواع الحقول في جداول
بالاسم فقط ولكن تبقى جميع أنواع قواعد البيانات مصممة لتخزين النصوص و الأرقام و.... Paradox
2 يفضل في البداية تصميم الجداول على الورق بما فيها تحديد الارتباطات وأنواع الحقول والقيود إلى الحقول
وثم البدء بإنشاء الجداول الآباء ثم الأبناء وتعريف خصائص الجدول عند إنشاءه .
3 عمليًا يفضل أن تكون جميع جداول القاعدة جاهزة قبل البدء بإدخال المعطيات إليها .
4 جداول القاعدة المعتمدة في هذا المثال والطرق التي اتبعت في إنشاءها غير مثالية واعتمدت هنا بهدف تعليمي
فقط .
إدخال البيانات إلى الجداول :
إدخال البيانات إليها وتعديلها . Database Desktop بالإضافة إلى إمكانية بناء الجداول يتيح البرنامج
http://goo.gl/R2U0yZ لغة البرمجة دلفي
98
إدخال البيانات باللغة العربية :
عليك تغير الخط المستخدم في Database Desktop لكي تستطيع إدخال نصوص باللغة العربية في البرنامج
لتغير الخط أختر من Change والضغط على الزر Edit 􀃆 Peferences البرنامج ويتم ذلك باختيار الأمر
مث ً لا . Arabic Transparent القائمة أحد الخطوط التي تدعم اللغة العربية
استخدام نمط التحرير :
من Edit قبل البدء بإدخال البيانات إلى الجدول يجب الدخول إلى نمط التحرير ويتم ذلك عن طريق اختيار الأمر
أو زر السرعة في أقصى يمين شريط السرعة ( طبعًا يجب أن يكون F أو الضغط على الزر 9 Table القائمة
الجدول مفتوحًا ) .
أدخل الآن المعلومات التالية إلى جدول المسافرين :
افتح او ً لا جدول المسافرين وادخل في نمط التحرير
للتنقل بين الحقول كما أن نفس الزر Tab استخدم الزر
سينقلك إلى سجل جديد .
لاحظ انه لا يسمح لك بإدخال قيمة في حقل من النوع ترقيم
تلقائي لإن هذا الحقل يأخذ قيمته تلقائيًا ويزاداد بمقدار 1 عند إضافة سجل جديد .
كما أنه لا حاجة لحفظ المعلومات المدخلة في الجدول ، حيث يقوم الجدول بحفظ المعلومات تلقائيًا عند الانتقال إلى
سجل جديد .
أدخل المعلومات التالية إلى جدول الرحلات : افتح الجدول وانتقل إلى وضع التحرير
ولاحظ عدم قبول البرنامج لهذه القيمة وتذكر الشرط الذي CardCount حاول إدخال القيمة 400 في الحقل
وضعناه على هذا الحقل
( إقرأ الرسالة التي تظهر في الزاوية اليسارية السفلى للبرنامج ) .
يمكن الضغط على مفتاح المسافة لإدخال الوقت والتاريخ الحالي . TimeStamp في الحقول من النوع
أدخل البيانات إلى جدول المسافرين والرحلات : افتح الجدول وانتقل إلى جدول الرحلات
بجدول PNo تعلم أننا قد ربطنا الحقل
بحث
للاستفادة من هذه الخاصة أضغط على
أثناء وجود Ctrl + Space المفاتيح
ستظهر نافذة PNO المؤشر في الحقل
http://goo.gl/R2U0yZ لغة البرمجة دلفي
99
أختر أحد السجلات واضغط عليه مرتين ستغلق النافذة Passengers.db جديدة فيها جميع حقول جدول البحث
في السجل المختار إلى الجدول الحالي . PNo وتنتقل قيمة الحقل
يمكنك أيضًا إدخال رقم المسافر يدويًا ولكن لا يسمح لك بإدخال رقم مسافر غير موجود في جدول المسافرين ، كما
لا يسمح بإدخال نفس المسافر على نفس الرحلة مرتين ( لا يمكن للمسافر أن يسافر في رحلة واحدة مرتين )
وذلك لأنه لا يمكن أن تكون القيم في المفتاح الرئيسي مكررة . Key Violation وتظهر الرسالة
. Record أخيرًا حاول التدرب على الأوامر في القائمة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
100
الجلسة السادسة عشر
سنكمل الآن مشوارنا بتعلم التعامل مع قاعدة البيانات Database Desktop ببعد أن قمنا ببناء الجداول باستخدام
من خلال دلفي باستخدام هذه الجداول
عرض جدول المسافرين في نافذة :
. Table, DBGrid, DataSource, DBNavigator ابدأ مشروعًا جديدًا أضف إليه العناصر
الخصائص التالية Table أعط العنصر 1
الخاصة القيمة
Travel DatabaseName
Passengers TableName
True Active
Table القيمة 1 DataSet الخاصة DataSource أعط العنصر
DataSource القيمة 1 DataSource الخاصة DBGrid و DBNavigator أعط العنصرين
نفذ البرنامج ولاحظ النتائج ...
التعامل مع الحقول :
من رؤية البيانات وتحريرها أما إذا أردنا الوصول إلى Data Control تمكننا العناصر الموجودة في الصفحة
البيانات والتحكم بطريقة عرضها علينا إنشاء عناصر الحقول .
:Tfield إنشاء عناصر الحقول
ومن أجل كل ( Table يمكن استخدام محرر الحقول لتعريف لائحة من الحقول ضمن الجدول ( عنصر الجدول
وهذا العنصر غير مرئي ولكن يمكن من Tfield حقل تنشئ دلفي عنصر من النوع
خلاله الوصول إلى قيمة الحقل والتحكم بمواصفاتها .
لتظهر النافذة Table لفتح صندوق حوار محرر الحقول اضغط مرتين على العنصر 1
Add المجاورة ، إضغط بزر الفأرة الأيمن في وسط هذه النافذة لتظهر قائمة اختر منها
عندها ستظهر حقول جدول المسافرين في هذه النافذة ، أعد الضغط بزر All Field
الفأرة اليميني على أحد هذه الحقول تظهر القائمة في هذه الحالة عمليات التعامل مع هذه
اللائحة من قص ونسخ وحذف ..
. DBGrid من اللائحة ولاحظ اختفاءه من العنصر Pno 1 احذف الحقل
وإفلاته في أعلى القائمة ولاحظ PassNo 2 أعد ترتيب الحقول ضمن القائمة وذلك عن طريق سحب الحقل
. DBGrid تأثير ذلك على العنصر
بتعريف عدد من المتحولات Delphi ولاحظ قيام Type افتح محرر الشيفرة وانتقل إلى القسم
Table1Pname: TStringField; // تم تعريف حقل من النوع النصي لأن الحقل من النوع نص
Table1Nationalty: TStringField;
Table1PassNo: TIntegerField; // تم تعريف حقل من النوع الصحيح لأن الحقل من النوع الصحيح
http://goo.gl/R2U0yZ لغة البرمجة دلفي
101
: Tfield تحديد خواص العنصر من النوع
ولاحظ خواص هذا الحقل في محرر الخواص حيث يظهر في أعلى PassNo افتح محرر الحقول واختر الحقل
حيث تعطي دلفي اسم هذا الحقل Table1Pname: TStringField محرر الخواص اسم العنصر ونوع العنصر
. Name تلقائيًا والذي يمكن تغيره عن طريق الخاصة
. DBGrid ولاحظ تأثير ذلك على العنصر taCenter إلى القيمة Alignment 3 غير قيمة الخاصة
القيمة " رقم جواز السفر " . DisplayLabel 4 أعط الخاصة
سنتعرف لاحقًا على إمكانيات إضافية لهذا لمحرر الحقول أما الآن فسنتعلم كيفية الوصول إلى قيمة الحقل برمجيًا :
قراءة قيم الحقول :
: TFeild الطريقة الأولى : بالاعتماد على عناصر الحقول
وزر : label أضف إلى النموذج السابق عنصر 1
في حدث الضغط على الزر اكتب التعليمة التالية :
Label1.Caption := Table1Pname.value ;
غير السجل الحالي ، Label في العنصر Pname نفذ البرنامج واضغط على الزر ولاحظ ظهور قيمة الحقل
واضغط على الزر مرة أخرى ...
من Caption وذلك لأن الحقل وال Caption في الخاصة Tabel1Pname تقوم هذه التعليمة بإلحاق قيمة الحقل
أما إذا أردت إلحاق قيمة حقل عددي إلى نوع نص استبدل التعليمة السابقة بالتعليمة التالية : String نوع
Label1.Caption := Tabel1PassNo.AsString ;
، AsFloat ، AsInteger ، AsBoolean عدد من الخواص يشبه الخاصة السابقة وهي TField ويملك العنصر
. AsDateTime
: FieldByName ( الطريقة الثانية : باستخدام الخاصة ( المنهج
TableName.FeildByName('FieldName').Value : وله الشكل التالي
TableName.FeildByName('FieldName').AsType : وللتحويل بين الأنواع
: Label مثال ( 1 ) : أضف زرين إلى البرنامج السابق وعنصر نص
في حدث الضغط على زر اكتب التعليمة التالية :
label1.Caption := Table1.FieldByName('Pname').Value
وفي حدث الضغط على الزر الثاني اكتب التعليمة التالية :
Label2.Caption := table1.fieldbyname('PassNo').AsString ;
Variant الطريقة الثالثة :التعامل مع الحقل كنوع
Table1['FieldName'] : ولها الشكل التالي
مثال : في حدث الضغط على الزر الأول اكتب التعليمة التالية
Label1.Caption := Table1['Pname'] ;
في حدث الضغط على الزر الثاني اكتب التعليمة التالية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
102
Label2.Caption := table1['PassNo'] ;
AsString لاحظ أنه لا حاجة لاستخدام المنهج
الطريقة الرابعة :
TableName.Field[Index].Value
.AsString
مثال : في حدث الضغط على الزر الأول اكتب التعليمة التالية
Label1.Caption := Table1['Pname'] ;
في حدث الضغط على الزر الثاني اكتب التعليمة التالية :
Label2.Caption := table1.Fields[3].AsString ;
إلحاق قيم بالحقول :
1 تعديل سجل ( حقل ) :
في هذه الحالة نريد أن نغير في قيمة السجل الحالي ونستخدم الأسلوب التالي :
Table1.Edit ;
Tabel1.FieldByName( 'FieldName').Value := NewValue ;
Table1.Post;
قمنا بالانتقال إلى وضع التحرير Database Desktop كما وجدنا عند إدخال البيانات إلى الجداول في البرنامج
بنفس الطريقة عند إدخال البيانات في لغة البرمجة علينا أن نضع الجدول في وضع التحرير لذلك استخدمنا التعليمة
. Table1.Edit
فمهمتها ثثبيت التغيرات المدخلة Table1.Post التعليمة الثانية تقوم بإدخال القيمة الجديدة داخل الحقل ، أما التعليمة
على الجدول وٌتخرج الجدول من وضع التحرير .
إلى النموذج السابق واكتب في حدث الضغط على زر التعليمات التالية : Edit مثال : أضف ثلاثة عناصر تحرير
Table1.Edit ;
Table1.Fieldbyname('Pname').Value := Edit1.Text ;
Table1.FieldByName('Nationalty').Value := Edit2.Text ;
Table1.FieldByName('PassNo').AsString := Edit3.Text ;
Table1.Post ;
بالتعليمة table1.FieldByName('PassNo').AsString := edit3.Text ; يمكن استبدال التعليمة الرابعة
Table1.FieldByName('PassNo').Value := strtoint( Edit3.Text) ;
نفذ البرنامج وأدخل قيم في عناصر التحرير واضغط على الزر ولاحظ تغير قيم السجل .
دون أن نقوم بوضع الجدول في وضع DBGrid ملاحظة : وجدنا أنه يمكن تعديل الجدول من خلال العنصر
حيث يقوم هذا العنصر بوضع الجدول في وضع DataSource للعنصر AutoEdit التحرير وهذا يعود للخاصة
نفقد القدرة على تغير قيمة البيانات في جدول . False التحرير بشكل تلقائي وبإعطاء هذه الخاصة القيمة
سواء ) DataSoucre من المفيد أن تلاحظ أننا استطعنا أن نصل للمعطيات في الجدول بدون المرور على العنصر
مباشرة . Table في القراءة أو الكتابة ) حيث أن التعليمات تتعامل مع العنصر 1
http://goo.gl/R2U0yZ لغة البرمجة دلفي
103
2 إضافة سجل :
Table1.insert ;
Table1.Fieldbyname('Pname').Value := Edit1.Text ;
Table1.FieldByName('Nationalty').Value := Edit2.Text ;
Table1.FieldByName('PassNo').AsString := Edit3.Text ;
Table1.Post ;
بوضع الجدول في وضع التحرير وتضيف سجل جديد فارغ إلى الجدول وتجعله Table1.insert تقوم التعليمة
السجل الحالي ، ثم تقوم التعليمات التالية بإلحاق قيم في هذا السجل والتعليمة الأخيرة تقوم بتثبيت المعلومات في هذا
الجدول .
يمكن استخدام طرق القراءة السابقة في الكتابة أي يمكن استبدال التعليمة
Table1.Fieldbyname('Pname').Value := Edit1.Text ;
Table1.Field[0].Value := أو بالتعليمة Table1['Pname'] := Edit1.Text ; بالتعليمة
Edit1.Text ;
.... Table1Pname.Value := Edit1.Text أو بالتعليمة
: Data Control التعرف على عناصر الصفحة
: DBGrid 1 العنصر
تعرفنا على هذا العنصر سابقًا وسنشرح الآن بعض الخصائص المهمة له :
الخاصة القيمة العمل
تحول اتجاه الجدول بحيث يصبح من اليمين إلى bdRightToLeft BiDiMode
اليسار
أي لون إعطاء لون لصفحة البيانات في العنصر Color
أي لون إعطاء لون لحواف الجدول FixedColor
تغير نمط الخط المستخدم في صفحة البيانات Font
تغير نمط الخط المستخدم في أسماء الأعمدة TitleFont
العديد من الخصائص الفرعية الهامة: Option كما يوجد في الخاصة
الخاصة القيمة العمل
التحكم بإمكانية التحرير أو عدمه في العنصر True or False dgEditing
إظهار أو عدم إظهار أسماء الأعمدة True or False dgTitle
إظهار أو إخفاء مؤشر السجل الحالي True or False dgIndicator
إظهار أو إخفاء خطوط بين الأعمدة True or False dgColLines
للتنقل بين الحقول Tab منع استخدام الزر True or False dgTabs
إمكانية اختيار السجل بالكامل True or False dgRowSelect
التحكم بإظهار رسالة تأكيد حذف سجل True or False dgConfirmDelete
http://goo.gl/R2U0yZ لغة البرمجة دلفي
104
إمكانية اختيار أكثر من سجل بنفس الوقت True or False dgMutiSelect
لهذا العنصر : Columns بقي أن نشرح الخاصة
تظهر DBGrid باختيار هذه الخاصة أو بالضغط مرتين على العنصر
نافذة محرر الأعمدة كما في الشكل المجاور :
حيث تظهر النافذة في البداية فارغة ، اضغط على الأيقونة الثالثة (
( Add All Field
فتظهر جميع أسماء حقول الجدول داخل هذه النافذة :
في حال حذف أحد هذه الحقول من القائمة فلن يظهر في العنصر
بعد اختيار Delete وللقيام بذلك اضغط على الزر الثاني DBGrid
الحقل المراد حذفه .
ملاحظة :يختلف الأمر هنا عن حذف الحقل من محرر الحقول وذلك لأنه في هذه الحالة الحقل المحذوف من محرر
مباشرة أو عن طريق ربطه بأحد عناصر Table الأعمدة يمكن الوصول إليه بطريقة أخرى عن طريق العنصر
أما في حال حذف العنصر من محرر الحقول فلن نستطيع الحصول على قيم هذا الحقل ( عمليًا ، Data Control
لن يتصل مع قاعدة البيانات لإحضار قيم هذا الحقل ) . Table العنصر
باختيار أحد هذه الحقول تظهر خصائص الحقل في محرر الخواص والتي يمكن الاستفادة منها كمايلي :
الخاصة القيمة العمل
التحكم بمكان ظهور البيانات داخل العمود Alignment
إعطاء لون محدد لعمود Color
إعطاء نمط خط محدد لعمود ( إظهار أحد الأعمدة بلون خط آخر مث ً لا Font
(
التحكم بمكان ظهور عنوان العمود Title-Alignment
إعطاء عنوان لعمود ( أعط إسم العمود باللغة العربية ) Title-Caption
إعطاء نمط خط ما لعنوان العمود Title-Font
بمثال : PickList سنشرح الخاصة الأخيرة
تقوم هذه الخاصة بإظهار لائحة من القيم لاختيار إحداها :
String List واضغط على الزر ... ، ستظهر النافذة PickList اختر الخاصة Nationality اختر العمود
أكتب فيها القيم التالية : حلب في السطر الأول ، دمشق في الثاني ثم القاهرة ثم عمان ثم الرياض ثم Editor
البحرين ........
سيظهر سهم القائمة بجواره إضغط على هذا السهم واختر قيمة Nationality نفذ البرنامج واضغط على الحقل
من القيم المدخلة .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
105
كما أنه يمكنك أن تدخل قيمه من خارج هذه اللائحة يدويًا .
وربط هذا العمود ( Add New ) يمكن أيضًا إضافة عمود جديد إلى محرر الأعمدة عن طريق اختيار الزر الأول
قد تريد مث ً لا أن تعرض عمود ما مرتين ( سنتعرف لاحقًا على ، FieldName مع حقل ما عن طريق الخاصة
ميزة هذه الخاصة ) .
بتغير ترتيبها في محرر الأعمدة .... DBGrid يمكن أيضًا تغير ترتيب الأعمدة في
بالإضافة إلى الخصائص السابقة يملك العنصر الخصائص المهمة التالية : : DBNavigator 2 العنصر
تجعل هذه الخاصة أزرار العنصر منبسطه ( مسطحة ) . : Flat
تمكن هذه الخاصة من كتابة تلميح لك زر من أزرار العنصر . : Hints الخاصة
تستخدم هذه الخاصة لإخفاء أو إظهار بعض أزرار العنصر . : VisibleButton الخاصة
ولكنه يمكن ربطه مع قاعدة البيانات . Label يشبه العنصر : DBtext 3 العنصر
تم شرحه مسبقًا . : DBEdit 4 العنصر
.Memo يتم ربط هذا العنصر مع حقل من النوع : DBMemo 5 العنصر
يتم ربط هذا العنصر مع حقل من النوع صورة . : DBImage 6 العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
106
الجلسة السابعة عشر
: Data Control سنتابع الآن مع العناصر في الصفحة
يستخدم هذا العنصر لعرض وإضافة الصور إلى قاعدة البيانات . : DBImage 6 العنصر
: ( DBImage و DBMemo مثال : ( استخدام العنصرين
و DBImage و DBGrid و Datasource و Table : ابدأ مشروعًا جديدًا وأضف إلى النموذج العناصر التالية
DBNavigator و DBMemo
وهو جدول يحوي معلومات عن ) biolife.db ومع الجدول DBDemos مع القاعدة Table اربط العنصر 1
القيمة DataSource للعنصر DataSet وأعط الخاصة ،True القيمة Active بعض الأسماك ) وأعطه الخاصة
واربط العنصر ، .. DataSource القيمة 1 DataSource وأعط بقية العناصر في الخاصة Table1
... Graphic مع الحقل DBImage والعنصر 1 ، Datafield في الخاصة Notes مع الحقل DBMemo1
وذلك لأن هذا العنصر لا DBGrid غير ظاهرتين في العنصر Graphic و Notes لاحظ أو ً لا أن قيمة الحقلين
يستطيع عرض الحقول ذات الحجم الكبير وبالتالي لا يستطيع تحريرها لذلك إذا أردنا التعامل مع هذه الحقول لا بد
و DBMemo لنا من استخدام عناصر التحكم التي تستطيع إظهار هذا النوع من الحقول لذلك استخدمنا العنصرين
: DBImage
: Graphic تحرير ( إضافة ) حقل من نوع
و العنصر DBGrid يمكنك تحرير الجدول من خلال العنصر Insert أو الزر Edit عند الضغط على الزر
وتبقى المشكلة في كيفية تحرير عنصر الصورة . DBMemo
ويكون ذلك بإحدى الطريقين ClipBoard عن طريق حافظة الويندوز DBImage يتم التعامل مع العنصر
إثناء DbImage 1 نسخ الصورة المطلوبة إلى الحافظة عن طريق أحد برامج الرسم ومن ثم اختيار العنصر
في حدث DBImage1.PasteFromClipboard أو استخدام الأمر Ctrl+v التنفيذ والضغط على الزرين
الضغط على زر .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
107
ومن ثم نسخ الصورة إلى الحافظة OpenPictureDialog 2 تحميل الصورة من ملف باستخدام العنصر
إلى النموذج السابق ( لا تنسى استخدام OpenPictureDialog ولصقها ولتنفيذ ذلك أضف عنصر زر وعنصر
وفي حدث الضغط على الزر اكتب التعليمات التالية : ( Jpg في حال أردت استخدام صور Jpeg الوحدة
If OpenPictureDialog1.Execute then Begin
DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName );
DBImage1.CopyToClipboard ;
DBImage1.PasteFromClipboard ;
end;
ومن ثم نسخها إلى الحافظة وإعادة لصقها في DBImage نقوم في هذه الحالة بتحميل الصورة إلى العنصر 1
العنصر .
على كل حال هذه الطريقة ليست طريقة جيدة للتعامل مع الحافظة ولكنها الطريقة الأسهل وسوف نتعلم قريبًا أسلوب
التعامل مع الحافظة عند دراسة الرسم في دلفي .
كما وجدنا DataSource أو DBImage 3 يمكن تحرير حقل من نوع صورة مباشرة دون العودة إلى العنصر
في الجلسة الماضية ويكون ذلك عن طريق التعليمات التالية :
Table1.edit;
If OpenPictureDialog1.Execute then
Table1Graphic.LoadFromFile(OpenPictureDialog1.FileName);
Table1.Post ;
ملاحظة :
لأن الحقل من نوع صورة لا يخزن إلا صور من نوع Jpg 1 لا يمكن في هذه الطريقة استخدام صور من نوع
تلقائيًا . Bmp إلى ملف Jpg أما في المثال السابق فتقوم الحافظة بتحويل الملف من نوع ، Bmp
في قاعدة البيانات سيحتاج إلى مساحة تخزين كبيرة لذلك يفضل بعض Bmp 2 تخزين الصور من نوع
ثنائيًا ومن ثم إعادة هذا الحقل إلى ملف Jpg وتخزين ملف الصورة Binary المبرمجين استخدام حقل من نوع
لإظهاره ...
: DBListBox 7 العنصر
يعرض قائمة من القيم الجاهزة لتمكين المستخدم من اختيار إحداها لإدخالها ضمن سجل ما في حقل معين ولا يمكن
للمستخدم إضافة قيم جديدة في هذه القائمة .
: DBComboBox 8 العنصر
يظهر قائمة منسدلة من القيم بحيث يستطيع المستخدم اختيار إحداها لإدخالها لحقل ما، ويمكن للمستخدم أيضًا أن
يقوم بإدخال قيم أخرى ضمنها غير موجودة مسبقًا لإلحاقها بقيمة حقل ضمن سجل .
: DBDateTimePiker 9 العنصر
وبالنسبة للنوع الحقل تحدد الخاصة TimeStamp أو Time أو Date يرتبط هذا العنصر مع حقول من النوع
إذا كنا نريد إظهار الوقت أو التاريخ . Kind
http://goo.gl/R2U0yZ لغة البرمجة دلفي
108
: ( DBcomboBox و DBlistBox مثال : ( العنصرين
وعنصر DBedit وعنصري DataSource و Table ابدأ مشروعًا جديدًا أضف إلى النموذج العناصر
. DBNavigator و عنصر DBDateTimePiker و عنصري DBComboBox و DBListBox
رتب العناصر كما في الشكل
واعط Trips والجدول Travel مع القاعدة Table اربط العنصر 1
. True القيمة Active الخاصة
، Table مع العنصر 1 DataSouce اربط العنصر 1
في الخاصة Datasoucrce حدد باقي العناصر وأعطها القيمة 1
. DataSource
Datafield في الخاصة TripNo مع الحقل DBedit اربط العنصر 1
لأن الحقل حقل ترقيم تلقائي ) True القيمة ReadOnly وأعط الخاصة
ولا حاجة إلى تحريره )
............. Company مع الحقل DBedit اربط العنصر 2
القيم التالية : حلب ، عمان ،دمشق ، Items وأعط الخاصة GoFrom مع الحقل DBListBox اربط العنصر 1
اللاذقية ، أثينا ..
القيم التالية : القاهرة ، الرياض ، جدة Items وأعط الخاصة ArriveTo مع الحقل ComboBox اربط العنصر 1
، عمان ، هامبورغ ...
تذكر أن ) dtkTime القيمة Kind وأعط الخاصة GoTime مع الحقل DBDateTimePiker اربط العنصر 1
. ( Timestamp من النوع GoTime الحقل
نفذ البرنامج ولاحظ ما يلي :
. DbListBox و 1 ComboBox 1 تنقل بين السجلات ولاحظ التغير في العناصر 1
. DBListBox من خلال اختيار أحد عناصر القائمة 1 GoFrom 2 يمكن الإضافة في الحقل
أو DBComboBox من خلال اختيار أحد عناصر القائمة المنسدلة 1 ArriveTo 3 يمكن الإضافة في الحقل
كتابة قيمة ما داخل العنصر .
وحاول الإضافة والحذف والتعديل ... DbGrid 4 أضف إلى الشكل عنصر
. Logical يرتبط هذا العنصر مع حقل من نوع : DBCheckBox 10 العنصر
يستخدم هذا العنصر لإدخال أو إظهار قيمة ما إلى حقل يأخذ عدد محدد من : DBRadioGroup 11 العنصر
القيم :
مثال :
DataSource اعط الخاصة ، DBRadioGroup بالعنصر DBListBox في المثال السابق استبدل العنصر
القيم التالية : حلب ، عمان Items والخاصة GoFrom القيمة DataField و الخاصة Datasource القيمة 1
،دمشق ، اللاذقية ، أثينا ..
http://goo.gl/R2U0yZ لغة البرمجة دلفي
109
القيم : حلب ، عمان ،دمشق ، اللاذقية ، أثينا .. . Values والخاصة
فتستخدم لإعطاء قيمة للحقل في حال Values لإظهار عناوين لأزرار الراديو ، أما Items حيث تستخدم الخاصة
ضغط المستخدم على زر الراديو ..
يتم Item ولكن بد ً لا من الخاصة DBListBox يشبه العنصر : DBLookUpListBox 12 _ العنصر
الحصول على قيم القائمة من خلال جدول آخر .
Item ولكن بد ً لا من الخاصة DBComboBox يشبه العنصر : DBLookUpComboBox 13 العنصر
يتم الحصول على قيم القائمة من خلال جدول آخر .
مثال :
حيث سيتم إدخال رقم PassAndTrip " سوف نقوم الآن بإنشاء نموذج للإدخال إلى جدول " المسافرين والرحلات
الذي سيرتبط مع جدول المسافرين لإحضار اسم المسافر ، DBLookUpListBox المسافر من خلال العنصر
الذي سيرتبط مع جدول المسافرين DBLookUpComboBox وسيتم إدخال رقم الرحلة من خلال العنصر
لإحضار اسم شركة الطيران .
وعنصر DBedit وعنصري DataSource وثلاثة عناصر Table ابدِأ مشروعًا جديدًا وأضف إليه ثلاثة عناصر
. DBGrid والعنصر DBLookUpComboBox وعنصر DBLookupListBox وعنصر DBNavigator
معه . DataSource واربط العنصر 1 Travel في القاعدة PassAndTrip مع الجدول Table اربط العنصر 1
معه . DataSource واربط العنصر 2 Travel في القاعدة Passengers مع الجدول Table اربط العنصر 2
معه . DataSource واربط العنصر 3 Travel في القاعدة Trips مع الجدول Table اربط العنصر 1
. True القيمة Active أعط جميع الجداول الخاصة
. DataSource القيمة 1 Datasource أعط بقية العناصر الخاصة
الخصائص التالية : DBLookupListbox أعط 1
في جدول " المسافرين والرحلات " . Pno سيرتبط هذا العنصر مع الحقل : "PNo" القيمة DataField الخاصة
القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول : DataSource القيمة 2 Listsource الخاصة
. Passengers
سيظهر في هذا العنصر قائمة بجميع أسماء المسافرين في الجدول : Pname القيمة ListField الخاصة
. Passengers
عند PassAndTrip تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول : PNo القيمة KeyField الخاصة
المرتبط معه المفتاح الثانوي KeyField اختيار اسم المسافر عمليًا يتم في هذه الخاصة تحديد المفتاح الرئيسي
. DataFields
الخصائص التالية : DBLookupComboBox اعط العنصر 1
في جدول " المسافرين TripNo سيرتبط هذا العنصر مع الحقل : "TripNo" القيمة DataField الخاصة
والرحلات " .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
110
القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول : DataSource القيمة 3 Listsource الخاصة
.Trips
سيظهر في هذا العنصر قائمة بجميع أسماء شركات الطيران في الجدول : Company القيمة ListField الخاصة
. Trips
عند PassAndTrip تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول :TripNo القيمة KeyField الخاصة
اختيار اسم الشركة .
. ClassNo مع الحقل DBEdit والعنصر 2 SeatNo مع الحقل Dbedit اربط العنصر 1
نفذ البرنامج وتنقل بين السجلات ولاحظ تغير القيم في العناصر .
اضغط على الزر + إضافة وأدخل قيم عن طريق اختيار اسم أحد المسافرين و اسم الشركة ....
أضف عدد من السجلات للتآلف مع العناصر ...
أو حقل من نوع Memo يمكن ربط هذا العنصر مع حقل من نوع : DBRichEdit 14 العنصر
Formatted Memo
هذا العنصر يقوم بإظهار صفحة من البيانات حيث يقوم هذا العنصر يتوليد : DBCtrlGrid 15 العنصر
سطور بعدد سجلات الجدول أثناء التنفيذ .
مثال :
وضع داخله عنصر DataSource القيمة 2 DataSource أضف هذا العنصر إلى النموذج السابق وأعط الخاصة
نفذ البرنامج ولاحظ النتائج . ، Pname القيمة DataField واعط الخاصة DBedit
لإظهار مخططات بيانية من للقيم الموجودة في جدول . : DBChart 16 العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
111
الجلسة الثامنة عشر
البحث في قواعد البيانات :
تعتبر عملية البحث عن سجل معين أو قيمة معينة لحقل ما في سجل من أهم تطبيقات قواعد البيانات ، ونظرًا
لضخامة البيانات الموجودة في قواعد البيانات ( بنوك المعلومات ) فإننا نحتاج إلى تقنيات بحث سريعة توصلنا إلى
المعلومة المحددة وبدون عناء البحث ضمن جميع بيانات الجدول ، وسنستعرض الآن أهم طرق البحث التي زودتنا
بها لغة دلفي .
: Locate المنهج
يقوم هذا المنهج بوضع مؤشر السجل الحالي عند أول سجل يطابق شروط البحث، باستخدام هذه الطريقة يمكننا
البحث عن قيمة لحقل ما حيث يأخذ هذه المنهج الشكل :
Locate ( 'FieldName',SearchValue,Option ) ;
اسم الحقل الذي سيتم البحث فيه . : FieldName حيث
القيمة التي سيتم البحث عنها. : SearchValue
تحدد خيارات البحث وتأخذ القيم التالية : : Option
Option = [loCaseInsensitive ] , عدم التميز بين الأحرف الكبيرة والصغيرة
Option = [ loPartiaKey ] ; " البحث في جزء من الكلمة أي أن البحث عن قيمة " محم " يمكن أن يعيد " محمد
أو " محمود"
Option = [ loCaseInsensitive , loPartiaKey ]; دمج الخيارين السابقين
Option = [ ]; لا نريد استخدام أي من الخيارين السابقين
في الحالة False في حال استطاع إيجاد القيمة المطلوبة في جدول البحث والقيمة True يعيد هذا المنهج القيمة
المعاكسة .
مثال :
Edit و Button و DbGrid و DataSorce و Table ابدأ مشروعًا جديدًا وأضف إلى النموذج عنصر
: DBGrid وأظهر محتويات الجدول ضمن Travel في القاعدة Passengers أربط الجدول مع جدول
اكتب في حدث الضغط على الزر التعليمة التالية :
If Table1.Locate('Pname',Edit1.Text , [locaseinsensitive,lopartialkey]) Then
Showmessage(' The record is found ') Else
Showmessage ( ' There is no match , Try Another Value ' );
في جدول المسافرين . PName ضمن الحقل Edit يقوم البرنامج السابق بالبحث عن القيمة المدخلة في العنصر 1
نفذ البرنامج وابحث عن قيمة حقل ما في الجدول ولاحظ انتقال مؤشر الحقل الحالي إليها عند وجودها ، ثم ابحث
عن جزء من اسم أحد المسافرين ( ابحث عن الحرف " م " فقط ولاحظ توضع مؤشر السجل الحالي عند اسم أول
من تعليمة البحث ولاحظ عدم قدرة المنهج من إيجاد loPartialKey مسافر يبدأ بحرف " م " ) ثم احذف الخيار
الحقل إلا في حال كانت القيمة مطابقة .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
112
وابحث عن القيمتين ثم احذف الخاصة ( ahmed و Ahmed ثم أضف أسماء مسافرين باللغة الإنكليزية ( مث ً لا
وأعد البحث .... loCaseInsensitive
للبحث عن أكثر من حقل بنفس الوقت : Locate استخدام المنهج
بفرض أننا نريد البحث عن اسم المسافر والجنسية بنفس الوقت ( المسافر محمد من سورية مث ً لا ) نستخدم عندها
بالشكل : Locate المنهج
Locate ( 'FieldName1; FieldName2; FieldName3',VarArrayOf ( [SearchValue1,
SearchValue2, SearchValue3]),Option ) ;
إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية : Edit مثال : أضف عنصر 2
if table1.Locate('pname;Nationalty',vararrayof([ edit1.Text,Edit2.text]) , [
locaseinsensitive , lopartialkey ] ) then
Showmessage('the record is found') else
Showmessage ( 'there is no match , Try Anther Value' );
. Variant ينشئ مصفوفة عناصرها من النوع VarArrayOf التابع
ملاحظة :
من النوع عدد SearchValue يجب أن تكون Long Integer أو Short إذا كان الحقل من نوع عدد صحيح
صحيح أيضًا ولذلك إذا أردنا أن نبحث عن رقم المسافر بد ً لا من اسمه نستبدل التعليمات السابقة بما يلي :
if table1.Locate('PNo;Nationalty',vararrayof([ strtoint(edit1.Text),Edit2.text])
,[locaseinsensitive,lopartialkey]) then
Showmessage('the record is found') else
Showmessage ( 'there is no match , Try Anther Value' );
: Lookup 2 المنهج
يعيد هذا المنهج مصفوفة من القيم لمجموعة من حقول الجدول دون أن تغير موضع السجل الحالي والمثال التالي
يوضح هذا المنهج :
مثال : سنبحث عن رقم المسافر وسنطلب من التابع ان يعيد اسم المسافر وجنسيته : اكتب في حدث الضغط على
زر التعليمات التالية
var LookupResult : Variant;
begin
lookupResult := Table1.Lookup('Pno',strtoint(edit1.Text ),'Pname;Nationalty');
if Not VarIsnull( lookupResult) then
Showmessage(vartostr(lookupresult[0]) + ' ' + vartostr(lookupresult[1] ) );
Variant ووضع النتيجة في متحول من النوع Edit التعليمة الأولى للبحث عن رقم المسافر المكتوب في العنصر 1
VarIsNull في المتحول إذا لم يجد القيمة المطلوب البحث عنها والتابع Null القيمة Lookup يعيد هذا التابع
يحوي قيمة أم لا . Variant يستخدم لمعرفة إذا كان المتحول من النوع
http://goo.gl/R2U0yZ لغة البرمجة دلفي
113
إلى نص . variant يحول قيمة المتحول VarToStr التابع
ملاحظات :
للبحث في أكثر من حقل في نفس الوقت مثال استبدل التعليمة الأولى في Lookup 1 يمكن استخدام التابع
المثال السابق بالتعليمة :
lookupResult := Table1.Lookup('Pno;Pname',VarArrayof
([strtoint(edit1.Text),Edit2.text]),'PName;Nationalty');
أنهما يستطيعان التعامل مع حقول مفهرسة وغير مفهرسة ، lookup و Locate 2 من أهم مزايا المنهجين
ويستخدمان أيضًا خوارزميات متقدمة للبحث حيث يستفيدان من الحقل إذا كان مفهرسًا و يطبقان عمليات الفرز (
الفلترة ) في حال كان غير مفهرس .
: FindKey المنهج
Findkey هذا المنهج خاص بالتعامل مع الحقول المفهرسة حيث تكون عمليات البحث أسهل حيث يأخذ المنهج
قيمة الحقل التي سيبحث عنها ويعيد قيمة بوليانية تدل على عثور هذا المنهج على السجل المطلوب ويقوم بنقل
مؤشر السجل الحالي إلى السجل المطابق لشروط البحث
مثال : في حدث الضغط المثال السابق على زر اكتب التعليمة التالية :
If not Table1.FindKey( [ Strtoint ( edit1.text)]) Then
Showmessage ( 'the Record is not Found');
لأنه المفتاح الرئيسي ) عن القيمة المكتوبة في العنصر ) PNo تقوم هذه التعليمة بالبحث في الفهرس الافتراضي
أما ،True وفي حال تم إيجادها ينتقل مؤشر السجل الحالي للسجل المطابق لنتيجة البحث ويعيد المنهج القيمة Edit
False في حال لم توجد النتيجة فيعيد التابع القيمة
Table للعنصر IndexName للبحث في الفهارس الثانوية يجب تحديد الفهرس الثانوي عن طريق الخاصة
ويمكن تحديدها أثناء التصميم أو أثناء التنفيذ .
تذكر أننا ) PNameIndex القيمة IndexName في الخاصة Table مثال : في المثال السابق أعط العنصر 1
DbGrid ولاحظ تغير ترتيب السجلات في العنصر ( Database Desktop عرفنا هذا الفهرس في البرنامج
. PName مباشرة حيث سيصبح ترتيب السجلات اعتمادًا على الترتيب الأبجدي في الحقل
عدل التعليمة في حدث الضغط على زر بالشكل التالي :
If not Table1.FindKey([edit1.text]) then
Showmessage ( 'the Record is not Found');
نفذ البرنامج وابحث عن اسم مسافر ما .....
وجدنا أيضًا أنه يمكن أن تكون المفاتيح الرئيسية عبارة عن حقلين أو أكثر كذلك الأمر بالنسبة للفهارس
بالشكل : FindKey الثانوية وفي هذه الحالة نستخدم المنهج
TableName.FindKey ( [ SearchValue1,SearchValue2 ,…,SearchValue3]) ;
حيث سيتم Table1.FindKey( [ مثال : يمكن البحث في جدول " المسافرين والرحلات" باستخدام التعليمة : ([ 2,3
. البحث عن المسافر رقم 2 في الرحلة 4
http://goo.gl/R2U0yZ لغة البرمجة دلفي
114
: FindNearest 4 المنهج
يشبه المنهج السابق إلا أنه ينتقل إلى سجل مطابق أو إلى أقرب سجل مطابق أو إلى أقرب سجل مطابق للقيمة
( False أو True المراد البحث عنها ، كما أنه لا يعيد قيمة ( لا يعيد
مثال :
عدل التعليمة في حدث الضغط على الزر السابق لتصبح بالشكل :
Table1.FindNearest ([edit1.text]);
جزء من اسم مسافر " مح" مث ً لا واضغط على الزر ستقوم التعليمات بوضع مؤشر السجل Edit ادخل في العنصر 1
الحالي عند أول مسافر أسمه " مح " أو أسمه قريب إلى "مح " مثل "محمد" أو "محمود".
: Filter ( التصفية ( الفلترة
تستخدم التصفية لإظهار مجموعة من الحقول تحقق معايير محددة مث ً لا نريد من الجدول أن يعرض المسافرين من
الجنسية السورية فقط في جدول المسافرين ، أو أن نظهر جميع الرحلات التي خرجت من مطار حلب في جدول
الرحلات .
. True القيمة Filter ويجب أن تأخذ الخاصة Table للعنصر Filter تستخدم لهذه العملية الخاصة
التصفية أثناء التصميم :
مثال : سنظهر في جدول الرحلات الخارجة من مدينة حلب ...
اربط ، Button و DBGrid و DataSource و Table ابدأ مشروعًا جديدًا واضف إلية العناصر التالية
أثناء التصميم . DBGrid في العنصر 1 Trips العناصر مع بعضها بحيث يظهر جدول الرحلات
القيمة : Filter واكتب في الخاصة True القيمة Table للعنصر 1 Filtered أعط الخاصة
GoFrom = ' 'حلب
سيتم تطبيق التصفية مباشرة وسيظهر الجدول جميع الرحلات المغادرة من مطار حلب ، نستطيع الآن إزالة
. False القيمة Filtered التصفية بإعطاء الخاصة
الآن على فرض أننا نريد أن نعرف جميع الرحلات المغادرة من مدينة حلب إلى القاهرة ، لتحقيق ذلك نكتب في
القيمة التالية Filter الخاصة
Gofrom = ' حلب ' and Arriveto = ' 'القاهرة
( True يجب أن تأخذ القيمة Filter ( الخاصة
كما يمكن أن نبحث عن جميع الرحل المغادرة من حلب أو دمشق إلى القاهرة ... :
(Gofrom = ' حلب ' Or GoFrom = ' دمشق ') and Arriveto = ' 'القاهرة
كما يمكن أن نوجد جميع الرحل المغادرة من بلد يبدأ أسمه بحرف " ح "
Gofrom =' '*ح
القيمة : Filter كما يمكن نعرف الرحل التي بقي فيها أكثر من 10 بطاقات : اكتب في الخاصة
CardCount > 10
http://goo.gl/R2U0yZ لغة البرمجة دلفي
115
التصفية أثناء التنفذ :
أثناء التصميم واكتب في حدث الضغط على زر التعليمة التالية لمعرفة الرحل True القيمة Filtered أعط الخاصة
التي بقي فيها أكثر من 10 بطاقات :
Table1.Filter := ' CardCount > 10 '
النموذج : Edit ولمعرفة الرحل التي بقي فيها أكثر من عدد محدد من البطاقات أضف عنصر
Table1.Filter := ' CardCount > '+ edit1.Text ;
حتى لا يحدث أخطاء ... Edit أدخل رقمًا في العنصر 1
لمعرفة الرحل المغادرة من مدينة ما نستخدم التعليمة التالية :
Table1.Filter := 'GoFrom = '+ Quotedstr(edit1.Text) ;
النص المعطى في وسيطه إليه مضاف إليه إشارتي حصر مث ً لا 'حلب ' = ( حلب Quotedstr يعيد التابع
Quotedstr (
وهكذا أعد تنفيذ الأمثله السابقة ...
: Table خواص العنصر
عدد من الخواص للتحكم به أثناء التنفيذ وهي : Table يملك العنصر
Table1.Active := true لفتح الجدول وتكافئ التعليمة Table1.open تسخدم التعليمة : Open 1 المنهج
.
Table1.Active := لإغلاق الجدول وتكافئ التعليمة Table1.Close تستخدم التعليمة : Close 2 المنهج
. False
لوضع مؤشر السجل الحالي عند أول سجل في الجدول . Table1.First استخدم : First 3 المنهج
لوضع مؤشر السجل الحالي في آخر الجدول . Table1.Last استخدم : Last 4 المنهج
للانتقال إلى السجل التالي في الجدول . Table1.Next استخدم : Next 5 المنهج
للانتقال إلى السجل السابق في الجدول . Table1.Prior استخدم : Prior 6 المنهج
للانتقال خمس سجلات إلى الأمام ( يمكن أن Table1.MoveBy( استخدم ( 5 : MoveBy( x) 7 المنهج
سالبة ). X تكون قيمة
إذا كان السجل الحالي في بداية الجدول . True تعيد هذه الخاصة القيمة : Bof 8 المنهج
إذا كان السجل الحالي في نهاية الجدول . True تعيد هذه الخاصة القيمة : Eof 9 المنهج
يعيد هذه المنهج عدد سجلات الجدول . : RecordCount 10 المنهج
يعيد هذا المنهج رقم السجل الحالي . : RecNo 11 المنهج
يقوم هذا المنهج بحث السجل الحالي ويضع مؤشر السجل على السجل التالي .. : Delete 12 المنهج
الحقول الحسابية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
116
الوظيفة :
:DataBase Desktop 1ً أنشئ الجداول التالية باستخدم البرنامج
: Writer 1 جدول المؤلفين
Wadress عنوان المؤلف WName اسم المؤلف * Wno رقم المؤلف
1
2
: Publisher 2 جدول دور النشر
PubAdr العنوان PubName اسم الدار * PubNo رقم الدار
3 جدول الكتب :
رقم الكتاب
BookNo
تاريخ الإصدار PubNo رقم الدار WNo رقم المؤلف Book اسم الكتاب
Edate
2 ً اربط بين الجداول بالشكل الذي تراه منسابًا .
3 ً عرف فهرس ثانوي على الحقل اسم المؤلف و الحقل اسم الدار والحقل اسم الكتاب .
4 ً اعرض جدول المؤلفين وجدول الكتب على نموذج واحد بحيث يكون الأول تفصيلي والثاني ثانوي .
5 ً ضع عدد من الأزرار على النموذج للبحث عن اسم المؤلف باستخدام أساليب البحث المختلفة
6 ً أعرض في نموذج جديد جميع الكتب الموجودة والتي من إصدار دار شعاع.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
117
الجلسة 19
الحقول الحسابية :
تستخدم الحقول الحسابية عادة لإعطاء نتيجة حسابية أجريت على عدد من حقول الجدول وهذه الحقول لا تخزن في
القاعدة البيانات ولكن تظهر للمستخدم فقط ( لا حاجة أص ً لا لتخزين هذه المعطيات لأنها معتمدة على حقول أخرى
في الجدول ) ....
مثال : على فرض أن جميع الرحلات قادرة على حمل 350 مسافر نريد أن ننشئ حقل حسابي يعرض عدد
= البطاقات المحجوزة على رحلة ما بالاعتماد على العلاقة - 350
عدد البطاقات المحجوزة CardCount
اربط العناصر مع بعضها ومع : DBGrid و DataSource و Table ابدأ مشروعًا جديدًا أضف إليه العناصر
أثناء DBGrid بحيث يظهر الجدول في Trips الجدول
التصميم ...
. False القيمة Table للعنصر 1 Active اعط الخاصة
ليظهر محرر Table اضغط مرتين على العنصر
الحقول، ثم اضغط بزر الفأرة اليميني وأضف جميع
الحقول، اضغط بزر الفأرة اليميني مرة أخرى واختر
ستظهر عندها النافذة حقل جديد New field
Type وفي القسم Name في القسم CapCard اكتب
Field type في القسم Calculated واختر Integer اختر
. Ok اضغط على
في محرر الخواص وانتقل إلى الحدث Event وانتقل إلى الصفحة Table أغلق محرر الحقول واختر العنصر 1
واكتب فيه التعليمة التالية : OnClacFields
Table1CapCard.Value := 350 - table1Cardcount.value ;
عدل ، CapCard ونفذ البرنامج، واستعرض الحقل الجديد Table للعنصر 1 True القيمة Active أعط الخاصة
... CapCard ولاحظ التغير المباشر في الحقل CardCount في أحد حقول
مثال 2 : نريد أن نضيف حقل جديد إلى الجدول السابق يعطي اسم اليوم الذي ستنطلق منه الرحلة ( أي اذا كانت
15 فإن قيمه هذا الحقل ستكون " الاثنين " ) ، سيعتمد هذا الحقل في قيمته على /9/ الرحلة ستنطلق بتاريخ 2003
وافتح محرر الحقول وفي False القيمة Table للعنصر 1 Active ولتحقيق ذلك أعط الخاصة GoTime الحقل
وانتقل إلى الحدث OK اضغط على ، String اختر Type وفي القسم TheDay أكتب Name القسم
واكتب التعليمات التالية : OnClacFields
Case DayOfWeek ( Table1GoTime.AsDateTime ) of
1: Table1Theday.Value :=' ;'الأحد
ة : لا تؤثر الحقول الحسابية على بنية قاعد البيانات 􀑧 ملاحظ
، وإذا أردنا استخدام هذه الحقول في أكثر من نموذج علينا
جديد . Table تعريفها من جديد في كل عنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
118
2: Table1Theday.Value :=' ;'الاثنين
3: Table1Theday.Value :=' ;'الثلاثاء
4: Table1Theday.Value :=' ;'الأربعاء
5: Table1Theday.Value :=' ;'الخميس
6: Table1Theday.Value :=' ;'الجمعة
7: Table1Theday.Value := ' ;'السبت
end;
رقم اليوم في الأسبوع حيث أن اليوم الأول الأحد والثاني الاثنين .... DayOfWeek يعيد التابع
ولاحظ النتائج .......... GoTime نفذ البرنامج وعدل في قيم الحقل
SQL ( Structured Query Language ) : لغة الاستفسارات البنيوية
هي لغة برمجة خاصة للتعامل مع قواعد البيانات وتعتبر لغة برمجة عالية المستوى، حيث SQL تعريف : لغة
يمكنها في سطر واحد إجراء عمليات بالغة التعقيد على قاعدة البيانات.
مجموعة من التعليمات للتعامل مع قواعد البيانات سنتعرف على بعض منها الآن : SQL تستخدم
مهمة هذه التعليمة إحضار المعلومات من قواعد البيانات ولها الشكل العام التالي : : Select التعليمة
Select FieldName1 , FieldName2 , FieldName13….
From TableName1,TableName2 …
[ Where Condition ]
[ Group By FieldName1,…]
[ Order By FieldName ]
التعليمات بين [ ] اختيارية .
From من الجدول المذكور اسمه في القسم Select تقوم هذه التعليمة بإحضار الحقول المحددة القسم
مث ً لا إذا أردنا إحضار حقل اسم المسافر و الجنسية من جدول المسافرين نستخدم التعليمة التالية :
Select PName , Nationality
From Passengers
وهو عنصر يشابه العنصر BDE الموجود في الصفحة Query باستخدام العنصر SQL يتم التعامل في دلفي مع
حيث يتم تحديد الجداول التي ستتعامل مع هذا العنصر TableName بشكل كبير ولكنه لا يملك الخاصة Table
فيها . SQL التي يتم كتابة تعليمات SQL باستخدام الخاصة
السابق SQL مثال : تحقيق مثال تعليمة
DBNavigator و DBGrid و DataSource و Query ابدأ مشروعًا جديدًا وأضف إلى النموذج العناصر التالية
.
SQL عند الضغط على ... في الخاصة ، Travel القيمة Query للعنصر 1 DataBaseName أعط الخاصة
تظهر نافذة اكتب فيها التعليمات التالية :
Select PName , Nationality
From Passengers
http://goo.gl/R2U0yZ لغة البرمجة دلفي
119
في حال ظهور رسالة خطأ تأكد من التعليمات ومن كتابتك لأسماء الحقول ) True القيمة Active أعط الخاصة
والجدول بشكل صحيح)
مع DBNavigator و 1 DBGrid واربط 1 Query القيمة 1 DataSource للعنصر 1 DataSet أعط الخاصة
. DataSource1
لاحظ أيضًا أن أزرار ، DBGrid داخل العنصر Select نفذ البرنامج ولاحظ ظهور الأعمدة المطلوبة في عبارة
غير فعالة ، كما أنه لا يمكن التعديل في البيانات من DBNavigator تعديل وإضافة السجلات في العنصر 1
تستخدم لجلب البيانات من قاعدة البيانات ، Select مباشرة وذلك يعود إلى أن عبارة DBGrid خلال العنصر 1
يملك خاصة Query خاصة بذلك، ولكن العنصر SQL أما إذا أردنا التعديل أو الإضافة أو الحذف فهناك تعليمات
يمكن التعامل True فعند إعطاء هذه الخاصة القيمة ، RequestLive تجعل البيانات قابلة للتحرير وهي الخاصة
تمامًا . Table كما كنا نتعامل مع العنصر Query مع العنصر
بد ً لا من ذكر أسماء الأعمدة ، عدل Select * مثال 2 :إذا أردنا إحضار حقول الجدول بالكامل نستخدم التعليمة
لتصبح بالشكل : SQL العبارة في المثال السابق ( داخل الخاصة
Select *
From Passengers
False إلى Query للعنصر Active ستعود قيمة الخاصة SQL بعد أي تعديل على الخاصة
لتحقيق شروط معينة على البيانات التي Select داخل عبارة Where تستخدم التعليمة : Where استخدام الشرط
سيحضرها الاستعلام .
. مثال 3 : نريد عرض جميع حقول جدول المسافرين والذين أرقامهم أكبر من 5
لتصبح بالشكل : SQL عدل التعليمات السابقة في الخاصة
Select *
From Passengers
Where PNo > 5
: مثال 4 : نريد عرض اسم المسافر الذي رقمه 3
Select *
From Passengers
Where PNo = 3
: مثال 5 : نريد عرض جميع المسافرين الذين أرقامهم بين 2 و 5
Select *
From Passengers
Where PNo Between 2 and 5 ;
: 5 – مثال 6 : نريد عرض المسافرين الذين أرقامهم خارج المجال 2
Select *
From Passengers
Where PNo Not Between 2 and 5 ;
مثال 7 : نريد عرض جميع المسافرين الذين اسمهم محمد :
Select *
http://goo.gl/R2U0yZ لغة البرمجة دلفي
120
From Passengers
Where PName = ' 'محمد
مثال 8 : نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م
Select *
From Passengers
Where Pname Like ' '%م
مثال 9 : نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م وطول اسمهم أربع أحرف :
Select *
From Passengers
Where Pname Like '____ 'م
للإشارة إلى عدد من الأحرف . Like تستخدم % في تعليمة
للإشارة إلى حرف وحيد . Like تستخدم _ في تعليمة
: Order By استخدام الترتيب
لترتيب البيانات حسب حقل محدد : Order by تستخدم تعليمة
مثال 10 : نريد عرض جميع المسافرين والذين أرقامهم أكبر من 5 بحيث يظهر ترتيب الأسماء تصاعديًا
Select * From Passengers
Where PNo > 5
Order By PName
مثال 10 : نريد عرض جميع المسافرين والذين أرقامهم أكبر من 5 بحيث يظهر ترتيب الأسماء تصاعديًا
Select * From Passengers
Where PNo > 5
Order By PName desc
مثال 11 :نريد عرض جميع المسافرين والذين أرقامهم أكبر من 5 بحيث يتم ترتيب الجدول بالنسبة للأسماء أو ً لا
ومن ثم لأ للجنسية ( أي إذا تطابق اسمي مسافرين سيوضع ترتيبها في الجدول حسب ترتيب الجنسية أبجديًا ) .
Select * From Passengers
Where PNo > 5
Order By PName ,Nationality
: SQL التوابع الجامعة في
: Select يعيد عدد السجلات التي تعيدها عبارة : Count 1 التابع
مثال 12 : لمعرفة عدد الرحلات المغادرة من مدينة حلب في جدول الرحلات
Select Count( * )
From Trips
Where GoFrom = ' 'حلب
يمكن ، Count(*) سيظهر في الجدول حقل وحيد فيه عدد السجلات المغادرة من مدينة حلب ،عنوان هذا الحقل
إلى Select تغير هذا العنوان بتعديل تعليمة
Select Count( * ) as Total ….
http://goo.gl/R2U0yZ لغة البرمجة دلفي
121
يعيد هذا التابع مجموع سجلات حقل ما . : Sum 2 التابع
التالية : SQL مثال 13 : لمعرفة مجموع بطاقات الرحلات المغادرة من حلب نستخدم عبارة
Select Sum(CardCount)
From Trips
Where GoFrom = ' 'حلب
يعيد هذا التابع المعدل الوسطي لمعطيات سجلات حقل ما : Avg 3 التابع
مثال 14 : لمعرفة المعدل الوسطي لعدد البطاقات الموجودة بالنسبة لعدد الرحلات
Select Avg(CardCount)
Form Trips
يعيد هذا التابع أكبر قيمة في الحقل : : Max 4 التابع
CardCount مثال 15 : لمعرفة أكبر عدد للبطاقات في حقل
Select Max(CardCount)
From Trips
يعيد هذا التابع أصغر قيمة في حقل ما . : Min 5 التابع
: Group By عبارة
لإجراء عمليات على البيانات وفرزها ضمن مجموعات وهي مرتبطة بشكل وثيق مع Select تستخدم ضمن تعليمة
التوابع الجامعة :
مثال 16 : لإظهار عدد الرحلات المغادرة من كل مطار :
Select GoFrom ,Count(GoFrom)
From Trips
Group by GoFrom
مثال 17 : لمعرفة عدد البطاقات للرحل المغادرة من كل مطار :
Select GoFrom ,Sum(CardCount)
From Trips
Group by GoFrom
ما عدا الحقول التي Group By يجب أن ترد في تعليمة Select ملاحظة : جميع الحقول الواردة في تعليمة
تستخدم التعليمات الجامعة .
: Having عبارة
لوضع شروط على عملية فرز البيانات . Group By بعد التعليمة Having تستخدم تعليمة
. مثال 18 : لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها أكبر من 10
Select GoFrom ,Sum(CardCount)
From Trips
Group by GoFrom
Having Sum( CardCount) > 10
Null مثال 19 : لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها لا يساوي
Select GoFrom ,Sum(CardCount)
http://goo.gl/R2U0yZ لغة البرمجة دلفي
122
From Trips
Group by GoFrom
Having Sum( CardCount ) is not null
http://goo.gl/R2U0yZ لغة البرمجة دلفي
123
الجلسة 20
ربط الجداول :
Where لإحضار بيانات من أكثر من جدول وبتطبيق بعض الشروط في عبارة Select يمكن استخدام عبارة
. Table نحصل على جداول مرتبة وأكثر فاعلية من الجداول التي يظهرها العنصر
لإظهار اسم المسافر بد ً لا من رقمه : PassAndTrips و Passengers مثال 1: ربط الجدولين
SELECT Pname,TripNo,SeatNo,ClassNo
FROM PassAndtrips, Passengers
WHERE PassAndtrips.PNo = Passengers.PNo
تقوم هذه التعليمة بإحضار أسماء الأعمدة المختارة من جدولي المسافرين و " المسافرين والرحلات " بتطبيق الشرط
الأخير والذي يسمى شرط ربط الجداول ( في حال تشابه اسم الحقل في جدولين نكتب اسم الجدول قبل اسم الحقل
Passengers.PNo وبينهما نقطة
بحيث يظهر جدول فيه اسم المسافر و اسم : Trips و Passengers و PassAndTrips مثال 2 :ربط الجداول
الشركة التي سيسافر معها وبلد المغادرة و رقم المقعد ورقم الصف :
SELECT Pname, Company, GoFrom, SeatNo, ClassNo
FROM Passandtrips, Passengers, Trips
WHERE (PassAndtrips.PNo = Passengers.PNo)
AND (PassAndtrips.TripNo = Trips.TripNo)
: Inner join التعليمة
للمثال الأول بالشكل : SQL هي تعليمة تستخدم للربط بين الجداول حيث يمكن كتابة عبارة
SELECT Pname, TripNo,SeatNo, ClassNo
FROM PassAndtrips
INNER JOIN Passengers
ON (Passengers.PNo = PassAndtrips.PNo)
للمثال الثاني بالشكل : SQL ويمكن كتابة عبارة
SELECT Pname, company, SeatNo, ClassNo
FROM Passandtrips
INNER JOIN Passengers
ON (Passengers.PNo = Passandtrips.PNo)
INNER JOIN Trips
ON (Trips.TripNo = Passandtrips.TripNo)
ملاحظات :
SQL يمكنك مراجعة كتب Right Join و Left Join و Outer Join 1 هناك عبارات أخرى للربط مثل
للتعرف عليها.
منها : SQL يوجد عبارات أخرى في SELECT 1 بالإضافة لعبارة
العبارة العمل
إنشاء جدول Create Table
http://goo.gl/R2U0yZ لغة البرمجة دلفي
124
إدخال قيم إلى جدول Insert
تعديل قيم جدول Update
حذف سجلات من جدول . Delete From
المختصة .... SQL للتعرف على هذه الأوامر راجع كتب
: SQL Builder البرنامج
يستخدم هذا البرنامج لكتابة
بشكل مرئي SQL تعليمات
وتفاعلي وبكلام آخر هو عبارة
عن أداة تسهل كتابة تعليمات
كما تمكننا من استعراض SQL
النتائج ...
ضع SQL Builder لتشغيل
على النموذج Query عنصر
واضغط عليه بزر الفأرة اليمني
من SQL Builder واختر
القائمة ستظهر عندها النافذة المجاورة
مثال 1 : لإظهار حقول من جدول الرحلات :
عندها ستظهر جميع الجداول ضمن هذه Travel اختر اسم قاعدة المعطيات Database 1 من القائمة المنسدلة
Trips.db اختر منها Table القاعدة في النافذة المجاورة
2 ستظهر عندها نافذة صغيرة تحوي جميع حقول جدول الرحلات وبجوار هذه الحقول صناديق خيار ، بتحفيز
هذه الصناديق يمكن اختيار الحقول التي ستظهر في الاستعلام ( حدد بعضًا من هذه الحقول ) .
من إزارا السرعة ستلاحظ مباشرة نتائج الاستعلام والذي يمكنك Execute SQL 3 اضغط على الزر
المجاور للزر السابق . SQL قراءة تعليماته بالضغط على الزر
سيسألك البرنامج إذا كنت تريد حفظ التغيرات إلى الاستعلام ، إذا اخترت نعم SQL Builder 4 أغلق البرنامج
بشكل تلقائي .. Query للعنصر SQL ستشاهد التعليمات ضمن الخاصة
لإظهار جميع الرحلات المغادرة من مطار حلب قم بما يلي : SQL Builder باستخدام Where مثال 2 : تعليمة
:
http://goo.gl/R2U0yZ لغة البرمجة دلفي
125
كما في السابق : ... SQL Builder 1 ادخل إلى البرنامج
بالضغط على صندوق الخيار المجاور لأسم الجدول ( ضمن النافذة Trips.db 2 حدد جميع حقول الجدول
الصغيرة ) .
واختر = Field Value من العمود الأيسر Trips.Gofrom معايير ) : اختر ) Criteria 3 ضمن الصفحة
الكلمة ( حلب ) . Field Value واكتب في العمود الأيمن Compare من العمود
ثم نفذها ... SQL 4 شاهد عبارة
مثال 3 : سنضيف شرط جديد على المثال السابق وهو إظهار الرحلات التي غادرت حلب باتجاه القاهرة .
Compare واختر = من العمود Trips.ArriveTo 1 في السطر التالي للشرط السابق اختر من العمود الأيسر
واكتب في العمود الأيمن ( القاهرة ) .
ستشاهد فيها جميع الحقول التي قمت Selection اختر الصفحة SQL Builder تغير عناوين الحقول :قي
اسم الحقل ويظهر العمود الأيسر ( ( Field ) يمكنك حيث يظهر في العمود الأيمن Trip باختيارها من الجدول
عنوان الحقل يمكنك في هذا القسم كتابة عنوان للحقل ( يمكنك استخدام اللغة العربية ) ،( يظهر ( Output Name
، ( Query المرتبط مع العنصر DBGrid عنوان الحقل في القسم اسم الحقل في العنصر
لتلاحظ النتائج . SQL نفذ عبارة
ترتيب حقول الجدول :
نختار SQL Builder تستخدم لترتيب الجدول و لكتابة هذه التعليمة باستخدام Order By وجدنا أن تعليمة
حيث تظهر في القسم الأيسر جميع الحقول المختارة من الجدول ، حدد أحد هذه الحقول واضغط Sorting الصفحة
يمكنك إضافة أكثر من حقل كما ، ( Sorted by ) ليضاف اسمه إلى القسم الأيمن من الصفحة Add على الزر
والضغط على أحد Sorted By يمكنك تحديد طريقة الترتيب ( تصاعدي أم تنازلي ) باختيار الحقل في القسم
قي الوسط .... Z 􀃆A أو A􀃆Z الزرين
:Group by …Having التجميع وشروط التجميع
. Group Criteria و Grouping باستخدام الصفحتين Having و Group by يمكنك كتابة التعليمات
: SQL Builder ربط الجداول باستخدام
حل المثال الأول :
اختر القاعدة ( Query عن طريق الضغط بزر الفأرة اليميني على عنصر ) SQL Builder افتح البرنامج
من نفس Passenegers ومن ثم اختر الجدول Table ومن اللائحة PassAndTrips واختر الجدول Travel
اللائحة :
Passengers في نافذة الجدول PNo ستظهر عندها نافذتي الجدولين ، اضغط بزر الفأرة الأيسر على الحقل
مع إبقاء الزر مضغوطًا ، حرر زر الفأرة فوق PassAndTrips في نافذة الجدول PNo وحرك يدك باتجاه الحقل
تمامًا ، سيظهر عندها خط يصل بين النافذتين دليل على عملية الربط ( اختر بعض الحقول من PNo الحقل
للمشاهدة التعليمات ) . SQL الجدولين وشاهد النافذة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
126
وبنفس الطريقة Trips ستظهر عندها نافذة الجدول Table من اللائحة Trips لحل المثال الثاني : أضف الجدول
في الجدولين ... TripNo السابقة اربط بين الحقلين
الاستفسارات الديناميكية :
جميع الاستفسارات التي أجرينها حتى الآن تدعى استفسارات ( استعلامات ) ستاتيكية وذلك لأنها شروطها تكون
محددة أثناء التصميم فمث ً لا في المثال الذي بحثنا فيه عن الرحلات المغادرة من مطار حلب كتبنا العبارة 'حلب
من الملاحظ أن هذا الاستفسار يعيد دائمًا الرحلات المغادرة من حلب ولا يستطيع ، Where GoFrom = '
المستخدم البحث عن الرحلات المغادرة من دمشق دون العودة إلى البرنامج إلى وضع التصميم و تغيير كلمة حلب
إلى دمشق ...
لذلك زودتنا دلفي بما يسمى بالاستفسارات الديناميكية والتي تمكن المستخدم من إعطاء الشرط أثناء التنفيذ وذلك عن
وسيط للعنصر ParamName حيث Where GoFrom = :ParamName طريق تعديل الشرط السابق بالشكل
يعطى قيمة ما أثناء التنفيذ . Query
مثال : إحضار معلومات من جدول الرحلات عن الرحلات المغادرة من بلد يحدده المستخدم :
بالإضافة إلى عنصر DBGrid و عنصر DataSource و عنصر Query ابدأ مشروعًا جديدًا وأضف عنصر
Button و زر Edit
Query للعنصر 1 SQL اربط العناصر مع بعضها كالعادة ... واكتب العبارة التالية في الخاصة
SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount
FROM Trips
Where GoFrom =:CityName
أثناء التنفيذ ( عند الضغط على الزر Query هي عبارة عن وسيط ستمرر قيمته إلى العنصر 1 CityName حيث
. ( Button1
، Edit Query1.Params واضغط على الزر المنقط ... لتظهر النافذة Query للعنصر 1 Params حدد الخاصة
Data Type من هذه النافذة لتظهر خواصه في محرر الخواص ومن ثم غير الخاصة CityName حدد الوسيط
. ftString إلى القيمة
اكتب التعليمات التالية : Button في حدث الضغط على الزر 1
query1.Close;
query1.ParamByName('cityName').Value := edit1.Text;
query1.Open
اسم البلد الذي تريد ( حلب ، دمشق ... ) واضغط على الزر ليحضر Edit نفذ البرنامج واكتب في العنصر 1
الاستعلام جميع الرحلات المغادرة من هذا البلد .
: مثال 2
يمكنك الاستعلام عن رقم الرحلة بشكل ديناميكي عن طريق الاستفسار التالي :
SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount
FROM Trips
http://goo.gl/R2U0yZ لغة البرمجة دلفي
127
Where TripNo =: TripNumber ;
. ftInteger إلى DataType وغير الخاصة TripNumber حدد الوسيط Edit Query1.Params في النافذة
وفي حدث الضغط على الزر اكتب التعليمة التالية :
query1.Close;
query1.ParamByName('TripNumber').Value := strtoint (edit1.Text) ;
query1.Open ;
ملاحظة :
وإذا SQL ولا يمكن فتح البرنامج بعد إضافة وسيط إلى عبارة ، Parameter لا يدعم الوسطاء SQL Builder
ومن ثم إعادة الوسيط عند SQL Builder أردت التعديل في العبارة فعليك حذف الوسيط والدخول إلى البرنامج
الخروج من البرنامج .
: Query مناهج العنصر
و Locate ) مثل Query يمكن استخدامها مع العنصر Table جميع المناهج التي استخدمناها مع العنصر
و FindKey لا يستخدم اسلوبي البحث Query إلا أن العنصر ( .... First و Eof و Bof و Lookup
لا تعتمد على مفتاح أساسي .. Query وذلك لأن الجداول التي يعيدها العنصر FindNearest
مثال هام :
التالي : Employees وليكن لدينا جدول الموظفين Company ليكن قاعدة بيانات لشركة ما
رقم
الموظف
EmpNo
اسم الموظف
EmpName
رقم المدير
ManagerNo
رقم الفرع
Department_id
تاريخ المباشرة
Hiredate
الراتب
Salary
9000 10/1/2002 3 200 Sara 10
12500 06/08/2000 2 300 kala 16
11000 09/01/2001 3 100 Dani 20
14000 05/07/2000 2 100 Wleed 30
وأدخل البيانات إليه : Database Desktop أنشئ هذا الجدول باستخدام
ابدأ مشروعًا جديدًا وأضف إليه العناصر اللازمة كما في الشكل :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
128
مع ال DataSource وسنقوم بربط DataSource مع العنصر DBNavigator و DBGrid أربط العنصرين
أثناء التنفيذ . Query
لكل منها : SQL وفيما يلي تعليمات Query كما تلاحظ لدينا ست عناصر
و اكتب QryEmpNo القيمة Query للعنصر 1 Name 1 استعلام البحث عن موظف : أعط الخاصة
: SQL التعليمات التالية في الخاصة
Select * from employees Where EmpNo = : No
وكتب في QryEmpName القيمة Query للعنصر 2 Name 2 استعلام البحث عن اسم موظف :أعط الخاصة
: SQl
Select * from employees Where EmpName =:name
القيمة Query للعنصر 3 Name 3 استعلام الرواتب : ( يعطي الرواتب التي بين قيمتين ) أعط الخاصة
... QrySal
Select * from Employees Where salary between :mn and :mx
QryHireDate القيمة Query للعنصر 4 Name 4 استعلام تاريخ المباشرة : أعط الخاصة
Select * from Employees Where hiredate between :b and :e
القيمة Query للعنصر 5 Name 5 استعلام حساب مجموع الرواتب في كل قسم: أعط الخاصة
QrysumsalaryByDepartment
Select Department_id ,sum(salary ) form employees
Group by DepartMent_id
http://goo.gl/R2U0yZ لغة البرمجة دلفي
129
القيمة Query للعنصر 6 Name 6 استعلام البحث عن الموظفين الذين يتبعون لمدير معين : أعط الخاصة
QryManager:
Select Empname From employees Where managerNo = :mno
وفيما يلي نستعرض أحداث الضغط على الأزرار :
1 حدث الضغط على الزر ( بحث عن اسم الموظف )
QryEmpNo.Close;
DataSource1.DataSet := QryEmpNo ;
QryEmpNo.ParamByName ( 'No') .value := Strtoint ( Edit1.text ) ;
QryEmpNo.Open;
2 حدث الضغط على الزر ( ابحث عن اسم الموظف ) :
QryEmpName.Close ;
DataSource1.DataSat := QryEmpName ;
QryEmpName.ParamesByName ( 'Name').Value := Edit2.text ;
QryEmpName.Open ;
3 حدث الضغط على الزر ( استعلام الرواتب )
QrySal.Close ;
DataSource1.DataSat := QrySal ;
QrySal.ParamByName( ' mn') .Value := strtoint ( edit3.text ) ;
QrySal.ParamByName( ' mx') .Value := strtoint ( edit4.text ) ;
QrySal.Open ;
4 حدث الضغط على الزر ( استعلام التاريخ ) :
QryHireDate.Close ;
DataSource1.DataSat := QryHireDate;
QryHireDate.ParamByName ( 'b').asdate := datetimepicker1.date;
QryHireDate.ParamByName ( 'e').asdate := datetimepicker2.date;
QryHireDate.Open ;
5 حدث الضغط على ( مجموع الرواتب في كل قسم ) :
QrysumsalaryByDepartment.Close ;
DataSource1.DataSat := QrysumsalaryByDepartment;
QrysumsalaryByDepartment.Open ;
6 حدث الضغط على الزر ( موظفي المدير ) :
QryManager.Close ;
DataSource1.DataSat := QryManager;
QryManager.ParamByName ( 'mno').Value := strtoint ( Edit5.text ) ;
QryManager.Open ;
While not QryManager.eof Do
Begin
Showmessage (QryManager.fieldByName ('EmpName').Value ) ;
QryManager.Next ;
End;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
130
سيظهر اسم الموظف التالي وهكذا . Ok سيظهر هذا الحدث اسم أول موظف يأتي به الاستعلام وعند الضغط على
http://goo.gl/R2U0yZ لغة البرمجة دلفي
131
الجلسة 21
:Access إنشاء الجداول ببرنامج
فلا office يمكن استخدام 2003 - ،(Microsoft Office XP وهو أحد تطبيقات ) Access XP افتح برنامج
في New File " ستظهر لك نافذة "مل ّ ف جديد ..New " اختر "جديد File " يختلف الأمر كثيرًا - ومن قائمة "مل ّ ف
جانب واجهة التطبيق كما في الصورة التالية:
تحت شريط "جديد" اضغط الأمر "قاعدة بيانات فارغة".. سيظهر لك مربع حوار "حفظ مل ّ ف" يطلب منك تحديد اسم
وقم ،"Books.mdb" قاعدة البيانات وموقع حفظها على الجهاز.. غير اسم قاعدة البيانات من الاسم الافتراضي إلى
بحفظها في الموضع الذي تريده.
ملاحظات :
على عكس قاعدة بيانات باردوكس التي تعتمد ملف .Mdb تخزن قاعدة بيانات أكسيس في ملف واحد من امتداد
مستقل لكل جدول أو فهرس ....
فيما يتعّلق بإنشاء الجداول، لهذا Access و 97 Access و 2000 Access XP ليست هناك اختلافات كبيرة بين
يمكنك أن تتبع معنا هذه الخطوات على أ  ي من هذه النسخ.
بعد إغلاق مربع الحوار ستظهر لك نافذة قاعدة البيانات كما
في الصورة التالية:
http://goo.gl/R2U0yZ لغة البرمجة دلفي
132
انقر الأمر "إنشاء جدول في طريقة عرض التصميم" م  رتين بالفأرة.. ستظهر لك نافذة تصميم الجدول كما في
الصورة التالية:
الآن كلّ ما عليك هو كتابة أسماء الحقول وتحديد نوعية البيانات في كلّ منها.. تعالَ نبدأ بتصميم جدول أسماء
المؤّلفين.. هذا الجدول سيتك  ون من العمودين التاليين:
اسم الحقل نوع البيانات الوصف
ترقيم تلقائي المفتاح الرئيس  ي لهذا الجدول ID
نص اسم المؤّلف Author
ومن ،ID بعد أن تنشئ هذه الأعمدة، اضغط بزر الفأرة الأيمن على المربع الرماد  ي الموجود على يمين الحقل
القائمة الموضعية اضغط "مفتاح أساسي" وذلك لجعل هذا الحقل مفتاحا أساسيا للجدول.
في المنطقة السفلى Indexed " ستلاحظ ظهور رمز المفتاح أمام هذا الحقل.. ستلاحظ كذلك أ  ن خاصية "مفهرس
من النافذة ستتح  ول إلى "نعم بدون تكرار"، وهو شيء متوّقع، فلقد اتفّقنا أ  ن قيم المفتاح الأساس  ي غير قابلة للتكرار.
وفي المنطقة السفلى من النافذة غير قيمة خاصية ،Author شي  ء آخر.. اضغط بالفأرة على حقل اسم المؤّلف
"حجم الحقل" إلى 30 بدلا من 50 ، بافتراض أن أطول اسم لمؤّلف لن يزيد عن 20 حرفا.
Authors لحفظ الجدول.. سيظهر لك مربع إدخال يطالبك بإدخال اسم الجدول.. س  مه Ctrl+S الآن اضغط
.OK واضغط زر
ملحوظة:
وسيكون من المرهق ،VB سم الجداول والأعمدة بأسماء أجنبية، وذلك لأ  ن هذه الأسماء ستدخل في كتابة الكود في
الانتقال من الإنجليزية إلى العربية والعكس أكثر من م  رة أثناء كتابة الكود.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
133
قد أضيف إلى نافذة قاعدة البيانات.. انقره م  رتين Authors الآن لو أغلقت نافذة التصميم، فستجد أ  ن الجدول
بالفأرة.. ستجد أن نافذة جديدة قد فتحت، تعرض لك جدول المؤّلفين.. أدخل البيانات التالية:
1 توفيق الحكيم
2 عباس العقاد
3 محمد عبد الحليم عبد الله
4 نبيل فاروق
5 أحمد خالد توفيق
6 محمد حمدي غانم
7 منصور
8 راتب
9 عقل
بنفس الطريقة ص مم جدول الكتب كالتالي:
اسم الحقل نوع البيانات الوصف
ترقيم تلقائي المفتاح الرئيس  ي لهذا الجدول. ID
نص اسم الكتاب Book
نص رقم المؤّلف AuthorID
وأدخل فيه البيانات التالية: ،Books احفظ هذا الجدول باسم
AuthorID Book ID
1 أرني الله 1
2 يوميّات نائب في الأرياف 1
3 عصا الحكيم 1
4 سارة 2
5 عبقرية محمد 2
6 عبقرية عمر 2
7 شجرة اللبلاب 3
8 مهنتي القتل 4
9 الأفق الأخضر 4
http://goo.gl/R2U0yZ لغة البرمجة دلفي
134
10 أسطورة الغرباء 5
11 العاشر 5
12 لا تدخلوا شيرود 5
13 مجرد طريقة للتفكير 6
14 حائرة في الحب 6
15 بين قوسين من الخلود 6
16 حياتي 7
17 حياتي 8
18 حياتي 9
إنشاء علاقة بين جدولي المؤّلفين والكتب:
Referential أعتقد أّنك متش  وق لمعرفة كيفية ربط حقلي رقم المؤّلف بين الجدولين لتحقيق التكامل المرجع  ي
بين الجدولين.. ستجد الأمر غاي ً ة في البساطة: Integration
ستظهر لك نافذة "إظهار جدول" المو  ضحة في ..Relationships " اضغط الأمر "علاقات Tools من قائمة أدوات
الصورة التالية:
اختر كلّ جدول واضغط ز  ر "إضافة".. بعد أن تضيف الجدولين أغلق هذه النافذة.. ستبدو لك نافذة العلاقات
كالتالي:
http://goo.gl/R2U0yZ لغة البرمجة دلفي
135
حيث يظهر كلّ جدول كمستطيل عليه عنوان الجدول، وبه أسماء أعمدته.
AuthorID بالفأرة من جدول المؤّلفين، وتح  رك بالفأرة إلى الحقل ID ولإنشاء علاقة بين الجدولين، اسحب حقل
في جدول الكتب.. ستلاحظ تغير شكل مؤ ّ شر الفأرة.. اترك زر
الفأرة الأيسر فوق هذا الحقل.. هنا ستظهر لك نافذة :
إنشاء العلاقة بين الحقلين:
Enforce Referential " اضغط اختيار "فرض التكامل المرجعي
لتقوم قاعدة البيانات آليا بالتحّقق من ص  حة البيانات بين ،Integrity
الجدولين.. وفي هذا الصدد لديك اختياران:
Cascade Update Related تتالي تحديث الحقول المرتبطة
:Fields
تلقائيا في سجلات كلّ AuthorID فمثلا، لو غيرت رقم (توفيق الحكيم) من 1 إلى 10 ، فسيتم تغيير رقم المؤّلف
. الكتب التي أّلفها إلى 10
في جدول المؤّلفين، لأّنه ترقيم تلقائ  ي.. ولو أردت تغييره، فعليك ID ملحوظة:لن تستطيع تغيير قيمة رقم المؤّلف
بتغيير نوع الحقل من ترقيم تلقائي إلى رقم، على أن يكون هذا قبل إنشاء العلاقة، لأّنه من غير المسموح تغيير نوع
بيانات حقل داخل في علاقة.
:Cascade Delete Related Fields تتالي حذف السجلات المرتبطة
فمثلا، لو حذفت سجلّ (نبيل فاروق) من جدول المؤّلفين، يتم حذف كلّ كتب (نبيل فاروق) تلقائيا من جدول الكتب.
اضغط ز  ر "إنشاء" لإغلاق هذه النافذة.
الآن سيظهر خ ّ ط يربط الجدولين كالتالي:
ولو أردت حذف هذه العلاقة، فاضغط الخ ّ ط بز  ر الفأرة الأيمن، ومن القائمة الموضعية اختر "حذف".
قم بحفظ التغييرات، وأغلق نافذة العلاقات.. افتح الآن جدول المؤّلفين.. ستلاحظ ظهور علامة "+" بجوار كلّ
حقل.. اضغط أيا منها، وليكن (توفيق الحكيم).. ستجد أ  ن علامة "+" تح  ولت إلى علامة "-"، وأ  ن جدولا صغيرا
يحتوي على الكتب التي أّلفها توفيق الحكيم قد ظهر.. ولإخفائه ثاني ً ة أعد ضغط علامة "-".
http://goo.gl/R2U0yZ لغة البرمجة دلفي
136
AuthorID ويمكنك إدخال المزيد من كتب (توفيق الحكيم) في هذا الجدول الفرع  ي، دون أن ُتدخل رقمه في خانة
في كلّ م  رة، إذ ستتم كتابة هذا الرقم آليا، م  ما يوّفر لك الوقت ويعفيك من احتمالات الخطأ.
في لغة البرمجة دلفي : BDE ربط قواعد البيانات أكسيس مع عناصر
مع العنصر Paradox وجدنا أنه تمكنا من ربط قاعدة البيانات
للعنصر عن طريق الاسم DataBaseName في الخاصة Table
Database الذي تم إنشائه بواسطة البرنامج Alias البديل
والسؤال المطروح هنا كيف يمكن أن نربط بين العنصر Desktop
وجدول بيانات أكسيس : Table
1 افتح لوحة التحكم في ويندوز واختر
Adminstrative Tools →ODBC Data Sources
ستظهر لك النافذة التالية
System DNS اختر منها الصفحة
لتظهر النافذة التالية : Add 2 اضغط على الزر
Microsoft Access Driver ( *.mdb) اختر منها
. Finish واضغط على الزر
Data 3 تظهر عندها النافذة التالية : اكتب في القسم
واضغط بعدها على الزر ، Library القيمة Source Name
http://goo.gl/R2U0yZ لغة البرمجة دلفي
137
بعد تحديد الفهرس التي وضعته فيه ، اضغط ( Books.mdb ) واختر قاعدة ملف قاعدة البيانات أكسيس Select
Ok بعدها على الزر
. ODBC Data Source واخرج من
من لوحة التحكم أو عن طريق BDE Administrator 4 افتح البرنامج
Start 􀃆 Program 􀃆 Borland Delphi 􀃆 BDE Administrator
والتحكم في خصائص قواعد البيانات المستخدمة على الجهاز . Alias مهمة هذا البرنامج هي تعريف ال
من الصفحة Library حدد قاعدة البيانات
فتظهر خواص هذه القاعدة في ، Database
أكتب في ، Definition الصفحة اليمينية
مسار قاعدة Database Name الخاصة
أو حدده عن طريق Books.mdb البيانات
الضغط على الزر ذو ... ،
BDE Administrator أغلق البرنامج
عندما يطالبك بحفظ Yes واضغط على الزر
التغيرات .
واستخدامها كما وجدنا في الأمثلة Query أو Table مع العنصر Library 5 الآن يمكنك ربط قاعدة البيانات
السابقة .
ملاحظة :
من القائمة New وذلك باختيار الأمر Paradox لقاعدة بيانات Alias يمكن استخدام البرنامج لإضافة اسم بديل
ومن ثم تحديد كتابة الاسم البديل للقاعدة وتحديد مسارها في صفحة Standard ومثل اختيار النوع Object
الخصائص .
، Borland بعد أن تعرفنا عن طريقة ربط قواعد البيانات بواسطة محرك قواعد بيانات : ADO الصفحة
سنتعرف الآن على كيفية ربط البيانات مع محرك قواعد بيانات مايكروسوفت .
وتستخدم خوارزميات أسرع في البحث والتعديل ، كما تقدم طرق قوية لربط قواعد BDE أحدث من ADO تعتبر
SQL Server أو Oracle معطيات موزعة مثل قواعد بيانات
: ADO مثال : ربط قاعدة بيانات المكتبة بواسطة
ابدأ مشروعًا جديدًا واضف إلى النموذج العناصر التالية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
138
و DataSource وأضف إليه أيضًا العناصر ADO من الصفحة ADOTable ، ADOConnection
. DBNavigator و DBGrid
اضغط مرتين على العنصر
لتظهر النافذة التالية : ADOConnection
Use Connection String اختر زر الراديو
Build واضغط على الزر
لتظهر النافذة التالية :
Microsoft Jet 4.0 OLE Db Provider اختر من القائمة
. Next واضغط على
فاختر Oracle ملاحظة : إذا كنت تستخدم قاعدة بيانات
Microsoft OLE DB Provider for Oracle
في القسم Connection تظهر الصفحة Next عند الضغط على
أدخل ملف قاعدة معطيات Select Or Enter Database Name
الكتب
لإنهاء المعالج Ok اضغط بعدها على الزر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
139
وأعطه الخصائص التالية : ADOTable حدد الآن العنصر 1
Authorsِ أعطها القيمة TableName و الخاصة ADOConnection أعطها القيمة 1 Connection الخاصة
True القيمة Active والخاصة
ADOTable القيمة 1 DataSource للعنصر DataSet أعط الخاصة
. DataSource القيمة 1 DBNavigator و 1 DBGrid للعنصرين 1 Datasource أعط الخاصة
نفذ البرنامج ولاحظ النتائج .
كما يمكننا استخدام نفس ، ADO في محرك SQL لاستخدام لغة SQLConnection بنفس الطريقة يمكن ربط
للتعامل مع هذه العناصر . Query و Table مناهج العنصرين
http://goo.gl/R2U0yZ لغة البرمجة دلفي
140
الجلسة 22
برنامج دليل الهاتف :
1 قاعدة البيانات :
قبل الشروع بكتابة البرنامج علينا تحديد قاعدة البيانات المطلوبة وتحديد عدد الجداول وطرق الربط بين الجداول
ونوعية البيانات والفهارس المطلوبة ...
في برنامج دليل الهاتف سنحتاج إلى جدول واحد وهو
ss City Country Web Email Fax Mobil WPhon HPhon LName FName Num
رقم الاسم الكنية هاتف
المنزل
هاتف
العمل
الهاتف
الخلوي
الفاكس البريد
الإلكتروني
موقع
الانترنت
الدولة المدينة ال
) A(15) A(15) A(40) A(40) A(15) A(15) A(15) A(15) A(15) A(15) +
هو حقل مفتاح رئيسي . Num حيث الحقل
سنحتاج أيضًا إلى تعريف فهرسين ثانويين الأول لترتيب الجدول حسب الاسم والثاني لترتيب الجدول حسب الكنية
.
وللبدء بإنشاء القاعدة :
حيث سنقوم بتخزين ملفات قاعدة ، Data وأنشئ داخله المجلد C على القرص MyPhon 1 أنشئ المجلد
حاول دائمًا أن تضع ملفات قاعدة البيانات في ) Data وسنخزن ملفات البرنامج في المجلد Data البيانات في المجلد
. Paradox مجلد منفصل وخاصة إذا كانت القاعدة تتألف من عدد من الملفات كما في قاعدة البيانات
BDE باستخدام C:\MyPhon\Data ليشير إلى المجلد Myphon باسم Alias 2 أنشئ اسم بديل
. Database Desktop أو باستخدام البرنامج Administrator
و لا تنس إنشاء Paradox باستخدام قاعدة البيانات Database Desktop 3 أنشئ الجدول السابق في البرنامج
الفهارس الثانوية كما يلي :
Define واضغط على الزر Table properties من اللائحة Secondary Indexes أ اختر
وأعط اسم للفهرس Ok على الترتيب واضغط على Lname و Fname وأضف الحقلين
. FNameIndex
على الترتيب .... وأعط FName و Lname مرة أخرى وأضف الحقلين Define ب اضغط على
. LNameIndex الفهرس اسم
أو داخل المجلد MyPhon الذي أنشأته سابقًا Alias ضمن الاسم البديل Phonebook 4 أحفظ الجدول باسم
. C:\MyPhon\Data
بهذا نكون قد أنشأنا قاعدة البيانات وسننتقل إلى المرحلة الثانية :
2 كتابة البرنامج :
قبل الشروع بكتابة البرنامج يجب عليك أن تملك تصورًا كام ً لا للشكل الذي تريد للبرنامج أن يظهر عليه ، ما هو
شكل النافذة الرئيسية وماهي العناصر التي ستتوضع عليها وما هي النوافذ الأخرى الواجب وضعها في البرنامج (
http://goo.gl/R2U0yZ لغة البرمجة دلفي
141
بكلمات أخرى ، أمسك ورقة وقلم وحاول أن ترسم ما تريد أن تفعله وما هو المطلوب من البرنامج أن يقدمه ) ،
حدد ما هي النقاط الأصعب في البرنامج وهل هي لعدم خبرتك البرمجية في التعامل مع هذه النقاط أو لعدم قدرة
لغة البرمجة على تقديم ما تطلبه ( عمليًا لغة البرمجة عالية المستوى لا تكون قاصرة عن أداء شيئ معين ولكن
على المبرمج أن يبحث كثيرًا لتعلم كيفية التعامل مع مواضيع معينه ) ، سأورد الآن بعض الأمثلة على هذه
المشاكل ، تصور أن المستخدم طلب أن يكون برنامجه قادرًا على طباعة حقول معينة وأنت حتى الآن لم تتعلم
شيئًا عن الطباعة ستكون هنا الآن أمام طريقين :
الأول: البدء بكتابة البرنامج وتعلم الطباعة عند الوصول إلى النقاط التي تحتاج الطباعة في البرنامج ( عمليًا يترك
هذا النوع من المبرمجين النقاط الصعبة حتى آخر نقطة من البرنامج ) .
الثاني : تعلم الطباعة والتعرف على إمكانيات الطباعة التي تقدمها لغة البرمجة ومن ثم الشروع بكتابة البرنامج .
ثم اكتشفت أن لغة البرمجة Memo المشكلة في الطريق الأول : تصور أنك عرفت بعض الحقول من النوع مذكرة
أو على الأقل لا تستطيع طباعتها بالشكل الذي تريده ، ماذا ستفعل Memo لا تستطيع أن تطبع الحقول من نوع
الآن ، إما أن تقوم بكتابة خوارزميات جديدة للطباعة وهذا صعب جدًا بالنسبة لمبرمج عادي أو العودة إلى قاعدة
Alpha البيانات وتحويل نوع هذه الحقول إلى النوع نص
وبالتالي العودة إلى النماذج وتعديلها أيضًا لملائمة التغيرات في القاعدة الأمر الذي قد يضطرك أحيانًا لكتابة
البرنامج من جديد .
الطريقة الثانية هي الطريقة الأفضل وربما هي الطريقة الوحيدة التي تجعلك تنهي ما بدأت بالشكل الذي تريد .
والقاعدة هي : ابدأ أو ً لا من أصعب النقاط وحاول حلها حتى تستطيع الوصول إلى النهاية .
سننشئ الآن النافذة الرئيسية والتي ستظهر بالشكل :
أضف الآن العناصر التالية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
142
1 أعط النموذج الأول الخصائص التالية :
الخاصة القيمة
bdRightToLeft BiDiMode
برنامج دليل الهاتف Caption
470 Hieght
750 Width
poScreenCenter Position
وأعطه الخصائص التالية : Win من الصفحة 32 TabControl 2 أضف العنصر
alTop Align
True MultiLine
tsButtons Style
أكتب الحروف الأبجدية من أ إلى ي وكل حرف في سطر Tabs
True HotTrack
وأعطه الخصائص التالية : Standard من الصفحة Panel 3 أضف العنصر
alClient Align
bvLowered Bevelinner
bvRaised BevelOuter
فراغ '' Caption
: Table 4 العنصر
MyPhone DatabaseName
Phonebook TableName
FnameIndex IndexName
True Active
لكي لا يظهر في الجدول ثم أعط لكل حقل Num أدخل إلى محرر الحقول وأضف جميع الحقول ثم احذف الحقل
التابعة لكل حقل. DisplayLabel اسمه باللغة العربية في الخاصة
: Tabcontrol ضعه ضمن العنصر : DataSource 5 العنصر
Table1 Dataset
: DbGrid 6 العنصر
alClient Align
DataSource1 DataSource
واضغط على + وغير Titel أدخل إلى محرر الأعمدة وأضف جميع الحقول ثم حددها واذهب إلى الخاصة
taCenter إلى Aligment الخاصة
: Panel ضعه ضمن العنصر : GroupBox 7 العنصر
ترتيب حسب Caption
http://goo.gl/R2U0yZ لغة البرمجة دلفي
143
GroupBox ضعه داخل العنصر 1 : RadioButton 8 العنصر 1
الاسم Caption
True Checked
RBTName Name
GroupBox ضعه داخل العنصر 1 : RadioButton 9 العنصر 2
الكنية Caption
RBTLname Name
: GroupBox ضعه داخل العنصر 1 : Edit 10 العنصر 1
فراغ " Text
GroupBox ضعه داخل العنصر 1 : Button 11 العنصر
بحث حسب الاسم Caption
BtnSearch Name
سنبدأ الآن بكتابة التعليمات اللازمة حتى هذه النقطة وسنعود لإكمال بقية العناصر لاحقًا :
عندما يضغط المستخدم على زر الراديو الاسم سيتم ترتيب الجدول حسب حقل الاسم وسيكون البحث متاحًا
: RBTName حسب اسم الشخص لذلك نكتب التعليمة التالية في حدث الضغط على زر الراديو الاسم
table1.IndexName := 'FnameIndex';
btnSearch.Caption := ' ;'بحث حسب الاسم
وفي حدث الضغط على زر الراديو الكنية سيرتب الجدول حسب حقل الكنية وسيكون البحث متاحًا حسب حقل
: RBTLname الكنية لذلك اكتب التعليمات التالية في حدث الضغط على زر الكنية
table1.IndexName := 'LnameIndex';
btnSearch.Caption := ' ;'بحث حسب الكنية
سيتم إظهار الأسماء التي تبدأ Tabcontrol عندما يضغط المستخدم على أي صفحة من صفحات العنصر
بالحرف التي ضغط عليه المستخدم ، أما إذا كان المستخدم قد اختار الترتيب حسب الكنية فستظهر الحقول التي يبدأ
Tabcontrol للعنصر 1 OnCahnge فيها حقل الكنية بالحرف الذي ضغط عليه المستخدم لذلك اكتب في الحدث
التعليمات التالية :
if RBTName.Checked then
table1.Filter := 'fname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*') else
table1.Filter := 'Lname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*')
لمعرفة عمل هذه التعليمات راجع المحاضرات السابقة ...
زر البحث :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
144
في حقل الاسم أو حقل الكنية ( حسب خيار المستخدم ) وفي Edit سيتم البحث عن القيمة المكتوبة في العنصر 1
حال عدم وجدوها سيتوقف مؤشر السجلات عند أقرب قيمة للبحث ، بما أن البحث سيتم في كامل الجدول فيجب
: BtnSearch قبل القيام بالبحث ، اكتب التعليمات التالية في حدث الضغط على الرز Filter إلغاء التصفية
table1.Filtered := false;
table1.FindNearest([edit1.text]);
أضف بعض السجلات على سبيل التجربة .............
البحث عن رقم هاتف :
عندما تريد أن تبحث عن رقم هاتف فلن يكون مهمًا أن تحدد في أي حقل أي لا يهم إن كان الهاتف الذي سنبحث
عن صاحبه هو هاتف المنزل أو هاتف العمل فالمهم أن يعيد البحث اسم الشخص الذي نبحث عن رقم هاتفه لذلك
فإذا لم نجد الرقم سنبحث في الحقل WPhon فإذا لم نجد الرقم نبحث في الحقل HPhon ستبحث في الحقل
وإذا لم نجد الرقم تظهر رسالة تخبرنا بأن الرقم غير موجود Mobil
لذلك أضف العناصر التالية إلى النموذج السابق :
: Panel ضعه ضمن العنصر : GroupBox 1 العنصر
بحث عن رقم الهاتف Caption
Edit 2 عنصر 2
فراغ " Text
: Button 3 العنصر
بحث Caption
BtnPhSearch Name
وفي حدث الضغط على هذا الزر اكتب التعليمات التالية :
Table1.Filtered := false;
if not Table1.Locate('HPhon',edit2.text,[]) then
if not Table1.Locate('WPhon',edit2.text,[]) then
if not Table1.Locate('Mobil',edit2.text,[]) then
showmessage( ' ; ( 'الرقم غير موجود
يمكنك الآن إضافة أزرار للبحث عن البريد الالكتروني و الفاكس و....
وأعط المشروع اسم Main.pas أعط الوحدة اسم C:\MyPhon حفظ البرنامج :احفظ التطبيق في المجلد
. MyPhone
أضف الآن العناصر التالية إلى النموذج :
: Panel ضعه ضمن العنصر : GroupBox العنصر
خيارات Caption
http://goo.gl/R2U0yZ لغة البرمجة دلفي
145
Caption أعطها Button أربع أزرار
لإدخال البيانات إلى القاعدة وعدم Data control الإدخال : جرت العادة على استخدام العناصر في الصفحة
الذي لا يمكن الإدخال إليه ضمن Memo فقط وخاصة أنه لدينا حقل من نوع DBGrid الاعتماد على العنصر
وذلك لاستخدامه للعرض فقط ) . ReadOnly الخاصة DBGrid في أغلب الأحيان يعطى العنصر ) DBGrid
أنشئ نموذجًا جديدًا وأعطه الخصائص التالية :
bdRightToLeft BiDiMode
إدخال Caption
poScreenCenter Position
DataEnter Name
على Table لهذه الوحدة وذلك لكي نتمكن من الوصول إلى العنصر 1 Uses إلى القسم Main وأضف اسم الوحدة
النموذج الأول :
. DataEnterU احفظ الوحدة باسم
على النموذج كما في الشكل DBNavigator وعنصر Label وعناصر DBEdit ضع مجموعة من عناصر ال
:
وأعطها ( Label حدد جميع عناصر التعامل مع قواعد المعطيات ( جميع العناصر على النموذج عدا عناصر ال
. Form1.DataSource القيمة 1 DataSource الخاصة
المجاور . Label وذلك حسب العنصر DataField بحقل في الخاصة DBEdit ثم اربط كل عنصر من عناصر
لإظهار هذا النموذج عد إلى النموذج الأول واكتب في حدث الضغط على الزر إدخال التعليمة التالية :
DataEnter.ShowModal ;
لذلك DBGrid من المفيد إيضًا ظهور هذا النموذج عندما يضغط المستخدم على اسم أحد الأشخاص داخل العنصر
DBGrid للعنصر 1 OnDbClick اكتب التعليمة التالية في الحدث
DataEnter.ShowModal ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
146
الطباعة :
للطباعة في دلفي وتستطيع هذه الصفحة التعامل مع قواعد البيانات كما يمكنك QReport يستخدم صفحة العناصر
طباعة الصور والأرقام والحسابات عن طريقها :
: ملاحظة لمستخدمي دلفي 7
وإذا أردت QReport بد ً لا من الصفحة Rave أضافت بورلاند صفحة مجموعة جديدة من العناصر في الصفحة
في دلفي 7 أضف هذه الصفحة عن طريق : QReport استخدام
Commponnant 􀃆 install package 􀃆 add
. Delphi داخل مجلد 7 Bin من الفهرس dclqrt60.bpl أضف الوحدة
لطباعة دليل الهاتف :
لهذه الوحدة وذلك لكي نتمكن من Uses إلى القسم Main أضف وحدة جديدة إلى البرنامج وأضف اسم الوحدة
. Printform Name على النموذج الأول وأعطها الخاصة Table الوصول إلى العنصر 1
وأعطه الخصائص التالية : Qreport من الصفحة QuickRep وأضف إليها العنصر
و HasDetail و HasColumnHeader : Band للخصائص التالية الموجودة ضمن الخاصة True أعط القيمة
. HasPagefooter و HasPageHeader
. Form1.DataSource أعطها القيمة 1 Dataset الخاصة
برنامج دليل الهاتف " " Caption أو أعطه ال Page Header إلى القسم QRlabel أضف الآن العصر
كما في الشكل : QRlabel عدد من العناصر Column Header أضف لل
كما Dataset واربطها مع الحقول المناسبة في الخاصة QRDbText مجموعة من العناصر Detail أضف إلى
في الشكل السابق .
... Page Number القيمة data وأعطه الخاصة QRSysData العنصر Page Footer أضف إلى
. PrintUnit احفظ الوحدة باسم
لتشاهد النتائج . Preview واختر QUickRep اضغط بزر الفأرة اليميني على العنصر 1
اكتب في حدث الضغط على الزر طباعة في النموذج الأول التعليمة التالية :
Printform.QuickRep1.Preview
http://goo.gl/R2U0yZ لغة البرمجة دلفي
147
الجلسة 23
لمسات برمجية :
يمكن أن نعتبر برنامج الهاتف برنامج جاهز للتوزيع والنشر ولكن بإضافة بعض اللمسات إلى البرنامج يمكن أن
نحول هذا البرنامج إلى برنامج سهل الاستخدام ومرغوب بشكل أكبر من قبل المستخدمين، وأقصد باللمسات
البرمجية بمجموعة الأعمال التي يقوم بها المبرمج والتي يمكن أن تأخذ وقت طوي ً لا لتسهيل عمل المستخدم .
1 تمكين المستخدم من التعامل مع البرنامج بدون استخدام الفأرة وبأسرع الطرق الممكنة :
فلا حاجة لأن يعود المستخدم إلى الفأرة ليضغط على Edit مث ً لا عندما يكتب المستخدم اسم للبحث عنه ضمن 1
من لوحة المفاتيح ليتم البحث ( Enter ) الزر لكي يتم تنفيذ البحث بل يكفي أن يضغط المستخدم على الزر إدخال
: Edit للعنصر 1 OnKeyPress ولتحقيق ذلك برمجيًا : اكتب التعليمات التالية في حدث
if key = char( VK_Return ) then
btnsearch.Click ;
في الحقيقة يجود الكثير من هذه ،Enter ثابت معرف في دلفي ويحوي شيفرة الأسكي للزر VK_Return حيث
و مفاتيح F1..F وهذه الأزرار هي المفاتيح 12 ( Virtual Key ) الثوابت والتي تحوي شيفرة الأزرار الافتراضية
أي مجموعة أزرار لوحة المفاتيح عدا الأحرف والأرقام) ) ... End و Delete و Caps lock و Tab الأسهم و
وللتعرف على هذه الثوابت راجع ملفات المساعدة في دلفي أو اكتب في مكان في محرر الشيفرة
وستكمل دلفي بقية الثوابت. Windows.VK_
ملاحظات :
أ يمكن الاستعاضة عن التعليمة السابقة بالتعليمة :
If key = #13 then btnsearch.Click ;
و # تستخدم قبل شيفرة Enter وهي القيمة الاسكي للزر VK_Return حيث 13 هي القيمة التي يحويها الثابت
S := فهذا يكافئ التعليمة S:=#89#111# الأسكي لتحويل الرقم إلى حرف ، مث ً لا إذا كتبنا التعليمة التالية : 117
'You'
ب يمكن الاستعاضة عن التعليمة السابقة بالتعليمة :
If key = #13 then BtnSearchClick (Sender);
نستخدم الإجراء الذي يقوم بهذه العملية مباشرة ( لا حظ أن BtnSearch للزر Click بد ً لا من استخدام المنهج
بمجرد Implementation والقسم Type قد تم تعريفة من قبل الدلفي في القسم BtnSearchClick الإجراء
ضغطك على الزر ....
لإدخال الأرقام فقط أو على الأقل رموز لوحة مفاتيح الهاتف Edit 2 من الملاحظ أننا نستخدم العنصر 2
وبالتالي يجب منع المستخدم من إدخال الحروف والرموز غير المرغوبة ولتحقيق ذلك اكتب التعليمة التالية :
const s = ['0','1','2','3','4','5','6','7','8','9','p',char(VK_back)];
begin
if not ( key in s )
then key:= char(vk_capital)
http://goo.gl/R2U0yZ لغة البرمجة دلفي
148
، فإذا لم 􀃅 و هو زر الحذف VK_back نعرف مجموعة من الرموز التي يستخدمها الهاتف بالإضافة إلى الزر
والذي لن يؤثر على Caps Lock وهو زر Vk_Capital يكن الزر المدخل من هذه المجموعة فحوله إلى الزر
ولكنه سيصدر صوت ما . Caps Lock وضع الزر
إلى آخر بواسطة الضغط على الزر DBEdit 3 في النافذة إدخال على المستخدم أن ينتقل من عنصر تحرير
للتنقل بين عناصر الإدخال Enter من لوحة المفاتيح على الرغم من أن معظم البرامج الجيدة تستخدم الزر Tab
: DBEdit للعنصر 1 OnKeyPress لذلك اكتب التعليمة التالية في الحدث
If key = #13 then DBEdit2.SetFocus ;
التعليمة التالية : OnKeyPress واكتب في حدث
If key =#13 then dbedit3.SetFocus ;
وهكذا في بقية العناصر .
يستخدم لتحفيز ( تفعيل العنصر ) وهو يستخدم مع معظم العناصر في دلفي فمث ً لا التعليمة SetFocus المنهج
ستظهر إطار شفاف داخل الزر والذي يعني أن هذا هو الزر الفعال والذي يمكن الضغط Button1.SetFocus
من لوحة المفاتيح . Space أو الزر Enter عليه بواسطة الزر
4 التحكم بتحميل النوافذ في الذاكرة :
وستجد فيه تعريف MyPhone.Dpr سيظهر لك ملف المشروع Project 􀃆 View Source افتح القائمة
Begin و ستجد التعليمات التالية في القسم Uses الوحدات في القسم
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TDataEnter, DataEnter);
Application.CreateForm(TForm2, Form2);
Application.Run;
والتي من النوع Form تقوم بإنشاء النافذة 1 Application.CreateForm ( TFom1,Form التعليمة ( 1
وكذلك الأمر بالنسبة Form التي يتبع لها النموذج 1 Main.pas للوحدة Interface والمعرف في القسم TForm1
التالية ، ولكن ماذا يعني إنشاء نافذة.... عند استخدام التعليمة CreateForm لتعليمات
Application.CreateForm ( TFom1,Form1)
1 سيتم إنشاء هذه النافذة في الذاكرة ( أي حجز حيز في الذاكرة يحوي النافذة التي ستظهر ) .
2 سيتم إنشاء جميع العناصر الموجودة على هذه النافذة من أزرار و عناصر قواعد البيانات و....
3 سيتم حجز المتحولات العامة وإعطاءها حيز من الذاكرة أيضًا .
. Form التابع للنموذج 1 OnCreate 4 سيتم تنفيذ التعليمات التي تم وضعها في الحدث
سيتم الآن تنفيذ هذه الخطوات بالنسبة للنوافذ الثلاثة المستخدمة في البرنامج ، لنقم الآن بدراسة بسيطة لحجم
استخدام كل نافذة :
سيستخدم أي مستخدم هذه النافذة عند كل دخول إلى البرنامج وذلك لأنها تحوي : Form 1 النافذة الأولى 1
عناصر البحث والفهرسة بالإضافة إلى عرض البيانات.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
149
تستخدم هذه النافذة عدة مرات في الأسبوع الأول لاستخدام البرنامج لأن المستخدم : DataEnter 2 النافذة
سيقوم بإدخال أرقام هواتفه إلى البرنامج وبعد ذلك لن يدخل المستخدم إلى هذه النافذة إلا مرة في الأسبوع أو الشهر
أو حتى بالسنة .
هذه النافذة تحوي عناصر الطابعة وإذا فرضنا أن المستخدم يملك طابعة فإنه لن يطبع دفتر : Form 3 النافذة 2
هواتفه كل يوم .
هذا يعني أننا نحجز حيز من الذاكرة لنافذتين لن يستخدمها المستخدم إلا مرات قليلة، لهذا زودتنا دلفي بطريقة
لإنشاء النموذج عن الحاجة إليه وذلك عن طريق :
أ إزالة النموذج من قائمة التحميل التلقائي :
لتظهر النافذة التالية : حدد منها Project 􀃆 Options افتح القائمة
وهي تحدد Main Form والتي فيها القائمة المنسدلة Forms الصفحة
النموذج الذي سيظهر عند تشغيل البرنامج.
وتظهر فيها أسماء النماذج التي سيتم Auto-Create Forms اللائحة
إنشاءها تلقائيًا عند تشغيل البرنامج ،
وتحوي جميع بقية النوافذ في البرنامج Available Form اللائحة
والتي لا توجد في لائحة التشغيل التلقائي.
Avialable Form حدد النوافذ التي لا تريد أن تعمل تلقائيًا واضغط على السهم < لتنتقل هذه الاسماء إلى اللائحة
.
ب إنشاء النموذج عند الطلب :
أو Show بما أنه النافذة لن تنشأ تلقائيًا فعلينا أن نكتب بعض التعليمات لإنشائها قبل استخدام المنهج
أو حتى قبل طلب أي متحول ما منها لذلك لنكتب التعليمات التالية في حدث الضغط على الزر ShowModal
إدخال :
Dataenter := TDataEnter.Create(application);
Try
DataEnter.Showmodal;
Finally
DataEnter.Release ;
end;
التابع للقسم Var المعرف في القسم ) TDataEnter من النوع DataEnter التعليمة الأولى تقوم بإنشاء المتحول
وسيطًا وحيدًا يدل على Delphi لعناصر Create ويأخذ المنهج ( DataEnterU.pas في الوحدة Interface
عادة لأن النموذج المنشأ سيعود لتطبيق Application العنصر المالك للعنصر المراد إنشائه وتمرر هنا القيمة
مباشرة .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
150
هي عملية لإزالة النموذج من الذاكرة بعد انتهاء عمله والتي يمكن استبدالها DataEnter.Release التعليمة
يعتبر أفضل لأنه لا يعيد رسالة خطأ إذا لم يكن النموذج منشأً Release ولكن المنهج DataEnter.Free بالتعليمة
بالفعل .
فيجب إضافة التعليمات التالية للتأكد من عمل ShowModal بد ً لا من المنهج Show إذا كنا نستخدم المنهج
البرنامج بشكل صحيح :
أضف التعليمة التالية : DataEnter للنافذة OnClose في الحدث
action := Cafree;
DataEnter := nil;
واكتب الآن التعليمات التالية في حدث الضغط على الزر إدخال ( في النموذج الأول ) :
If DataEnter = nil then
DataEnter := TDataEnter.Create(application);
DataEnter.Show;
لنافذة يتم تنفيذه عندما يتم إغلاق النافذة ( ضغط المستخدم على زر إغلاق ) ويأخذ هذا الحدث OnClose الحدث
والذي يمكن أن يأخذ القيم التالية : Action الوسيط
القيمة المعنى
لا يمكن إغلاق النافذة ولن يحدث شيء إذا ضغط المستخدم على الزر إغلاق CaNone
سيتم إغلاق النافذة وتحرير كامل الذاكرة المستخدمة من قبلها CaFree
وهو الخيار Show سيتم إخفاء النافذة بد ً لا من إغلاقها ويمكن إعادة إظهارها عن طريق المنهج CaHide
FormStyle := fsNormal الافتراضي للنوافذ من النوع
fsMDIChild سيتم تصغير النافذة وهو الخيار الافتراضي مع النوافذ من النوع CaMinimize
الأمر الذي يجعلنا DataEnter في المتحول ( Null ) تقوم بتحميل قيمة اللاشيء DataEnter = Nil التعليمة
قد تم تنفيذه ومن ثم تنفيذ عملية إنشاء النموذج . OnClose فيما بعد أن الحدث
ملاحظة : هذه إحدى الطرق المستخدمة لإنشاء النافذة بشكل ديناميكي وهناك طرق أخرى متعددة .
: Windows Registry مسجل النظام
بما فيها Windows مسجل النظام عبارة عن مجموعة من الملفات يتم تخزين فيه جميع معلومات نظام التشغيل
خصائص النظام واسم المستخدم واسم الكمبيوتر بالإضافة إلى أن معظم البرامج تضيف بعض المفاتيح إلى مسجل
النظام للتحكم بطريقة إظهار البرنامج حسب خيارات يحددها المستخدم ، يدعى مسجل النظام بقاعدة بيانات النظام
الموجودين داخل فهرس الويندوز ،لمشاهدة مسجل النظام User.dat و System.dat ويكون مخزن في الملفين
. Ok في النافذة تشغيل ثم اضغط على Regedit واكتب Run وتحريره افتح القائمة أبدأ و اضغط على
http://goo.gl/R2U0yZ لغة البرمجة دلفي
151
ستظهر عندها النافذة التالية والتني تحوي في جهة
اليمين ستة من المفاتيح الرئيسية تدعى عادة مفاتيح
بالضغط على إشارة + بجانب هذه ، Root key الجذر
المفاتيح تظهر لها مفاتيح فرعية و التي يمكن الوصول
من خلالها إلى مفاتيح فرعية أخرى، تدعى الرموز التي
تظهر على القسم اليميني من النافذة بالقيم وهي على
ثلاثة أنواع ،
قيم عددية و قيم نصية وقيم منطقية ،
قبل أن تعدل أي قيمة ما في مسجل النظام عليك أن تعرف ما تفعل لأن بعض التعديلات قد تؤدي إلى توقف النظام
عن العمل أو تعطيل البرنامج الذي عدلته على الأقل ، يمكنك أن تأخذ نسخة عن مسجل النظام أو عن جزء منه
ستطالب بإدخال Regestry 􀃆 Export ضع حدد بمؤشر الفأرة المفتاح الذي تريد أخذ نسخه منه واختر الأمر
اسم ملف ما وسيتم بعدها حفظ نسخة عن المفتاح ، لاستعادة مسجل النظام اضغط مرتين على ملف الملف الذي
كنت قد حفظته سابقًا .
سأشرح بشكل موجز ماهي المعلومات المخزنة في كل مفتاح رئيسي :
يحوي هذا المفتاح معلومات عن كل أنواع الملفات المعرفة في النظام ( لا حظ : HKEY_ClASSES_ROOT
أنه يحوي قائمة بجميع امتدادات الملفات التي يتعامل معها ويندوز ) بالإضافة إلى معلومات عن البرامج القادرة
... .Doc أو .jpg على التعامل مع هذه الملفات مث ً لا
يحوي معلومات عن مستخدم النظام والقيم الافتراضية التي أعطاها لبعض : HKEY_CURRENT_USER
برامج الويندوز بالإضافة إلى الخصائص لوحة التحكم والبرامج التي تنصبها المستخدم على الجهاز .....
يحوي معلومات عن جهاز الحاسوب بالكامل بما فيها أنواع الأجهزة : HKEY_LOCAL_MACHINE
مث ً لا تستطيع معرفة نوعية كرت الشاشة ( Driver ) المستخدمة في الجهاز بالإضافة إلى مشغلات هذه الأجهزة
المستخدم ونوعية الشاشة المعرفة على الجهاز ....
يحوي معلومات عن التشكيلات الجانبية للمستخدم ( الخصائص التي يحددها المستخدم : HKEY_USERS
لألوان سطح المكتب مث ً لا .. ) ، بالإضافة إلى التشكيلات الجانبية الافتراضية التي ستعطى عندما يدخل مستخدم
جديد إلى الويندوز .
ولكن HKEY_LOCAL_MACHINE يعتبر جزء من المفتاح : HKEY_CURRENT_CONFIG
بطريقة عرض أخرى .
Windows NT يحوي معلومات عن أجهزة النظام وطرق إعدادها ( غير موجود في : HKEY_DYN_Data
. (
التعامل مع مسجل النظام يسمح لك بالتحكم بالنظام بشكل كامل ولا بد أنك سمعت عن برامج تتحكم بسرعة قائمة
ابدأ و تغير أسم سلة المحذوفات وتغير الصورة التي تظهر بجانب قائمة ابدأ ( الصورة المكتوب فيها
مث ً لا ) و بالإضافة إلى تغير صورة جهاز كمبيوتر و بالإضافة إلى البرامج التي تضيف نفسها WINDOWS Me
http://goo.gl/R2U0yZ لغة البرمجة دلفي
152
إلى القائمة التي تظهر عند الضغط بزر اليمين على سطح المكتب أو مستكشف ويندوز ، حتى أن البرامج التي
تدعي أنها تتحكم بسرعة الاتصال انترنت تتعامل مع مسجل النظام ...... )
وإذا أردت أن تصبح مبرمجًا محترفًا عليك قراءة أحد الكتب Windows Registry هذه موجز صغير جدًا عن
بحجم 800 صفحة تقريبًا . Windows 2000 Registry المختصة بهذا الموضوع فكتاب
في دلفي : Registry التعامل مع
إذا لم تكن تريد أن تتحكم بنظام ويندوز من داخل برنامجك فأنت بحاجة إلى تخزين بعض المعلومات عن برنامجك
داخل مسجل النظام الأمر الذي يطرك إلى التعامل مع النظام .
مثال : سنقوم بإنشاء برنامج يقوم بمعرفة اسم المستخدم الذي سجل النظام باسمه ومن ثم تغيره ( نستطيع معرفة
اسم المستخدم عن طريق الضغط بزر الفأرة اليميني على أيقونة جهاز الكمبيوتر واختيار خصائص من القائمة ) .
اسم المستخدم يوجد داخل مسجل النظام تحت المفتاح
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
للتأكد من ذلك ) . Regedit افتح البرنامج ) RegisteredOwner ومخزن في القيمة النصية
، Edit ابدأ مشروعًا جديدًا وأضف زرين إلى النموذج وعنصر 1
USES إلى القسم Registry للتعامل مع مسجل النظام عليك إضافة الوحدة
للقراءة من مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الأول
Var reg:tregistry ;
Begin
reg:= tregistry.Create ; // إنشاء المتحول وحجز مكان له في الذاكرة
try
reg.RootKey := HKEY_LOCAL_MACHINE ;// تحديد المفتاح الرئيسي
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;
edit1.text := reg.ReadString('RegisteredOwner');// قراءة القيمة النصية المخزنة في الوسيط المذكور
reg.CloseKey ; // إغلاق المفتاح
Finally
reg.Free ; // تحرير الذاكرة بعد استخدام المتحول
end;
تقوم بفتح المفتاح المرر لها كوسيط أول وإذا لم يكن موجودًا فتقوم بإنشاء هذا المفتاح إذا كان OpenKey التعليمة
.True وسيطها الثاني
للكتابة إلى مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الثاني :
Var reg:tregistry ;
Begin
reg:= tregistry.Create ;// إنشاء المتحول وحجز مكان له في الذاكرة
try
reg.RootKey := HKEY_LOCAL_MACHINE ;// تحديد المفتاح الرئيسي
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
153
reg.WriteString('RegisteredOwner',edit1.Text ); // كتابة القيمة المدخلة في عنصر التحرير إلى اسم
القيمة المحددة
reg.CloseKey ; // إغلاق المفتاح
Finally
reg.Free ; // تحرير الذاكرة بعد استخدام المتحول
end;
مثال 2 : سنعود إلى برنامج الهاتف :
يقوم برنامجنا بالترتيب حسب الاسم دائمًا وعلى فرض أن المستخدم يفضل الترتيب حسب الكنية فإن عليه عن
يضغط على زر الراديو الكنية كلما دخل إلى البرنامج ، سنضيف الآن مفتاح إلى مسجل النظام يقوم بتخزين الخيار
الافتراضي للمستخدم ، وسنقوم بفحص قيمة هذا المفتاح كلما دخلنا إلى البرنامج :
في المفتاح : IndexBy سنخزن قيمة عددية تحت أسم
HKEY_CURRENT_USER\Software\MyPhone
وعند تشغيل البرنامج سنفحص قيمة هذا المتحول فإذا كان هذا المتحول يحوي قيمة 1 فالفهرسة ستتم حسب الكنية
وإلا فالفهرسة ستتم حسب الاسم .
في برنامج الهاتف وأعطه العنوان " فهرس دائمًا حسب الكنية " . Form أضف زر إلى النموذج الأول 1
وفي حدث الضغط على هذا الزر اكتب التعليمات التالية :
Var reg:tregistry ;
Begin
reg:= tregistry.Create ;
try
reg.RootKey := HKEY_CURRENT_USER ;
reg.OpenKey('SOFTWARE\MyPhone',True ) ;
if button4.Caption = ' فهرس دائمًا حسب الكنية ' Then
reg.WriteInteger ('IndexBy',1 )
else reg.WriteInteger ('IndexBy',0 )
reg.CloseKey ;
Finally
reg.Free ;
end;
بإنشاء القيمة WriteInteger بإنشاء المفتاح إذا لم يكن موجودًا وتقوم التعليمة OpenKey تقوم التعليمة
وتخزن فيها القيمة 1 أو صفر حسب الشرط . IndexBy
الآن سنفحص هذا المفتاح عند تشغيل البرنامج :
RBTLname
reg:= tregistry.Create ;
try
reg.RootKey := HKEY_CURRENT_USER ;
reg.OpenKey('SOFTWARE\MyPhone',True) ;
if reg.ReadInteger ('IndexBy') = 1 then begin
http://goo.gl/R2U0yZ لغة البرمجة دلفي
154
RBTLname.Checked := true;
RBTLnameClick(Sender);
button5.Caption := ' ; 'رتب دائمًا حسب الاسم
end؛
reg.CloseKey ;
Finally
reg.Free ;
end;
فإذا كانت تساوي 1 فإنها تقوم بتحفيز زر الراديو الكنية وتنفيذ IndexBy تفحص هذه التعليمات القيمة المخزنة
الحدث الخاص بالضغط على هذا الزر والذي فيه تعليمات تغيير الفهرس بالإضافة إلى تغير عنوان الزر إلى رتب
دائمًا حسب الاسم .
بهذا نكون قد تعلمنا التعامل مع مسجل النظام .
وظيفة : فكر بطريقة تقوم بها بإضافة كلمة سر إلى برنامج الهاتف ، حيث ستظهر نافذة عند تشغيل البرنامج
تطالب المستخدم بإدخال كلمة السر فإذا أدخل كلمة السر الصحيحة فستظهر النافذة الرئيسية وإلا فسيطالب بإدخال
كلمة السر مرة أخرى وإذا فشل في الدخول ثلاث مرات متتالية فيتم إغلاق البرنامج ( خزن كلمة السر في مسجل
النظام ) .
: Windows API توابع وثوابت الويندوز
توابع وثوابت الويندوز هي مجموعة هائلة من التوابع والثوابت المعرفة في ويندوز والموجودة ضمن مكتبات
وتستخدم هذه النوافذ للتحكم في ويندوز وفي كل شيء في ويندوز ابتداء .DLL ويندوز في ملفات ذات الامتداد
بلوحة المفاتيح وانتهاء مرورًا بالذاكرة والمعالج و الشاشة بما في ذلك التحكم بالبرامج والنوافذ وطرق إظهارها (
و معرفة معلومات معينة عن الأجهزة مثل Api يمكنك على سبيل المثال التحكم بارتفاع الصوت باستخدام توابع
يمكنك الحصول على معلومات في برنامج آخر من برنامجك كأن تحصل Hard Disk معرفة حجم السواقة الصلبة
على معلومات من ملف ورد والمزيد الذي لا يمكن حصره هنا .
سنشرح أمثلة عن التوابع وطرق التعامل معها :
: Windows 1 إغلاق
لإطفاء الجهاز أو إعادة التشغيل : ExitWindowsEx( ) يستخدم التابع
ابدأ برنامجًا جديدًا واضف زر إلى النموذج واكتب التعليمة التالية :
ExitWindowsEx(ewx_ShutDown,0) ;
احفظ البرنامج وقم بتنفيذه ولا تضغط على الزر ،أغلق البرنامج وشغله من خارج الدلفي ( من المكان الذي حفظته
فيه ) ، اضغط على الزر الآن وسيتم إيقاف تشغيل ويندوز .
. ExitWindowsEx(ewx_Reboot, لإعادة إقلاع النظام استخدم التعليمة : ( 0
2 التحكم بلغة البرنامج الافتراضية : إذا كانت اللغة الافتراضية على الجهاز هي اللغة الإنكليزية فإن برنامجك
سيظهر المؤشر في عناصر التحرير بحيث يتم الكتابة باللغة الإنكليزية وعلى المستخدم أن يحول إلى أسلوب الكتابة
بالغة العربية كلما أراد الكتابة ، ويمكن حل هذه المشكلة عن طريق التعليمة :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
155
LoadKeyboardLayout('00002801',klf_activate) ;
للنموذج وشغل OnCreate وأضف التعليمة السابقة إلى الحدث Edit ابدأ مشروعًا جديدًا وضع فيه عنصر تحرير
البرنامج وستلاحظ أن المؤشر أصبح بجهة الكتابة بالغة العربية .
الرقم 00002801 هو الرقم الذي يرمز إلى لوحة المفاتيح العربية السعودية إذا أردت العودة إلى اللغة الإنكليزية
. الأمريكية بدل هذا الرقم إلى 00000409
. Form للنموذج الأول 1 OnCreate تطبيق : اذهب إلى برنامج الهاتف وأضف هذه التعليمة للحدث
يوجد لدينا في النافذة إدخال في برنامج الهاتف حقلين يجب كتابتهما باللغة الإنكليزية هما حقل البريد الإلكتروني
لهذين الحقلين : OnEnter وحقل موقع الانترنت لذلك يمكنك كتابة التعليمة التالية في الحدث
LoadKeyboardLayout('00000409 ',klf_activate) ;
حيث سيتم التحول إلى اللغة الإنكليزية عند دخول المؤشر إلى هذين الحقلين واكت التعليمة التالية في الحدث
OnExit
LoadKeyboardLayout('00002801',klf_activate) ;
إذا أردت أن يعود المؤشر إلى اللغة العربية عن خروج المؤشر من هذين الحقلين .
: MessageBox التابع
سابقًا ولكن مشكلة هذين التابعين أن عناوين الأزرار تظهر MessageDlg و ShowMessage تعاملنا مع التابعين
الذي سيظهر عناوين الأزرار Api من ويندوز MEssageBox بالغة الإنكليزية دائمًا لذلك يمكنك استخدام التابع
تبعًا للغة النظام .
أكتب التعليمة التالية في حدث الضغط على الزر :
MessageBox ( هذا عنوان الرسالة ' , ' هذا نصر الرسالة', 0 ' , MB_Ok ) ;
سيظهر بالغة العربية ( موافق ) إذا كنت تستخدم ويندوز بالغة العربية . Ok نفذ البرنامج ولاحظ أن الزر
اكتب التعليمة التالية في حدث الضغط على زر آخر :
If MessageBox ( تغير لون النافذة ' , ' هل تريد تلوين النافذة باللون الأحمر', 0 ' ,Mb_YesNo ) = IDYES
then
Form1.color := clred;
. F واضغط على 1 MessagBox لمزيد من التعليمات ضع المؤشر فوق اسم التابع
التعامل مع النوافذ :
وهو عبارة عن عدد صحيح Thandle وهو من النوع Handle لكل نافذة في ويندوز مقبض أو ممسك يدعى
فقط بل لكل عنصر Form طويل يتعامل النظام مع هذا المقبض للوصول إلى النافذة ( لا يقصد بالنافذة هنا النموذج
و.... ) ، المقبض ليس له قيمة ثابتة إذ يعطى للنافذة Edit على النموذج مقبض أيضًا فهناك مقبض للزر وللعنصر
رقم مقبض جديد عند كل إنشاء للنافذة ، عندما تقوم يتحريك نافذة ما على سطح المكتب فإن النظام يستدعي
لتنفيذ هذه الحركة . Api مجموعة من توابع
يوجد عدد هائل من التوابع المتعلقة بالنوافذ سنذكر بعض منها في هذه العجالة :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
156
1 برنامج يعيد أسماء جميع النوافذ الموجودة في الذاكرة :
إلى النموذج في برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية ListBox أضف زر و عنصر
:
var h:Thandle;
p:pchar;
begin
getmem(p,250);
h:= gettopwindow ( getdesktopwindow) ;
getwindowtext(h,p,250);
listbox1.Items.Add(p);
while h > 0 do begin
h:= getnextwindow( h,gw_hwndnext);
getwindowtext(h,p,250);
listbox1.Items.Add(p) ;
end;
freemem(p,200);
end;
شرح البرنامج :
ملاحظة ) Pchar من النوع P بالإضافة إلى المتحول Thandle وهو من النوع h في البداية تم تعريف المتحول
( Pchar تتعامل مع النوع Api جميع توابع
. p تخصص 200 بايت من الذاكرة للمتحول GetMem( p, التعليمة ( 200
يعيد مقبض سطح المكتب في ويندوز . : GetDesktopwindow
يعيد النافذة الموجودة في أعلى النوافذ في حيز الذاكرة المخزن فيه مقبض النافذة الذي يمرر GetTopWindow
كوسيط لهذا التابع
ويعيد نص بطول 250 h عنوان النافذة التي مقبضها p يعيد هذا التابع في المتحول :getwindowtext(h,p,250)
حرف
وفي حال وصلنا إلى آخر h يعيد مقبض النافذة التي تلي النافذة : GetNextWindow( h, gw_hwndnext)
. Nil نافذة فيعيد القيمة
2 برنامج إخفاء وإظهار شريط المهام :
ابدأ مشروعًا جديدًا وأضف إليه زرين :
للوحدة : Private 1 عرف المتحول التالي في القسم
hTaskBar: THandle;
للنموذج : OnCreate 2 اكتب التعليمة التالية في الحدث
hTaskBar := FindWindow('Shell_TrayWnd', nil);
تعيد هذه التعليمة النافذة التي نوعها مذكور في الوسيط الأول وعنوانها مذكور في الوسيط الثاني
http://goo.gl/R2U0yZ لغة البرمجة دلفي
157
3 أكتب التعليمة في حدث الضغط على الزر الأول :
ShowWindow(hTaskBar, SW_HIDE);
تقوم هذه التعليمة بإظهار أو إخفاء النافذة تبعًا للوسيط الثاني .
4 أكتب التعليمة التالية في حدث الضغط على الزر الثاني :
ShowWindow(hTaskBar, SW_SHOW);
نفذ البرنامج .
ملاحظات :
فوق بعد وضع المؤشر فوق اسم التابع . F 1 للمزيد من المعلومات عن التوابع المذكورة سابقًا اضغط 1
في أي مكان من محرر الشيفرة و Windows اكتب Windows Api 2 للحصول على اسماء معظم توابع
وهي مرتبطة مباشرة مع Windows.pas ضع النقطة ، فسيتم كتابة جميع الثوابت والتوابع المعرفة في الوحدة
. Windows Api
عليك مراجعة الكتب المختصة أو الحصول على Windows Api 3 للحصول على معلومات وافرة عن
. MicroSoft Visual Studio والتي تباع مع MSDN Library مجموعة الأقراص الليزرية المسماة
إعداد المهندس : محمد خالد ناصر آغا
http://goo.gl/R2U0yZ لغة البرمجة دلفي
158
الجلسة 24
: ( Add new omponant ) إضافة عناصر جديدة
قبل إضافة عناصر جديدة إلى دلفي علينا أن نعرف ما هي العناصر:
لقد تعاملنا مع مجموعة كبيرة من العناصر في دلفي منها المرئي ومنها المخفي وهي عبارة عن كتل برمجيه جاهزة
يضعها المبرمج على النموذج لإعطاء برنامجه شكل وخصائص معينة، وتختلف العناصر بطبيعتها فمنها البسيط
وعناصر الطباعة . BDE أو عناصر معقدة كعناصر TLabel العنصر
أي أننا نستطيع object-oriented programming من المعروف أن لغة الدلفي هي لغة برمجة غرضية التوجه
أن نكتب كتلنا البرمجية اعتمادًا على كتل أخرى ، فعند إنشاء النموذج لسنا بحاجة إلى كتابة التعليمات لإنشاء
النموذج وإظهاره ولسنا بحاجة أيضًا لكتابة التعليمات البرمجية لإظهار كل عنصر على النموذج ، إذ يكفي أن
بإضافة التعليمات البرمجية اللازمة لإظهار العنصر وطرق Delphi نسحب العنصر ونضعه على النموذج لتقوم
التعامل مع هذه العناصر )
وهو العنصر الرئيسي ( الأب ) في دلفي حيث تنحدر جميع Tobject تنحدر جميع العناصر في دلفي من العنصر
وتضيف إليها خواص جديدة أو تعدل في Tobject العناصر منه وحيث تأخذ العناصر بعض خواص العنصر
بعض هذه الخواص بما يلائم عمل كل عنصر والشجرة التالية توضح البناء الهيكلي للعناصر :
لماذا يتم إنشاء عناصر جديدة :
يقوم بعض المبرمجين المحترفين أو بعض المبرمجين الهواة بإنشاء عناصر جديدة حتى يجعلوا من البرمجة أمر
سهل وممتع ، لأنك كمبرمج عادي لا تستطيع أن تبرمج كل شيء بنفسك وعليك أن تعتمد على الغير في أنشاء
http://goo.gl/R2U0yZ لغة البرمجة دلفي
159
برامجك فلا حدود للإمكانيات التي تستطيع العناصر أن تقدمها وكل يوم نسمع عن عناصر جديدة وابتكارات جديدة
في عالم العناصر .
طرق إضافة عناصر جديدة إلى لوحة العناصر :
هناك العديد من الطرق لإضافة عناصر جديدة إلى صفحة العناصر وأفضل طريقة هي قراءة ملفات المساعدة التي
تأتي مع العنصر ولكننا سنركز على بعض الطرق العامة :
: .bpl 1 عن طريق استخدام المكتبة
فاتبع الطريقة التالية لإضافة هذا العنصر إلى صفحة العناصر : bpl إذا وجدت في فهرس العنصر ملف من النوع
Install Package اختر Component أ من الصفحة
واذهب إلى المسار Add تظهر عندها النافذة المجاورة اختر منها
واضغط .bpl الموجود فيه العنصر الذي تريد إضافته واختر ملف
. Ok على
مثال ( نفذ الطريقة السابقة على العنصر
TIBEAntialiasButton02_all
الموجود على الديسك المرفق ) . أو حمله من الموقع
http://www.ibe-software.com
ستلاحظ أن العنصر وضع نفسه في الصفحة الأخير في لوحة
العناصر .
ب الآن يجب إضافة مجلد العنصر إلى مسار المكتبات
المستخدمة في دلفي :
Tools 􀃆 Environment Options من القائمة
Library ستظهر عندها نافذة أختر منها الصفحة
لتظهر النافذة Library path اضغط على الزر
التالية :
اضغط على الزر المجاور لعنصر التحرير بالأسفل
( ... )
http://goo.gl/R2U0yZ لغة البرمجة دلفي
160
ثم اضغط على ( pas وملفات Dcu أو ملفات bpl وحدد مسار العنصر الذي قمت بإضافته ( حدد مسار ملفات
Ok ومن Add
بإمكانك الآن استخدام العنصر الجديد بالطريقة التي كنا نستخدمها مع أي عنصر سابق من عناصر دلفي ،( يفضل
( Demo استعراض الأمثلة التي تأتي مع العنصر عادة في الفهرس
: .Dpk 2 استخدام ملفات
فاتبع الخطوات التالية ( Delphi Package ملف حزمة دلفي ) .Dpk إذا وجد مع العنصر ملف من النوع
لإضافة هذا العنصر إلى صفحة العناصر :
لتظهر النافذة التالية : ok واضغط على .Dpk حدد الملف ذو الامتداد File 􀃆 Open أ من القائمة
ستظهر عندها رسالة تعلمك Install اضغط منها على الزر
بأنه قد تم تحميل العنصر .
ب اعد الخطوة ب الطريقة السابقة .
ملاحظة قد تظهر بعض المشاكل عن استخدام هذه الطريقة،
واختر من الصفحة option لحل المشكلة اضغط على الزر
وغير في القسم الموضح في النافذة التالية : Description
. Install ثم أغلق نافذة الخيارات واضغط على
: Pas 3 في حال العنصر الجديد مكون من ملف واحد من الامتداد
File أ افتح الملف من القائمة
: 􀃆Open
Component 􀃆 Install اختر القائمة
تظهر عندها النافذة Component
المجاورة
Into New package اختر الصفحة
واكتب أي اسم تريد في الحقل
ok واضغط على Package file name
. Install تظهر عندها النافذة الموضحة في الطريقة الثانية ، اضغط منها على
http://goo.gl/R2U0yZ لغة البرمجة دلفي
161
ب أعد الخطوة ب السابقة .
وتقوم بتنصيب نفسها تلقائيًا . ( Setup ) 4 بعض العناصر تأتي مع برنامج تنصيب
لماذا هذه الطرق المتعددة :
عمليًا هناك طريقة واحدة لتركيب العناصر وهي الطريقة الثالثة ولكن بعض المبرمجين يحتاج إلى أكثر من وحدة
، .Dpk وبالتالي ينشأ عندنا ملف Package في عنصره ولذلك يقوم بحزم هذه الوحدات في ملف حزمة Unit
في الطريقة الثانية أو الثالثة ، تقوم دلفي بإنشاء الملف ذو Package في النافذة Install عندما تضغط على الزر
وهو ملف المكتبات في دلفي ( في لغة الفيجول سي أو الفيجول بيسك يتم اعتماد الملفات ذات الامتداد Bpl الامتداد
. ( OCX أو DLL
إلى البرنامج عن توزيعه حيث يتم إدراج Bpl تتميز دلفي عن لغات البرمجة الأخرى بأنه لا حاجة لإضافة ملفات
عند استخدام فيجول Ocx و .DLL بينما يجب عليك إدراج ملفات ال .Exe هذه الملفات تلقائيًا في الملف التنفيذي
سي أو فيجول بيسك .
إنشاء العناصر في دلفي :
1 الطريقة الأولى : سوف نتعرف الآن على أسهل طريقة لإنشاء العناصر في دلفي :
سوف نقوم بإنشاء عنصر تحرير لا يقبل إدخال الأحرف ولعمل ذلك :
: OnKeyPress واكتب التعليمات التالية في الحدث Edit ابدأ مشروعًا جديدًا وأضف إليه العنصر
const s= [ '1','2','3','4','5','6','7','8','9','0',char(Vk_back)];
begin
if not (key in s ) then
key := char(VK_CAPITAL )
end;
تظهر عندها النافذة Component 􀃆 Create Component Template واختر Edit حدد بعدها العنصر 1
التالية :
اسم العنصر التي تريد Component name أكتب في الحقل
اسم Palette Page وحدد في الحقل ( TNumEdit )
الصفحة التي تريد أن يظهر فيها العنصر ( بإمكانك أن تكتب
اسم صفحة جديدة )
كما يمكنك تحديد أيقونة للعنصر الجديد عن طريق الضغط
. Change على الزر
سيظهر العنصر الجديد في الصفحة التي حددتها . Ok اضغط على
يمكنك عندئذٍ استخدامه في جميع برامجك اللاحقة .
2 الطريقة الثانية : سنقوم بكتابة نفس العنصر السابق ولكن بطريق أفضل .
File 􀃆 Close All أغلق جميع الوحدات في دلفي
http://goo.gl/R2U0yZ لغة البرمجة دلفي
162
: Component 􀃆 New Component اختر الأمر
تظهر عندها النافذة التالية :
TCustemEdit القيمة Ancestor type اختر من اللائحة
وهي العنصر الأب الذي سيرث عنصرنا الجديد خواصه .
اكتب اسم الصنف الذي تريده Class Name في الحقل
لعنصرك أن
TMyNumberEdit ( T ( يجب أن يبدأ بحرف
اكتب اسم الصفحة التي تريد أن Palette Page في الحقل
. ( MyComponent ) يظهر بها العنصر
بالشكل التالي : MyNumEdit ستظهر الوحدة ok اضغط على الزر
unit MyNumberEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
T MyNumberEdit = class(TCustomEdit)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [MyNumberEdit]);
end;
end.
سنشرح كل سطر من هذه الأسطر بشكل مبسط :
من TMyNumEdit هذه التعليمة تعرف نوع جديد باسم TMyNumberEdit = class(TCustomEdit) 1
TEdit هو النوع TCustomEdit النوع ) TEdit وهو النوع المشتق منه النوع TCustomEdit النوع
ولكن بدون أي خاصة أو حدث ، حيث سنقوم بإدخال الأحداث والخصائص المطلوبة بعد قليل ) .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
163
يتم في هذا القسم تعريف بعض المتحولات والتوابع والخصائص والتي يمكن الوصول إليها من : protected 2
قبل هذه الوحدة ( الوحدة المعرفة بها ) ومن أي وحدة مشتقة ( موروثة ) من هذه الوحدة . أي أننا إذا عرفنا
متحول في هذه المنطقة فإننا يمكننا قراءة قيمته والكتابة فيه ضمن أي وحدة ترتبط مع الوحدة
.MyNumberEdit
ويختلف عنه أن الخاصة Public يستخدم هذا القسم لتعريف الخصائص وهو يشبه القسم : published 3
سيتضح عمله فيما ... Event وفي صفحة ( Object inspector ) المعرفة هنا ستظهر في محرر الخواص
بعد .
: procedure Register 4
والذي RegisterComponents('Standard', [MyNumberEdit]); مهمة الإجراء هي استدعاء الإجراء
من صفحات العناصر . Standard في الصفحة MyNumberEdit يقوم بإظهار العنصر
وفيها اسم About والتي ستظهر في صفحة الخواص الخاصة About الآن سوف نبدأ بإضافة بعض الخاصة
مبرمج العنصر .
: Public أضف التعليمة التالية في القسم
constructor Create(AOwner: TComponent); override;
فقط ويقوم بإنشاء العنصر وتهيئته أي إعطاءه القيم Create هو منهج خاص يستخدم مع Constructor حيث
. Procedure بد ً لا من Constructor الابتدائية ويمكن اعتباره إجراء تستخدم فيه الكلمة المحجوزة
التعليمة التالية : Published أضف في القسم
Property About : string Read FAbout Write Fabout;
سيضاف Ctrl + Shift + C ضع مؤشر التحرير ( مؤشر لوحة المفاتيح ) عند هذا السطر واضغط على المفاتيح
. private إلى القسم String من النوع FAbout عندها المتحول
تأخذ هذه الخاصة قيمتها أثناء التصميم من String من النوع About تقوم هذه التعليمة بتعريف خاصة من اسمها
التعليمة
. Write FAbout وتأخذ قيمتها أثناء التنفيذ من التعليمة Read FAbout
سيضاف عندها Ctrl + Shift + C واضغط على المفاتيح Constructor ضع مؤشر التحرير على المنهج
والتي تجعل هذا التابع يرث جميع Inherited والذي سيبدأ بالتعليمة Implementation هذا المنهج إلى القسم
. TCustomEdit خواص التابع الأصل المعرف في الوحدة
: Inherited أضف التعليمة التالية بعد التعليمة
FABout := 'M.Khaled Nasser Agha';
. MyNumberEdit قم بحفظ الوحدة باسم
ستظهر النافذة المشروحة في الفقرة الثالثة من طرق Component 􀃆 install component افتح النافذة
في الحقل Editnumber واكتب into new package تركيب عنصر جديد على كل حال افتح الصفحة
أو Install ستفتح عندها نافذة جديدة اضغط فيها على أحد الزرين ok واضغط على الزر Package File Name
http://goo.gl/R2U0yZ لغة البرمجة دلفي
164
إذا كنت قد كتبت التعليمات السابقة بدون ) Standard سيظهر عندها العنصر في آخر الصفحة ، Compile
أخطاء ) أغلق نافذة واحفظ الملفات إذا ٌ طلب ذلك .
About ابدأ مشروعًا جديدًا وضع عليه العنصر الجديد ستجد أن أول خاصة له في محرر الخواص هي الخاصة
ولاحظ عدم وجود أي حدث لهذا العنصر Events بالإضافة إلى أن الخواص مختصرة بشكل كبير ، افتح الصفحة
.
لهذا العنصر حيث سيتم إدخال رقم إلى العنصر و الحصول منه على رقم من Num سنقوم الآن بإضافة الخاصة
. ( TEdit في العنصر من النوع Text خلال هذه الخاصة ( ستحل هذه الخاصة محل الخاصة
اختر File 􀃆 ReOpen أغلق الآن جميع النوافذ ومن القائمة
ستظهر الآن النافذة المجاورة، اضغط مرتين Editnumber.dpk
ستظهر عندها هذه الوحدة في محرر MyNumberEdit.pas
الشيفرة ، نستطيع الآن إجراء التعديلات التي نريد على هذه الوحدة
للتنقل التعديلات إلى العنصر Compile ومن ثم الضغط على الزر
... Standard الموجود على الصفحة TMyNumberEdit
. Published أضف الآن السطر التالي إلى القسم
property Num: Extended read FNum write SetFNum;
في FNum سيتم عندها تعريف المتحول Ctrl + Shift + C ضع مؤشر التحرير عند هذا السطر واضغط على
سيتم إضافة جسم الإجراء Implementation أيضًا ، وفي القسم SetNum وتعريف الإجراء Private القسم
أضف إليها التعليمة التالية : FNum := Value : وستوجد فيه التعليمة التالية SetNum
Text := floattostr(value);
ثم Compile احفظ الوحدة وعد إلى النافذة السابقة ( ستكون موجودة في الخلف عادة ) اضغط منها على الزر
ستلاحظ Standard من الصفحة MyNumberEdit أغلق هذه النافذة وابدأ مشروعًا جديدًا أضف إليه العنصر
أدخل فيها أي قيمة عددية لتظهر في العنصر أثناء التصميم ، أدخل مجموعة من Num أن لهذا العنصر الخاصة
ستلاحظ عدم قبول هذه الخاصة لإدخال الأحرف . Enter الأحرف واضغط على الزر
نفذ البرنامج وأدخل حروف في العنصر ستلاحظ قبول العنصر لها وهذا يدفعنا إلى الخطوة التالية في تطوير
العنصر وهي منع إدخال الأحرف إليه .
. MyNumberEdit.pas ثم افتح الوحدة EditNumber.dpk افتح الحزمة
وهو المسؤول عن TCustomEdit إلى وحدتنا وهذا التابع معرف في الوحدة KeyPress سوف نضيف التابع
: Public استقبال أحرف لوحدة المفاتيح لذلك أضف السطر التالي في القسم
procedure KeyPress(var Key: Char); override;
لكي Inherited ليضاف جسم الإجراء تلقائيًا وتضاف فيه التعليمة Ctrl + Shift + C اضغط على المفاتيح
TCustomEdit الموجود في الوحدة الأب المعرف فيها KeyPress يورث جميع التعليمات الموجودة في الإجراء
مباشرة : Implementation أضف الآن التعليمة التالية فوق التعليمة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
165
const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];
: Inherited وبعد التعليمة KeyPress وأضف التعليمة التالية في جسم الإجراء
If not (key in NumberChar ) Then key := char(VK_Capital);
ثم أغلقها . EditNumber.dpk في نافذة المجموعة Compile احفظ الوحدة واضغط على الزر
ابدأ مشروعًا جديدًا وأضف إليه عنصرنا الجديد ونفذ البرنامج .
بالإضافة Edit بقيت مشكلة وحيدة في عنصرنا وهي عدم وجود عدد كبير من الخصائص الموجودة في العنصر
وأكتب أسماء الخواص والأحداث التي Editnumber.dbk إلى عدم وجود أحداث ولإضافتها افتح الحزمة
كما في الشكل : Published تحتاجها في عنصرك في القسم
property BiDiMode;
property CharCase;
property Color;
property OnEnter;
property OnKeyPress;
property OnKeyDown;
property OnKeyUp;
ثم أضف عنصرنا الجديد إلى مشروع جديد لتلاحظ وجود هذه Compile واحفظ الوحدة بعدها واضغط على
الخواص فيه .
: MynumberEdit.pas وفيما يلي النص الكامل للوحدة
unit MyNumberEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TMyNumberEdit = class(TCustomEdit)
private
FAbout: string;
FNum: Extended;
procedure SetFNum(const Value: Extended);
{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
procedure KeyPress(var Key: Char); override;
{ Public declarations }
published
Property About : string Read FAbout Write Fabout;
property Num: Extended read FNum write SetFNum;
property BiDiMode;
property CharCase;
property Color;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
166
property Enabled;
property Font;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property PasswordChar;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyUp;
{ Published declarations }
end;
procedure Register;
const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];
implementation
procedure Register;
begin
RegisterComponents('Standard', [TMyNumberEdit]);
end;
{ TMyNumberEdit }
constructor TMyNumberEdit.Create(AOwner: TComponent);
begin
inherited;
FABout := 'M.Khaled Nasser Agha';
end;
procedure TMyNumberEdit.KeyPress(var Key: Char);
begin
inherited;
if not (key in NumberChar ) then
key := char(VK_Capital);
end;
procedure TMyNumberEdit.SetFNum(const Value: Extended);
begin
FNum := Value;
Text := floattostr(value);
end;
end.
http://goo.gl/R2U0yZ لغة البرمجة دلفي
167
الجلسة 25
: Drag and Drop : السحب والإفلات
: Sender 1 فهم الوسيط
ففي حدث الضغط على Event يدخل في جميع معالجات أحداث الصفحة Sender لا بد أنك لاحظت أن الوسيط
. TObject من النوع Sender الزر يظهر الإجراء التالي والذي له وسيط واحد هو
procedure TForm1.Button1Click(Sender: TObject);
هي Button مهمة هذا الوسيط هي إرجاع اسم العنصر الذي قام بالحدث أي أن قيمته عن الضغط على الزر 1
. Button1
ولفهم أعمق لهذا الوسيط نفذ المثال التالي :
: Button ابدأ مشروعًا جديدًا وأضف إليه زرين
أكتب التعليمة التالية : Button 1 اكتب في حدث الضغط على الزر 1
If sender = Button1 Then Showmessage ( ' You Click On Button1 ');
If sender = Button2 Then Showmessage ( ' You Click on Button2 ');
واختر OnClick واضغط على السهم المجاور للخاصة Event ثم انتقل إلى الصفحة Button 2 حدد الزر 2
من القائمة
. Button1Click
نفذ البرنامج واضغط على الزرين ولاحظ النتائج .
2 السحب والإفلات :
سنقوم الآن بكتابة : ListBox وعنصر Label مثال 1 : أضف إلى النموذج في مشروع جديد ثلاثة عناصر
بحيث يصبح لون ListBox وإفلاتها فوق العنصر Label التعليمات البرمجة التي تمكننا من سحب العناصر
لون مختلف Label المسحوب، لذلك أعط كل من العناصر Label بلون العنصر LIstBox العنصر اللائحة 1
. dmAutomatic القيمة DragMode وأعطهم جميعًا في الخاصة
التعليمة التالية : ListBox للعنصر 1 OnDragOver اكتب في الحدث
Accept := Source is Tlabel;
الوسطاء التالية : ListBox1DragOver يحوي الإجراء
. ListBox العنصر الذي يستدعي الإجراء وهو هنا العنصر 1 : Sender
في مثالنا . Label العنصر الذي يتم سحبه وهو أحد العناصر : Source
إحداثيات مؤشر الفأرة . : X,Y
يحدد طريقة تحرك الفأرة فوق العنصر . : State
فإن العنصر سوف يكون جاهزًا لإفلات العنصر فوقه ( سيتغير True عندما يأخذ هذا المتحول القيمة : Accept
شكل مؤشر الفأرة ليظهر بالشكل الذي يبين أن الإفلات مقبول )وإلا فإن العنصر سيرفض إفلات العنصر المسحوب
فوقه .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
168
. Tlabel من النوع Source إذا كان المتحول True تعيد هذه التعليمة القيمة : Source Is Tlabel
لنفس العنصر التعليمة التالية : OnDragDrop اكتب في الحدث
( sender as Tlistbox ).color := (Source as Tlabel ).color ;
نفسه Tlistbox كما نتعامل مع العنصر Sender تسمح لنا بالتعامل مع الوسيط Sender As TlistBox التعليمة
.
. Source As Tlabel كذلك بالنسبة للعنصر
ولاحظ النتائج . ListBox وأتركه فوق العنصر 1 Label نفذ البرنامج واسحب أحد العناصر
: مثال 2
أعط ،Picture إلى المثال السابق واجعله يظهر صورة ما عن طريق الخاصة Image أضف عنصر صورة
Image سنكتب التعليمات اللازمة التي تمكننا من وضع العنصر 1 dmAutomatic القيمة DragMode الخاصة
في مكان على النموذج .
التعليمة التالية : Form للنموذج 1 OnDragOver اكتب في الحدث اكتب في الحدث
accept := Source is Timage;
للنموذج التعليمة التالية : OnDragDrop اكتب في الحدث
(Source as Timage).Top := y;
(Source as Timage).Left := X;
ولاحظ تنقله فوق أي مكان من النموذج ولاحظ أيضًا أنه لا يمكن إفلاته Image نفذ البرنامج وحرك العنصر 1
.ListBox فوق العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
169
الرسم في دلفي :
ويمكننا Timage والعنصر TForm وهو أحد خصائص العنصر Canvas يتم الرسم في دلفي فوق عنصر الكنفا
رسم عدد من الأشكال الهندسية بواسطة توابع معرفة فوق عنصر الكنفا .
رسم مستقيم :
لرسم مستقيم يجب تحديد نقطة البداية ونقطة للنهاية
هما إحداثيات نقطة x,y حيث Form1.Canvas.MoveTo(x,y) أ يتم تحديد نقطة البداية عن طريق التعليمة
البداية، إذا أردت من المستخدم أن يحدد نقطة البداية عن طريق الضغط على زر الفأرة فوق النموذج ضع هذه
. Form للنموذج 1 OnMouseDown التعليمة في الحدث
x,y حيث Form1.Canvas.LineTo(x,y) ب يتم تحديد نقطة النهاية للمستقيم ضمن تعليمة رسم مستقيم وهي
هما إحداثيات نقطة النهاية لمستقيم ، وإذا أردت أن يتم رسم المستقيم في المكان الذي يحرر فيه المستخدم زر
. Form للنموذج 1 OnMouseUp الفأرة ضع هذه التعليمات في الحدث
نفذ الآن البرنامج واضغط على مؤشر الفأرة وأبقه مضغوطًا ثم حرك الفأرة إلى مكان جديد وحرر زر الفأرة ،
سيظهر عندها خط مستقيم بين نقطتي البداية والنهاية .
والذي يحدث أثناء OnMouseMove لإظهار الخط أثناء تحريك الفأرة ضع التعليمة التالية ضمن الحدث
تحريك الفأرة :
Form1.Canvas.LineTo(x,y);
تقوم هذه التعليمة بالرسم فوق النافذة عند تحريك الفأرة ، وإذا أردنا الرسم فقط عندما يكون زر الفأرة مضغوطًا
يجب إضافة التعليمات التالية:
للوحدة بحيث يصبح بالشكل : Var أ عدل القسم
var
Form1: TForm1; Drawing : boolean = false;
لتصبح بالشكل : OnMouseDown ب عدل التعليمات في الحدث
Drawing := True;
Canvas.MoveTo(x,y);
لتصبح بالشكل : OnMouseMove ج عدل التعليمات في الحدث
if Drawing Then Form1.Canvas.LineTo(x,y);
لتصبح بالشكل : OnMouseUp د عدل التعليمات في الحدث
Drawing := false;
نفذ البرنامج واضغط على زر الفأرة وارسم الخط .
هو أنه يرسم خط منحني ولا يرسم مستقيم بين نقطتين يحددهما المستخدم OnMouseMove إن مشكلة الحدث
ولذلك نضيف متحول جديد على الوحدة يقوم بحفظ النقطة التي ضغط عليها المستخدم وهذا المتحول من النوع
يخزن فيهما إحداثيات النقطة . Integer من النوع X,y هذا النوع عبارة عن سجل يحوي متحولين TPoint
كما يلي : private أ أضف تعريف المتحول على القسم
Origin : TPoint;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
170
لتصبح بالشكل : OnMouseDown ب عدل التعليمات في الحدث
Drawing := True; Canvas.MoveTo(x,y);
Origin := point(x,y);
لتصبح بالشكل : OnMouseMove ج عدل التعليمات في الحدث
If Drawing then Begin
Canvas.MoveTo(origin.X,origin.y) ; Form1.Canvas.LineTo(x,y);
end;
لتصبح بالشكل : OnMouseUp د عدل التعليمات في الحدث
Canvas.MoveTo(origin.X,origin.Y);
canvas.LineTo(x,y);
Drawing := false;
نفذ البرنامج واضغط على زر الفأرة وحركها سيتم رسم العديد من المستقيمات من نقطة التي ضغطت عليها إلى
النقطة التي يتحرك مؤشر الفأرة فوقها ، ولكننا نريد فقط أن يظهر في النهاية المستقيم الذي يرسمه الحدث
لكن لاتوجد تعليمة ، OnMouseMove لذلك سنقوم بمسح المستقيمات التي ترسم في الحدث ، OnMouseUp
ولكن بلون OnMouseMove لحذف مستقيم معين لذلك سنقوم برسم خط جديد فوق الخط الذي يرسم في الحدث
الأرضية وبهذا يبدوا عمليًا أن الخط قد تم مسحه، ولتحقيق ذلك عدل التعليمات في الوحدة لتغدو بالشكل :
الذي سنخزن فيه قيمة آخر نقطة مر عليها Tpoint من النوع Movept المتحول Private أ أضف على القسم
وبالتالي هي نفسها إحداثيات نهاية الخط الذي رسم باستخدام هذا الحدث . OnMoseMove الحدث
Origin,Movept :Tpoint;
: OnMouseDown ب أضف التعليمة في نهاية تعليمات الحدث الحدث
Movept := Point(x,y);
لتصبح بالشكل : OnMouseMove ج عدل التعليمات في الحدث
If Drawing then begin
canvas.Pen.Mode := pmNotXor;
canvas.MoveTo(origin.X,origin.y) ;
Canvas.LineTo(Movept.x,movept.y);
Canvas.moveto(origin.X,origin.y) ;
Canvas.LineTo(x,y);
end;
movept := point(x,y);
Canvas.Pen.Mode := pmCopy;
end;
فإننا بذلك طلبنا دمج الخط مع عنصورات pmNotXor وأعطيناها القيمة pen للقلم Mode عندما غيرنا الخاصة
في آخر PmCopy الأرضية وبذلك سيرسم الخط بنفس لون الأرضية وسيبدو وكأنه ممسوح وقد أعدنا القيمة
تعليمة لكي يكون القلم جاهز لرسم الخط النهائي عندما نحرر زر الفأرة .
1
2
http://goo.gl/R2U0yZ لغة البرمجة دلفي
171
التعليمتان 1 تقومان برسم خط بين النقطة التي حددها المستخدم وبين آخر نقطة مرت فوقها الفأرة ( النقطة
وسيكون لون الخط بلون الأرضية ( بما أننا نرسم خط جديد فوق خط سابق لونه ( Movept المخزنة في المتحول
ستقوم بطرح اللونين من بعضهما وإعادة لون الخلفية ) pmNotXor ذات القيمة mode أسود فإن الخاصة
التعليمتان 2 تقومان برسم خط جديد بين النقطة التي ضغط عليها المستخدم والنقطة التي تتحرك الفأرة فوقها
وسيظهر الخط باللون الأسود.
OnMouseMove إذا أردت أن تتأقلم مع التعليمات السابقة ( أن تفهمها بشكل جيد ) عدل التعليمات في الحدث
لتصبح بالشكل :
If Drawing then begin
canvas.Pen.Color := form1.Color ;
canvas.MoveTo(origin.X,origin.y) ;
Canvas.LineTo(Movept.x,movept.y);
canvas.Pen.Color := clblack;
canvas.moveto(origin.X,origin.y) ;
Form1.Canvas.LineTo(x,y);
end;
movept := point(x,y);
لكن عليك أن تعيدها على شكلها السابق لكي نكمل برنامجنا بالطريقة الصحيحة ...
حتى الآن استطعنا أن نرسم مستقيم ولرسم بقية الأشكال الهندسية سنقوم بإضافة شريط أدوات للبرنامج للتمكن من
اختيار الشكل الذي نريد رسمه :
إضافة شريط أدوات للشكل :
من القائمة ، كرر New Button إلى الشكل واضغط عليه بزر الفأرة اليميني واختر Toolbar أضف العنصر
العملية لإضافة أربع أزرار.
يجب إعطاء كل زر من الأزرار السابقة صور ما تدل على العمل الذي سيقوم به الزر، فإذا كنت تملك أيقونات
جاهزة فبإمكانك استخدامها وإلا فعليك أن ترسم هذه الأيقونات بنفسك ، قبل البدء بإنشاء الإيقونات قم بحفظ
. ( Painting واحفظ المشروع باسم Gragh المشروع ( احفظ الوحدة باسم
إنشاء أيقونات جديدة :
سيظهر Image Editor الأمر Tools اختر من القائمة
عندها برنامج تحرير الصور كما في الشكل :
File 􀃆New 􀃆 icon File اختر
16 Color و Small Icon ستظهر لك نافذة اختر منها
كما في الشكل المجاور Icon1.ico ستظهر عندها النافذة
فيها مربع الأخضر وهو يدل على المساحة الشفافة في
الأيقونة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
172
استخدم أداة رسم خط لرسم خط بين الزاوية اليسرى العلوية والزاوية اليمنى السفلية وبهذا نكون قد رسمنا أيقونة
وأغلقه ، ثم أنشأ الأيقونات الأخرى جديدة بنفس الطريقة بحيث تظهر Line.ico لزر رسم خط احفظ الملف باسم
الأشكال التالية فيها :
لاتنس أن تحفظ كل أيقونة باسم مناسب .
نعود الآن إلى مشروعنا :
وأضف Add واضغط عليه مرتين تظهر عندها نافذة أختر منها Win من الصفحة 32 ImageList أضف العنصر
الأيقونات الأربعة التي رسمتها .
لكل زر ImageIndex ثم عدل الخاصة Images للخاصة Imagelist واعط القيمة 1 Toolbar اختر العنصر 1
على لكي تظهر الأيقونات بالترتيب التالي :
. True القيمة Flat وأعط الخاصة ToolBars حدد العنصر
لتجميع هذه الأزرار مع بعضها ،True القيمة Grouped حدد الأزرار الأربعة سوية وأعطها في الخاصة
هذه الخاصة ستجعل أحد الأزرار مضغوطًا فقط ولايمكن أن نبقي ، tbsCheck القيمة Style وأعطها في الخاصة
زرين مضغوطين بنفس الوقت .
عندما نضغط على أحد الأزرار فإننا سنحدد الشكل الذي سترسمه الفأرة أثناء تحريكها لذلك سنعرف متحول يأخذ
قيمة مختلفة عند الضغط على كل زر من الأزرار وأفضل طريقة هي تعريف نوع معطيات تعدادي ، هذا النوع
Type سيربط بين سلسلة رمزية وبين رقم داخلي ويستبدله تلقائيًا ،لذلك صرح عن نوع المعطيات التالي في القسم
: Gragh من الوحدة
type
TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);
TForm1 = class(TForm)
ملاحظة : تعريف هذا النوع يكافئ التعريف التالي :
const
dtLine = 0;
dtRectangle = 1;
dtEllipse = 2;
dtRoundRect = 3;
: Private بما أننا عرفنا نوع فعلينا تعريف متحول من هذا النوع، لذلك أضف تعريف المتحول التالي للقسم
DrawingTool: TDrawingTool;
أكتب التعليمة التالية في حدث الضغط على الزر الأول :
DrawingTool := dtLine;
والتعليمة التالية في حدث الضغط على الزر الثاني :
DrawingTool := dtRectangle;
والتعليمة التالية في حدث الضغط على الزر الثالث :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
173
DrawingTool := dtEllipse;
والتعليمة التالية في حدث الضغط على الزر الرابع :
DrawingTool := dtRoundRect;
عند الضغط على كل زر من الأزرار . DrawingTool وبهذا نكون قد أعطينا قيمة محددة للمتحول
OnMouseUp عند رسم الأشكال لذلك نعدل التعليمات في الحدث DrawingTool الآن علينا أن نفحص قيمة
للنموذج كما يلي
case DrawingTool of
dtLine:
begin
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(X, Y)
end;
dtRectangle: Canvas.Rectangle(Origin.X, Origin.Y, X, Y);
dtEllipse: Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
dtRoundRect: Canvas.RoundRect(Origin.X, Origin.Y, X, Y,
(Origin.X - X) div 2, (Origin.Y - Y) div 2);
end;
Drawing := False;
End;
لتصبح OnMuseMove ولكي نستطيع مشاهدة الشكل الذي يرسم أثناء تحريك الفأرة نعدل التعليمات في الحدث
بالشكل :
if Drawing then
begin
Canvas.Pen.Mode := pmNotXor;
case DrawingTool of
dtLine: begin
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(MovePt.X, MovePt.Y);
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(X, Y);
end;
dtRectangle: begin
Canvas.Rectangle(Origin.X, Origin.Y, MovePt.X, MovePt.Y);
Canvas.Rectangle(Origin.X, Origin.Y, X, Y);
end;
dtEllipse: begin
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
end;
dtRoundRect: begin
Canvas.RoundRect(Origin.X, Origin.Y, X, Y,
(Origin.X - X) div 2, (Origin.Y - Y) div 2);
Canvas.RoundRect(Origin.X, Origin.Y, X, Y,
http://goo.gl/R2U0yZ لغة البرمجة دلفي
174
(Origin.X - X) div 2, (Origin.Y - Y) div 2);
end;
end;
end;
MovePt := Point(X, Y);
Canvas.Pen.Mode := pmCopy;
end;
شرح بعض التعليمات الواردة في الحدثين السابقين :
: ( Rectangle ) تعليمة رسم مستطيل
تقوم هذه التعليمة برسم مستطيل بمعرفة إحداثيات نقطتي البداية والنهاية لأحد أقطاره .
: ( Ellipse) تعليمة رسم قطع ناقص
تقوم هذه التعليمة برسم قطع ناقص أو دائرة بمعرفة :إحداثيات نقطتي قطر المستطيل الذي يمس القطع الناقص
أقطاره الأربعة أضلاع
: ( RoundRect ) تعليمة رسم مستطيل ذو زوايا مستديرة
تقوم هذه التعليمة برسم مستطيل ذو زوايا مستديرة بمعرفة نقطي القطر كما في رسم مربع ( الوسطاء الأربعة
الأولى ) ومعرفة الطول الذي سيأخذه القوس من ارتفاع وعرض المستطيل .
تغير شكل الخط :
يمكننا التحكم بشكل الخط، حيث يمكن أن يظهر بشكل منقط أو خطوط متتالية أو خط ونقطة ... ، كما يمكننا
التحكم بلون الخط وعرضه.
سنضيف الآن شريط أدوات جديد للتحكم بشكل الخط، هذا الشريط سيبقى مخفيًا حتى يضغط المستخدم على زر في
شريط الأدوات السابق ولتحقيق ذلك :
. False القيمة Visible وأعط الخاصة Win من الصفحة 32 Toolbar أ أضف شريط ادوات
. New Button ب أضف الآن ستة أزرار عن طريق الضغط على زر الفأرة اليميني والضغط على الزر
معه وأضف مجموعة من الأيقونات أو Toolbar جديد واربط العنصر 2 ImageList ج أضف عنصر 1
الصور إلى هذا العنصر (
اذهب إلى المجلد
C:\Program Files\Borland\Delphi6\Demos\Doc\Graphex
واضف الصور التالية منه على الترتيب :
solid.bmp - dashed.bmp - dotted.bmp - dashdot.bmp - dashdot2.bmp - clear.bmp
بحيث يصبح في النهاية بالشكل :
tbsCheck القيمة Style والخاصة True لها القيمة Grouped حدد الأزرار الستة وأعط الخاصة
ثم أضف زر جديد وأضف New Separator واختر toolbar د اضغط بزر الفأرة اليميني على العنصر 1
من المجلد السابق : ImageList الصور التالية إلى العنصر 1
http://goo.gl/R2U0yZ لغة البرمجة دلفي
175
pen.bmp - brush.bmp
tbsCheck القيمة Style أعط هذا الزر في الخاصة
ه في حدث الضغط على هذا الزر أكتب التعليمة التالية :
toolbar2.Visible := not toolbar2.Visible ;
عند الضغط هذا الزر فسيظهر شريط الأدوات الثاني وسيختفي إذا كان ظاهرًا .
: Toolbar أكتب التعليمة التالية في حدث الضغط على الزر الأول في شريط الأدوات الثاني 2
canvas.Pen.Style := pssolid;
والتعليمة التالية في حدث الضغط على الزر الذي يليه :
canvas.Pen.Style := psDash;
والتعليمة التالية في حدث الضغط على الزر الذي يليه :
canvas.Pen.Style := psdot;
والتعليمة التالية في حدث الضغط على الزر الذي يليه :
canvas.Pen.Style := psdashdot ;
والتعليمة التالية في حدث الضغط على الزر الذي يليه :
canvas.Pen.Style := psdotdot ;
والتعليمة التالية في حدث الضغط على الزر الذي يليه :
canvas.Pen.Style := psclear ;
تغير لون القلم :
ولتحقيق ذلك : Tpen يمكن أن نرسم بألوان مختلفة باستخدام عنصر القلم
إلى النموذج . ColorDialog أ أضف العنصر
ومن ثم زر جديد وفي حدث الضغط على هذا الزر أكتب ( Separator ) فاصل Toolbar ب أضف إلى 2
التعليمة التالية :
if ColorDialog1.Execute then
Canvas.Pen.Color := ColorDialog1.Color;
من الفهرس السابق ) . colors.bmp ج أعط هذا الزر أيقونة مناسبة ( الأيقونة
نفذ البرنامج ولاحظ النتائج .
تغير عرض القلم :
لكي يتمكن برنامجنا بالتحكم بعرض الخط المرسوم أضف ما يلي :
. ToolBar ضعه فوق العنصر 2 Edit أ عنصر
: Associate في الخاصة Edit أعطه في القيمة 1 Win من الصفحة 32 UpDown ب عنصر
:Edit للعنصر 1 OnChange ج أضف التعليمة التالية في الحدث
canvas.Pen.Width := strtoint(edit1.Text );
تغير نوع الفرشاة :
تستخدم الفرشاة في دلفي لتحديد النمط الذي ستمتلئ به الأشكال في دلفي :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
176
سنضيف الآن شريط أدوات جديد للتحكم بالفرشاة على غرار شريط الأدوات المستخدم للتحكم بالقلم ولتحقيق ذلك :
أ أضف شريط أدوات جديد إلى النموذج .
واكتب tbsCheck لهذا الزر القيمة Style وأعط الخاصة Toolbar ب أضف زر جديد إلى شريط الأدوات 1
في حدث الضغط عليه التعليمة التالية :
Toolbar3.Visible := Not Toolbar3.Visible ;
Grouped ج أضف إلى شريط الأدوات الجديد تسعة أزرار ، حدد الأزرار الثمانية الأولى منها وأعط الخاصة
وأعطها صور من المجلد السابق بحيث تظهر بالشكل : tbsCheck القيمة Style والخاصة True لها القيمة
أكتب في حدث الضغط على الزر الأول التعليمة التالية :
canvas.Brush.Style := bssolid;
وفي حدث الضغط على الزر التالي القيمة :
canvas.Brush.Style := bsclear;
وفي حدث الضغط على الزر التالي القيمة :
canvas.Brush.Style := bshorizontal;
للأزرار الباقية على التوالي : Style كرر التعليمة وغير القيمة المحلقة بالمنهج
bsVertical – bsFdiagonal – bsbdiaognal – bsColor – bsDiagCross
تغيير لون الفرشاة :
: ToolBar اكتب التعليمة التالية في حدث الضغط على الزر التاسع في شريط الأدوات 3
If ColorDialog1.Excetue then canvas.Brush.Color := ColorDialog1.Color ;
إضافة شريط الحالة إلى النموذج :
لإظهار معلومات عن حالات معينة ضمن التطبيق، سيظهر برنامجنا معلومات Status bar يستخدم شريط الحالة
عن موقع المشيرة الحالي بالإضافة إلى النقطة البدائية التي ضغط عليها المستخدم ولتحقيق ذلك :
. Win من الصفحة 32 StatusBar أ أضف العنصر
ستظهر عندها نافذة تحرير اللوحات اضغط فيها على Panel Editor 2 إضغط عليه بزر الفأرة اليميني واختر
مرتين لإضافة لوحتين . Add New الزر
. القيمة 150 Width 3 حدد اللوحة 0 وأعطها في الخاصة
للنموذج : OnMouseDown 4 أضف التعليمة التالية في حدث
StatusBar1.Panels[0].Text := Format ('origin = %d , %d',[x,y]);
للنموذج : OnMouseMove 5 أضف التعليمة التالية في الحدث
StatusBar1.Panels[1].Text := Format ('Point = %d , %d',[x,y]);
http://goo.gl/R2U0yZ لغة البرمجة دلفي
177
الجلسة 26
الرسم على عنصر صورة :
بما أننا نرسم على النموذج مباشرة فلن نستطيع إجراء عمليات على الصور المرسومة كالنسخ واللصق والحفظ
والطباعة، لذلك علينا تطوير برنامجنا ليكون قادرًا على الرسم فوق عنصر الصورة ، قبل إضافة عنصر الصورة
إلى الشكل عليك .
1 إضافة مساحة قابلة للتدرج :
بما أنك سترسم فوق عنصر صورة فقد يكون حجم الصورة أكبر من حجم النموذج وبالتالي علينا إضافة أشرطة
تمرير لكي يمكن المستخدم من الوصول إلى أجزاء الصورة الغير ظاهرة على النموذج ولتحقيق ذلك:
. alClient القيمة Align وأعط الخاصة Win من الصفحة 32 ScrollBox أضف العنصر
وأعطاه الخصائص التالية ScrollBox فوق العنصر 1 Image 2 إضافة عنصر صورة
True AutoSize
0 Left
True Stretch
0 Right
تحديد الحجم والصورة الابتدائية لعنصر الصورة :
عندما وضعنا صور على الشكل فإننا لم نحدد صورة لعرضها ولكننا حددنا مكان لتعرض فيه الصورة، وما علينا
ويمكن تحقيق ذلك بطريقتين : Image للعنصر 1 Picture الآن إلا وضع صورة فارغة في الخاصة
لعنصر Picture إلى الخاصة .Bmp 1 أثناء التصميم : إضافة صورة فارغة ذات لون أبيض ذات امتداد
الصورة .
ولتحقيق ذلك اكتب التعليمات Image وإلحاقة بالصورة 1 Bitmap 2 أثناء التنفيذ : إنشاء عنصر صورة نقطية
للنموذج : OnCreate التالية في الحدث
Var
Bitmap : TBitmap ;
Begin
Bitmap := Tbitmap.Create ;
Bitmap.Width := 200;
Bitmap.Height := 200;
Image1.Picture.Graphic := Bitmap;
Bitmap.Free ;
الرسم على عنصر الصورة :
ولتحقيق Canvas لن يختلف الرسم على عنصر الصورة عن الرسم على النموذج ، فعنصر الصورة يملك الخاصة
الرسم بدون إجراء تغيرات كبيرة في البرنامج نفذ مايلي :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
178
واختر من Graph 1 ضع مؤشر التحرير في أول الوحدة
فتظهر النافذة : Search 􀃆 Replace الأمر
Canvas القيمة Text To Find اكتب في الحقل
Image1.Canvas القيمة Replace With واكتب في
Replace All واضغط على الزر
مث ً لا Canvas.pen… سيتغير الآن كل سطر في الوحدة من
Image1.Canvas.pen.. إلى
واضغط Event 2 حدد عنصر الصورة وأذهب إلى الصفحة
واختر من القائمة OnMousemove السهم المجاور للحدث
للنموذج Form1MouseUp للصورة مع الحدث OnMouseup كذلك أربط الحدث ، FormMouseMove
.. OnmouseDown وكذلك الأمر بالنسبة للحدث
نفذ البرنامج ولاحظ النتائج .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
179
إضافة قائمة إلى برنامج الرسم :
سنضيف الآن قائمة إلى برنامج الرسم للتحكم بعنصر الصورة :
تحوي الأوامر File وأنشأ القائمة Standard من الصفحة MainMenu أضف العنصر
الموضحة بالشكل :
التي يجب أن تظهر كما في الشكل : Edit وأنشأ فيها القائمة
سنكتب الآن الأوامر التي يجب تنفيذها عند الضغط على كل زر من أزرار القائمة :
اكتب التعليمة التالية : File في القائمة Exit 1 في حدث الضغط على الزر
Close ;
ستظهر نافذة تطلب من المستخدم تحديد ارتفاع وعرض الصورة New 2 عندما يضغط المستخدم على الزر
الجديدة وعندما يضغط على الزر موافق سيتم إنشاء صورة فارغة :
أنشأ نموذج جديدًا وأعطه الخواص المناسبة بحيث يبدو كما في
الشكل :
الوحدة ) Graph للوحدة Public أضف المتحول التالي في القسم
الأولى )
CurrentFile : String;
سنستخدم هذا المتحول لحفظ الملف لاحقًا .
أكتب التعليمة التالية : New في حدث الضغط على الزر
Form2.ShowModal;
وفي حدث الضغط على الزر موافق في النموذج الثاني أكتب التعليمات التالية :
var bitmap : tbitmap;
begin
Bitmap := Tbitmap.Create ;
Bitmap.Width := strtoint(edit1.Text );
Bitmap.Height := strtoint(edit2.Text );
form1.Image1.Picture.Graphic := Bitmap;
bitmap.Free ;
Form1.CurrentFile := '' ;
close;
Close; : وفي حدث الضغط على الزر إلغاء الأمر أكتب التعليمة
نفذ البرنامج وأنشأ صورة جديدة .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
180
وبالتالي يمكن تحرير هذه Image سيقوم البرنامج بفتح صورة في العنصر Open 4 عند الضغط على الزر
الصورة أو الرسم فوقها :
. Dialog من الصفحة OpenPictureDialog أضف العنصر
اكتب التعليمة التالية : File من القائمة Open في حدث الضغط على الزر
if OpenPictureDialog1.Execute then
begin
CurrentFile := OpenPictureDialog1.FileName;
Image1.Picture.LoadFromFile(CurrentFile); end;
سنقوم بحفظ الصورة في اسم الملف المخزن في المتحول Save 3 عندما يضغط المستخدم على الزر
فهذا يعني أن الصورة جديدة وبالتالي نستدعي الأجراء CurrentFile = '' أما إذا كان CurrentFile
: Saveas1Click
. Save اكتب التعليمات التالية في حدث الضغط على الزر
if CurrentFile <> '' then
Image1.Picture.SaveToFile(CurrentFile)
else SaveAs1Click(Sender);
: Save As 4 عندما يريد المستخدم أن يحفظ الصورة في ملف جديد فإنه سيضغط على الزر
من القائمة Save As إلى النموذج واكتب في حدث الضغط على الزر SavePictureDialog اضف العنصر
التعليمات التالية File
if SavePictureDialog1.Execute then
begin
CurrentFile := SavePictureDialog1.FileName;
Image1.Picture.SaveToFile(CurrentFile); end;
5 طباعة الصورة :
وبإمكننا استخدام هذه الصفحة للصباعة هنا ولكن ،QReport تعاملنا سابقًا مع الصباعة باستخدام صفحة العناصر
يبقى أفضل ) : Qreport سنستخدم أسلوبًا جديدًا ( علمًا أن التعامل مع
من القائمة Print وفي حدث الضغط على الزر Graph للوحدة Uses إلى القسم Printers أ أضف الوحدة
اكتب التعليمات التالية : File
printer.BeginDoc ;
printer.Canvas.Draw(0,0,image1.Picture.Graphic );
printer.EndDoc ;
لإعطاء الطابعة إيعاز تبدأ عمليات الطباعة . BeginDoc يستخدم المنهج
لعنصر الطابعة Canvas في الخاصة Image لنسخ ( رسم ) الصورة 1 Canvas.Draw يستخدم المنهج
لإنهاء تكليف الطابعة وعند هذا الأمر تبدأ عملية الطباعة . EndDoc تستخدم التعليمة
مثال : Draw بد ً لا من التعليمة StretchDraw إذا أردت أن تتحكم بحجم الصورة استخدم التعليمة
printer.Canvas.StretchDraw(rect(0,0,4000,4000),image1.Picture.Graphic );
يحدد المستطيل الذي ستتمدد الصورة فيه . Rect حيث التابع
http://goo.gl/R2U0yZ لغة البرمجة دلفي
181
في برنامجنا : Clipboard استخدام الحافظة
سنستخدم الحافظة لكي نتمكن من نسخ صورة ولصقها بلإضافة إلى قصها في برنامجنا :
و CopyToClipbord حيث كان لهذا العنصر المنهجين DbImage استخدمنا الحافظة سابقًا للتعامل مع العنصر
المستخدم في برنامجنا Image ولكن للأسف العنصر PasteFromClipboard بالإضافة إلى CutToClipord
للتعامل في برنامجنا مع الحافظة ، لذلك أضف ClipBrd لا يملك هذه المناهج ولذلك علينا التعامل مع الوحدة
Graph للوحدة Uses إلى القسم ClipBrd الوحدة
1 نسخ الصورة إلى الحافظة :
Copy اكتب التعليمة التالية في حدث الضغط على الزر
Clipboard.Assign(Image.Picture);
. Clipboard تقوم هذه التعليمة بإلحاق هدف الصورة بهدف الحافظة
2 قص الصورة إلى الحافظة :
لقص الصورة إلى الحافظة نقوم أو ً لا بنسخ الصورة إلى الحافظة ومن ثم مسح الصورة :
: Cut اكتب التعليمات التالية في حدث الضغط على الزر
Var ARect :TRect ;
Clipboard.Assign(Image.Picture);
image1.Canvas.CopyMode := cmwhiteness;
ARect :=rect(0,0,image1.Width,image1.Height);
image1.Canvas.CopyRect( ARect,image1.Canvas,ARect);
image1.canvas.copymode := cmsrccopy;
عبارة عن نوع مستطيل وهو يعرف مستطيل من خلال معرفة إحداثيات البداية والنهاية للمستقيم TRect النوع
الذي يمثل أحد الأقطار.
تعني أن عملية نسخ صورة إلى الحافظة ستتم باللون الأبيض ( أي : Canvas.CopyMode := cmWhiteness
أن الصورة ستصبح بيضاء ) .
الحالية . Image تحدد أبعاد المستطيل بأبعاد العنصر : ARect := Rect ( 0,0,…)
عملية نسخ إلى المستطيل المحدد بالوسيط الأول : Canvas.CopyRect( ARect,Image.Canvas,ARect)
من الكنفا المحددة بالوسيط الثاني والوسيط الثالث يحدد أبعاد المستطيل الذي سينسخ من الكنفا الأصل . ARect
بكلمات أخرى تقوم هذه التعليمة بنسخ مستطيل بحجم الصورة من عنصر الكنفا إلى عنصر الكنفا نفسه وستكون
. CopyMode := cmWhiteness النتيجة صورة بيضاء لأننا الخاصة
إلى قيمتها الافتراضية CopyMode تعيد الخاصة : Canvas.CopyMode := cmsrcCopy التعليمة الأخيرة
.
لصق الرسومات من الحافظة :
عملية لصق صورة من الحافظة هي عملية معاكسة لعملية نسخ صورة إلى الحافظة وتتم بالتعليمة التالية :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
182
image1.Picture.Bitmap.Assign(clipboard) ;
ولكن تظهر لدينا هنا المشكلة التالية : تصور أن الحافظة تحوي عنصر نص ( قد تكون نقلت نص إلى الحافظة في
أي برنامج تحرير نصوص ) وبالتالي ستكون التعليمة السابقة تطلب لصق نص فوق عنصر صورة الأمر الذي
سيظهر رسالة خطأ ولذلك علينا فحص نوع المعلومات في الحافظة قبل إجراء عملية اللصق :
: Paste اكتب التعليمات التالية في حدث الضغط على الزر
if Clipboard.HasFormat(cf_BITMAP) then
image1.Picture.Bitmap.Assign(clipboard) ;
إذا كانت هناك صورة في الحافظة . HasFormat (CF_BITMAP) تعيد التعليمة
بهذا نكون قد انهينا برنامج الرسم وسننتقل الآن للتعامل مع الوسائط المتعددة ( الملتميديا ) في دلفي :
برمجة الأوساط المتعددة :
إن مصطلح الأوساط المتعددة يشير إلى أي شكل من أشكال العروض المتحركة ( الأفلام ) والصوت والمستخدمة
في الحاسب ،
للتعامل مع الأوساط المتعدد في دلفي : System في الصفة MediaPlayer يستخدم العنصر
ا تشغيل ملفات الأصوات :
: مثال 1
وأعطه الخصائص التالية : MediaPlayer أبدأ مشروعًا جديدًا وأضف إليه العنصر
تحديد الملف الصوتي الذي سيعرضه C:\WINDOWS\MEDIA\ CHORD.WAV Filename
العنصر
إمكانية التشغيل التلقائي True Autoopen
نفذ البرنامج واضغط على الزر الأخضر وستسمع الصوت إذا كانت أجهزة الصوت في حاسوبك جاهزة .
مثال 2 : تحديد الملف الصوتي أثناء التنفيذ :
إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية : OpenDialog أضف زر وعنصر
فقط .MP و الامتداد 3 .WAV بحيث يعرض ملفات من الامتداد OpenDialog للعنصر 1 Filter عدل الخاصة
.
أكتب التعليمة التالية في حدث الضغط على الزر
MediaPlayer1.Close ;
if openDialog1.Execute then begin
MediaPlayer1.FileName := Opendialog1.FileName ;
MediaPlayer1.Open ;
end;
إذا كان يعرض ملف صوتي عند ضغط الزر . MediaPlayer التعليمة الأولى تعمل على إيقاف عمل العنصر
http://goo.gl/R2U0yZ لغة البرمجة دلفي
183
فمهمتها Mediaplayer.Open أما التعليمة ، MediaPlayer والتعليمة الأخرى تسند أسم ملف جديد إلى العنصر
جعل العنصر فعا ً لا ، نفذ البرنامج وحدد ملف ما واضغط على الزر الأخضر .
عرض ملفات الفيديو :
في الخاصة MediaPlayer إلى النموذج السابق وأعط العنصر Panel لعرض ملفات الفيديو أضف العنصر
و .AVI بحيث يعرض ملفات OpenDialog للعنصر 1 Filter ثم عدل الخاصة ، Panel القيمة 1 Display
. .MPG و .DAT
نفذ البرنامج الآن واضغط على الزر وحدد الملف ( طبعًا إذا كنت لا تملك غيره ) :
C:\Program Files\Borland\Delphi6\Demos\CoolStuf\ speedis.avi
وشاهد العرض . Play واضغط على الزر
: MediaPlayer سماع الصوت بدون استخدام العنصر
: SpeedButton ابدأ مشروعًا جديدًا وأضف إليه الزر
للعنصر OnMouseUP واكتب التعليمات التالية في الحدث Uses للقسم MMSystem أضف الوحدة
SpeedButton
PlaySound('C:\WINDOWS\MEDIA\DING.WAV',0,0)
طبعًا بإمكانك تحديد اسم الملف الذي تريد في الوسيط الأول .
http://goo.gl/R2U0yZ لغة البرمجة دلفي
184
الجلسة 27
التعامل مع الملفات :
ا نسخ ملف :
مثال :
،C:\temp وأنشأ المجلد Test.Bmp باسم C:\ أنشئ صورة باستخدام برنامج الرسام واحفظها على القرص
: C:\temp وأبدأ مشروعًا جديدًا واكتب في حدث الضغط على زر التعليمات اللازمة لنسخ هذا الملف إلى المجلد
copyfile('c:\Test.bmp','c:\Temp\Test.bmp',False) ;
الوسيط الأول : هو الملف المصدر ( الملف الذي سيتم نسخه ) .
الوسيط الثاني : هو الملف الهدف ( الملف الذي سيتم إنشاءه وسيكون نسخة عن الأصل في الملف الأول ) يمكن
وبهذا سيتم نسخ الملف 'C:\Temp\Des.bmp' أيضًا تغير اسم الملف الهدق أي يمكن أن يكون الوسيط الثاني
وبالتالي سيكون للملفين أسمين مختلفين ولكنهما سيحويان نفس C:\temp\des.bmp إلى الملف C:\test.bmp
البيانات .
فإن التابع سيفشل في حال كان هناك ملف بنفس الأسم True الوسيط الثالث : في حال أعطيت هذا الوسيط القيمة
فهذا يعني أنه ستتم الكتابة فوق الملف الهدف إذا كان موجودًا . False في المجلد الهدف وأما أن كانت قيمته
2 نقل ملف :
تقوم التعليمة التالية بنقل الملف من مكان إلى آخر مع إمكانية تغيير أسمه : ( أضف زر إلى المشروع السابق
واكتب فيه التعليمة التالية :
Movefile('c:\temp\test.bmp','c:\movetest.bmp');
الوسيط الأول هو الملف الأصل ، والوسيط الثاني هو الملف الهدف ، سيفشل التابع في حال كان الملف الأصل غير
موجود أو في حال كان الملف الوجهة موجودًا ( ليس هناك هنا اكانية للكتابة فوق الملف ) .
3 حذف ملف :
لحذف ملف ما استخدم التعليمة التالية :
DeleteFile('c:\movetest.bmp');
4 طرق أنشاء الملفات والتعامل معها في دلفي :
1 ملفات لغة الباسكل : يمكنك إنشاء الملفات النصية والملفات محددة النوع والملفات غير محددة النوع (
و Rewrite و Reset و AssignFile ) باستخدام التعليمات المعروفة في لغة تربو باسكل مثل ( Untyped File
تعتبر هذه الطريقة غير متوافقة مع ويندوز ولكنها تعمل على أية حال ،( .. CloseFile و Writeln و Readln
ولكن تفضل الطرق الأخرى .
يتم تعين مقبض للملف عند إنشاءه أو فتحة ومن : ( File Handles ) 2 التعامل مع مقابض الملف في ويندوز
لإتمام عملها Windows Api ثم يتم التعامل مع هذا المقبض حيث تستدعي التوابع المستخدمة في هذه الحالة توابع
. SysUtils وجميع هذه التوابع موجودة في الوحدة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
185
هو نهر أو جدول أو سيل ولا أعرف كيف أترجمها Stream معنى كلمة ) : File Streams 3 ملفات ستريم
TFileStream في هذه الحالة وقد جرت العادة بين المبرمجن الحديث عنها ب ستريم فيل ) هذه الملفات من النوع
وهي ملفات تستطيع أن تخزن فيها أي نوع من البيانات كما يمكن أن تحفظ فيها بياناتك بطريقة مشفرة بحيث لا
وهذا يمكنك TMemoryStream و TStream يستطيع أحد غيرك الإطلاع عليها تتعامل هذه الملفات مع النوعين
من التعامل مع الذاكرة بشكل مباشر ويمكنك تحميل بياناتك إلى الذاكرة ومن ثم تخزينها في ملف أو يمكنك تحميلها
بياناتك إلىالذاكرة ليتشارك عليها أكثر من جزء من برنامجك .
: ( Working With File Handles ) التعامل مع الملفات عن طريق المقبض
سنوضح مثا ً لا يبين طريقة التعامل مع هذه الملفات :
أ الكتابة إلى ( في ) ملف :
أكتب في حدث الضغط على زر التعليمات التالية :
var FileHandle:integer;
S:string;
Begin
if Not FileExists('c:\MyFile.mka') then
FileHandle:= FileCreate('c:\MyFile.mka') Else
FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;
s:= 'khaled Nassr Agha' ;
FileWrite(FileHandle,Pointer(s)^,length(s ));
Fileclose(FileHandle);
end;
في حال كان الملف موجودًا وفي حال عدم وجود True التي تعيد القيمة FileExists في البداية نستخدم التعليمة
أما ، FileHandle التي ينشأ الملف ويعيد رقم مقبض هذا الملف في المتحول FileCreate الملف نستخدم التابع
الذي يقوم بفتح الملف ويعيد رقم مقبض هذا الملف في FileOpen في حال وجود الملف سابقًا فنستخدم التابع
هو أحد القيم التي يأخذها هذا الملف ويعني انه fmOpenReadWrite والوسيط الثاني ، FileHandle المتحول
سنستخدم الملف للقراءة والكتابة وهناك عدة قيم أخرى راجع ملفات المساعدة للحصول على معلومات عنها.
وبطول FileHandle والتي هي من نوع مؤشر في الملف ذو المقبض S يقوم بكتابة القيمة FileWrite التابع
. S المتحول الثالث والذي يشير هنا إلى طول السلسلة
تقوم بإغلاق الملف المفتوح . FileClose التعليمة الأخيرة
ب القراءة من ملف :
و زرًا جديدًا واكتب في حدث الضغط عليه التعليمات التالية : Memo أضف عنصر
var FileHandle,FileSize : integer;
s:string;
begin
if FileExists ('c:\MyFile.mka') then begin
FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
186
FileSize:=getfilesize(FileHandle,nil);
setlength(s,FileSize);
Fileread(FileHandle,pointer(s)^,FileSize);
Memo1.Text := s;
Fileclose(FileHandle);
end;
هو مقبض الملف Handle حيث : SeekFile ( Handle, Offset ,origin) للتنقل ضمن الملف تستخدم التعليمة
القيم التالية : Origin ويأخذ Origin مقدار الإزاحة عن Offset و
من أول الملف . Offset 0 يتم اعتبار الإزاحة
من موقع المؤشر الحالي . Offset 1 يتم اعتبار الإزاحة
من آخر الملف . Offset 2 يتم اعتبار الإزاحة
تضع مؤشر الملف في بداية الملف و التعليمة SeekFile(FileHandle, مث ً لا التعليمة ( 0,0
تضع مؤشر الملف على بعد 12 حرف من آخر الملف . Seekfile(FileHandle,12,2)
: File Stream الملفات ستريم
سنأخذ مثا ً لا بسيطًا عن كيفية أنشاء هذا النوع من الملفات زمن القراءة والكتابة إليها :
والكتابة إليه : TFileStream إنشاء ملف من النوع
أضف زر إلى نموذج جديد واكتب في حدث الضغط على الزر التعليمات التالية :
Var FileStream : TFileStream ;
buffer : String;
begin
FileStream := TFileStream.Create('c:\MyStream.tst',fmCreate) ;
Buffer := ' This Line Will Be Save to File ' ;
FileStream.Write(pointer(Buffer)^,Length(Buffer));
FileStream.Free ;
end;
فإنه يقوم fmCreate أما الوسيط C على القرص MyStream.Tst تنشأ الملف TFileStream.Create التعليمة
بإنشاء الملف إذا لم يكن موجدًا وفي حال كان موجودًا يفتح الملف في وضع للكتابة فقط .
لا تتعامل إلا مع المؤشرات ) ) Buffer تقوم بكتابة النص في المتحول : FileStream.Write التعليمة
وإغلاق الملف المرتبط معه . FileStream تقوم بتحرير المتحول : FileStream.Free التعليمة
: TFileStream القراءة من ملف
إلى النموذج السابق واكتب التعليمات التالية في حدث الضغط على زر جديد : Memo أضف عنصر
Var FileStream : TFileStream ;
buffer : String;
FileSize : integer;
begin
FileStream := TFileStream.Create('c:\MyStream.tst',fmOpenRead) ;
FileSize := (FileStream.size );
http://goo.gl/R2U0yZ لغة البرمجة دلفي
187
Setlength(Buffer,FileSize);
FileStream.read(pointer(Buffer)^,FileSize);
memo1.text := Buffer;
FileStream.Free ;
end;
لتحديد حجم FileStream.Size ومن ثم استخدمنا التعليمة Create قمنا او ً لا بفتح الملف للقراءة فقط في التعليمة
ثم قرأنا من الملف إلى المتحول SetLength حجم هذا الملف عن طريق التعليمة Buffer الملف وأعطينا المتحول
. Memo ووضعنا النتيجة في العنصر 1 Buffer
ملاحظات :
( Origin لنقل مؤشر الملف لمسافة محددة تبعًا للوسيط Seek تقوم التعليمة : FieStream.Seek 1 التعليمة
للإطلاع أكثر على وسطاء هذه التعليمة ). SeekFile للتعليمة Origin راجع الوسيط
معلومات مفيدة :
ا تشغيل برنامج آخر من داخل برنامجك :
بفرض أنك تريد تستدعي برنامج الآلة الحاسبة ضمن برنامج : من المعلوم أن برنامج الحاسبة يتم تنفيذة عن طريق
الموجود ضمن فهرس الويندوز ولاستدعاء هذا البرنامج من برنامج اكتب التعليمة التالية في Calc.exe الملف
حدث الضغط على زر :
WinExec('C:\Windows\Calc.exe' ,Sw_Show) ;
تقوم هذه التعليمة بإظهار بتشغيل برنامج الآلة الحاسبة .
وهذا يحصل بشكل افتراضي C:\Windows ملاحظة : تفترض هذه التعليمة أن مجلد الويندوز على جهازك هو
Windows و Windows أما الفهرس الافتراضي ل 2000 Windows Me و Windows عند تنصيب 98
وكما تعلم يمكن للمستخدم تغير هذه الفهارس أثناء تنصيب نظام التشغيل لذلك تستخدم عادة C:\Win فهو 32 Xp
GetWindowsDirectoy : للوصول إلى فهرس نظام التشغيل مثال GetWindowsDirectory التعليمة
وسيكون فيه اسم مجلد الويندوز ( لاتنس استخدام التعليمة Pchar من النوع p حيث (p,200);
بعدها . FreeMem(p, قبل هذه التعليمة والتعليمة ( 200 GetMem(p,200)
2 تشغيل ملف تابع لبرنامج آخر من برنامج :
ويعرض أحد الملفات ( Microsoft Word ) بقرض أنك تريد من برنامجك أن يشغل برنامج مايكروسوفت وورد
لتحقيق ذلك استخدم التعليمات التالية :
ومن ثم أكتب التعليمة التالية في حدث الضغط على زر . Uses إلى القسم ShellApi أضف أو ً لا الوحدة
shellapi.ShellExecute(0 ,'Open','C:\My Documents\Test.doc',Nil,Nil,0) ;
. My Document الموجود في المجلد Test.doc تقوم هذه التعليمة بفتح الملف
. 'Print' بالوسيط 'Open' إذا أردت من برنامجك فتح الملف وطباعته مباشرة استبدل الوسيط
http://goo.gl/R2U0yZ لغة البرمجة دلفي
188
تقوم هذه التعليمة بالعودة إلى بيئة ويندوز لمعرفة البرنامج الافتراضي الذي تستخدمه لفتح هذا النوع الملفات ومن
ستقوم C:\Mypicture.jpg ثم تقوم بتشغيل البرنامج وفتح الملف بداخله فإذا اخترت استخدمت في التعليمة الملف
Internet التعليمة التعليمة بالبحث عن البرنامج الافتراضي الذي يفتح هذا النوع من الصور فقد يكون فوتوشوب أو
. Explorer
استخدام التعليمة السابقة لفتح مجلد ما :
إذا أردت فتح مجلد ما في مستكشف ويندوز أكتب التعليمة التالية :
shellapi.ShellExecute(0 ,'Open','C:\My Documents',Nil,Nil,0) ;
. C:\My Document تقوم التعليمة السابقة بفتح مجلد
http://goo.gl/R2U0yZ لغة البرمجة دلفي
189
الجلسة 27
برنامج المفكرة :
ويختلف عنه بأنه سيتعامل مع ملفات ( Notepad ) سنقوم الآن بكتابة برنامج يشابه برنامج المفكرة في ويندوز
بحيث يمكننا أن نفتح أكثر من ملف MDI كما أنه سيكون من النوع ، Txt بالإضافة إلى الملفات Rtf من النوع
بنفس الوقت .
وأعط الخصائص التالية للعناصر OpenDialog والعنصر MainMenu أبدأ مشروعًا جديدًا وأضف إليه العنصر
:
: Form عنصر النموذج 1
الخاصة القيمة
bdRightToLeft BiDiMode
برنامج المفكرة Caption
fsMDIForm FormStyle
MainForm Name
poDesktopCenter Position
أنشئ في هذا العنصر القائمة ( ملف ) والقائمة ( إطار ): : MainMenu عنصر القائمة
وأضف إليه الأوامر ( الأزرار ) التالية : FileMenu القيمة Name أعط الزر (ملف ) في الخاصة
Shortcut قيمة الخاصة Name قيمة الخاصة Caption قيمة الخاصة
New &جديد
OpenFile &فتح
CloseApp &خروج
وأضف إليه الأوامر ( الأزرار ) التالية : Window القيمة 1 Name أعط الزر (إطار) في الخاصة
Shortcut قيمة الخاصة Name قيمة الخاصة Caption قيمة الخاصة
ترتيب
تتالي
-
: OpenDialog العنصر 1
.rtf DefaultExt
الأسطر التالية : Filter ضع في الخاصة Filter
Filter Name Filter
Rich Text *.rtf
Text File *.Txt
All File *.*
. MyTextEditor.Dpr والمشروع باسم Main.pas احفظ الوحدة باسم
http://goo.gl/R2U0yZ لغة البرمجة دلفي
190
MainMenu وأضف أليه العناصر التالية : عنصر File􀃆 New 􀃆 Form أضف إلى المشروع نموذجًا جديدًا
.FontDialog وعنصر PrintDialog و SaveDialog وعنصر Win من الصفحة 32 RichText و عنصر
أعط النموذج الجديد الخصائص التالية :
bdRightToLeft BiDiMode
fsMDIChild FormStyle
EditForm Name
ثلاث قوائم باسم ( ملف ) و ( تحرير ) و ( تنسيق ) وأنشئ في كل منها أزرار MainMenu أنشئ في العنصر 1
حسب الجدول التالي :
وأضف إليه الأوامر ( الأزرار ) التالية : FileMenu القيمة Name أعط الزر (ملف ) في الخاصة
Shortcut قيمة الخاصة Name قيمة الخاصة Caption قيمة الخاصة
New &جديد
OpenFile &فتح
Ctrl+S Save حفظ
SaveAs حفظ باسم
PrintFile طباعة
CloseFile إغلاق
CloseAll &خروج
وأضف إليه الأوامر ( الأزرار ) التالية : EditMenu القيمة Name أعط الزر (تحرير ) في الخاصة
Shortcut قيمة الخاصة Name قيمة الخاصة Caption قيمة الخاصة
Ctrl+C CopyText نسخ
Ctrl+X Cuttext قص
Ctrl+V PasteText لصق
Ctrl+A SelectAll تحديد الكل
وأضف إليه الأوامر ( الأزرار ) التالية : EditMenu القيمة Name أعط الزر (تنسيق ) في الخاصة
Shortcut قيمة الخاصة Name قيمة الخاصة Caption قيمة الخاصة
Left محاذاة إلى اليسار 1
Right محاذاة إلى اليمين 1
Center محاذاة إلى الوسط 1
-
WordWrap التفاف تلقائي 1
Font خط 1
هذا سيجعلها تبدو True القيمة RadioItem حدد الأزرار الثلاثة الأولى من القائمة تنسيق وأعطها في الخاصة
http://goo.gl/R2U0yZ لغة البرمجة دلفي
191
كأزرار الراديو ولا يمكن اختيار إلا واحد منها في ذات الوقت .
الخصائص التالية : Richedit أعط العنصر 1
alClient Align
Editor Name
الخصائص التالية : Savedialog أعط العنصر 1
.rtf DefaultExt
الأسطر التالية : Filter ضع في الخاصة Filter
Filter Name Filter
Rich Text *.rtf
Text File *.Txt
EditText.pas _ احفظ البرنامج وسمي الوحدة الجديدة باسم
: MainForm اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج
TEditForm.Create(Self);
وسيط معرف يعود إلى النموذج الذي يطلب فيه هذا الوسيط . Self الوسيط
:EditForm - اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج
TEditForm.Create(Self);
اكتب التعليمة التالية : EditForm للنموذج OnClose - في الحدث
Action := CaFree ;
حيث CaMinimized تمكننا هذه التعليمة من إغلاق النافذة الابن وتكون قيمتها الافتراضية في النموذج الابن هي
يتم تصغير النموذج الابن بد ً لا من إغلاقه عند الضغط على الزر إغلاق .
عندما يقوم المستخدم بالضغط على الزر فتح من القائمة ( سواء في النافذة الأب أو الابن ) سنقوم بإنشاء نافذة
كما سنغير عنوان النافذة ليكون باسم ، ( TrichEdit ) Editor ابن جديدة وسنقوم تحميل الملف إلى العنصر
الملف الذي نفتحه .
قبل البدء بكتابة التعليمات الخاصة بفتح ملف سنقوم بتعريف ما يلي :
. EditText للوحدة Private في القسم String من النوع PathName عرف المتحول
_ عرف الثابت :
const
DefaultFileName = ' ;'بدون عنوان
: EditText للوحدة public _ أضف تعريف الإجراء التالي في القسم
Procedure Open(const AFileName: string);
سيتم عندها إضافة التابع السابق Ctrl+Alt+C ضع مؤشر لوحة المفاتيح عند السطر السابق واضغط الأزرار
اكتب التعليمات التالية في جسم التابع : ، Implementation إلى القسم
PathName := AFileName;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
192
Caption := ExtractFileName(AFileName);
with Editor do
begin
Lines.LoadFromFile(PathName);
SelStart := 0;
Modified := False;
end;
يعيد اسم الملف مع امتداده وبدون ذكر المسار . : ExtractFileName ( AFileName) التابع
تكافئ التعليمات : With Editor Do begin …. End; التعليمات ضمن الكتلة
Editor.Lines.LoadFromFile(PathName);
Editor.SelStart := 0;
Editor .Modified := False;
لنتخلص من ذكر العنصر في كل سطر من سطور البرنامج . Width أي أننا نستخدم التعليمة
في بداية الملف . Editor ضع مؤشر التحرير للعنصر Editor.selstart := التعليمة 0
في حال عدل المستخدم في أي نقطة من الملف المفتوح . True تأخذ القيمة Editorr.Modified التعليمة
اكتب التعليمة التالية : MainForm في حدث الضغط على الزر فتح في القائمة ملف للنموذج
If OpenDialog1.Execute Then
TeditForm.Create(Self).Open(OpenDialog1.FileName ) ;
الذي كتبناه سابقًا . Open بإنشاء نافذة جديدة ومن ثم طلب تنفيذ الإجراء Then تقوم التعليمة بعد
اكتب التعليمة التالية : EditForm في حدث الضغط على الزر فتح في القائمة ملف للنموذج
MainForm.Openfile.Click ;
_ عند إنشاء ملف جديد سنعطي عنوان النافذة التي تفتح هذا الملف اسم افتراضي لذلك اكتب التعليمات التالية في
: EditForm للنموذج OnCreate الحدث
PathName := DefaultFileName;
سيدل على الاسم الافتراضي للملف الجديد . PathName أي أن المتحول
حفظ الملف :
فقط وعلى برنامجنا حفظ الملف rtf يقوم بحفظ الملفات بامتداد TRichEdit وهو من النوع Editor العنصر
إليه ومن ثم Editor لنقل أسطر العنصر Tstrings لذلك سنستخدم متحول من النوع Txt أو بالامتداد rtf بامتداد
. .Txt ذا طبعًا عند اختيار المستخدم حفظ الملف بالامتداد ÷ حفظ أسطر هذا المتحول على ملف
اكتب التعليمات التالية : EditForm في حدث الضغط على الزر حفظ في القائمة ملف للنموذج
var S: Tstringlist;
begin
if PathName = DefaultFileName then
SaveAsClick(Sender)
else
begin
if uppercase(rightstr(PathName,3)) = uppercase( 'rtf' ) then
Editor.Lines.SaveToFile(PathName) else
try
http://goo.gl/R2U0yZ لغة البرمجة دلفي
193
S:=Tstringlist.Create ;
s.AddStrings(Editor.Lines )
finally
s.SaveToFile(PathName) ;
end;
Editor.Modified := False;
end;
فإذا كانت قيمته هي القيمة الافتراضية أي "بدون عنوان" PathName تقوم التعليمات السابقة بفحص المتحول
يعني أن الملف جديد ولم يتم حفظه سابقًا ،مما يستدعي طلب التعليمات التي تنفذ عند الضغط على حفظ باسم أما أذا
لا يساوي القيمة الافتراضية مما يدل أن للملف مسار وأسم محددين وسندرس هنا احتمالين : PathName كان
) Editor.Lines.SaveToFile(PathName) وبالتالي ننفذ التعليمة rtf 1 أن يكون امتداد الملف هو
'rtf' مع القيمة PathName واضح أن الشرط الذي يسبق هذه التعليمة يقارن الأحرف الثلاثة الأخيرة في المتحول
بعد تحويل القيمتين على أحرف كبيرة .
وننقل أسطر العنصر TStringList من النوع S وبالتالي ننشئ المتحول Txt 2 أن يكون امتداد الملف هو
أي أن الملف لم يتم تعديله بعد Editor.Modified للخاصة False إليه ومن ثم نحفظه ، ثم نعيد القيمة Editor
الحفظ الأخير .
حفظ الملف باسم :
: EditForm اكتب التعليمات التالية في حدث الضغط على الزر حفظ في القائمة ملف للنموذج
SaveDialog1.FileName := PathName;
if SaveDialog1.Execute then
begin
PathName := SaveDialog1.FileName;
Caption := ExtractFileName(PathName);
SaveClick(Sender);
end;
التعليمة الأولى تجعل صندوق الحوار حفظ باسم أن يظهر الاسم الحالي للملف كاسم افتراضي والتعليمات التالية
وتغير PathName تقوم بوضع اسم الملف الذي اختاره المستخدم في صندوق الحوار حفظ باسم في المتحول
ليتم حفظ الملف وفق SaveClick ( Sender ) عنوان النافذة ليأخذ اسم الملف الجديد .ومن ثم تستدعي الإجراء
الامتداد الذي اختاره المستخدم .
إغلاق الملف :
: EditForm اكتب التعليمة التالية في حدث الضغط على الزر إغلاق في القائمة ملف للنموذج
Close;
الخروج من البرنامج :
:MainForm اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذج
Close;
http://goo.gl/R2U0yZ لغة البرمجة دلفي
194
: EditForm اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذج
MainForm.CloseApp.Click ;
يتم إغلاق جميع النوافذ الأبناء عند إغلاق النموذج الأب .
أمامنا الآن مشكلة جديدة ، افرض أن المستخدم قد عدل الملف ثم ضغط على الزر إغلاق بدون حفظ الملف ،
سيقوم البرنامج في هذه الحالة بإغلاق الملف دون حفظ ولذلك علينا إظهار رسالة حوار تسأل المستخدم إذا كان
يريد أن يحفظ الملف أم لا .
: EditForm للنموذج OnCloseQuery اكتب التعليمة التالية في حدث الضغط على الحدث
Const
SWarningText = ' ;'هل تريد حفظ التغيرات المدخلة على الملف
begin
if Editor.Modified then
begin
case MessageDlg(Format(SWarningText + #13 + '%s', [PathName]), mtConfirmation,
[mbYes, mbNo, mbCancel], 0) of
mrYes: SaveClick(Self);
mrCancel: CanClose := False;
end;
end;
end;
عندما يضغط المستخدم على زر إغلاق وقبل أن يتم إغلاق النموذج ويجود مع OnCloseQuery يتم تنفيذ الحدث
يرفض البرنامج False وعند إعطاءه القيمة ، True والذي يأخذ قيمة افتراضية CanClose هذا الحدث الوسيط
إغلاق النافذة .
إذا قام المستخدم بإجراء أي تعديل على True الذي يأخذ القيمة ) Editor.Modified نفحص عندها المتحول
الملف ) ، وعندها نظهر صندوق حوار يسأل المستخدم إذا كان يريد حفظ الملف وهذا الصندوق ذو ثلاث أزرار :
. SaveClick إذا ضغط المستخدم على هذا الزر فإنه يريد حفظ الملف ونستدعي عندها التابع : Yes
إذا ضغط المستخدم على هذا الزر فإنه لا يريد حفظ الملف وسيتم إغلاق النافذة . : No
CanClose إذا ضغط المستخدم على هذا الزر فإنه لا يريد إغلاق الملف وبالتالي نغير قيمة الوسيط : Cancel
وبالتالي لن يستجيب البرنامج لحدث الضغط على الزر إغلاق . False إلى
يجعل اسم الملف يظهر في السطر الثاني من الرسالة ، هذا يكافئ كتابة نص MessageDlg الرمز 13 # في التابع
ومن ثم كتابة اسم الملف . Enter الرسالة ومن ثم الضغط على زر
برمجة القائمة تحرير :
اكتب التعليمة التالية في حدث الضغط على الزر نسخ في القائمة تحرير :
Editor.CopyToClipboard;
اكتب التعليمة التالية في حدث الضغط على الزر قص في القائمة تحرير :
Editor.CutToClipboard;
اكتب التعليمة التالية في حدث الضغط على الزر لصق في القائمة تحرير :
http://goo.gl/R2U0yZ لغة البرمجة دلفي
195
Editor.PasteFromClipboard;
اكتب التعليمة التالية في حدث الضغط على الزر تحديد الكل في القائمة تحرير :
Editor.SelectAll;
، Editor من الواضح أن الزرين نسخ و قص يجب أن يكونا غير فعالين إذا لم يحدد المستخدم نصًا ما في العنصر
كما أن الزر لصق يجب أن يكون غير فعال في حال كانت الحافظة فارغة ( أو في حال كانت فيها صورة ) ،
لتحقيق ذلك أكتب التعليمات التالية في حدث الضغط على الزر تحرير :
Copytext.Enabled := editor.SelLength > 0;
Cuttext.Enabled := editor.SelLength > 0;
Pastetext.Enabled := clipboard.HasFormat(CF_text);
. EditForm في للوحدة uses إلى القسم ClipBrd وأضف الوحدة
وهي تساوي الصفر إذا لم يحدد المستخدم أي Editor يعيد عدد الأحرف المحددة في العنصر SelLength المنهج
حرف .
برمجة القائمة تنسيق :
اكتب في حدث الضغط على الزر محاذاة إلى اليسار التعليمات التالية :
with Sender as TMenuItem do Checked := True;
with Editor.Paragraph do
if Left1.Checked then
Alignment := taLeftJustify
else if Right1.Checked then
Alignment := taRightJustify
else if Center1.Checked then
Alignment := taCenter;
في OnClick ثم حدد الزرين ( محاذاة إلى اليمين ) و(محاذاة إلى اليسار ) ثم أضغط على السهم المجاور للحدث
. Left1Click من محرر الخواص واختر من القائمة Event الصفحة
اكتب التعليمة التالية في حدث الضغط على الزر التفاف تلقائي :
with Editor do
begin
WordWrap := not WordWrap; { toggle word wrapping }
if WordWrap then
ScrollBars := ssVertical
else
ScrollBars := ssBoth;
WordWrap1.Checked := WordWrap; { set menu item check }
end;
اكتب التعليمات التالية في حدث الضغط على الزر خط :
FontDialog1.Font := Editor.Font;
if FontDialog1.Execute then
Editor.SelAttributes.Assign(FontDialog1.Font);
http://goo.gl/R2U0yZ لغة البرمجة دلفي
196
بإنه يمكن تحديد نمط خط لكل سطر أي أنه يمكن تنسيق النص Memo عن العنصر RichEdit يتميز العنصر
الذي يمكنك استخدام خط وتنسيق واحد لكل الأسطر . Memo المكتوب بداخله على عكس العنصر
.TRichEdit يعطيك أمكانية التحكم بتنسيق السطر المحدد في العنصر SelAttributes والمنهج
: MainForm برمجة القائمة إطار في النموذج
في البداية تلاحظ أن هذه القائمة لن تظهر أثناء تنفيذ البرنامج إذا كان أحد الأبناء ظاهرًا ( أغلق جميع النوافذ الأبناء
المفتوحة ولاحظ ظهور القائمة إطار من جديد ) هذا يحدث لأن قائمة النموذج الابن تأخذ مكان قائمة النموذج الأب
وإذا أردنا إظهار قوائم النموذج الأب بجوار قوائم النموذج الابن علينا استخدام ما يدعى بدمج القوائم ولتحقيق ذلك
:
. GroupIndex افتح محرر القوائم في النموذج الأب وحدد الزر إطار ثم اكتب القيمة 1 في الخاصة
لاحظ أن جميع قوائم النافذة الابن تأخذ القيمة الافتراضية 0 في هذه الخاصة وإذا أعطيت القيمة 1 لأحد هذه القوائم
فإنها GroupIndex فإنها ستأخذ مكان القائمة إطار ، أما إذا أعطيت أحد قوائم النافذة الاين القيمة 2 في الخاصة
ستظهر بعد القائمة إطار .
تستخدم لدمج وترتيب القوائم بين النموذج الأب والنماذج الأبناء . GroupIndex إذًا الخاصة
اكتب التعليمة التالية في حدث الضغط على الزر ترتيب الكل في القائمة إطار :
MainForm.Tile
تقوم هذه التعليمة بترتيب النوافذ الأبناء بشكل أفقي ( عليك أن تفتح أكثر من نافذة ابن لتلاحظ النتائج .
اكتب التعليمة التالية في حدث الضغط على الزر تتالي الكل في القائمة إطار:
MainForm.Cascade;
تقوم هذه التعليمة بصف النوافذ فوق بعضها البعض .
إظهار أسماء النوافذ الأبناء ضمن القائمة إطار :
عند الضغط على القائمة إطار في برنامج الوورد تظهر في نهاية القائمة أسماء جميع ملفات النصوص المفتوحة
وأعطاها القيمة WindowsMenu ثم اذهب إلى الخاصة MainForm ولتحقيق ذلك في برنامجنا حدد النموذج
اسم زر القائمة إطار ) ، نفذ البرنامج الآن وافتح أكثر من ملف واضغط على القائمة إطار ستلاحظ ) Window1
ظهور أسماء جميع هذه الملفات في القائمة الإطار ويمكنك التنقل بين هذه الملفات عن طريق الضغط على اسم
الملف في هذه القائمة .
لتوزيع برنامج المفكرة . ( Setup ) أحفظ البرنامج الآن وانتقل إلى الخطوة التالية وهي عمل برنامج تنصيب
http://goo.gl/R2U0yZ لغة البرمجة دلفي
197
: Install Shelled Express البرنامج
بعد أن يصبحك برنامجك جاهزًا وخاليًا من الأخطاء عليك أن تحضره ليعمل على أي حاسب وبأسهل طريقة
ممكنة، فليس من المعقول أن يكون المبرمج موجودًا لتنصيب البرنامج على عند كل مستخدم للبرنامج لذلك جرت
العادة على استخدام معالجات تنصيب وهي عبارة عن مجموعة من صناديق الحوار تسأل المستخدم عن مسار
البرنامج واللغة المستخدمة ومكان وضع الاختصارات .....
تستطيع أن تكتب برنامج التنصيب بنفسك فهو في النهاية عبارة عن نسخ ملفات من قرص مرن أو قرص ليزري
Install Shelled Express إلى الحاسب ولكن هناك برامج مختصة بهذه العملية ، ويأتي مع قرص دلفي البرنامج
ولكنه يفي بالغرض . Install Shelled Professional وهو نسخة مجانية من البرنامج
Install Shelled Express سنشرح الآن بشكل سريع البرنامج
عمل برنامج تنصيب لبرنامج المفكرة :
من قرص دلفي ومن تشغيله من القائمة : Install Shelled Express عليك أو ً لا تنصيب البرنامج
Start 􀃆 Program 􀃆 IntallShelled 􀃆 Express – Borland Limited Edition .
: Create new project تظهر عندها نافذة اختر منها
ثم C:\My Documents\MySetups\MyNotpad.ism أكتب Project name and location في الصندوق
. Create اضغط على الزر
تظهر عندها نافذة تتألف من نافذة تحوي شجرة على اليسار وتظهر في النافذة اليمنى خصائص الفرع المختار من
هذه الشجرة .
من الشجرة فستظهر الخصائص التالية في النافذة المجاورة : General Information اختر
هناك بعض الخواص الواضحة
والتي ليست بحاجة إلى شرح
لذلك سأشرح أكثر الخصائص
أهمية :
تحدد هذه : INSTALLDIR
الخاصة المجلد الافتراضي
الذي سيتم فيه تنصيب
البرنامج بالضغط على هذه
الخاصة تظهر القيم التي يمكن
أن تأخذها هذه الخاصة، كما
يمكنك كتابة المجلد الذي تريد
لتنصيب برنامجك داخله .
تحدد هذه الخاصة اسم البرنامج وسيظهر اسم البرنامج عند بداية التنصيب . : Product Name
http://goo.gl/R2U0yZ لغة البرمجة دلفي
198
من الشجر ة اليسارية فتظهر نافذ على اليسار تستخدم لتحديد نوع التنصيب وهناك ثلاث Setup Types اختر
أو تنصيب ( Minimal ) أو تنصيب اصغري ( Typical ) أنواع عادة لتنصيب الملف وهي إما تنصيب نموذجي
تتحكم طرق التنصيب بالملفات التي سيتم نسخها إلى الحاسب وبما أن برنامجنا مؤلف من ( Custom ) مخصص
من النافذة . Typical ملف واحد فلا حاجه لأن يكون هناك ثلاث أنوا من التنصيب لذلك اختر فقط
من الشجرة تظهر عندها أربع نوافذ متجاور إلى في النافذة اليسرى ، سنحدد هنا الملفات التي سيتم Files اختر
نسخها إلى القرص الصلب وهي ملفات التي يحتاجها البرنامج ( معظم البرامج المكتوبة بالغة دلفي لا تحتاج إلا إلى
إلا إذا كان برنامجك يتعامل مع ملفات خارجية، كملفات صور أو نصوص أو صوت أو .Exe الملف ذو الامتداد
قاعدة بيانات ...
في النافذة اليسرى في الأسفل ستظهر لك قائمة حدد Destination Computer اضغط بزر الفأرة اليميني على
Source Computer's حدد بعدها الفهرس الذي حفظت فيه برنامج المفكرة في النافذة ، INSTALLDIR منها
. Folder
Destination إلى النافذة Source Computer's Files من النافذة TextEditor.Exe ثم أنقل الملف من
عن طريق سحب الملف إفلاته . Computer Files
وحدد من النافذة المجاورة المكتبات التي يتعامل معها برنامج وأهمها : : Object/ Merge Modules اختر
في دلفي وبمجرد تحديد هذا BDE حدد هذا الخيار إذا كان برنامجك يستخدم العناصر في الصفحة : BDE_ent
إذا كنت بحاجة لذلك . Alias الخيار يظهر نموذج حوار لتحديد نوع قاعدة المعطيات المستخدمة ولإنشاء
... . QuickRep حدد هذا الخيار إذا استخدمت في برنامجك العناصر في الصفحة : QuickReport
فتظهر عندها النافذة التالية : : Shortcuts /folder's اختر بعدها
وسم المجلد الجديد باسم شركتك ثم New Folder واختر Program Menu اضغط بزر الفأرة اليمني على القائمة
أعط هذا الاختصار الاسم ، New Shortcut اضغط على بزر الفأرة اليميني على المجلد الجديد واختر من القائمة
ثم حدد الخصائص لهذا الاختصار كما هو موضح في الأعلى وهذا شرح لهذه الخصائص . Notepad
Win تظهر هذه الخاصة تلميح عندما يقف مؤشر فوق أيقونة الاختصار في 2000 :Description
تحدد هذه الخاصة الملف الذي سيتم تشغيله عند الضغط على الاختصار ( لا حظ أن هذا الاختصار : Target
. INSTALLDIR\TextEditor.exe يجب أن يحدد على الكمبيوتر الهدف وليس على حاسبك لذلك وضع داخل
يتم تحديد في هذه الخاصة الأيقونة التي سيحملها الاختصار . : IconFile
http://goo.gl/R2U0yZ لغة البرمجة دلفي
199
تحدد مجلد عمل البرنامج ( هذه الخاصة ضرورية جدًا إذا كان البرنامج يستدعي ملفات : Working Directory
من مجلد البرنامج ).
يمكنك عمل أكثر من اختصار لنفس الملف ، كما يمكنك أن تظهر اختصار لبرنامج على سطح المكتب و إذا أردت
. Startup لبرنامجك أن يعمل في بداية تشغيل ويندوز ضع اختصارًا له في القائمة
من الشجرة اليسارية إذا كان برنامجك يتعامل مع ملف تسجيل ويندوز ( إذا كان برنامجك يحتاج Registry اختر
إلى إضافة قيم إلى مسجل النظام ليعمل بشكل جيد ) .
من الشجرة اليسارية لتحدد النوافذ التي ستظهر أثناء تشغيل برنامج التنصيب ، حدد منها النوافذ التي Dialog اختر
تريد أن تظهر ولاتنس أن تتحكم بخصائص هذه النوافذ ( لا حظ أن كثرة النوافذ ستؤدي إلى زيادة حجم ملفات
برنامج التنصيب ) .
إذا كان برنامجك مخصص ليعمل على نظام تشغيل محدد ( ويندوز 2000 فقط مث ً لا ) أو Requirement اختر
انه بحاجة إلى معالج من طراز معين ، أو بحاجة إلى حد معين من الذاكرة ليعمل و...
من النافذة المجاورة وحدد الخصائص من النافذة المجاورة وفيما Custom واختر Build your release اختر
يلي شرح مختصر لهذه الخواص :
حدد هنا حجم وسيلة التخزين التي تريد أن تخزن عليها برنامج التنصيب ( إذا كان قرص مرن : Media Size
. ( أعط القيمة 1.38
أي أن الحجم الذ 1ي حددته في الخيار الأول سيقاس Gb أو Mb يمكنك أن تختار بين : Media Size Unite
بالميغا بايت أو في جيغا بايت .
يمكنك أن تختار 512 أو 1024 تبعًا لوسيط التخزين المستخدم . : Cluster Size
لهذه الخاصة ليتم ضغط ملفات برنامجك و( يفضل أن تفعل ذلك إذا كنت True أعط القيمة : Compress Media
تريد حجم التخزين أصغر ما يمكن ) .
هو الملف المسؤول عن تنصيب البرنامج Setup.exe في برامج التنصيب الحديثة لم يعد الملف : Setup.exe
هي تحديد نظام التشغيل وتسليم Setup.exe ومهمة البرنامج Msi ويقوم بتنصيب البرنامج الملفات ذات الامتداد
لأن أغلب المستخدمين True المناسبة، يفضل أن تعطي هذه الخاصة القيمة Msi العمل إلى برامج تنصيب ملفات
. Setup.exe تعود على تشغيل ملفات
وهو يقوم بتنصيب البرنامج الذي instmsia.exe سيضيف هذا الخيار الملف : Include Msi Win9x engine
ليس ملف تنفيذي ولذلك هو بحاجة لبرنامج آخر لتشغيله Msi الملف ذو الامتداد ) Msi يستطيع التعامل مع ملفات
فلن يتم تنصيب البرنامج، لذلك Msi فإذا قمت بتنصيب برنامجك على حاسوب لا يحوي برنامج تشغيل ملفات
إذا كنت ، ( Msi الذي يحوي البرنامج المسؤول عن فتح الملفات من نوع instmsia.exe عليك أن تضيف الملف
. True ستستخدم القرص المرن كوسيلة تخزين فأعط هذا الخيار القيمة
نفس الشرح السابق . .... instmsiw.exe سيضيف هذا الخيار الملف : Include Msi Windows Nt engine
إذا كنت ستنسخ برنامج إلى قرص ليزري أو قرص True أعط هذا الخيار القيمة : Generate AutoRun.inf
. DVD
http://goo.gl/R2U0yZ لغة البرمجة دلفي
200
سيتم عندها إنشاء ملفات التنصيب ويجب أن تكون الرسالة الأخيرة Build من القائمة Build Custom اختر الآن
build completed with 0 errors, 0 warnings
هذا يعني أن لم يحدث أي أخطاء أثناء عملية بناء ملفات التنصيب .
Run Your في النافذة الجديدة ومن ثم Custom من الشجرة واضغط على Test Your Release اختر بعد ذلك
سيتم الآن تنصيب البرنامج بشكل كامل لا حظ الخطوات وتأكد من أنها تعمل بشكل صحيح وإذا تم العمل ، Setup
بدون رسائل أخطاء ، ستجد الاختصارات التي وضعتها في القائمة أبدا ، كما يمكنك إزالة البرنامج من النافذة
إضافة إزالة البرامج من لوحة التحكم .
في حال حدوث أخطاء يجب عليك التأكد من القيم التي اخترتها في النوافذ السابقة وإعادة بناء البرنامج ومن تجربته
.
بعد الانتهاء ستجد نسخة من برنامج التنصيب في الفهرس الذي حددته لحفظ برنامج التنصيب وهو غاليًا من الشكل
:
C:\My Documents\MySetups\MyNotpad\Express\Custom\DiskImages\DISK1
من الشجرة المجاورة ومن ثم حدد المكان الذي تريد Custom واختر Distributed your release حدد الخيار
مث ً لا ... A:\ أن تضع فيه برنامج التنصيب ،ليكن القرص
لا تدعم اللغة العربية وفي حال استخدام اللغة العربية في عمليات Install Shelled ملاحظة :هذه النسخة من
إعداد برنامج التنصيب من المحتمل أن تشاهد الكثير من رسائل الأخطاء .
وآخر دعواهم أن الحمد لله رب العالمين
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم
محمد خالد ناصر آغا
http://goo.gl/R2U0yZ لغة البرمجة دلفي