لغة البرمجة دلفي Delphi
لغة البرمجة دلفي Delphi
لغة البرمجة دلفي Delphi
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
تم تحميل الملف من موقع<br />
البوصلة التقنية<br />
www.boosla.com
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
بسم االله الرحمن الرحيم<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
موقع الكِتاب على الإنترنت<br />
http://www.alshater.net<br />
يسمح بالنشر الإلكتروني أو الاقتباس أو النقل<br />
على أن يتم الإشارة إلى المؤلف وموقع الكِتاب على الانترنت<br />
ولا يسمح بأي شكل من الأشكال النشر الورقي للكتاب<br />
إعداد<br />
محمد خالد ناصر آغا<br />
Support@alshater.net<br />
1
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إلى<br />
أمي، إلى أبي الذين لولا سهرهما وتعبهما لم أكن هنا لأكتب<br />
هذا الكتاب.<br />
إلى أناس لا أعرفهم ولا يعرفونني ولكنهم قدموا لي الكثير وخاصة<br />
في مجال <strong>البرمجة</strong> كنت قد التقيت بهم على الانترنت في المنتديات<br />
وساحات الحوار وكان عطائهم من دون طلب حتى أنهم لم يطلبوا<br />
الشكر على المساعدة.<br />
2
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الفهرس<br />
الموضوع<br />
الصفحة<br />
5<br />
7<br />
10<br />
15<br />
16<br />
18<br />
20<br />
24<br />
27<br />
29<br />
35<br />
43<br />
48<br />
52<br />
55<br />
60<br />
69<br />
77<br />
86<br />
100<br />
111<br />
117<br />
118<br />
123<br />
131<br />
المقدمة ................................................................................<br />
نبذه عن <strong>دلفي</strong><br />
..........................................................................<br />
البرنامج الأول .........................................................................<br />
الوحدة<br />
.......................................................................... unit<br />
التعرف على العناصر .................................................................<br />
التعامل مع الأحداث<br />
التعامل مع واجهة ال<strong>دلفي</strong><br />
التعرف على عنصر المذكرة<br />
إنشاء قوائم للنماذج<br />
أنواع المعطيات<br />
الإجراءات والتوابع<br />
بعض التوابع المعرفة في <strong>دلفي</strong><br />
صناديق الحوار<br />
التعرف على العنصر<br />
التعامل مع السلاسل النصية<br />
معالجة الأخطاء في <strong>دلفي</strong><br />
..................................................... ( Events )<br />
...............................................................<br />
................................................. Memo<br />
....................................................................<br />
........................................................ Data Type<br />
...................................................................<br />
.........................................................<br />
.............................................................. Dialog<br />
..................................................... MaskEdit<br />
...........................................................<br />
..............................................................<br />
قواعد البيانات ........................................................................<br />
بناء تطبيقات قواعد البيانات ............................................................<br />
بناء قواعد البيانات<br />
.......................................... Database Desktop<br />
التعامل مع قاعدة البيانات من خلال <strong>دلفي</strong> ...............................................<br />
البحث في قواعد البيانات ..............................................................<br />
الحقول الحسابية .......................................................................<br />
<strong>لغة</strong> الاستفسارات البنيوية :<br />
.................................................... SQL<br />
ربط الجداول .........................................................................<br />
إنشاء الجداول ببرنامج<br />
...................................................... Access<br />
3
http://www.alshater.net<br />
137 ................................................................................ ADO<br />
140<br />
الطباعة ............................................................................... 146<br />
147<br />
150<br />
154<br />
158<br />
167<br />
169<br />
182<br />
184<br />
183<br />
197<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
برنامج دليل الهاتف ...................................................................<br />
لمسات برمجية ........................................................................<br />
................................................ Windows Registry<br />
............................................. Windows API<br />
مسجل النظام<br />
توابع وثوابت الويندوز<br />
إضافة عناصر جديدة ..................................................................<br />
السحب والإفلات.......................................................................<br />
الرسم في <strong>دلفي</strong> ........................................................................<br />
برمجة الأوساط المتعددة ...............................................................<br />
التعامل مع الملفات ....................................................................<br />
........................................................................<br />
............................................. Install Shelled Express<br />
برنامج المفكرة<br />
البرنامج<br />
4
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
المقدمة<br />
بسم االله والحمد الله والصلاة والسلام على رسول االله أما بعد:<br />
هذه مجموعة من المحاضرات كنت قد اعددتها أثناء تدريسي ل<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong> سنة 2003 في مركز الشبيبة<br />
للعلوم والحاسوب، ومن ذلك الوقت وأنا أفكر بنشر هذه المحاضرات على الإنترنت ولكن العمل أخذ كل وقتي منذ<br />
ذلك الحين ولم أجد الوقت الكافي لإتمام ذلك.<br />
وكنت قد فكرت حينها أنه يجب تنقيح هذه المحاضرات لغويا ً وعلميا ً قبل نشرها الأمر الذي جعلني أجد من نشرها<br />
عملا ً شاقا ً ويأخذ الكثير من الجهد ولذلك قررت هذه العام 2006 أن أطرحها كما هي مع القليل القليل من التنقيح<br />
فلا اعتقد أني سأجد الوقت المناسب لنشر هذه المحاضرات في المستقبل.<br />
لماذا <strong>دلفي</strong>؟<br />
ظهر كثيرا ً من النزاع في مواقع الإنترنت حول أيهما أفضل فيجول بيسك أم <strong>دلفي</strong> ولا أريد هنا أن أدخل في هذه<br />
المناقشات ولكني اخترت ال<strong>دلفي</strong> لسببين<br />
:<br />
1<br />
– يدرس كل طلاب الهندسة المعلوماتية في سورية <strong>لغة</strong> الباسكال والتي هي ال<strong>لغة</strong> الأم لل<strong>دلفي</strong> وبالتالي يكون<br />
الانتقال إلى <strong>دلفي</strong> سلس وسهل.<br />
– 2 الموضة :<br />
قد يفاجئ البعض من هذا السبب ولكن وبكل صراحة اقتنيت حاسبا ً سنة 1997 وكنت في السنة<br />
الثانية في الكلية وكانت نسخة ال<strong>دلفي</strong> 2 قد ظهرت لأول مرة وكان الكثير يدرس ال<strong>دلفي</strong> في الكلية بالرغم من أنها<br />
غير مقررة في المنهاج الأمر الذي جعل ال<strong>دلفي</strong> تنتشر كما تنتشر الموضة الجديدة بين النساء، بالنسبة لمن يرون أن<br />
تعبير موضة ليس في محله أذكرهم أن الموضة في عام<br />
العام.<br />
رحلتي مع <strong>دلفي</strong>:<br />
2005 كانت<br />
#C ولا أعرف أين ستتجه الموضة هذا<br />
بدأت بدارسة ال<strong>دلفي</strong> كما قلت في عام 1997 وبعدها أصبحت مدمنا ً لل<strong>دلفي</strong> كنت ألعب ال<strong>دلفي</strong> بينما كان أصدقائي<br />
يلعبون فيفا 98 أو رود رش<br />
.<br />
ولكن في عام 2004 بدأت حياتي تأخذ مسارا ً آخر فعملي أصبح يتطلب العمل على شبكات لينكس والتي تأخذ<br />
الكثير من الوقت بالإضافة أنني تعرفت على <strong>لغة</strong> برمجة جديدة وهي PHP والتي أصبحت تأخذ حياتي شيئا ً فشيئا ً،<br />
الأمر الذي جعلني أبتعد عن ال<strong>دلفي</strong> حتى أني توقفت السنة الماضية عن العمل بها أو تدريسها تمام ًا.<br />
لمن هذا الكتاب ؟<br />
بالرغم من أنني حاولت تبسيط الكتاب ما أمكن ولكنني توجهت في إعداد هذه المحاضرات إلى طلاب كلية الهندسة<br />
المعلوماتية و كلية الحاسبات الأمر الذي جعلني أفترض أن قارئ هذا الكتاب لديه إلمام ولو بسيط بلغات <strong>البرمجة</strong>.<br />
5
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لماذا أنشر هذا الكتاب<br />
:<br />
)<br />
اقتبس هذه الكلام من مقدمة كتاب احتراف Visual Basic.Net لمؤلفة محمد حمدي غانم):<br />
أعرف ُ أن الكثيرين سيتساءلون: ما هو الدافع الذي حداك لبذل هذا المجهود؟.. وإن ّي لأجدها فرصة ً مناسبة ً لأنقلَ<br />
لكم فكرة ً تعلمتها من احتكاكي بأناسٍ أكن لهم كل َّ الود والاحترام.. هذه الفكرة ُ تدور حولَ كونِ الإنسانِ جزءا من<br />
مجتمعِه، لهذا فمهما كانت أقدار هذا الإنسان، فإن مصيره مرتبط بمصير هذا المجتمع، يسعدانِ معا ويشقيانِ معا.<br />
فما فائدة ُ أن تملِك في مجتمعٍ معدم؟<br />
وما جدوى أن تشعر في مجتمعٍ متحجر؟<br />
وما قيمة ُ أن تعرف َ في مجتمعٍ يجهل؟<br />
وما هدف ُ أن تفهم في مجتمعٍ متبل ّد؟<br />
وما مغزى أن ت ُبدع في مجتمعٍ متدن ّي الذائقةِ والثقافة؟<br />
لن يكون لكل ِّ هذا قيمة ٌ إذا لم يتشارك معك فيه أناس آخرون، بحيث تعم الفائدة على الجميع، في إطارٍ من التعاونِ<br />
والو د.<br />
إن الحاجة َ للإحساسِ بالانتماءِ هي حاجة ٌ من حاجاتِ الإنسانِ الحيويةِ التي لا يستطيع العيش َ بدونِها، تماما كالطعامِ<br />
والشراب!.. ولكن.. هل يمكن ُك أن تنتمي إلا لأناسٍ يرقون لمستوى خ ُلقكِ ومبادئك وثقافتِك وإبداعك؟؟!!<br />
إن هذه دعوة ٌ لكل ِّ من يقرأُ هذه الكلماتِ أن يحاولَ أن يشارك الآخرين في معرفتِه وعلمِه، على الأقل ِّ حت ّى يجد من<br />
يقدر هذه المعرفة َ ويحترم هذا العلم، في مجتمعٍ اختل ّت به كلّ المقاييس!!، وحت ّى ينطبق َ عليه قول الرسولِ (صل ّى<br />
االلهُ عليه وسل ّم): "خير الناسِ أنفعهم للناس".<br />
وفي النهاية أرجوا من كل من يستفيد من هذا الكتاب أن يدعو لي بالهداية والتوفيق والنجاح وللأمة الإسلامية<br />
بالنصر والعزة والخروج مما هي فيه من محن..<br />
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم<br />
محمد خالد ناصر آغا<br />
سورية - جامعة حلب<br />
الحرم الجامعي الرقمي الفرانكفوني<br />
Support@alshater.net<br />
6
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الأولى<br />
نبذه عن <strong>دلفي</strong> :<br />
من المعروف أن <strong>دلفي</strong> هي منتج بورلاند الأكثر مبيعا ً للتطوير<br />
http://www.alshater.net<br />
السريع للتطبيقات RAD (Rapid Application<br />
(Developmentوالمستخدم لكتابة تطبيقات ويندوز ، ويمكن باستخدام ال<strong>دلفي</strong> إنشاء تطبيقات ويندوز بسرعة<br />
أكبر وبسهولة أكثر من أي وقت مضى.<br />
هذا يعني أنه نستطيع إنشاء واجهة المستخدم<br />
الرئيسي<br />
)<br />
(..<br />
يقصد بواجهة المستخدم القوائم ومربعات الحوار والإطار<br />
للبرنامج مستخدمين تقنيات السحب والإفلات لمطور تطبيقات سريع ، ويمكن أيضا ً وضع تحكمات<br />
أكتيف إكس ) Active X<br />
العناصر المستخدمة في فيجول بيسك<br />
(<br />
على النماذج لإنشاء برامج متخصصة مثل برامج<br />
استعراض الويب في دقائق، تقوم <strong>دلفي</strong> بعمل جيد وذلك بإخفاء بعض التفصيلات التي تشكل أحشاء برنامج الويندوز<br />
ولكن ليس بإمكانها كتابة البرامج بشكل كامل ، لذلك يجب في النهاية أن يكون المبرمج جيدا ً، ويمكن لهذه العملية<br />
أن تكون طويلة ، والخبر الجيد أن <strong>دلفي</strong> تجعل الرحلة غير متعبة وحتى أنها تجعلها ممتعة.<br />
نظرة سريعة على مكونات <strong>دلفي</strong><br />
IDE<br />
سنتعرف في هذا القسم على بيئة التطوير المتكاملة لل<strong>دلفي</strong><br />
IDE (<strong>Delphi</strong> Integrated Development Environment).<br />
عندما تشغل برنامج ال<strong>دلفي</strong> تظهر بيئة التطوير فيه والتي سنتعرف عليها كل على حده<br />
بيئة <strong>دلفي</strong> مكونة من ثلاثة أقسام<br />
1<br />
:<br />
الإطار العلوي:<br />
يمكن اعتباره الإطار الرئيسي يحتوي على أشرطة الأدوات ولوحة المكونات توصل أشرطة أدوات <strong>دلفي</strong> إلى<br />
وظائف كالفتح والتخزين والبناء وتحتوي لوحة المكونات على كثير من مكونات <strong>دلفي</strong> التي يمكن وضعها في<br />
) البرنامج<br />
لافتة نصية ، علب تحرير ، مربعات سرد وأزرار وما شابه ذلك )، لتكون أكثر ملائمة فإن المكونات<br />
مقسمة إلى مجموعات ، حتى تضع مكون على برنامجك انقر على المكون ومن ثم انقر على المكان حيث تريد<br />
وضع المكون على النموذج.<br />
7
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
(<br />
)<br />
2 محرر الخواص :<br />
سنتعرف عليه بالتفصيل في دروس قادمة<br />
والذي يتم<br />
بواسطته تعديل الخصائص والأحداث للعنصر وسوف<br />
نستخدمه بشكل دائم<br />
خلال عملنا مع <strong>دلفي</strong><br />
والأحداث.Events<br />
وهناك صفحتين<br />
محرر الخواص هما الخصائص Properties<br />
مصطلح<br />
الخاصة Property يحتوي على خصائص لها قيم تحدد عمل العنصر<br />
يتضمن باب الأحداث Events<br />
قائمة أحداث العنصر، تتشكل الأحداث نتيجة لتفاعل<br />
المستخدم مع المكون مثلا<br />
عند نقر المكون يتولد حدث يخبرك بأن المكون قد نقر<br />
بإمكانك كتابة أوامر تستجيب لهذه<br />
الأحداث.<br />
مصطلح الحدث Event<br />
هو شيء ما يحصل كنتيجة لتفاعل<br />
العنصر مع المستخدم أو<br />
(<br />
مع ويندوز )<br />
حدث ضغط على زر مثلا ً<br />
مصطلح معامل الحدث Event Handler<br />
هو مقطع<br />
من <strong>البرمجة</strong> ينفذ استجابة للحدث.<br />
منطقة عمل :<br />
3 <strong>دلفي</strong><br />
الجزء<br />
الثالث هو منطقة عمل<br />
<strong>دلفي</strong> وعادة ما يظهر مشروعا ً جديد ًا<br />
،في المقدمة<br />
مصمم النموذج وخلفه محرر<br />
الشيفرة الذي تدخل عبره <strong>البرمجة</strong> عند كتابة<br />
برامجك.<br />
وكلا ً من<br />
محرر الخواص ومصمم النموذج ومحرر الشيفرة تتفاعل فيما<br />
بينها عند بناء التطبيقات لتولد البرنامج.<br />
4 شجرة العناصر :<br />
تظهر هذه النافذة العناصر الموضوعة على النموذج على شكل شجرة من العناصر<br />
النافذة الرئيسية<br />
8<br />
:
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أ القوائم سنتعرف على القائمة<br />
File بالتفصيل لأنها أساس العمل مع البيئة ومن ثم باقي القوائم ستشرح في<br />
حينها :<br />
1 : File Menu وتحتوي على الأوامر التالية :<br />
<br />
: New وتظهر عنه قائمة فرعية<br />
. (<br />
البدء بكتابة برنامج جديد<br />
) يعمل تحت نظام ويندوز<br />
: Application<br />
( 1<br />
)<br />
. (<br />
البدء بكتابة برنامج جديد<br />
) يعمل تحت نظام لينكس وويندوز<br />
: CLX<br />
( 2<br />
)<br />
إنشاء وحدة جديدة<br />
(يتم الوصول لها من جميع نماذج<br />
المشروع).<br />
:Data Model<br />
( 3<br />
)<br />
: Form إضافة نمودج جديد للمشروع .<br />
( 4<br />
)<br />
تصميم عنصر يحوي مجموعة من العناصر للاستخدام مع نماذج المشروع<br />
) سيتم<br />
: Frame<br />
( 5<br />
)<br />
شرحة فيما بعد بمثال .<br />
خاص<br />
: Others سيتم شرحها في حينها .<br />
( 6<br />
)<br />
.<br />
( *.dpr<br />
)<br />
( *.Pas<br />
)<br />
: Open<br />
لفتح ملف وحدة<br />
أو ملف مشروع<br />
موجودين مسبقا ً<br />
.<br />
: Open Project<br />
لفتح مشروع موجود مسبقا ً<br />
<br />
: Reopen يقدم لائحة بآخر عدة ملفات تم فتحها لسهولة إعادة فتحها من جديد.<br />
.<br />
: Save<br />
تخزين آخر تعديل<br />
.<br />
: Save As<br />
تخزين الوحدة<br />
Unit الحالية باسم جديد<br />
.<br />
: Save Project As<br />
تخزين ملف البرنامج الرئيسي Main Program باسم جديد<br />
.<br />
: Save All<br />
إعادة تخزين جميع ملفات المشروع<br />
.<br />
: Close<br />
إغلاق النافذة الفعالة<br />
.<br />
: Close All<br />
إغلاق البرنامج بالكامل<br />
Use لاحقا ً ( .<br />
) Use<br />
: Use Unit<br />
لاستخدام وحدة أي وضع اسمها بعد تعليمة<br />
ستشرح تعليمة<br />
: print<br />
لطباعة النموذج الحالية أو لطباعة الوحدة الحالية.<br />
9
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الثانية<br />
سنقوم الآن بكتابة برنامج يقوم بتغير لون النافذة:<br />
أ مرحلة التصميم :<br />
1 إبدأ مشروعا جديدا عن طريق القائمة . File New Application<br />
2 لنعطي النموذج الجديد الخصائص التالية :<br />
أسم الخاصة<br />
القيمة<br />
شرح الخاصة<br />
bdRightToLeft تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من اليمين<br />
BiDiMode<br />
(<br />
إلى اليسار )<br />
لموافقة البرامج العربية<br />
تحديد ارتفاع النموذج<br />
280<br />
Height<br />
تحديد عرض النموذج<br />
350<br />
Width<br />
تغير الألوان<br />
تحديد عنوان للنموذج يظهر في شريط العنوان<br />
Caption<br />
(<br />
تحديد مكان ظهور النموذج )<br />
ستشرح قيمها فيما بعد<br />
poDesktopCenter<br />
Position<br />
2 نضع ثلاثة أزرار على النموذج Button) (<br />
من صفحة العناصر<br />
Standard ونعطي لكل منهم الخصائص<br />
التالية :<br />
إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />
تحديد عنوان للزر<br />
RedButton<br />
أحمر<br />
تحديد بعد الزر عن أعلى النافذة<br />
تحديد بعد الزر عن يسار النافذة<br />
)<br />
)<br />
بكسل)<br />
( بكسل<br />
إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />
تحديد عنوان للزر<br />
160<br />
230<br />
GreenButton<br />
أخضر<br />
تحديد بعد الزر عن أعلى النافذة<br />
تحديد بعد الزر عن يسار النافذة<br />
)<br />
)<br />
بكسل)<br />
( بكسل<br />
190<br />
203<br />
CloseButton<br />
إغلاق<br />
إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />
تحديد عنوان للزر<br />
تحديد بعد الزر عن أعلى النافذة<br />
تحديد بعد الزر عن يسار النافذة<br />
)<br />
)<br />
بكسل)<br />
( بكسل<br />
200<br />
24<br />
: Button1<br />
Name<br />
Caption<br />
Top<br />
Left<br />
Button2<br />
Name<br />
Caption<br />
Top<br />
Left<br />
Button3<br />
Name<br />
Caption<br />
Top<br />
Left<br />
10
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ب كتابة التعليمات :<br />
form1.Color := clred ;<br />
Color القيمة clred وهي<br />
1 نضغط مرتين على الزر الأول فيظهر محرر الشيفرة نكتب فيه مايلي<br />
:<br />
تقوم هذه العملية بتغير لون النموذج إلى اللون الأحمر عن طريق إعطاء خاصة اللون<br />
قيمة محجوزة في ال<strong>دلفي</strong> وتدل على اللون الأحمر.<br />
form1.Color := clgreen;<br />
close;<br />
2 نضغط مرتين على الزر الثاني فيظهر محرر الشيفرة نكتب فيه مايلي<br />
3 نضغط مرتين على الزر الثالث فيظهر محرر الشيفرة نكتب فيه مايلي<br />
تقوم هذه التعليمة بإغلاق النافذة<br />
:<br />
:<br />
وبذلك نكون قد أنهينا كتابة البرنامج ولحفظه نختار الأمر<br />
File Save Project As<br />
لنعطي الوحدة الاسم NewCloors والمشروع الأسم<br />
ChangeCloros<br />
ولتنفيذه نضغط على F9 أو نختار الأمر Run من القائمة<br />
Run<br />
( Run Run )<br />
سنقوم الآن بتغير بعض خواص العناصر للتعرف على<br />
خصائص جديدة :<br />
1 خصائص النموذج :<br />
:<br />
( Form1<br />
نختار النموذج بالنقر عليه أو باختيار اسمه )<br />
من القائمة الموجودة في أعلى محرر الخواص<br />
أ <br />
تظهر أمام هذه القائمة إشارة +<br />
بالنقر عليها تظهر لها أربع خيارات تأخذ كل منها القيمة<br />
: BorderIcons<br />
صح أو خطأ وتتحكم هذه الخواص بأزرار شريط العنوان :<br />
.<br />
بإعطاء هذه الخاصة القيمة<br />
False تختفي الأزرار الثلاثة<br />
: Bisystemmenu<br />
بإعطاء هذه الخاصة القيمة<br />
False يختفي زر التصغير .<br />
: BiMinimize<br />
. يختفي زر False بإعطاء هذه الخاصة القيمة : BiMaximize<br />
بإعطاء هذه الخاصة القيمة<br />
True يظهر الزر ؟<br />
) لا يظهر هذا الزر مع النوافذ العادية<br />
: BiHelp<br />
ستشرح مع الخاصة التالية .<br />
.<br />
ملاحظة<br />
: نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ<br />
ب<br />
: Borderstyle تقوم هذه الخاصة بالتحكم بشكل النافذة وشريط العنوان وتأخذ إحدى القيم التالية<br />
.<br />
11
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: bsDialog تقوم بإخفاء أزرار التكبير والتصغير بالإضافة إلى منع تغير حجم النموذج أثناء التنفيذ<br />
. Bihelp للخاصة True<br />
ويظهر فقط زر الإغلاق والزر ؟ في حال<br />
تم إعطاء القيمة<br />
: bsNone يظهر النموذج بدون شريط عنوان ولا يمكن تغير حجمه أثناء التنفيذ.<br />
: bsSingle تظهر جميع أزرار شريط العنوان ولا يمكن تغير حجمه أثناء التنفيذ .<br />
وهي القيمة الافتراضية ويظهر النموذج<br />
بشكله الطبيعي مع إمكانية التكبير والتصغير والتحجيم.<br />
: bsSizeable<br />
يظهر شريط عنوان صغير مع زر ×<br />
فقط وتختلف الأولى عن الثانية<br />
: bsToolWindow و bsSizeToolWin<br />
بإمكانية تغير الحجم .<br />
.<br />
ملاحظة<br />
: نتائج التعديل في هذه الخواص لا تظهر إلا في أثناء التنفيذ<br />
:<br />
ج : Position<br />
لإظهار النموذج في مكان ما على الشاشة وأهم قيمها<br />
: poDesigned يظهر النموذج في المكان الذي حدد له أثناء التصميم .<br />
: poDesktopCenter يظهر النموذج في وسط الشاشة.<br />
يظهر النموذج في وسط الشاشة )<br />
في حال وجود شاشة واحدة لهذه<br />
: poScreenCenter<br />
الخاصة نفس نتيجة الخاصة السابقة ( .<br />
...<br />
د : Icon<br />
تتحكم هذه الخاصة بشكل أيقونة النافذة ، وعند تحديد هذه الخاصة يظهر زر عليه ثلاث نقاط<br />
بالنقر عليه يظهر صندوق حوار لاختيار أيقونة )<br />
يتم عادة جلب الأيقونات من الانترنت أو يتم رسمها<br />
:<br />
(<br />
يدويا ً كما سنرى لاحقا ً يمكن اختيار أحدى الأيقونات من الدليل<br />
C:\Program Files\Common Files\Borland Shared\Images\Icons<br />
هذه هي الخواص الأساسية للنموذج وسنتعرف على باقي الخواص لاحقا ً .<br />
1 خصائص الزر :<br />
:<br />
( Top, Left, Width, Height, Caption<br />
بالإضافة للخصائص المعروفة )<br />
هناك بعض الخصائص المهمة<br />
: BiDiMode تم شرح هذه الخاصة سابقا ً بالنسبة للنموذج ولكن من المهم أن نعلم أنه عند تغير هذه الخاصة<br />
في النموذج تتغير بشكل تلقائي في الزر .<br />
تتحكم هذه الخاصة بنوع خط عنوان الزر بالإضافة إلى لون العنوان وحجمه.<br />
تظهر هذه الخاصة ملاحظة عند وقوف مؤشر الفأرة فوق الزر<br />
: Font<br />
: Hint<br />
.<br />
يجب أن تأخذ هذه الخاصة القيمة<br />
True حتى يتم تفعيل الخاصة السابقة<br />
: Showhint<br />
مثال :<br />
أختر الزر<br />
RedButton ثم اختر الخاصة<br />
Hint من محرر الخواص واكتب النص<br />
(<br />
التالي )<br />
عند الضغط على هذا الزر سيتحول لون النافذة إلى اللون الأحمر<br />
ثم أعط الخاصة<br />
ShowHint القيمة True ونفذ البرنامج .<br />
.<br />
عند إعطاء القيمة<br />
False لهذه الخاصة لن يظهر الزر أثناء التنفيذ<br />
: Visible<br />
: Enable عند إعطاء القيمة False لهذه الخاصة سيظهر الزر بشكل باهت ولا يمكن الضغط عليه.<br />
12
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أثناء تنفيذ البرنامج وعند الضغط على الزر<br />
Tab في لوحة المفاتيح يظهر إطار مربع<br />
: TabOrder<br />
داخل الزر وينتقل هذا الإطار من زر إلى آخر بالنقر على الزر<br />
Tab وتقوم هذه الخاصة<br />
بتحديد ترتيب انتقال الإطار عند التنقل بين العناصر.<br />
1 لنضيف الآن زر جديد إلى النموذج السابق ولنعطه الخصائص التالية<br />
:<br />
BtnAbout Name<br />
Caption<br />
Top<br />
Left<br />
Width<br />
حول<br />
0<br />
0<br />
40<br />
إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />
تحديد عنوان للزر<br />
تحديد بعد الزر عن أعلى النافذة<br />
تحديد بعد الزر عن يسار النافذة<br />
تحديد عرض الزر<br />
)<br />
)<br />
بكسل)<br />
بكسل<br />
ثم نضيف نموذج جديد للمشروع عن طريق القائمة : File New Form<br />
وبذلك يظهر نموذج جديد لنعطه الخصائص التالية<br />
(<br />
:<br />
About Name<br />
bdRightToLeft BiDiMode<br />
إعطاء أسم جديد للنموذج<br />
تقوم هذه الخاصة بتحويل اتجاه النص والعناصر في النموذج من<br />
اليمين إلى اليسار<br />
)<br />
لموافقة البرامج العربية<br />
(<br />
تحديد ارتفاع النموذج<br />
تحديد عرض النموذج<br />
تحديد عنوان للنموذج يظهر في شريط العنوان<br />
تحديد مكان ظهور النموذج<br />
250<br />
300<br />
معلومات حول البرنامج<br />
poDesigned<br />
Height<br />
Width<br />
Caption<br />
Position<br />
الآن يمكن حفظ النموذج عن طريق الضغط على الزر<br />
Save من أزرار السرعة أو باختيار نفس الأمر من القائمة<br />
aboutunit<br />
File أو بالضغط على<br />
Ctrl + s من لوحة المفاتيح ، لنعط الوحدة أسم<br />
( Form1<br />
عند تنفيذ البرنامج لا يظهر إلا النموذج الأول )<br />
والآن علينا كتابة الشيفر المناسبة لاستدعاء النموذج<br />
. من النموذج Form1 About<br />
لاستدعاء نموذج ثاني من نموذج أول يجب علينا أن نعلم النموذج الأول باسم الوحدة التابع لها النموذج الثاني ويتم<br />
: Uses<br />
ذلك بإضافة اسم وحدة النموذج الثاني في القسم<br />
implementation لوحدة النموذج الأول بعد عبارة<br />
implementation<br />
والآن أضف العبارة التالية كما يلي :<br />
الآن نضغط مرتين على الزر<br />
يقوم الأمر Show بإظهار النافذة<br />
لنكمل الآن تصميم النموذج<br />
BtnAbout الموجود على النموذج الأول ونكتب التعليمة التالية<br />
uses aboutunit ;<br />
:<br />
about.Show;<br />
.(<br />
) About<br />
: About<br />
أحفظ البرنامج واضغط على الزر حول لمشاهدة النتائج<br />
13
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
1 نضيف العنصر<br />
http://www.alshater.net<br />
:<br />
)<br />
( لوح Panel<br />
AlTop<br />
Align<br />
من القائمة<br />
)<br />
Standard ولنعطه الخصائص التالية<br />
تجعل العنصر يتوضع في أعلى النافذة وعلى عرضها بشكل كامل<br />
سيتم شرح قيم هذه الخاصة قريب ًا<br />
(<br />
" "<br />
185<br />
bvLowered<br />
Caption<br />
Height<br />
BevelOuter<br />
تحديد عنوان للزر<br />
تحديد ارتفاع<br />
اللوح<br />
تحديد طريقة عرض الحد الخارجي للوح<br />
حاول إعطاء قيمة ما لخاصة Width ستلاحظ أنها لا تتغير وذلك لأن الخاصة<br />
2 نضيف زر<br />
Button ونعطه الخواص التالية<br />
Align مفعلة<br />
:<br />
BtnClose<br />
Name<br />
Caption<br />
Top<br />
إغلاق<br />
192<br />
إعطاء اسم جديد للعنصر غير الاسم الافتراضي<br />
تحديد عنوان للزر<br />
تحديد بعد الزر عن أعلى النافذة<br />
)<br />
112<br />
Left<br />
تحديد بعد الزر عن يسار النافذة<br />
)<br />
بكسل)<br />
بكسل<br />
3 نضيف عنصر الصورة Image من الصفحة Additional فوق العنصر<br />
(<br />
Panel<br />
picture<br />
أي صورة<br />
إعطاء صورة للعنصر يمكن أختيار أي صورة مرغوبة<br />
صورة من المجلد<br />
يمكن أخذ )<br />
:<br />
C:\Program Files\Common Files\Borland Shared\Images<br />
\Splash\256Color<br />
True<br />
Stretch<br />
إظهار كامل الصورة داخل العنصر<br />
Image<br />
0<br />
Top<br />
تحديد بعد الزر عن أعلى النافذة<br />
)<br />
0<br />
Left<br />
تحديد بعد الزر عن يسار النافذة<br />
3 نضيف عنصرين من النوع Label فوق العنصر<br />
)<br />
بكسل)<br />
( بكسل<br />
Panel<br />
Label1<br />
Caption<br />
Top<br />
Left<br />
font<br />
تغير الألوان<br />
24<br />
168<br />
Label2<br />
Caption<br />
نغير الخط ونعطيه اللون الأزرق<br />
: إعداد وتنفيذ<br />
88<br />
212<br />
Top<br />
Left<br />
Font<br />
نعطي الخط اللون الأحمر<br />
ونعطي الخصائص التالية:<br />
نضغط مرتين على الزر BtnClose ونكتب التعليمة Close في محرر شيفرة ، ثم نحفظ المشروع وننفذه<br />
.<br />
14
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
.<br />
أصبح الوقت ملائما ً الآن للتعرف على الوحدة<br />
الجلسة الثالثة<br />
Unit بشكل مفصل<br />
تتألف الوحدة سواء كانت مرتبطة بشكل أم لا من الأجزاء التالية<br />
:<br />
unit Unit Name ;<br />
interface<br />
uses<br />
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />
Dialogs;<br />
type<br />
TForm1 = class(TForm)<br />
private<br />
{ Private declarations }<br />
public<br />
{ Public declarations }<br />
end;<br />
var<br />
Form1: TForm1;<br />
implementation<br />
end.<br />
1 يبدأ رأس الوحدة بالكلمة المحجوزة Unit يليها مباشرة أسم الوحدة ) NewColors ( .<br />
في مثالنا<br />
قسم الاتصال الخارجي : Interface<br />
الذي يحدد بداية منطقة الاتصال الخارجي ، أي المنطقة من الوحدة التي يمكن أن تراها وحدات أخرى من وحدات<br />
التطبيق وفيه :<br />
القسم أ <br />
: Uses توضع فيه جميع أسماء الوحدات التي تتعامل معها الوحدة سواء كانت الوحدات الخاصة<br />
بال<strong>دلفي</strong> أو الوحدات التي أنشأها المبرمج<br />
) عند إضافة عناصر جديدة على النموذج تقوم <strong>دلفي</strong> بإضافة الوحدة<br />
التابعة لهذا العنصر بشكل تلقائي ( .<br />
ب القسم<br />
تعرف الوحدة هنا صنفا ً جديدا ً موروثا ً من النوع ) TForm صنف النموذج<br />
، يضاف إلى<br />
(<br />
: Type<br />
Type للوحدة<br />
الصنف الجديد أسماء جميع العناصر والأحداث المضافة إلى الوحدة )<br />
قارن بين القسم<br />
NewColors والوحدة ( AboutUnit ويتضمن القسم Type الجزأين :<br />
: Private وتوضع فيه المتحولات الخاصة بالوحدة نفسها.<br />
(<br />
وتوضع فيه المتحولات العامة<br />
) من أجل أن تتبادل الوحدة المعلومات مع الوحدات الأخرى<br />
: Public<br />
وسيشرح هذين الجزأين بشكل مفصل فيما بعد ، ينتهي القسم Type بالتعليمة .end;<br />
TForm1 ويشير Form1 إلى<br />
(<br />
)<br />
ج القسم : Var<br />
يتم فيه تعريف عن هدف<br />
اسمه غرض<br />
Form1 من النوع<br />
النموذج الذي نضيف له العناصر أثناء التنفيذ<br />
.<br />
15
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
قسم التنفيذ<br />
: implementation<br />
يمكن أن يحتوي هذا القسم على تصريحات عن توابع وإجراءات ومتحولات خاصة بالوحدة نفسها بالإضافة إلى<br />
ملاحظة<br />
جميع التوابع والإجراءات المستخدمة داخل الوحدة<br />
.<br />
:<br />
قد يكون الجزء السابق صعبا ً بعض الشيء لكنه ضروري لمتابعة العمل مع <strong>دلفي</strong> كما أننا سنتعرف عليه<br />
بشكل أكبر كلما دعت الحاجة إلى ذلك<br />
.<br />
سنعمل الآن على كتابة تطبيقات بسيطة الهدف منها التعرف على عناصر جديدة وخصائصها<br />
1 التعرف على صندوق الاختيار checkbox من القائمة<br />
ابدأ مشروع جديدا ً وصغر حجم النموذج قليلا ً وأضف أليه عنصر<br />
الزر<br />
:<br />
: Standard<br />
: checkbox وعنصر Button<br />
اختر العنصر checkbox1 من محرر الخواص واعطه الخاصة<br />
: Caption "أظهر الزر "<br />
ثم انتقل إلى الصفحة Event واختر منها الحدث<br />
محرر الشيفرة اكتب فيه السطر التالي<br />
OnClick فيظهر<br />
:<br />
if checkbox1.Checked then button1.Visible := true else button1.Visible := false ;<br />
الخاصة<br />
16<br />
Checked للعنصر<br />
والقيمة False في حال اختفاء الإشارة السابقة<br />
نفذ البرنامج وشاهد النتائج<br />
.<br />
.<br />
3 التعرف على عنصر صندوق اللائحة<br />
checkbox تعيد القيمة True في حال تم إظهار إشارة في صندوق الاختيار<br />
ListBox<br />
يظهر هذا الصندوق قائمة بنصوص تم إدخالها أثناء التصميم<br />
أو أثناء التنفيذ<br />
من القائمة<br />
: Standard<br />
:<br />
قم بإنشاء مشروع جديد وأضف إليه صندوق نص<br />
وصندوق لائحة<br />
( Edit )<br />
( ListBox )<br />
( Button )<br />
أ أثناء التصميم<br />
كما في الشكل المرفق<br />
وثلاثة أزرار<br />
:<br />
:<br />
باختيار الخاصة Items من محرر<br />
الخواص تظهر نافذ يمكن أن نكتب فيها سطور القائمة<br />
" مثلا ً أدخل<br />
الجلسة الثانية<br />
ب أثناء التنفيذ<br />
" الجلسة الأولى<br />
في السطر الأول و<br />
"<br />
"<br />
في السطر الثاني<br />
.<br />
:<br />
أضغط مرتين على الزر Button وأضف السطر التالي<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تقوم التعليمة السابقة بإضافة النص المكتوب في صندوق النص إلى صندوق اللائحة<br />
لحذف سطر واحد من عنصر اللائحة نضغط على الزر الثاني ونضيف السطر التالي<br />
تقوم هذه التعليمة بحذف السطر الذي تم اختياره من اللائحة .<br />
كذلك لحذف عناصر اللائحة أثناء التنفيذ اضغط على الزر الثالث مرتين واكتب السطر التالي<br />
تقوم هذه التعليمة بمسح صندوق اللائحة بالكامل.<br />
4 التعرف على أزرار الراديو<br />
http://www.alshater.net<br />
Listbox1.items.add (edit1.text);<br />
(<br />
)<br />
نفذ البرنامج وشاهد النتائج<br />
:<br />
listbox1.DeleteSelected ;<br />
:<br />
Listbox1.items.clear ;<br />
: ( RadioButtons<br />
)<br />
تعتبر أزرار الراديو مشابهة لعنصر صندوق الاختيار وتختلف عنه أنه<br />
لا يمكن اختيار زري راديو بنفس الوقت أي أنه أمام المستخدم اختيار<br />
زر واحد من بين الأزرار الظاهرة على النموذج.<br />
كمثال على ذلك<br />
:<br />
أبدأ مشروعا ً جديدا ً وأضف إليه ثلاثة أزرار راديو كما في الشكل<br />
أعط الزر الثالث الخاصة<br />
:<br />
Checked القيمة<br />
اللون . ClCream<br />
أضغط مرتين على الزر الأول وأضف التعليمة التالية<br />
وأضف التعليمة التالية للزر الثاني<br />
وللزر الثالث التعليمة<br />
:<br />
True وأعط النموذج<br />
form1.Color := clred;<br />
form1.Color := clblue;<br />
form1.Color := clcream;<br />
:<br />
:<br />
نفذ البرنامج وشاهد النتائج<br />
.<br />
5 التعرف على صندوق المجموعة<br />
: GroupBox<br />
في المثال السابق لنفرض أننا نريد إضافة مجموعة جديدة من أزرار الراديو لتغير لون الخط في النموذج<br />
الأزرار السابقة تغير لون النموذج<br />
)<br />
(<br />
، فإذا أضفنا زرين آخرين على النموذج فلا يمكننا تغير الخط واللون معا ً<br />
لأنه لا يمكن اختيار زري راديو في نفس الوقت ، وهنا يأتي دور صندوق المجموعة حيث<br />
كانت<br />
يؤمن هذا الصندوق<br />
ربطا ً بين أزرار الراديو بداخله فقط دون التأثير على أزرار الراديو خارجه ، كما يوضح المثال التالي<br />
أضف صندوق مجموعة للمثال السابق وضع عليه زرين راديو كما في الشكل<br />
وأضف التعليمة التالية للزر الأول داخل الصندوق<br />
:<br />
form1.Font.Color := clgreen;<br />
form1.Font.Color := clyellow<br />
والتعليمة التالية للزر الآخر :<br />
17
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التعامل مع الأحداث<br />
: ( Events )<br />
يوجد لكل عنصر في <strong>دلفي</strong> مجموعة من الأحداث التي يمكن أن ينفذها ، تعرفنا مثلا ً على الحدث<br />
OnClick للزر<br />
) Button<br />
عند الضغط مرتين على الزر يتم تفعيل الحدث Onclick ويظهر معالج الشيفرة لكتابة التعليمات التي<br />
تبين كيفية تعامل البرنامج مع هذا الحدث )،سنتعرف الآن على مجموعة جديدة من الأحداث.<br />
1 الحدث<br />
: OnMouseMove<br />
يشرين على مكان وجود الفأرة حيث<br />
عنوان النافذة وكمثال على ذلك<br />
يعمل هذا الحدث عن مرور الفأرة فوق العنصر ويعيد احداثيات<br />
X = left أي بعد الفأرة عن اليسار، و<br />
( x,y<br />
)<br />
:<br />
أنشاء مشروع جديد وضع على عنصر<br />
اليسار ،والآن حدد النموذج<br />
الخاصة<br />
( Form1<br />
)<br />
y = top أي بعد الفأرة عن شريط<br />
الذين<br />
Label الأول في الأعلى وفي أقصى اليمين والثاني في الأسفل وفي أقصى<br />
اختر محرر الخواص وانتقل إلى الصفحة<br />
ف ُيظهر محرر الشيفرة التابع<br />
Event واضغط مرتين على<br />
:<br />
OnMouseMove<br />
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br />
Y: Integer);<br />
:<br />
label1.Caption := inttostr(x);<br />
label2.Caption := inttostr(y);<br />
.<br />
لنكتب بين السطرين Begin وEnd التعليمات التالية<br />
نفذ البرنامج<br />
2 الحدث<br />
السابق ، كمثال عليه<br />
: OnMouseDown<br />
حدد النموذج :<br />
Event واضغط مرتين على الخاصة<br />
)<br />
يعمل هذا الحدث عن الضغط على زر الفأرة ويعيد الإحداثيات كما في الحدث<br />
( Form1<br />
من المثال السابق اختر محرر الخواص وانتقل إلى الصفحة<br />
OnMouseDown فيظهر محرر الشيفرة أكتب فيه التعليمات التالية<br />
:<br />
label1.Left := x;<br />
label1.Top := y -10;<br />
label2.Left := x+20;<br />
label2.Top := y-10;<br />
18
http://www.alshater.net<br />
)<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تعمل هذه التعليمات على وضع عنصري العنوان<br />
Label في مكان الضغط على الفأرة ،<br />
تم إضافة وطرح الأرقام<br />
. (<br />
من X و<br />
y فقط لإظهار النتائج بشكل أفضل<br />
:<br />
5 الحدث<br />
: OnMouseLeave يعمل هذا الحدث عند ابتعاد الفأرة عن العنصر<br />
أضف عنصر<br />
التالية:<br />
Label جديد إلى الشكل السابق وحدد الحدث<br />
OnMouseMove لهذا العنصر واكتب التعليمة<br />
label3.font.color := clblue;<br />
ثم حدد الحدث OnMouseLeave واكتب التعليمة التالية :<br />
نفذ البرنامج ولاحظ أنه عند مرور الفأرة من فوق العنصر Label3 يتحول إلى اللون الأزرق ثم يعود إلى لونه<br />
الأسود عن مغادرة الفأرة له.<br />
Label3.font.color := clblack;<br />
:<br />
4 الحدث : On DblClick<br />
يعمل هذا الحدث عند الضغط مرتين على العنصر<br />
Close;<br />
On DblClick واكتب التعليمة :<br />
حدد العنصر<br />
Label3 ثم أختر الحدث<br />
نفذ البرنامج واضغط مرتين على العنصر<br />
Label3 للخروج من البرنامج<br />
.<br />
19
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الرابعة<br />
التعامل مع واجهة ال<strong>دلفي</strong> :<br />
1 إضافة عدة نسخ من العنصر نفسه :<br />
يمكن إضافة عدة نسخ من العنصر نفسه وذلك بالضغط على المفتاح<br />
Shift من لوحة المفاتيح وإبقاؤه مضغوطا ً<br />
حتى نختار العنصر المراد إضافته من لوحة العناصر، عندئذٍ يظهر مربع أزرق يحيط بأيقونة العنصر ضمن لوحة<br />
العناصر ، ننقر الآن فوق النموذج ليظهر العنصر وفي كل مرة ننقر على النموذج تظهر نسخة أخرى من العنصر<br />
نفسه ، لإيقاف العملية نضغط أيقونة المؤشر ضمن لوحة العناصر ليختفي الصندوق الأزرق حول العنصر ، كمثال<br />
على ذلك اضغط على العنصر<br />
Label بمؤشر الفأرة مع الضغط على المفتاح<br />
shift انقل الفأرة إلى النموذج<br />
واضغط عدة مرات .<br />
2 التحكم بمكان العنصر وحجمه على النموذج من لوحة المفاتيح :<br />
كما رأينا يمكن التحكم بهذه الخواص بدقة عن طريق محرر الخواص ولكن هناك طريقة أخرى ومفيدة للتحكم بهذه<br />
الخواص .<br />
أ تحريك العنصر :<br />
أختر العنصر المراد تحريكه اضغط على المفاتح<br />
+ Ctrl أزرار الأسهم فسيتم نقل العنصر باتجاه السهم المضغوط<br />
.<br />
، ولتحريك العنصر بسرعة أكبر أستخدم الأزرار + Ctrl + Shift<br />
أزرار الأسهم<br />
ب تغير حجم العنصر :<br />
اختر العنصر المراد تغير حجمه واضغط على المفتاح<br />
+ Shift أزرار الأسهم وسيتم التكبير أو التصغير حسب<br />
السهم المضغوط .<br />
3 اختيار أكثر من عنصر في نفس الوقت :<br />
يمكن أن نختار أكثر من عنصر على نموذج في نفس الوقت على عن طريق الضغط على العنصر الأول ومن ثم<br />
الضغط على العنصر الثاني مع مفتاح<br />
، وعند تنفيذ هذه العملية تظهر في محرر الخواص<br />
Shift وهكذا ...<br />
الخواص المشتركة للعناصر المختارة<br />
عند أختيار عنصرين الأول<br />
Label والثاني Edit ستظهر الخواص<br />
)<br />
( Caption, Text<br />
المشتركة مثل top, ... Width, Height, left,<br />
، وستختفي بعض الخواص مثل<br />
رصف العناصر :<br />
يمكننا رصف العناصر نسبيا ً وفق بعضها البعض ، أو نسبيا ً وفق الشكل وذلك من خلال اختيار العنصر المراد<br />
رصفه ومن ثم استخدام لوحة الرصف<br />
Alignment palette من القائمة View أو Alignment من القائمة<br />
: Edit<br />
أ لوحة الرصف : Alignment palette<br />
كل زر في هذه اللوحة له مهمة ما وسيتم شرح كل منها على حدة :<br />
ترصف جميع العناصر المختارة إلى الجهة اليسارية لأول عنصر تم اختياره<br />
20<br />
.<br />
نفس العمل السابق ولكن الرصف يتم للجهة اليمينية
http://www.alshater.net<br />
)<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ترصف العناصر جميع العناصر المختارة إلى<br />
منتصف العنصر الأول الذي تم اختياره بشكل أفقي<br />
تجعل<br />
جميع العناصر على عمود واحد (<br />
نفس عمل الزر السابق ولكن الرصف يتم بشكل عمودي،(تجعل جميع العناصر المختارة على صف واحد).<br />
تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل أفقي .<br />
تنقل جميع العناصر المختارة إلى وسط النافذة الأب بشكل عامودي .<br />
تجعل المسافة بين العناصر الأفقية متساوية<br />
) تثبت العنصر الأول والأخير وتحرك العناصر التي بينهما<br />
لتأخذ مسافات متساوية .<br />
نفس الخاصة السابقة للعناصر العامودية .<br />
.<br />
.<br />
تحريك العناصر إلى نفس الناحية السفلية لأول عنصر تم اختياره<br />
تحريك العناصر إلى نفس الناحية العلوية لأول عنصر تم اختياره<br />
:<br />
ب : Alignment<br />
أختر<br />
Align من القائمة<br />
Edit ستظهر النافذة التالية<br />
عمل هذه النافذة يشبه عمل النافذة السابقة ولكن تم<br />
الاستعاضة عن الأيقونات بأزرار راديو ليتم الاختيار<br />
منها.<br />
تثبيت موقع العناصر :<br />
بعد أن نعطي العناصر مواقعها يمكننا تثبيت هذه المواقع لكي لا تتحرك العناصر بطريق الخطأ وذلك عن طريق<br />
اختيار العنصر ومن ثم استخدام الأمر<br />
Lock Controls من القائمة ، Edit عندها لن نستطيع تحريك هذه<br />
العناصر حتى نختار نفس الأمر مرة أخرى .<br />
قص ونسخ ولصق العناصر :<br />
يمكن قص أو نسخ العناصر ولصقها على نفس النموذج أو على نموذج آخر عن طريق اختيار العناصر وقصها او<br />
:<br />
نسخها عن طريق الأوامر Cut أو<br />
Copy في القائمة<br />
Edit ولصقها عن طريق الأمر<br />
Paste من نفس القائمة<br />
ملاحظة العنصر الملصق يأخذ جميع خصائص العنصر الأصل بالإضافة إلى جميع أحداثه .<br />
عنوان البرنامج :<br />
يمكن وضع عنوان للبرنامج<br />
عنوان البرنامج يظهر على شريط المهام بقرب أيقونة البرنامج<br />
( أختر الأمر<br />
)<br />
Application<br />
File Options وانتقل إلى الصفحة وانتقل إلى الصفحة<br />
Application ،واكتب في القسم<br />
النص الذي تريد، نفذ البرنامج ولاحظ العنوان على شريط مهام ويندوز<br />
.<br />
Title قرب setting<br />
21
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أيقونة برنامج :<br />
)<br />
(<br />
تعلمنا سابقا ً تغير أيقونة نافذة )<br />
نموذج<br />
وسنتعلم الآن تغير أيقونة البرنامج<br />
أيقونة البرنامج هي نفس أيقونة الملف<br />
EXE الذي ينتج عند تنفيذ البرنامج وتظهر أيقونة البرنامج على شريط المهام وفي أي اختصار يوضع للبرنامج )،<br />
Load<br />
من نفس الصفحة السابقة Project Options انتقل إلى الصفحة<br />
Application ،اضغط على الزر<br />
Icon<br />
واختر أيقونة جديدة للبرنامج<br />
نفذ البرنامج ولاحظ النتائج<br />
) يمكن اختيار أيقونات من الفهرس<br />
C:\Program Files\Common Files\Borland Shared\Images\Icons<br />
.<br />
صناديق الرسائل :<br />
أ الصندوق : ShowMessage<br />
يستخدم الإجراء<br />
string) showmessage S) : لإظهار رسالة للمستخدم حيث تظهر نافذة صغيرة تحوي نص<br />
الرسالة وعلى الزر<br />
Ok فقط ويكون عنوان هذه النافذة هو أسم الملف التنفيذي للبرنامج<br />
كمثال على ذلك أنشأ مشروعا ً جديدا ً وأضف إليه<br />
Button وأضف التعليمة التالية عند حدث<br />
الضغط على الزر :<br />
نفذ البرنامج واضغط على الزر لتشاهد صندوق الرسالة<br />
;('أهلا ً بكم مع <strong>دلفي</strong>')showmessage<br />
ب الصندوق : MessageDlg<br />
هذا الصندوق يشبه الصندوق السابق ولكنه يتوقع من المستخدم أن يعيد قيمه للبرنامج من خلال الضغط على أزرار<br />
هذا الصندوق فرضا ً سيقوم البرنامج بتنفيذ تعليمات معينة إذا ضغط المستخدم على الزر<br />
Yes وتعليمات أخرى في<br />
حال الضغط على الزر ، NO يتم استدعاء هذا الصندوق عن طريق التابع التالي<br />
حيث<br />
:<br />
Function MessageDlg(const Msg: string ; DlgType: TMsgDlgType; Buttons:<br />
TMsgDlgButtons ; HelpCtx: Longint): Word<br />
.<br />
: Msg<br />
نص الرسالة المطلوب إظهارها<br />
: Dlgtype تحديد نوع لصندوق الرسالة ويأخذ أحدى القيم التالية :<br />
: mtWarning يظهر في صندوق الرسالة أيقونة على شكل مثلث أصفر له إشارة تعجب .<br />
.<br />
: mtError يظهر في صندوق الرسالة أيقونة على شكل دائرة حمراء داخلها إشارة ×<br />
.<br />
يظهر في صندوق الرسالة أيقونة على شكل<br />
! داخلها إشارة تعجب<br />
: mtInformation<br />
داخلها إشارة ? .<br />
: mtConfirmation<br />
: mtCustom<br />
يظهر في صندوق الرسالة أيقونة على شكل<br />
لا يظهر في صندوق الرسالة أيقونة<br />
!<br />
.<br />
يعتمد نوع صندوق الرسالة على نوع الرسالة المراد إظهارها للمستخدم هل هي للتنبيه أو لإعلام المستخدم<br />
بحصول خطأ ما أو إعطاءه معلومة جديدة .... .<br />
: Buttons<br />
تحدد الأزرار التي ستظهر في صندوق الرسالة وتأخذ القيم التالية :<br />
22
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
mbYes,mbNo,mbOK,mbCancel,mbAbort,mbRetry,mbIgnore,mbAll,mbNoToAll,mbYesT<br />
oAll, mbHelp<br />
توضع الأزرار بين قوسين ] [ وتوضع بينهما فاصلة .<br />
:HelpCtx<br />
توضع فيه رقم السطر في ملف المساعدة المرتبط مع الزر<br />
يعيد التابع قيمة تتبع للزر الذي ضغط عليه المستخدم حسب الجدول<br />
التالي<br />
)<br />
سيشرح ملف المساعدة<br />
*.HLP لاحقا ً .(<br />
:<br />
أي أنه عند الضغط على الزر OK سيعيد التابع القيمة<br />
mrok<br />
.<br />
وهكذا<br />
مثال<br />
.<br />
: ( 1 )<br />
أبدأ مشروعا ً جديدا ً وضع عليه الزر<br />
:<br />
Button واكتب التعليمة التالية<br />
عند حدث الضغط عليه<br />
if MessageDlg(' تريد إغلاق البرنامج mtConfirmation,'هل<br />
,[mbyes,mbno],0)= mryes then close;<br />
تظهر هذه التعليمة الصندوق التالي مع<br />
الزرين<br />
مثال<br />
Yes وNo وتغلق البرنامج في<br />
حال تم الضغط على زر<br />
. Yes<br />
: 2<br />
أضف زر جديد إلى المشروع السابق<br />
عليه:<br />
واكتب التعليمة التالية عند حدث الضغط<br />
messagedlg( ' (mterror,[mball,mbyestoall,mbNoToAll,mbIgnore],0,'تجربة ;<br />
3 الصندوق : InputBox<br />
يظهر هذا الصندوق على شكل نافذة فيها عنصر Edit مع الزرين<br />
حيث<br />
Cancel وله الشكل التالي<br />
:<br />
Ok و<br />
InputBox( const ACaption, APrompt, ADefault: string ): string ;<br />
.<br />
: ACaption<br />
: Aprompt<br />
نص الرسالة<br />
هو عنوان الصندوق<br />
.<br />
: ADefault<br />
قيمة افتراضية تظهر في الصندوق<br />
يعيد التابع النص المدخل في العنصر<br />
مثال<br />
mbOK<br />
mbCancel<br />
mbYes<br />
mbNo<br />
mbAbort<br />
mbRetry<br />
mbIgnore<br />
mbAll<br />
mrOk<br />
mrCancel<br />
mrYes<br />
mrNo<br />
mrAbort<br />
mrRetry<br />
mrIgnore<br />
mrAll<br />
mrNoToAll<br />
mbNoToAll<br />
mbYesToAll mrYesToAll<br />
:<br />
'<br />
.<br />
. Edit<br />
:<br />
أضف زر جديد إلى المشروع السابق واكتب التعليمة التالية<br />
;('جديد ',' أدخل أسما ً جديدا ً للنموذج ,'تغير عنوان النموذج')inputbox form1.Caption =:<br />
23
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الخامسة<br />
التعرف على عنصر المذكرة<br />
24<br />
: Memo<br />
يستخدم عنصر المذكرة لكتابة نص طويل<br />
أكثر من )<br />
256 حرف (<br />
كما يمكن فيه كتابة نص من عدة سطور<br />
.<br />
تتم الكتابة في المذكرة أثناء التصميم عن طريق الخاصة Lines في محرر الخواص ،كما لها بعض الخصائص<br />
: المهمة مثل<br />
: WordWrap<br />
: WantTabs<br />
في حال كانت قيمة هذه الخاصة True يقوم المؤشر بالإنتقال إلى السطر التالي عند الوصول<br />
إلى آخر السطر الحالي .<br />
في حال كانت قيمة هذه الخاصة True فإنه ستتم إضافة 6 فراغات عند الضغط على الزر<br />
أثناء التنفيذ<br />
Tab<br />
Enter<br />
.<br />
: Wantreturns<br />
في حال كانت قيمة هذه الخاصة<br />
وستتم الكتابة على سطر واحد في حال قيمتها<br />
True سيتم إضافة سطر جديد عند الضغط على الزر<br />
. False<br />
: ReadOnly<br />
: Alignment<br />
في حال كانت قيمة هذه الخاصة True لا يمكن الكتابة في العنصر أثناء التنفيذ .<br />
تظهر طريقة عرض النص في المذكرة وتأخذ إحدى القيم التالية<br />
:<br />
: taRightJustify<br />
يظهر النص في الجهة اليمينية( في حال كانت الخاصة<br />
( bdRightToLeft تساوي BiDiMode<br />
: taLeftJustify<br />
مثال<br />
يظهر النص في الجهة اليسارية<br />
)<br />
( bdRightToLeft تساوي BiDiMode<br />
: taCenter<br />
يظهر النص في وسط العنصر<br />
.<br />
:<br />
أنشئ مشروعا ً جديدا ً وأضف إليه عنصر مذكرة<br />
في حال كانت الخاصة<br />
Memo وزرين<br />
Caption "حفظ "<br />
واكتب التعليمة التالية بعد الضغط عليه<br />
تقوم هذه التعليمة بحفظ النص المكتوب داخل عنصر المذكرة<br />
Button ،أعط الزر الأول الخاصة<br />
:<br />
Memo1.Lines.SaveToFile( 'c:\a.txt') ;<br />
)<br />
(<br />
. ( a.txt<br />
أعط الزر الثاني الخاصة<br />
" Caption<br />
فتح<br />
تقوم هذه التعليمة بتحميل النص من الملف<br />
التعرف على عنصر الزر<br />
"<br />
)<br />
(أثناء التنفيذ<br />
واكتب التعليمة التالية بعد الضغط عليه<br />
المذكور اسمه بين القوسين<br />
إلى الملف المحدد بين القوسين<br />
هنا<br />
:<br />
Memo1.lines.LoadFromFile ('c:\a.txt') ;<br />
. (<br />
: Bitbtn<br />
يشبه هذا العنصر عنصر الزر إلى حد بعيد ويختلف عنه في<br />
1 إمكانية تغير لون خط العنوان<br />
:<br />
. ( Caption )<br />
2 إمكانية إضافة صورة لهذا الزر وذلك عن طريق<br />
أ الصور الافتراضية الموجودة في الخاصة<br />
:<br />
. Kind<br />
إلى المذكرة
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ب الخاصة Glyph التي يمكن أن نختار منها صورة ما للزر يوجد بعض صور للأزرار في المجلد<br />
C:\Program Files\Common Files\Borland Shared\Images\Buttons<br />
يمكن تغير صورة الزر عند الضغط عليه باختيار الصورة Glyph عبارة عن ثلاث صور متجاورة بنفس الحجم<br />
)<br />
NumGlyph إلى<br />
كما في الصورة التالية :<br />
وتغير قيمة الخاصة<br />
، 3 حيث تكون الصورة الأولى للزر<br />
في الوضع الافتراضي والصورة الثانية في حالة كانت الخاصة Enabeled تساوي<br />
False والصورة الثالثة تظهر<br />
عند الضغط على الزر .<br />
: SpeedButton<br />
التعرف على<br />
الأزرار السريعة<br />
:<br />
هي عبارة عن أزرار تستخدم في أشرطة الأدوات ولها خصائص الزر<br />
BitBtn بالإضافة إلى الخصائص التالية<br />
1 : Flat تعطي مظهر مستوي للزر ويصبح المظهر ثلاثي البعد عند مرور الفأرة فوقه .<br />
<br />
GroupIndex :عند إعطاء مجموعة من أزرار السرعة قيمة واحدة لهذه الخاصة أكبر من الصفر تعمل<br />
2<br />
هذه الأزرار كأزرار الراديو .<br />
مثال :<br />
Glyph<br />
أنشأ<br />
مشروعا ً جديدا ً وأضف أليه أربع أزرار<br />
Speedbutton أضف لكل زر صورة عن طريق الخاصة<br />
وأعط جميع الأزرار الخاصة GroupIndex القيمة<br />
1، نفذ البرنامج ولاحظ أنه لا يمكن لأكثر من زر من هذه<br />
المجموعة أن يكون مضغوطا ً في نفس الوقت .<br />
: ( MDI و SDI<br />
أنواع النماذج )<br />
:<br />
تقسم<br />
كل واجهات التطبيقات التي نصممها إلى نوعين هما<br />
واجهة الوثيقة الواحدة<br />
SDI أي إظهار نافذة واحدة<br />
.<br />
للبرنامج ،وواجهة الوثائق المتعددة : MDI<br />
وتعتمد على عدد من النوافذ الأبناء تظهر ضمن النافذة الأب<br />
يمكن تحديد نوع التطبيق الذي نصممه من خلال الخاصة FormStyle والتي تأخذ إحدى القيم التالية<br />
:<br />
FormStyle<br />
fsNormal<br />
fsMDIForm<br />
تنشئ شكلا ً وحيدا ً من النوع<br />
ملاحظات<br />
عملها<br />
SDI<br />
تنشئ شكلا ً أبا ً (شكل رئيسي للتطبيق) يمكن لهذا الشكل أن يحتوي على<br />
أشكال أخرى أثناء التنفيذ<br />
.<br />
تنشئ شكلا ً ولدا ً ، أي شكل ثانوي<br />
متعلق بشكل آخر<br />
تنشئ شكلا ً وحيدا ً يبقى ظاهرا ً في<br />
الأمام مهما كانت التطبيقات المفتوحة<br />
هذا الشكل سوف يحتوي من قبل<br />
الشكل الأب أثناء التنفيذ.<br />
fsMDIChild<br />
fsStayOnTop<br />
:<br />
وحتى نشرح كيف يستطيع الشكل الأب من النوع<br />
MDI أن يحتوي شكلا ً ولدا ً سنقوم بما يلي<br />
1 ننشئ مشروعا ً جديدا ً ونعطي الخاصة Formstyle للنموذج Form1 القيمة . fsMDIForm<br />
. fsMDIChild<br />
2 نضيف نموذج جديد للمشروع ونعطي الخاصة<br />
Formstyle له القيمة<br />
3 نفذ البرنامج ولاحظ أن النموذج الثاني يظهر ضمن حدود النموذج الأول ولا يمكن تحريكه خارجه<br />
.<br />
25
http://www.alshater.net<br />
: fsStayOnTop<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
المثال التالي يشرح الخاصة<br />
Formstyle للنموذج Form1 القيمة ، fsStayOnTop نفذ البرنامج<br />
ابدأ<br />
مشروعا ً جديدا ً وأعط الخاصة<br />
ولاحظ أن النافذة ستظهر على الشاشة ولا يمكن لأي نافذة أخرى الظهور فوقها<br />
) حاول مثلا ً فتح نافذة جهاز<br />
الكمبيوتر أو نافذة سلة المحذوفات ولاحظ أن هذه النوافذ ستظهر خلف نافذة البرنامج<br />
. (<br />
26
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إنشاء قوائم للنماذج<br />
تعطي القوائم طريقة سهلة للمستخدم للوصول إلى عدد من الأوامر وهناك نوعين من القوائم<br />
. ( Popup Menu<br />
)<br />
( Main Menu<br />
القائمة الرئيسية )<br />
والقائمة المنبثقة<br />
:<br />
القائمة الرئيسية Menu) ( Main :<br />
للقائمة الرئيسية الشكل التالي<br />
عناصر القوائم ضمن شريط القوائم<br />
أوامر القائمة<br />
أمر يفتح قائمة فرعية<br />
مفتاح تسريع<br />
اختصارات لوحة المفاتيح<br />
شريط فاصل<br />
مثال :<br />
Standered<br />
1 ابدأ مشروعا ً جديدا ً وأضف إلى النموذج عنصر<br />
MainMenu من القائمة<br />
:<br />
( Menu Desigenr<br />
2 افتح مصمم القوائم )<br />
عن طريق<br />
الخاصة<br />
Items من محرر الخواص أو الضغط مرتين على عنصر القائمة أو الضغط على العنصر بالزر<br />
اليميني<br />
Menu Item )<br />
واختر<br />
Menu Desigenr من القائمة عند ذلك سيظهر مصمم القوائم وفيه عنصر قائمة<br />
.<br />
فارغ مضاء وستضاء أيضا ً الخاصة<br />
Caption ضمن محرر الخواص<br />
(<br />
: (<br />
3 أعط الخاصة Caption القيمة )<br />
&ملف<br />
ستلاحظ ظهور عنصر القائمة ملف وظهور خط صغير تحت<br />
. Caption<br />
الحرف م في كلمة ملف وذلك لأننا وضعنا الرمز &<br />
قبل هذا الحرف في الخاصة<br />
. (<br />
)<br />
4 أعط الخاصة<br />
Caption للزر الظاهر تحت عنصر القائمة ملف القيمة<br />
&جديد<br />
. (<br />
5 وسيظهر عندها زر جديد تحت الزر السابق أعطه ) Caption<br />
&فتح<br />
.<br />
6 أعط ال Caption<br />
للزر الأخير القيمة<br />
– وذلك لإظهار خط فاصل بين أوامر القائمة<br />
27
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
7 أعط ال Caption لآخر زر ناتج القيمة<br />
http://www.alshater.net<br />
.<br />
28<br />
إغلاق &<br />
8 أختر عنصر القائمة الموجود بجانب العنصر ملف وأعطه ال<br />
9 أعط الزر الذي تحته ال Caption القيمة نسخ، والخاصة<br />
بتنفيذ عملية الضغط على عنصر القائمة عند طريق استخدام لوحة المفاتيح<br />
10 أعط الزر التالي ال<br />
11 أعط الزر التالي ال<br />
إنشاء قائمة فرعية لقائمة رئيسية<br />
Caption &تحرير .<br />
Shortcut القيمة Ctrl + c وتقوم هذه الخاصة<br />
.<br />
. Ctrl + X القيمة Shortcut قص ، والخاصة Caption<br />
. Ctrl + V القيمة Shortcut لصق ، والخاصة Caption<br />
:<br />
12 أعط الزر الذي يلي الزر لصق ال Caption نمط الخط ، اضغط عليه بزر الفأرة اليميني<br />
واختر Create SubMenu ستظهر عندئذ قائمة فرعية أعط فيها الأوامر الثلاث التالية<br />
غامق ، مائل ، تحته خط<br />
العمل مع عناصر القائمة<br />
:<br />
.<br />
:<br />
1 لحذف عنصر قائمة نختار أي عنصر ونضغط على الزر Delete أو نضغط بزر الفأرة الأيمن ونختار<br />
Delete من القائمة<br />
.<br />
2<br />
القائمة<br />
لإضافة عنصر جديد بين عنصرين نختار العنصر السفلي ونضغط بزر الفأرة الأيمن ونختار<br />
Insert من<br />
.<br />
3<br />
لتغيير موقع عنصر قائمة أو لإعادة ترتيب قائمة نسحب العنصر الذي نريد نقله<br />
العنصر ونبقيه مضغوطا ً<br />
)<br />
(<br />
ثم نحرر زر الفأرة ليتوضع في المكان الجديد<br />
.<br />
4 لإظهار عناصر قائمة متجاورين أفقيا ً نغير الخاصة Break لأمر القائمة المطلوب إلى<br />
نضغط بزر الفأرة على<br />
mbBreak<br />
أو إلى<br />
mbBarBreakوحيث تظهر الثانية خط عمودي بين الأوامر ، ولإعادة القائمة إلى الحالة الافتراضية نختار<br />
. mbNone<br />
حدث الضغط على عنصر قائمة<br />
:<br />
5<br />
تستخدم القوائم لتنفيذ تعليمات معينة ولكتابة هذه التعليمات نضغط على الأمر في القائمة أو نختاره ونضغط<br />
على الحدث OnClick من الصفحة Event في محرر الخواص<br />
.<br />
6<br />
غالبا ً ما تستخدم القوائم مع البرامج متعددة الوثيقة MDI ويمكن دمج قوائم النافذة الأبن مع نوافذ النافذة الأب<br />
وسندرس ذلك لاحقا ً.<br />
القائمة المنبثقة<br />
: ( Popup Menu )<br />
هي عبارة عن قائمة تظهر عند الضغط على زر الفأرة اليميني ويمكن ربطها مع النموذج أو أي عنصر آخر<br />
وتصميهما مشابه لتصميم القائمة الرئيسية<br />
مثال<br />
. Main Menu<br />
:<br />
أضف عنصري قائمة منبثقة PopUpMenu إلى مشروع جديد وأضف عنصر<br />
أضف إلى عنصر القائمة الأولى الأوامر التالية<br />
Panel كذلك .<br />
:<br />
الأمر الأول ، الأمر الثاني ، الأمر الثالث<br />
أضف إلى عنصر القائمة الثانية الأوامر التالية الرابع ، الخامس<br />
'لقد ضغطت على الأمر الأول من القائمة' 'الأولى<br />
.<br />
.<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اضغط على الأمر الأول واكتب التعليمة التالية:<br />
اضغط على الأمر الثاني واكتب التعليمة التالية<br />
http://www.alshater.net<br />
Showmessage ( "you click the first button" );<br />
:<br />
Showmessage ( "you click over the second button " );<br />
اضغط على الرابع واكتب التعليمة التالية :<br />
Showmessage ("you click over the third button")<br />
:<br />
Showmessage ("you click over the fifth button" )<br />
. PopUpMenu1<br />
اضغط على الخامس واكتب التعليمة التالية<br />
اختر الخاصة PopUpMenu التابعة للنموذج وأعطها القيمة<br />
اختر الخاصة PopUpMenu التابعة لل Panel وأعطها القيمة<br />
نفذ البرنامج<br />
واضغط بزر الفارة الأيمن على كل من النموذج وال<br />
.PopUpMenu2<br />
. Panel<br />
إضافة ملاحظات إلى البرنامج<br />
29<br />
: ( Comments)<br />
يستخدم المبرمج الملاحظات ليتذكر عمل مقطع برمجي محدد ، وليترك فكرة عما يريد أن يطوره مستقبلا ً في<br />
سطور برمجية معينه<br />
.<br />
يمكن إضافة ملاحظات إلى البرنامج<br />
:<br />
1 }<br />
أكتب أي نص تريده بين هذين القوسين ، ويمكن أن يكون على عدة أسطر<br />
. {<br />
2 <br />
3 //<br />
(* أكتب أي نص تريده بين إشارتي القوس والنجمة ، ويمكن أن يكون على عدة اسطر<br />
أكتب أي نص تريده بعد هذين الإشارتين ، النص على سطر واحد فقط<br />
لكتابة الملاحظات في ال<strong>لغة</strong> العربية<br />
. (*<br />
.<br />
:<br />
properties<br />
القيمة<br />
اضغط بمؤشر الفأرة الأيمن في وسط محرر الشيفرة واختر من القائمة<br />
فتظهر النافذة Property Editors أختر منها الصفحة Display وغير الخاصة<br />
Editor Font إلى<br />
... Ok اضغط على ، Courier New ( Arabic)<br />
أنواع المعطيات<br />
تملك <strong>لغة</strong> باسكال الهدفية<br />
:Data Types<br />
(Object Pascal)<br />
:<br />
عدد ًا من أنواع المعطيات مسبقة التعريف بحيث تمكننا من التصريح<br />
مباشرة عن متحولات تنتمي لهذه الأنواع. والجدول التالي يعرض أنواع المعطيات مسبقة التعريف في هذه ال<strong>لغة</strong>:<br />
الأنواع الصحيحة<br />
نوع المعطيات وصفها<br />
Integer<br />
Shortint<br />
Smallint<br />
هي أعداد بدون فاصلة عشرية. تقع هذه الأعداد ضمن المجال من<br />
)<br />
(2147483647)<br />
، وتتطلب أربع بايتات من الذاكرة لتخزينها<br />
)<br />
2 بايت (<br />
-2147483648)وحتى<br />
كان حجمه في تربو باسكال<br />
لذلك ليس من الضروري ان تتطابق أنواع المعطيات بين <strong>دلفي</strong> و تربو باسكال) .<br />
هي أعداد بدون فاصلة عشرية. تقع في المجال بين<br />
من الذاكرة<br />
(128-)<br />
.<br />
وهي أعداد بدون فاصلة عشرية وتقع في المجال بين (-32768)وحتى<br />
وحتى(127) وتتطلب بايتا ً واحدا ً<br />
(32767)<br />
وتتطلب
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
بايتين من الذاكرة لتخزينها<br />
هي أعداد بدون فاصلة عشرية،<br />
وتقع في المجال بين(2147483648-)وحتى<br />
Longint<br />
(2147483647)وتتطلب أربع بايتات من الذاكرة لتخزينها<br />
هي أعداد بدون فاصلة عشرية وبدون إشارة تقع في المجال بين (0)<br />
وحتى<br />
(225)وتتطلب<br />
Byte<br />
بايتا ً واحدا ً من الذاكرة<br />
.<br />
هي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين<br />
(0)وحتى(65535)وتحتاج<br />
Word<br />
بايتين من الذاكرة.<br />
وهي أعداد بدون فاصلة عشرية وبدون إشارة وتقع في المجال بين(0)<br />
وحتى<br />
Cardinal<br />
(2147483647) وتحتاج أربع بايتات لتخزينها.<br />
2*10 63 -1<br />
)<br />
( -2*10 63<br />
وهي أعداد بدون فاصلة عشرية وتقع ضمن المجال )<br />
وحتى المجال<br />
Int64<br />
( وتحتاج إلى ثمان بايتات من الذاكرة<br />
الأنواع الحقيقية<br />
هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />
من<br />
) 8 ( أو ) 7 (<br />
1.5* 10 -45 وحتى<br />
10*3.4 38 وتحتاج إلى أربع بايتات من الذاكرة<br />
هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />
) 12 ( أو ) 11 (<br />
2.9*10 -39 إلى<br />
باسكال القديمة وإلا فإن استخدام<br />
أرقام وتقع في المجال<br />
وتقع ضمن المجال<br />
10*1.7 38 وهي تحتاج إلى ست بايتات من الذاكرة وتستخدم للتوافق مع نسخ<br />
Extended أو Double أولى<br />
هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />
) 16 ( أو ) 15 (<br />
5.0*10 -324 إلى<br />
10*1.7 308 وتحتاج إلى ثماني بايتات من الذاكرة<br />
هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />
.<br />
) 20 ( أو ) (19<br />
3.4*10 -4932 وحتى<br />
10*1.1 4932 وتحتاج إلى عشرة بايتات من الذاكرة<br />
وتقع ضمن المجال<br />
رقم وتقع في المجال<br />
وهي أعداد حقيقية ذات فاصلة ثابتة بخلاف باقي الأنواع ذات الفاصلة العائمة ، وهي ملائمة<br />
Single<br />
Real<br />
Double<br />
Extended<br />
Currency<br />
20 رقم (<br />
)<br />
( 19<br />
للحسابات المالية وتملك جزءا ً عشريا ً من )<br />
أو<br />
وتقع ضمن المجال<br />
922337203685477.5808- وحتى 922337203685477 ويتطلب تخزينها ثمان بايتات<br />
.<br />
هي أعداد تحتوي فاصلة عشرية وجزءا ً عشريا ً فيه<br />
أو ) (19<br />
) 20 ( رقم وتقع في المجال<br />
-9.2*10 18 وحتى<br />
10*9.2 18 وتحتاج إلى ثمان بايتات من الذاكرة<br />
.<br />
Comp<br />
30
http://www.alshater.net<br />
True أو False ويحتاج<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الأنواع البوليانية<br />
:<br />
Boolean<br />
هو نوع منطقي يمكن أن تأخذ المتحولات المنتمية إليه إحدى قيمتين<br />
إلى بايت واحد من الذاكرة<br />
.<br />
ByteBool مثل نوع Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى بايت واحد من<br />
الذاكرة<br />
مثل نوع<br />
مثل نوع<br />
الذاكرة<br />
Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى بايتين من الذاكرة<br />
Boolean يستخدم للتوافق مع لغات أخرى مثل C ويحتاج إلى أربع بايتات من<br />
Wordbool<br />
Longbool<br />
الأنواع الرمزية :<br />
AnsiChar هو نوع رمزي يحتاج إلى بايت واحد من الذاكرة لتخزين شيفرة أسكي المقابلة لرمز معين<br />
) Unicode<br />
. Character<br />
WideChar هو نوع رمزي يحتاج إلى بايتين من الذاكرة لتخزين رمز بالشيفرة الموحدة<br />
الشيفرة الموحدة تم اعتمادها منذ فترة في أنظمة التشغيل Windows 2000,Xp وهي عبارة<br />
تمثيل يضم جميع لغات العالم<br />
)<br />
عدى لغات شرق آسيا<br />
(<br />
ويحتاج كل رمز فيها إلى<br />
هو نفس النوع AnsiChar تحت بيئة Windows 98,Me ولكنه قد يشير إلى<br />
16 بت .<br />
WideChar<br />
Char<br />
في بيئة . Windows 2000,Xp<br />
2 جيغا<br />
أنواع السلاسل الرمزية<br />
:<br />
AnsiString<br />
هو عبارة عن مصفوفة من الرموز غير محدودة الطول يبدأ حجمها<br />
بايت<br />
4بايت وينتهي ب<br />
وتبدأ رموزها من الحجرة الأولى<br />
) 1<br />
لا وجود للحجرة<br />
. ( 0<br />
هو عبارة عن مصفوفة من الرموز حدها الأقصى 256 رمز ويأخذ حجمها بين<br />
2 بايت و<br />
Sortstring<br />
( 0<br />
256 بايت ويخزن في الحجرة الأولى منها )<br />
الحجرة رقم<br />
طول المصفوفة<br />
هو عبارة عن مصفوفة من الرموز بالشيفرة الموحدة Unicode يبدأ حجمها 4بايت وينتهي<br />
ب 2 جيغا بايت وتبدأ رموزها من الحجرة الأولى<br />
) 1<br />
لا وجود للحجرة<br />
بشكل افتراضي تعريف متحول من هذا النوع يكافئ تعريف متحول<br />
. ( 0<br />
AnsiString أو<br />
WideString<br />
String<br />
WideString حسب نظام التشغيل ، ويمكن أن يشير<br />
إلى<br />
Shortstring في حال أضفنا<br />
{$H-}<br />
التعليمة التالية في بداية القسم implementation<br />
31
؛)<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
السلاسل الرمزية المنتهية بلا شيء<br />
http://www.alshater.net<br />
. ( Null )<br />
PAnsiChar<br />
هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز<br />
ورموز هذه السلسة من النوع<br />
Null<br />
AnsiChar<br />
PWideChar<br />
هو عبارة عن نوع معطيات مؤشر يؤشر إلى على سلاسل رمزية منتهية برمز<br />
ورموز هذه السلسة من النوع<br />
Null<br />
WideChar<br />
Pchar<br />
المؤشر<br />
نفس النوعين السابقين ويؤشر على النوع<br />
Char<br />
Pointer<br />
النوع المتنوع<br />
وهو مؤشر غير محدد النوع أي يؤشر إلى أي نوع من المعطيات ،ويحتاج إلى أربع حجرات<br />
. من الذاكرة<br />
( المتغير )<br />
Variant<br />
أمثلة<br />
نوع متغير متوافق مع جميع انواع المعطيات ويمكن أن يخزن قيما ً وفق أي نوع<br />
.<br />
:<br />
1 النوع<br />
: Boolean<br />
أنشأ مشروعا ً جديدا ً وأضف إليه زر<br />
Button وعنصري Edit وأكتب التعليمات التالية<br />
var a:Boolean;<br />
i,j:integer;<br />
begin<br />
i:=strtoint(edit1.text);<br />
j:= strtoint(edit2.text);<br />
a:= i>j;<br />
) 'العدد الثاني أكبر من ) else showmessage 'العدد اللأول أكبر من الثاني') if a then showmessage<br />
2 النوع<br />
: Shortstring<br />
أضف زر وعنصري Label و عنصر Edit إلى مشروع جديد<br />
يقوم التابع<br />
Word بإعادة شيفرة الأسكي لرمز معين مثلا ً<br />
السلسة مخزن كرمز وليس كرقم<br />
الأول'<br />
واكتب التعليمات التالية عند الضغط على الزر<br />
:<br />
:<br />
var a:shortstring;<br />
begin<br />
a:=edit1.text;<br />
form1.Caption := inttostr(word(a[0]);<br />
if word(a[0]) >= 4 then<br />
label1.Caption := a[3]+a[4];<br />
Word('A') يساوي<br />
.<br />
65 واستخدم هذا التابع لأن طول<br />
32
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
السادسة<br />
2 النوع : String<br />
للحصول على طول سلسلة رمزية نستخدم التابع Length('s') حيث<br />
S هو السلسة المطلوب حساب طولها<br />
مثال :<br />
أضف زر وعنصر<br />
Edit إلى مشروع جديد واكتب التعليمات التالية عند حدث الضغط على الزر<br />
:<br />
var a:string;<br />
begin<br />
a:=edit1.text;<br />
label1.Caption := inttostr(length(A);<br />
label2.Caption :=inttostr(length('asdfgh');<br />
3 النوع<br />
label و<br />
: Pchar<br />
Var P:pchar;<br />
لنفرض أنه عرفنا متحول : Pchar<br />
P من النوع<br />
ثم كتبنا في القسم Begin التعليمة التالية<br />
p:=<br />
هذا يكافئ كتابة التعليمات التالية :<br />
'Hello<br />
;Form1.Caption := p<br />
s: string;<br />
begin<br />
s:= 'HELLO ALL......'#0 ;<br />
p:= @s[1];<br />
form1.Caption := p;<br />
:<br />
All…….'<br />
حيث #0 هو رمز الأسكي ل Null ووضعه هنا ينهي السلسلة<br />
. Null ب s<br />
@ يعيد عنوان موقع الذاكرة المخزن فيه الحرف الأول من السلسلة . s<br />
: Variant<br />
(<br />
4 النوع المتغير )<br />
المتنوع<br />
var v1,v2,v3 :variant;<br />
begin<br />
v1:= 5;<br />
v2:= 20;<br />
v3 := v1+v2 ;<br />
form1.Caption := v3;<br />
v1:= 5;<br />
v2:= 'asd';<br />
v3 := v1+v2 ;<br />
اكتب التعليمات التالية في حدث الضغط على زر<br />
التعليمات التالية تعطي رسالة خطأ من النوع<br />
ولكن التعليمات التالية لا تعطي هذا الخطأ<br />
: EvariantError<br />
:<br />
:<br />
v1:= 5;<br />
v2:= '123';<br />
v3 := v1+v2 ;<br />
33
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لماذا لا نستخدم النوع<br />
34<br />
Variant دائما ً :<br />
هذا لاحظ أن<br />
المتحول ضد التوجه العام ل<strong>لغة</strong> باسكال و ضد أعراف<br />
<strong>البرمجة</strong> الجيدة، هذا النوع يتم فحص نوعه و يتم حسابه في وقت التشغيل، والمجمع compiler لن يحذرك من<br />
احتمالات الأخطاء، و التي لن يستدلّ عليها إلا بعد اجراء اختبارات مكثفة، بصورة عامة، يمكنك اعتبار أجزاء<br />
الترجمة التي تستخدم<br />
هذا النوع هي ترجمة فورية<br />
،interpreted لأنه، مثل أي<br />
<strong>لغة</strong> تفسيرية، العديد من<br />
العمليات لا يمكن التقرير بشأنها وحل ّها إلا في وقت التشغيل، هذا يؤثر بصفة خاصة في سرعة التنفيذ.<br />
المتحولات العامة والخاصة<br />
:<br />
يوجد في القسم Interface لكل وحدة قسم خاص بالمتحولات المستخدمة داخل الوحدة نفسها ويدعى<br />
private والمتحول المعرف في هذا القسم يمكن استخدامه في جميع إجراءات وتوابع هذه الوحدة لكن لا<br />
يمكن الوصول إليه من خارجها<br />
.<br />
وهناك قسم آخر يشبه القسم السابق ويختلف عنه بإمكانية الوصول إليه من وحدات خارجية مرتبطة مع الوحدة<br />
المعرف فيها هذا المستخدم ويدعى<br />
مثال<br />
. Public<br />
:<br />
أنشئ مشروعا ً جديدا ً وأضف إليه زرا ً وعرف في القسم Private المتحول التالي<br />
وعرف في القسم<br />
Public المتحول التالي<br />
private<br />
I :integer;<br />
public<br />
x:integer;<br />
:<br />
:<br />
أذهب إلى الحدث OnCreate الخاص بالنموذج واكتب فيه التعليمات التالية<br />
الحدث<br />
I := 4 ; X := 24;<br />
:<br />
) X,I<br />
OnCreate يتم تنفيذه عند يقوم ويندوز بإنشاء النافذة والتعليمات السابقة تعطي قيم ابتدائية للمتحولين<br />
لاحظ استخدام هذين المتحولين ضمن الإجراء<br />
يمكن استخدامها ضمن أي جزء من البرنامج<br />
الزر<br />
procedure TForm1.FormCreate أي<br />
. (<br />
:<br />
أضف نموذجا ً جديدا ً وأضف إليه زرا ً الآن اذهب إلى النموذج الأول واكتب التعليمة التالية في حدث الضغط على<br />
نفذ البرنامج حتى يتم ربط الوحدة الثانية مع الأولى بشكل آلي<br />
form2.Show ;<br />
)<br />
في حدث الضغط على الزر الموجود في النموذج الثاني أكتب التعليمة التالية<br />
أو اكتب أسم الوحدة الأولى في القسم<br />
. ( Uses<br />
:<br />
Form2.Caption := inttostr ( Form1.X) ;<br />
نفذ البرنامج لربط الوحدات مع بعضها آليا ً ثم نفذ البرنامج، الزر في النافذة الأولى سيقوم بإظهار النافذة الثانية،<br />
والزر في النافذة الثانية سيأخذ القيمة X من الوحدة الأولى ويضعها في عنوان النافذة<br />
هناك طريقة أخرى لتعريف متحول خاص بالوحدة عن طريق تعريفه بالقسم<br />
ويتميز تعريف المتحول هنا بإمكانية إعطاء قيمة مبدئية له مباشرة<br />
Implementation<br />
.<br />
Var قبل<br />
.
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
مثال عرف المتحولات التالية في القسم<br />
الثوابت<br />
قبل<br />
http://www.alshater.net<br />
Implementation Var<br />
Y: string = 'abcd'; F : double = 55;<br />
: Const<br />
الثابت هو حجرة من الذاكرة تحمل قيمة معينة طوال فترة تنفيذ البرنامج<br />
يمكن تعريف الثوابت خارج القسم<br />
في القسم<br />
:<br />
Type قبل<br />
Implementation فتكون ثوابت عامة ، ويمكن تعريفها<br />
Implementation وتكون ثوابت خاصة بالوحدة .ويكون تعريفها بالطريقة التالية<br />
ويمكن تعريفها بطريقة أخرى<br />
الإجراءات والتوابع<br />
:<br />
Const<br />
pi=3.14;<br />
pi2=22/7;<br />
programmer = 'Khaled';<br />
Const<br />
Pi :Real = 3.14;<br />
pi2:single =22/7;<br />
programmer :string= 'Khaled';<br />
:<br />
:<br />
مبدئيا هي سلسلة من التعليمات تحت اسم خاص، و التي يمكن تنفيذها في كل مرة باستخدام اسمها، بهذه الطريقة<br />
تتجنب معاودة كتابة التعليمات مرة بعد أخرى، فتتحصل على مجموعة واحدة من التعليمات يمكنك استدعائها في<br />
كامل البرنامج.<br />
في <strong>دلفي</strong> الإجرائية routine<br />
يمكن<br />
افتراضها بشكلين:<br />
إجراء procedure<br />
و تابع<br />
function<br />
نظريا، يستخدم الإجراء عندما نريد من الحاسب القيام بعمل ما دون أن يعيد قيمة معينة ،والتابع هو عبارة عن<br />
إجراء ينفذ مجموعة من التعليمات ليعيد قيمة معينة يطلبها المبرمج<br />
،result قيمة مسترجعة، بينما الإجراء ليس كذلك، كلا<br />
متحولاتparameters<br />
، من أنواع بيانات<br />
تعطى لها .<br />
عمليا ً، الفرق عموما بين التوابع و الإجراءات محدود جدا: يمكنك<br />
(التي قد تكون رمز خطأ اختياري أو<br />
.<br />
هذا الفرق يؤك ّده<br />
حقيقة أن التابع له نتيجة<br />
النوعين من الاجرائيات يكمن أن يكون لهما عدة<br />
استدعاء تابع لإنجاز عمل ما ثم تتخط ّى النتيجة<br />
ما شابه) كما بامكانك استدعاء إجراء يمرر نتيجته ضمن متحولاته.<br />
procedure Hello;<br />
begin<br />
35<br />
وهذا مثال لتعريف إجراء :<br />
وهذا مثال لتعريف تابع<br />
;('مرحبا ً بكم في <strong>دلفي</strong>') ShowMessage<br />
end;<br />
function Double (Value: Integer) : Integer;<br />
begin<br />
Double := Value * 2;<br />
end;<br />
:
http://www.alshater.net<br />
Implementation<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تكتب هذه الإجراءات أو التوابع في القسم<br />
التالية في حدث الضغط على الزر الأول<br />
ولاستدعائها، أضف زرين واكتب التعليمة<br />
Hello<br />
:<br />
Form1.caption := inttostr( Double(6));<br />
:<br />
والتعليمة التالية في حدث النقر على الزر الثاني<br />
المتحولات داخل إجراء أو تابع :<br />
1 الحالة العامة<br />
Procedure ProcedureName ( var1,var2,var3: anytype ;<br />
var4,var5:any type) ;<br />
Begin<br />
….<br />
…<br />
end;<br />
Procedure Add( x,y : integer) ;<br />
Begin<br />
Y:= x+y ;<br />
End;<br />
:<br />
var i,j:integer;<br />
begin<br />
i:=1;j:=2;<br />
add(i,j);<br />
label1.Caption := inttostr(i);<br />
label2.Caption := inttostr(j);<br />
.<br />
x إلى<br />
مثال :<br />
أضف زر وعنصري Label واكتب فيه التعليمات التالية<br />
يقوم هذا البرنامج باستدعاء التابع Add الذي يقوم بإضافة<br />
2 المتحولات<br />
y ولكنه لا يعيد أي نتيجة<br />
: ( )<br />
Procedure ProcedureName ( var1,var2,var3: anytype ;var<br />
var4,var5:any type) ;<br />
Begin<br />
….<br />
…<br />
end;<br />
مثال<br />
الوسطاء<br />
المتغيرة<br />
Add ليصبح كتالي ونفذ البرنامج<br />
procedure add(x:integer;var y:integer);<br />
begin<br />
y:= x+y;<br />
end;<br />
. j<br />
x إلى<br />
:<br />
عدل الإجراء<br />
يقوم البرنامج باستدعاء الإجراء<br />
Add الذي يقوم بإضافة<br />
y ولكنه يعيد قيمة y وبالتالي تتغير قيمة<br />
36
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ملاحظات<br />
http://www.alshater.net<br />
37<br />
:<br />
أ يمكن استدعاء الإجراء<br />
Add ( ولكن لا يمكن استدعائه بالشكل Add( (j,1 المعدل بالشكل Add<br />
(2,I أو بالشكل (1,2 Add( وذلك لأن الوسيط الثاني لهذا الإجراء يجب أن يكون متحول حتى تتم إعادة<br />
. النتيجة فيه<br />
ب قد يتبادر إلى الذهن هنا السؤال التالي بما أنني أريد من الإجراء أن يعيد قيمة ما فلماذا لا أستخدم تابع؟<br />
والجواب هنا أنه بهذه الطريقة يمكن أن يعيد الإجراء أكثر من قيمة بينما يعيد التابع قيمة وحيدة، على كل حال هذه<br />
الطريقة يمكن أن تستخدم مع الإجراءات والتوابع على حد سواء أي انه يمكن أن نعرف تابع يعيد قيمة ما عن<br />
طريق إسمه وقيم أخرى عن طريق متحولاته<br />
3 الوسطاء الثابتة<br />
( . وسطاءه )<br />
:<br />
Procedure ProcedureName ( const var1,var2,var3: anytype ;<br />
var4,var5:any type) ;<br />
Begin<br />
….<br />
…<br />
end;<br />
عندما لا نكون بحاجة لتغير قيمة الوسيط ضمن التابع يمكن أن نعرفه من النوع الثابت<br />
في زيادة سرعة البرنامج<br />
.<br />
عدل التابع Add ليصبح بالشكل<br />
نفذ البرنامج ولن تلاحظ أي فرق في النتائج<br />
Const ولا يفيد ذلك إلا<br />
:<br />
procedure add(const x:integer;var y:integer);<br />
begin<br />
y:= x+y;<br />
end;<br />
أما إذا عدل البرنامج ليصبح بالشكل<br />
procedure add(const x:integer;const y:integer);<br />
begin<br />
y:= x+y;<br />
end;<br />
فسيعطي تنفيذ البرنامج رسالة الخطأ التالية<br />
Left side cannot be assigned to :<br />
.<br />
أنه لا يمكن إعطاء قيمة ل Y لأنها من النوع الثابت<br />
5 إجراءات القيمة الافتراضية<br />
.<br />
:<br />
يمكن إعطاء وسيط ما قيمة إفتراضية والاستغناء عن تمرير قيمه له عند الطلب<br />
وتعني<br />
:<br />
Procedure ProcedureName(var1,var2,var3: anytype ; var4:<br />
anytype = Value ; var5:anytype= value) ;<br />
Begin<br />
….<br />
…<br />
end;
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
مثال :<br />
عدل الإجراء<br />
Add ليصبح بالشكل<br />
الآن يمكن أن نطلب الإجراء Add بأحد الشكلين التاليين<br />
procedure add(var x:integer;var y:integer=5);<br />
begin<br />
x:= x+y;<br />
end;<br />
Add ( I,j) or Add( I )<br />
:<br />
في الحالة والثانية سيقوم الإجراء باستخدام القيمة الافتراضية المعطاه في تعريف الإجراء<br />
ملاحظة<br />
.<br />
:<br />
الوسطاء الافتراضية يجب أن تكون آخر الوسطاء المعرفة في التابع<br />
4 تعريف تابع فوق تابع أو إجراء فوق إجراء<br />
مثال<br />
: overload<br />
تمكننا هذه الطريقة من تعريف مجموعة توابع لها نفس الأسم ولكل منها وظيفة محددة<br />
.<br />
: أضف ثلاثة أزرار وعنصري Label إلى مشروع جديد واكتب الإجراءات التالية<br />
procedure change( i :integer; var s :string) ; overload;<br />
begin<br />
s:=inttostr(i);<br />
end;<br />
procedure change( i:tdatetime; var s :string) ; overload;<br />
begin<br />
s:= datetostr(i)<br />
end;<br />
procedure change( i:tdatetime; var s1,s2 :string) ;<br />
overload;<br />
begin<br />
S1:= datetostr(i);<br />
S2 := datetostr( i+1);<br />
end;<br />
Var a:string ;<br />
begin<br />
change ( 5,a) ;<br />
Label1.Caption := a ; end;<br />
Var B:String ; begin<br />
Change ( date,b);<br />
Label2.Caption := b; End;<br />
Var A,B:string; begin<br />
في حدث الضغط على الزر الاول أكتب التعليمة التالية<br />
:<br />
وفي حدث الضغط على الزر الثاني أكتب التعليمات التالية<br />
وفي حدث الضغط على الزر الثالث أكتب ما يلي<br />
:<br />
:<br />
38
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
6 متحول النتيجة<br />
http://www.alshater.net<br />
Change ( date,a,b);<br />
Label1.Caption := A; Label2.Caption := B; end;<br />
: Result<br />
Result هو عبارة عن متحول افتراضي في بيئة <strong>دلفي</strong> توضع قيمة التابع<br />
يمكن كتابة التابع Add بأحد الشكلين<br />
Function add( x,y:integer) :<br />
integer;<br />
Begin<br />
Add := x+y;<br />
End;<br />
:<br />
:<br />
Function add( x,y:integer) :<br />
integer;<br />
Begin<br />
result := x+y;<br />
End;<br />
جعل الإجراء مرئي من قبل وحدات أخرى<br />
:<br />
نعلم أنه كي نستطيع استدعاء متحول أو تابع من وحدة إلى أخرى يجب أن تكون موجودة في القسم<br />
. Interface<br />
1 وضع أسم الإجراء في القسم<br />
ثم نكتب الإجراء مع جسمه<br />
Interface قبل Var مثلا ً :<br />
Procedure Add( x,y : integer) ;<br />
( Begin… end )<br />
في القسم<br />
: Implementation<br />
Procedure Add( x,y : integer) ;<br />
Begin<br />
Y:= x+y ;<br />
End;<br />
بهذه الطريقة نستطيع طلب الإجراء من أي وحدة أخرى مرتبطة بالوحدة التي عرف في الإجراء عن طريق ذكر<br />
. اسمه فقط<br />
2 يمكن أن نضيف اسم الإجراء مع وسطائه إلى القسم<br />
مثال أضف السطر التالي في القسم<br />
. Type<br />
Private<br />
Procedure Add( x,y : integer) ;<br />
Type قبل<br />
:<br />
على أن نعرف الإجراء Add في القسم Implementation بالشكل التالي<br />
:<br />
Procedure Tform1.Add( x,y : integer) ;<br />
Begin<br />
Y:= x+y ;<br />
End;<br />
أضف وحدة أخرى إلى البرنامج وأطلب منها التابع Add العائد لل Form1 بالشكل التالي<br />
:<br />
Form1.add ( x,y ) ;<br />
39
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التوابع ذات الوسطاء المتعددة<br />
الجلسة السابعة<br />
http://www.alshater.net<br />
:<br />
Procedure procedureName ( var parameter1 : array of anytype<br />
; par2,par3:anytype );<br />
Begin<br />
……………………<br />
……<br />
end;<br />
يعرف في هذه الإجراءات<br />
مثال<br />
40<br />
( التوابع )<br />
:<br />
استخدمنا هنا التابع<br />
وسيط على أنه من نوع مصفوفة غير محدودة العناصر<br />
Function add( a:array of integer): string ;<br />
var h,i,s : integer;<br />
begin<br />
s:=0;<br />
h := high(a);<br />
for i:= 0 to h do s:= s + a[i];<br />
result:= inttostr(s);<br />
end;<br />
High الذي يعيد رقم آخر عنصر في مصفوفة<br />
)<br />
إي إذا عرفنا مصفوفة ما بالشكل<br />
[3..0] سيعيد التابع القيمة 3 وإذا عرفنها بالشكل [3..2] سيعيد القيمة 3 وإذا عرفت بالشكل<br />
[22..88] سيعيد . 88<br />
في حدث الضغط على زر أكتب التعليمات التالية<br />
:<br />
form1.Caption := add([1,3,4,89])<br />
سيقوم البرنامج بجمع الأعداد ووضع الناتج في عنوان النافذة<br />
ملاحظة<br />
) المستخدم<br />
:<br />
شريط العمل<br />
المصفوفات المتغيرة تبدأ دائما ً بالعنصر رقم صفر أي<br />
لذلك بدأت الحلقة المستخدمة في التابع<br />
Add من الصفر<br />
.<br />
: ProgressBar<br />
هو شريط يؤشر إلى كمية إنجاز العمل حتى لحظة معينة<br />
برنامج<br />
مثال<br />
أضف<br />
)<br />
[0]A وتنتهي بحسب العناصر التي أدخلها<br />
نفس الشريط الذي يظهر عند بدأ تنصيب<br />
Setup أي<br />
(<br />
كما يمكن استخدامه لإظهار قيمة معينة<br />
.<br />
Progress Bar من الصفحة<br />
:<br />
أعط الخاصة<br />
ل<br />
Win32 وTimer إلى مشروع جديد<br />
:<br />
Interval<br />
if progressbar1.Position < 100 then<br />
progressbar1.Position := progressbar1.Position+1;<br />
للمؤقت القيمة 100 واكتب في الحدث OnTimer التعليمات التالية<br />
:<br />
ProgressBar<br />
الخصائص المهمة التالية<br />
:<br />
1 : Position<br />
تعطي موقع الشريط الأزرق داخل<br />
ProgressBar<br />
وتأخذ قيمة بين<br />
Min و<br />
. Max
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تحدد أصغر قيمة يمكن أن تأخذها الخاصة<br />
http://www.alshater.net<br />
. Postion<br />
41<br />
2 : Min<br />
3 : Max<br />
تحدد أكبر قيمة يمكن أن تأخذها الخاصة<br />
. Postion<br />
4 : Step<br />
progressbar1.Position := progressbar1.Position+1;<br />
طول الخطوة وتحدد المسافة التي يقطعها الشريط الأزرق في كل مرة تنفذ فيها التعليمة<br />
:<br />
5 : Smooth<br />
عند إعطاء القيمة<br />
True لهذه الخاصة يظهر الشريط الأزرق بدون تقطيعات<br />
.<br />
6 <br />
عمودي<br />
orientation :عند إعطاء القيمة<br />
ProgressBar ال ، pbVertical<br />
)<br />
شريط القيمة<br />
لملاحظة ذلك أعط الخاصة<br />
ProgressBar ل Height<br />
قيمة كبيرة<br />
100 مثلا ً (<br />
: TrackBar:<br />
يعمل بشكل<br />
يشبه هذا الشريط الشريط السابق ولكنه يختلف عنه بإمكانية تحريك مؤشره بواسطة الفأرة ومكان المؤشر سيعيد<br />
قيمة ليستخدمها البرنامج<br />
مثال : أضف إلى المشروع السابق TrackBar من الصفحة Win32 وأعط الخاصة<br />
والخاصة<br />
Max القيمة 1000<br />
Min القيمة 1<br />
واكتب في الحدث<br />
Onchange التعليمة التالية<br />
timer1.Interval := trackbar1.Position ;<br />
تقوم هذه التعليمة بتغير الخاصة<br />
عدل التعليمات الموجودة في<br />
Interval كلما تغير موقع مؤشر ال<br />
ontimer لتصبح بالشكل<br />
trackbar1<br />
:<br />
if progressbar1.Position < 100 then<br />
progressbar1.Position := progressbar1.Position+1<br />
else progressbar1.Position := 0;<br />
نفذ البرنامج وحرك المؤشر لتلاحظ كيف يمكن أن نتحكم بسرعة المؤقت أثناء التنفيذ.<br />
التعامل مع الحلقات<br />
:<br />
لن أشرح هنا الحلقات ولكن سأتعرض لبعض الحلقات ومشاكلها<br />
حلقة التأخير الزمني<br />
:<br />
:<br />
حلقة التأخير الزمني يمكن تمثيلها بأي نوع من الحلقات<br />
عمل ما لفترة زمنية بسيطة مثال<br />
في حدث الضغط على الزر<br />
( For ,Repeat ,While<br />
)<br />
أضف زر و :<br />
progressbar<br />
:<br />
نلاحظ أن مؤشر الخط الأزرق قد تحرك بسرعة كبيرة<br />
التعليمات السابقة كما يلي:<br />
والهدف منها تأخير<br />
إلى مشروع جديد واكتب التعليمات التالية<br />
var i :integer;<br />
begin<br />
for i := 0 to 100 do<br />
progressbar1.Position := i<br />
( غير ملحوظة )<br />
لذلك نضيف حلقة للتأخير الزمني<br />
عدل )<br />
var i,j :integer;<br />
begin<br />
for i := 0 to 100 do begin<br />
for j := 0 to 90000 do ;
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
نلاحظ أن الحلقة<br />
الوقت<br />
http://www.alshater.net<br />
progressbar1.Position := i<br />
end;<br />
.<br />
; do for j =: 0 to 10000 لا تنفذ شيء لكنها تعيق تنفيذ التعليمة التالية بعض<br />
أضف الآن إلى البرنامج السابق زر جديد واكتب في حدث الضغط عليه التعليمة التالية<br />
حاول الضغط على الزر الثاني أثناء تنفيذ الحلقة<br />
عليه حتى ينتهي تنفيذ الحلقة<br />
:<br />
Form1.color := clred;<br />
)<br />
إضغط على الزر الأول ثم الثاني<br />
(<br />
.<br />
عندما نستخدم المؤقت لتحريك ال<br />
ولاحظ أنه لا يمكن الضغط<br />
progressbar لا يؤثر ثلك على بقية البرنامج ولكن عند استخدام<br />
الحلقات لا يمكن تنفيذ حدث جديد حتى الخروج من الحلقة ولحل هذه المشكلة أضافت <strong>دلفي</strong> التعليمة التالية في حلقة<br />
التأخير الزمني<br />
تقوم هذه الرسالة بإعطاء البرنامج فرصة لتنفيذ تعليمات أخرى خارج الحلقات<br />
الثاني وتنفيذ التعليمات المرتبطة به على الرغم من أن الحلقة تعمل<br />
For j := 0 to 90000000 do<br />
Application.ProcessMessages ;<br />
)<br />
. (<br />
أي يمكنك الآن الضغط على الزر<br />
42
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
بعض التوابع المعرفة في <strong>دلفي</strong><br />
أً توابع التعامل مع الأعداد<br />
الجلسة الثامنة<br />
http://www.alshater.net<br />
43<br />
:<br />
:<br />
معظم هذه التوابع موجودة في الوحدة Math لذلك يجب إضافتها إلى القسم Uses للوحدة التي تستدعي هذه<br />
. التوابع<br />
Abs(x)<br />
أسم التابع<br />
يعيد القيمة المطلقة لعدد معطى<br />
x<br />
Exp(x)<br />
يعيد التابع القيمة<br />
e X<br />
Floor(x)<br />
يعيد أقرب عدد طبيعي أقل أو يساوي<br />
عمله<br />
Floor (2.8) = 2; : مثال X<br />
Floor(-2.8) = -3<br />
Frac(x)<br />
يعيد الجزء العشري للعدد<br />
Frac(234.987)= 0.987: مثال X<br />
Int(x)<br />
تعيد القسم الطبيعي من عدد حقيقي<br />
Int(234.987)= 234<br />
X Y مثال<br />
intpower(2,3)=8;intpower(2,2)=4<br />
IntPower(X,y)<br />
Isinfinite(X)<br />
يعيد القيمة<br />
يعيد القيمة<br />
الأسفل<br />
True<br />
(<br />
X*2 Y LdExp(x,y)<br />
Ln(x)<br />
يعيد التابع القيم<br />
في حال كان<br />
يعيد اللوغاريتم الطبيعي للعدد<br />
X يسعى إلى اللانهاية .( لا حظ المثال في<br />
Len(e) = 1 : X<br />
Log10(X)<br />
يعيد اللوغاريتم العشري للعدد<br />
Log10(10) = 1 : X<br />
LogN(Y,X)<br />
يعيد لوغاريتم القيمة<br />
X بالنسبة للأساس<br />
Y<br />
Max(X,Y)<br />
يعيد قيمة الرقم الأكبر<br />
Max(3,6) = 6<br />
:<br />
Min ( X,Y)<br />
يعيد قيمة العدد الأصفر<br />
Min(3,6) = 3:<br />
Pi<br />
يعيد القيمة<br />
3.14159265358932358<br />
Poly ( x,y:array<br />
of double)<br />
يعيد قيمة السلسة<br />
المثال في الأسفل<br />
يعيد القيمة<br />
يعيد تدوير العدد الحقيقي<br />
Y[0]*X 0 +Y[1]*X 1 +…..+Y[n]*X n لاحظ<br />
X Y Power ( X,Y)<br />
Round ( 1.5) = : X<br />
Round ( X)<br />
2;Round(1.4)=1;Round(1.6) =2<br />
Sing(X)<br />
يعيد القيمة<br />
1 إذا كان<br />
X موجبا ً و<br />
1- إذا كان X سالبا ً و 0 إذا كان<br />
X=0<br />
Sqr(x)<br />
X 2 يعيد القيمة<br />
Sqrt(x)<br />
يعيد القيمة<br />
X<br />
Trunc(x)<br />
يعيد الجزء الطبيعي من العدد<br />
Trunc(5.022) =<br />
: X
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
مثال<br />
http://www.alshater.net<br />
5;Trunc(5.999)=5<br />
1 Isinfinite(X) :<br />
:<br />
أضف زر واكتب في حدث الضغط عليه التعليمات التالية<br />
:<br />
var v: variant;<br />
x:double;<br />
begin<br />
x:=1/0;<br />
v:= isinfinite(x);<br />
if v then<br />
form1.Caption := 'true';<br />
لاحظ أننا وضعنا في<br />
X القيمة<br />
1/0 والتي لن تقبل في حال كون X من النوع<br />
. Integer<br />
2 double) : Poly ( x,y:array of<br />
أضف زر واكتب في حدث الضغط عليه التعليمات التالية<br />
:<br />
var v: variant;<br />
begin<br />
v:= poly (4,[2,3,4,5]);<br />
form1.Caption := v;<br />
2ً توابع قلب وتحويل الأنواع : ترفض <strong>لغة</strong> <strong>دلفي</strong> إلحاق الأنواع المختلفة بعضها ببعض لذلك وجدت بعض<br />
التوابع والإجراءات التي تقوم بقلب بين الأنواع التي لها نفس الحجم ومن هذه التوابع<br />
:<br />
Integer ('A') = 65; Integer ('a') = 97;<br />
Char ( 97 ) = 'a'; Char (48) = '0'; char (65)= 'A';<br />
Boolean(0) = false; Boolean ( 1 ) = true;<br />
كما يمكن التحويل بين الأنواع المختلفة في الحجم بواسطة توابع معرفة مسبقا ً<br />
الجدول التالي يوضح بعض توابع تحويل الأنواع<br />
أسم التابع<br />
:<br />
:<br />
Strtoint64<br />
يشبه التابع<br />
عمله<br />
Strtoint ولكنه يحول النص المعطى إلى النوع<br />
int64<br />
Floattostr(X)<br />
يحول العدد الحقيقي<br />
X إلى نص<br />
:<br />
Floattostr(5.5e3)='5500';Floattostr(5.5)='5.5'<br />
FloattostrF(x,,,,)<br />
يحول العدد الحقيقي<br />
X إلى نص ولكن بشكل محدد<br />
)<br />
أنظر الأمثلة في الأسفل<br />
. (<br />
Strtofloat(s)<br />
يحول النص<br />
S إلى رقم ذو فاصلة عائمة<br />
Strtofloat(3.3)= 3.3; :<br />
Strtofloat( 3.3e4)=33000<br />
Strtocurr(S)<br />
يحول هذا التابع النص<br />
S إلى رقم من النوع عملة<br />
.<br />
Inttohex(X,y)<br />
يحول هذا التابع العدد الصحيح X إلى عدد ست عشري وتمثل y عدد أرقام النتيجة لا<br />
: حظ المثال<br />
44
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أمثلة<br />
التابع<br />
http://www.alshater.net<br />
function FloatToStrF(Value: Extended; Format: :<br />
TFloatFormat ; Precision, Digits: Integer):string ;<br />
1<br />
:<br />
يظهر هذا التابع العدد الحقيقي<br />
Format الذي يأخذ عدة قيم سيتم شرحها مع الأمثلة<br />
مثال<br />
:<br />
: ( 1 )<br />
1 Format = FFGeneral<br />
Value بعدة طرق حسب الوسطاء المعطاه في التابع وخاصة الوسيط<br />
تقوم هذه التعليمة بتحويل العدد Value إلى أقرب عدد بالفاصلة الثابتة أو العائمة مع إزالة كافة الأصفار على<br />
يسار الفاصلة وتتأثر هذه الخاصة بالقيمة Precision التي تحدد العدد الأعظمي لأرقام النتيجة .والقيمة<br />
Digits التي تحدد عدد أرقام الأس<br />
أضف إلى حدث الضغط على زر التعليمة التالية<br />
:<br />
form1.caption := floattostrf(55.2723e+3, ffgeneral,5,2);<br />
سيعيد هذا التابع القيمة<br />
الرقم<br />
بالشكل<br />
55272 متجاهلا ً القيم بعد الفاصلة لأنه الوسيط<br />
Precision يساوي ، 5 غير الآن<br />
5 إلى<br />
:<br />
7 ولاحظ تغير النتيجة إلى الشكل<br />
. 527e4<br />
2 Format = FFExponent<br />
، 55272.3 غير الرقم السابق إلى<br />
4 ولاحظ ظهور النتيجة<br />
ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذي فاصلة عائمة من الشكل (ddd.edd) وتحدد الخاصة<br />
Precision هنا عدد أرقام النتيجة والقيمة<br />
Digits تتراواح بين 4..0 وتحدد عدد أرقام الأس<br />
.<br />
form1.caption := floattostrf(52.34, ffexponent,8,3);<br />
سيعيد التابع النتيجة<br />
001+5.2340000e في حال تغير الرقم<br />
8 إلى 4 والرقم 3 إلى<br />
2 تصبح النتيجة<br />
:<br />
5.234E+01<br />
3 Format = fffixed<br />
ستقوم التعليمة بتحويل العدد الحقيقي إلى عدد ذو فاصلة ثابتة حيث يحدد عدد الأرقام بعد الفاصلة بالقيمة<br />
: Digits<br />
form1.caption := floattostrf(100.36, fffixed,6,1);<br />
سيعيد التابع القيمة<br />
في حال كانت قيمة<br />
100.4 لأنه لإظهار رقم واحد بعد النتيجة قام التابع بتدوير النتيجة<br />
.<br />
Precision أصغر من عدد أرقام العدد سيعيد التابع النتيجة بالفاصلة العائمة<br />
.<br />
4 Format = ffNumber<br />
تشبه الحالة السابقة ولكن مع إظهار فواصل بين الآلاف مع تقريب النتيجة<br />
.<br />
form1.caption := floattostrf(195784430.36, ffnumber,10,5);<br />
سيعيد التابع القيمة<br />
. 195,784,430.4000<br />
45
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
5 : Format = ffcurrency<br />
سيعيد التابع نفس القيمة السابقة ولكن مع ذكر ل.س بجانب الناتج<br />
طريق اعدادات إقليمية الموجودة في لوحة التحكم<br />
ل.س<br />
)<br />
يعيد التابع اسم العملة المحددة في الجهاز عن<br />
. (<br />
form1.caption := floattostrf(195784430.36, ffcurrency,10,5);<br />
195,784,430.4000<br />
التابع(Inttohex(X,Y :<br />
: مثال<br />
inttohex(2345,1); سيعيد القيمة 929 التي تكافئ العدد العشري<br />
2345<br />
لا حاجة لتحويل العدد الست عشري إلى عدد طبيعي في <strong>دلفي</strong> لأنه يمكن إلحاق الإعداد الست عشرية مباشرة في<br />
المتحولات الطبيعية Integer أو الحقيقية<br />
... ) $929 I:= تكافئ I:=2345 و J:=$F تكافئ<br />
( J=15<br />
هناك آلاف التوابع والإجراءات المعرفة في <strong>دلفي</strong> ولا يمكن شرحها كلها لذلك سنتعرف الآن على طرق البحث عن<br />
تابع ملفات في ملفات المساعدة الموجودة في <strong>دلفي</strong><br />
الحالة الأولى<br />
:<br />
:<br />
التابع معروف ولكننا بحاجة إلى تذكر الوسطاء التابعة له<br />
:<br />
اكتب إسم التابع في أي مكان في محرر الشيفرة وإضغط F1 سيظهر شرح كامل للتابع بال<strong>لغة</strong> الإنكليزية ، إذا كان<br />
لأحد الوسطاء عدة قيم<br />
)<br />
كما هي الحالة في الوسيط<br />
( Floattostrf للتابع Format<br />
الوسيط باللون الأخضر يمكننا بالضغط عليه الانتقال لصفحة تشرح هذه القيم<br />
الحالة الثانية<br />
.<br />
:<br />
التابع غير معروف ولكننا نتذكر تابع قريب أو مشابه له<br />
:<br />
سيظهر نوع هذا<br />
فرضا ً أريد أن أجد التابع الذي يحول النص إلى العدد الحقيقي من نوع عملة ، Currency نحن نعلم بوجود<br />
تابع يحول النص إلى عدد حقيقي وهو Strtofloat لذلك نكتب اسم هذا التابع في محرر الشيفرة ونضغط<br />
، F1 سيظهر الآن شرح للتابع ، Strtofloat ستلاحظ الآن وجود الكلمة<br />
See Also باللون الأخضر<br />
في أعلى الصفحة ، في حال الضغط عليها ستظهر هذه الوصلة قائمة بالتوابع المتعلقة بالتابع المذكور أو التوابع<br />
المشابهة له<br />
مثالنا<br />
)<br />
يمكن أن نختار منها )، Strtocurr كما يوجد أحيانا ً الوصلة بعد العنوان<br />
) Category<br />
( Floating point Conversion Routines<br />
المتصلة بموضوع التابع Strtofloat في مثالنا<br />
صيغة أخرى<br />
الحالة الثالثة<br />
)<br />
. (<br />
:<br />
نريد أن نبحث عن تابع له صفة معينة<br />
:<br />
)<br />
فرضا ً نريد أن نبحث عن تابع رياضي<br />
لذلك يمكن أن نكتب<br />
(<br />
بالضغط عليها ستظهر كل التوابع<br />
ستظهر كل التوابع المتعلقة بتحويل العدد الحقيقي إلى<br />
من المعروف أن معظم التوابع الرياضية تنتمي إلى الوحدة<br />
Math<br />
)<br />
أي تابع ينتمي للوحدة<br />
Power مع ظهور أسم الوحدة في الأعلى<br />
) math التابع Power مثلا ً (<br />
)<br />
.( math<br />
ملاحظة : معظم توابع التحويل<br />
)<br />
في<br />
ونضغط F1 سيظهر شرح التابع<br />
بالضغط عليه تظهر قائمة بجميع التوابع الموجودة في الوحدة<br />
..... Strtoint )موجودة في الوحدة<br />
. Sysutil<br />
46
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الحالة الرابعة<br />
http://www.alshater.net<br />
:<br />
:<br />
لانعرف أي شيء من الحالات السابقة<br />
نريد أن نوجد تابع ما يقوم بعملية معينة<br />
)<br />
تابع الجيب جب<br />
( مثلا ً ( يه )<br />
من قوائم ال<strong>دلفي</strong> نختار<br />
Help <br />
<strong>Delphi</strong> help<br />
نختار بعدها الصفحة Find (عند الضغط على الصفحة Find لأول مرة يظهر صندوق حوار لتحديد طرق<br />
البحث (أختر الخيارات الأفتراضية)<br />
يظهر بعدها صندوق حوار نكتب فيه اسم التابع في ال<strong>لغة</strong> الإنكليزية<br />
الكلمات المكتوبة في ملفات المساعدة والتي تبدأ بالأحرف المكتوبة<br />
)<br />
Sin في مثالنا<br />
(<br />
( Sin )<br />
فيظهر في الأسفل جميع<br />
ويظهر أسفل هذه القائمة قائمة أخرى<br />
بالعنوانين التي تحوي هذه الكلمة حاول أن تختار منها طلبك واضغط عليه مرتين فيظهر نص المساعدة المرتبط<br />
) بهذا العنوان<br />
في مثالنا Otherوللعودة Standard routine إلى القائمة أختر السابقة<br />
Help<br />
. ( topic<br />
: ملاحظات<br />
لمعرفة عمل أي عنصر في <strong>دلفي</strong> أختره وأضغط على<br />
. F1<br />
لمعرفة عمل أي خاصة تابعة لعنصر ما في <strong>دلفي</strong> أختر هذه الخاصة واضغط على<br />
.... F1<br />
47
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
صناديق الحوار<br />
الجلسة التاسعة<br />
http://www.alshater.net<br />
: Dialog<br />
هي عبارة عن صناديق جاهزة موجودة في الصفحة<br />
وحفظ ملف ولتحديد لون ولفتح ملف صورة وللطباعة وللبحث<br />
صندوق<br />
الحوار فتح ملف<br />
Dialogs ومهمتها فتح نوافذ خاصة بنظام التشغيل<br />
)<br />
( ....<br />
وسندرس بعض هذه الصناديق بالتفصيل<br />
لفتح<br />
:<br />
: OpenDialog<br />
يستخدم لفتح ملف ما ،حيث يظهر النافذة المعروفة لفتح<br />
ملف الموجودة في الويندوز وحيث يمكننا من هذه<br />
النافذة اختيار الملف والضغط على فتح<br />
( Open )<br />
وسيعيد العنصر أسم الملف المختار بالخاصة<br />
FileName<br />
سنبدأ بمثال بسيط وسنحاول التعرف على<br />
بشكل أفضل لاحقا ً<br />
مثال<br />
:<br />
:<br />
أضف عنصر مذكرة<br />
جديد بالإضافة إلى العنصر<br />
العنصر<br />
Memo وزر إلى مشروع<br />
Opendialog<br />
في حدث الضغط على الزر أكتب التعليمات التالية<br />
:<br />
IF Opendialog1.Execute then<br />
memo1.Lines.LoadFromFile(opendialog1.FileName ) ;<br />
نفذ البرنامج واضغط على الزر سيظهر صندوق الحوار أختر أي ملف نصي<br />
سيمكنك الآن مشاهدة محتويات الملف في المذكرة<br />
التعليمة<br />
( TXT )<br />
واضغط على<br />
open<br />
.<br />
OpenDialog1.Execute تقوم بإظهار نافذة الحوار فتح ملف وتعيد القيمة<br />
اختار المستخدم أحد الملفات وضغط على الزر فتح<br />
opendialog1.FileName ستحتوي على<br />
اسم الملف، وتعيد القيمة<br />
صندوق الحوار أو ضغط على الزر إلغاء الأمر(<br />
opendialog1.FileName ستحتوي على فراغ.<br />
الخاصة<br />
( Open )<br />
True في حال<br />
وفي هذه الحالة<br />
False في حال أغلق المستخدم<br />
( Cancel<br />
: Filter<br />
محرر الخواص واضغط على النقاط الثلاث<br />
Name أكتب ملف نص ، والعمود<br />
تحدد هذه الخاصة نوع الملفات التي ستظهر في النافذة ، اختر الخاصة<br />
وفي هذه الحالة<br />
Filter من<br />
...<br />
فتظهر النافذة التي تحدد نوع الملفات في العمود<br />
Filter<br />
Filter أكتب<br />
الحوار لا يظهر إلا المجلدات والملفات من النوع النصي<br />
يشير إلى نوع الملفات<br />
للعمود<br />
جميع الملفات<br />
" Files Type<br />
ملف نص<br />
*.txt أغلق النافذة ونفذ البرنامج ستلاحظ أن صندوق<br />
، "<br />
" Filter Name<br />
ملف دفعي "وفي العمود<br />
، Txt وستظهر في أسفل الصندوق في العنوان الذي<br />
عد إلى الخاصة Filter أدخل في السطر الثاني<br />
"*.Bat " Filter<br />
ثم في السطر التالي العمود الأول<br />
"<br />
وبجانبه "<br />
. " *.* "<br />
48
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
نفذ البرنامج الآن واضغط على الزر سيظهر صندوق فتح الملفات حيث يمكنك الآن اختيار نوع الملفات التي<br />
ستظهر عن طريق<br />
الخاصة<br />
49<br />
. Files Type<br />
: FilterIndex<br />
الفلتر الأول و2 إلى الثاني<br />
الخاصة<br />
....<br />
تستخدم هذه الخاصة لتحديد نوع الملفات الافتراضي وتأخذ القيمة<br />
1 لتشير إلى<br />
: InitialDir تقوم هذه الخاصة بتحديد الفهرس الابتدائي الذي سيعمل فيه الصندوق أكتب في هذه<br />
الخاصة القيمة \:C وسيفتح عندها الصندوق في الفهرس<br />
الخاصة<br />
... C:\<br />
: Title<br />
"أختر ملف ما ليقوم البرنامج بفتحه<br />
الخاصة<br />
."<br />
: Option<br />
معلومات عن عمل كل خاصة.<br />
صندوق الحوار حفظ ملف<br />
تمكنك إظهار الخاصة من إظهار نص معين في شريط العنوان لنافذة فتح الملفات ادخل القيمة<br />
ينبثق عن هذه الخاصة العديد من الخواص حاول مراجعة تعليمات <strong>دلفي</strong> للحصول على<br />
: SaveDialog<br />
يقوم هذا الملف بفتح صندوق الحوار حفظ ملف وهو يشبه الصندوق السابق بطريقة الاستدعاء والخصائص لذلك لا<br />
داعي لإعادة شرح الخصائص<br />
مثال<br />
.<br />
:<br />
أضف زر و SaveDialog إلى البرنامج السابق وأعط الخاصة<br />
SaveDialog الخصائص التالية<br />
1 الخاصة<br />
2 الخاصة<br />
Caption<br />
" حفظ " للزر القيمة<br />
:<br />
: Filter<br />
ملف نص<br />
*.txt ........<br />
ملف دفعي :<br />
*.bat .......<br />
: Defaultext<br />
القيمة<br />
: .Txt<br />
في حدث الضغط على الزر اكتب التعليمات التالية<br />
هذه القيمة ضرورية لتحديد امتداد الملف الذي سيتم حفظه<br />
ثم أعط<br />
.<br />
:<br />
if savedialog1.Execute then<br />
memo1.Lines.SaveToFile(savedialog1.FileName )<br />
نفذ البرنامج واضغط على الزر حفظ واكتب الاسم الذي تريد<br />
إحدى الخصائص المهمة لهذا العنصر والتابعة للخاصة<br />
....<br />
Option هي الخاصة<br />
OfOverwritePrompt<br />
أعط هذه الخاصة القيمة Ture لكي يتم تنبيه المستخدم قبل أن يحفظ ملف فوق ملف من نفس الإسم<br />
صندوق الحوار<br />
مثال:<br />
.<br />
: OpenPictureDialog<br />
صندوق الحوار هذا يشبه صندوق الحوار فتح ملف ويختلف عنه بظهور قسم يجانب الملفات لإظهار الصور قبل<br />
فتحها ، من الملاحظ أن الخاصة Filter لهذا العنصر مجهزة بأنواع الملفات التي يمكن لل<strong>دلفي</strong> التعامل معها<br />
أضف زر وعنصر Image إلى مشروع جديد وأضف كذلك العنصر<br />
في حدث الضغط على الزر أكتب التعليمة التالية<br />
.<br />
. OpenPictureDialog<br />
:<br />
if OpenPictureDialog1.Execute then<br />
image1.Picture.LoadFromFile(OpenPictureDialog1.FileName )
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
نفذ البرنامج واضغط على الزر واختر أي صورة لتلاحظ ظهورها إلى يمين صندوق الحوار وبالضغط على الزر<br />
Open ستظهر الصورة في العنصر<br />
. Image<br />
ملاحظة : رغم وجود ملفان من النوع Jpg في الخاصة Filter لا تظهر الملفات *.jpg أثناء التنفيذ وإذا<br />
أردت إظهارها قم بإضافة اسم الوحدة Jpeg إلى القسم<br />
صندوق الحوار<br />
مثال<br />
. Uses<br />
: SavePictureDialog<br />
) ..........................................................................................<br />
.............<br />
نفس الكلام السابق<br />
(<br />
:<br />
أضف زر وعنصر<br />
الخاصة<br />
SavePictureDialog<br />
إلى البرنامج السابق و أعط<br />
.Bmp واكتب في حدث الضغط على الزر التعليمة التالية<br />
SavePictureDialog<br />
:<br />
DefaultExt القيمة<br />
if SavePictureDialog1.Execute then<br />
image1.Picture.SaveToFile(SavePictureDialog1.FileName)<br />
نفذ البرنامج ثم افتح صورة عن طريق الزر الأول واحفظها عن طريق الزر الثاني<br />
الصورة أي تغير نوعها عن طريق تغير الامتداد في أسفل صندوق الحوار<br />
صندوق الحوار الخطوط<br />
يقوم<br />
الخط<br />
)<br />
يمكنك أيضا ً تغير امتداد ملف<br />
. ( Save As Type<br />
: FontDialog<br />
.<br />
هذا العنصر بإظهار صندوق الحوار اختيار خط حيث يمكننا هذا الصندوق من تحديد نوع ونمط وحجم ولون<br />
أضف زر وعنصر<br />
: التعليمة التالية<br />
صندوق الحوار تحديد لون<br />
Label و عنصر<br />
FontDialog إلى برنامج جديد واكتب في حدث الضغط على الزر<br />
if Fontdialog1.Execute then<br />
label1.Font := fontdialog1.Font ;<br />
: ColorDialog<br />
يقوم هذا العنصر بإظهار صندوق حوار لاختيار لون حيث يمكن اختيار اللون من عدد كبير جدا ً من الألوان<br />
أضف زر وعنصر<br />
.<br />
ColorDialog إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />
صندوق الحوار ColorDialog يظهر فيه زر عنوانه<br />
:<br />
if colorDialog1.Execute then<br />
form1.Color := colordialog1.Color ;<br />
Define Custom colors بالضغط عليه<br />
يظهر لوح الألوان الذي يمكن من خلاله تحديد اللون أو يمكن كتابة RGB كتابة في حال معرفتها<br />
ملاحظة<br />
.<br />
:<br />
تتبع جميع صناديق الحوار<br />
فصندوق الحوار فتح ملف في ويندوز<br />
Dialog نظام التشغيل المستخدم، أي أنها ستختلف حسب نظام التشغيل<br />
98 يختلف عنه في ويندوز<br />
Xp وبالتالي سيختلف شكل الصندوق من نظام<br />
تشغيل إلى آخر ولكنه سيؤدي نفس الوظيفة بنفس التعليمات ، كما تتأثر هذه الصناديق ب<strong>لغة</strong> النظام أي أنها ستظهر<br />
50
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
بال<strong>لغة</strong> العربية في حال كانت واجهات نظام التشغيل المستخدم بالعربية وبال<strong>لغة</strong> الإنكليزية في حال كانت واجهات<br />
نظام التشغيل بال<strong>لغة</strong> الإنكليزية<br />
.<br />
51
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة العاشرة<br />
التعرف على العنصر<br />
http://www.alshater.net<br />
) : MaskEdit<br />
الصفحة<br />
( Additional<br />
يشبه هذا العنصر عنصر التحرير Edit ويختلف عنه بإمكانية تحديد شكل النص المدخل وللتعرف على هذه اميزة<br />
اذهب إلى الخاصة Editmask من محرر الخواص وبالضغط على<br />
...<br />
ستظهر النافذة التالية<br />
:<br />
تحديد القناع<br />
أقنعة جاهزة<br />
الرمز الذي سيظهر<br />
مكان الفراغ<br />
( أمثلة )<br />
لتجربة النص المدخل<br />
تحميل أقنعة جاهزة<br />
مثال<br />
.....<br />
52<br />
:<br />
1<br />
أضف عنصر MaskEdit من الصفحة<br />
محرر الخواص واختر من النافذة السابقة في القسم<br />
Additional<br />
إلى برنامج جديد واختر الخاصة<br />
Editmask من<br />
( Sample Masks )<br />
Date واضغط على Ok عندها سيظهر<br />
العنصر بالشكل __/__/__ الآن نفذ البرنامج وحاول الإدخال إلى العنصر ولاحظ أنه لا يمكنك إدخال سوى<br />
الأرقام .<br />
: تحديد القناع<br />
نلاحظ أن القيم في الحقل تحديد القناع عبارة عن<br />
0 أو 9 أو L أو …<br />
فماذا تعني هذه الرموز<br />
:<br />
: 9<br />
يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف مع إمكانية عدم إدخال أي رقم<br />
مثلا ً في حال كان القناع 99999 ،يستطيع المستخدم إدخال عدد مكون من خمس أرقام أو أربع أو ثلاث<br />
يستطيع إدخال الأحرف<br />
)<br />
....<br />
(<br />
: 0<br />
يستطيع المستخدم إدخال رقم في مكان هذا الرمز ولا يمكن إدخال الأحرف<br />
فعلى المستخدم إدخال خمس أرقام حصرا ً ولا يمكن أربعة<br />
رسالة خطأ عن خروج المؤشر من العنصر<br />
)<br />
في حال كان القناع<br />
ولا<br />
، 00000<br />
(...<br />
.<br />
: L<br />
يستطيع المستخدم، إدخال أحرف مكان هذا الرمز ولا يمكن إدخال الأرقام<br />
المستخدم إدخال أربع أحرف حصرا ً<br />
)<br />
وفي حال ادخل المستخدم أربعة سيصدر البرنامج<br />
في حال كان القناع<br />
LLLL فعلى<br />
.(<br />
: l<br />
إدخال أحرف فقط مع إمكانية عدم الإدخال
http://www.alshater.net<br />
....<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: a إدخال أحرف مع أرقام مع إمكانية عدم الإدخال<br />
.<br />
إدخال أحرف مع أرقام ...<br />
حصرا ً<br />
: A<br />
يوجد مجموعة أخرى من الرموز يمكن مراجعتها في ملفات المساعدة التابعة لل<strong>دلفي</strong> ............<br />
( Win32<br />
العنصر : MonthCalendar )<br />
الصفحة<br />
يستخدم هذا العنصر لإظهار التاريخ، ويستطيع المستخدم إدخال التاريخ عبره ...<br />
في حال أردنا من العنصر إظهار تاريخ اليوم في كل مرة نفتح البرنامج، علينا إدخال التعليمة التالية في الحدث<br />
OnCreate للنافذة التي تحوي العنصر :<br />
MonthCalendar1.Date := date;<br />
للحصول على التاريخ المدخل من قبل المستخدم نكتب التعليمة التالية في حدث الضغط على زر أو حدث الضغط<br />
form1.Caption := datetostr(MonthCalendar1.Date);<br />
.. (<br />
)<br />
على العنصر نفسه<br />
:<br />
عن إعطاء الخاصة Align لهذا العنصر القيمة<br />
alClient يظهر مفكرة بعدة أشهر<br />
حسب حجم النموذج<br />
.<br />
Sample العنصر<br />
ملاحظة :<br />
يوجد في الصفحة<br />
Calendar وهو يشبه العنصر السابق إلى حد ما<br />
( Win32<br />
العنصر : DateTimePicker )<br />
الصفحة<br />
:<br />
(<br />
يستخدم هذا العنصر لإظهار )<br />
إدخال<br />
التاريخ أو الوقت<br />
يظهر التاريخ في حال كانت الخاصة Kind تساوي<br />
dtkDate ويمكن تغير التاريخ عن طريق مفاتيح الأسهم<br />
1<br />
أو عن طريق الضغط على السهم المجاور للعنصر حيث يظهر عندها شكل مشابه للعنصر MonthCalendar<br />
الذي يمكن تحديد التاريخ من خلاله، كما يمكن تغير قيمة الخاصة DateMode إلى<br />
dmUpDown يظهر سهمين<br />
أعلى وأسفل لإدخال التاريخ ....<br />
Timer<br />
يظهر الوقت في حال كانت الخاصة Kind تساوي<br />
dtkTime وحتى يتم تحديث الوقت يجب إضافة<br />
2<br />
وكتابة التعليمة التالية في الحدث : OnTimer<br />
DateTimePicker1.Time := time;<br />
3 يمكن الحصول على الوقت من هذا العنصر عن طريق التعليمة التالية :<br />
Form1.Caption := TimeToStr(DateTimePicker1.Time );<br />
ويكون الحصول على التاريخ عن طريق التعليمة :<br />
Form1.Caption := Datetostr(DateTimePicker1.date );<br />
الصفحة<br />
العنصر<br />
( Win32<br />
) : PageControl<br />
يقوم هذا العنصر بإظهار صفحات مستقلة وللتعرف على هذا العنصر سنبدأ بمثال :<br />
مثال :<br />
ابدأ مشروعا ً جديدا ً وأضف إليه عنصر الصفحات<br />
PageControl من الصفحة<br />
،Win32 اضغط على العنصر<br />
Tabsheet1<br />
بزر الفأرة اليميني وأختر من القائمة<br />
New Page عندها ستظهر صفحة جديدة باسم<br />
، أعد الخطوة<br />
الأخيرة مرتين لإظهار TabSheet2 و . TabSheet3<br />
53
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اختر الصفحة الأولى<br />
وأعطها الخاصة<br />
التاريخ<br />
" وأضف في داخلها العنصر<br />
" Caption<br />
Tabsheet1<br />
. MonthCalendar<br />
اختر الصفحة الثانية<br />
TabSheet2 وأعطها الخاصة<br />
الوقت<br />
" وأضف إليها العنصر<br />
" Caption<br />
وأعطه الخاصة<br />
Kind القيمة dtkTime ولا تنس إضافة مؤقت لتحديث الوقت...<br />
DateTimePicker<br />
اختر الصفحة الثالثة<br />
TabSheet3 وأعطها الخاصة<br />
التاريخ والوقت<br />
" وأضف إليها عنصرين<br />
" Caption<br />
.... dtkTime القيمة Kind أعط إحداهما الخاصة DateTimePicker<br />
نفذ البرنامج ولاحظ كيفية الانتقال بين الصفحات ..<br />
ESC من<br />
اختر العنصر ) PageControl<br />
يمكن الانتقال من عنصر ابن إلى عنصر أب بالضغط على المفتاح<br />
.<br />
alClient القيمة Align<br />
لوحة المفاتيح (<br />
وأعطه الخاصة<br />
عندها سيأخذ العنصر حجم النموذج بالكامل<br />
Add<br />
أضف العنصر<br />
ImageList من الصفحة<br />
Win32 واضغط علية مرتين يظهر صندوق حوار اختر منه<br />
لإضافة مجموعة من الصور، اضغط بعدها على<br />
،Ok عد بعدها إلى العنصر<br />
PageControl وأعط الخاصة<br />
Images القيمة ImageList1 وعندها ستظهر الصور بجانب عنوانين الصفحات، نستطيع اختيار صور محددة<br />
... ImageIndex<br />
لصفحة ما باختيار الصفحة<br />
tabSheet ثم كتابة رقم الصورة المطلوبة في الخاصة<br />
يمكن تحويل موضع اختيار الصفحات عن طريق الخاصة<br />
TapPosition حيث يمكن أن تكون في الأسفل أو<br />
على اليمين أو على اليسار<br />
يمكن تحويل شكل الصفحات إلى أزرار عن طريق الخاصة<br />
Style للعنصر PageControl بإعطائها القيمة<br />
tpTop تساوي TapPosition لا تعمل هذه الخاصة إلا إذا كانت قيمة الخاصة ) tsFlatButtons أو tsButtons<br />
. (<br />
.<br />
الخاصة<br />
ActivePage تحدد الصفحة الفعالة عند تنفيذ البرنامج<br />
الخاصة<br />
عند إعطاء هذه الخاصة القيمة<br />
True يتحول لون خط عنوان الصفحة إلى اللون الأزرق<br />
: HotTrack<br />
. (<br />
عند مرور الفأرة فوقه )<br />
في وقت التنفيذ<br />
( Win32<br />
العنصر : TabControl )<br />
الصفحة<br />
يشبه هذا العنصر العنصر<br />
PageControl ويختلف عنه بكونه لا يعطي صفحات مستقلة حيث أنه مكون من<br />
صفحة واحدة<br />
) أي أن العناصر توضع في صفحة واحدة ويتم تطبيق تغيرات على هذه العناصر عندما يضغط<br />
المستخدم على أزرار الصفحات :<br />
. 5<br />
مثال :<br />
سنقوم بكتابة برنامج يعطي جدول ضرب العدد<br />
1,2,3,4,5,6,7,8,9 كل<br />
ابدأ مشروعا ً جديدا ً وأضف إليه العنصر ، TabControl في الخاصة<br />
Tabs أكتب القيم<br />
منها في سطر<br />
. TabControl<br />
أضف عنصري<br />
Label داخل العنصر<br />
:<br />
مستقل وفي الحدث<br />
OnChange أكتب التعليمات التالية<br />
var i :integer;<br />
begin<br />
54
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
حيث TabControl1.TabIndex تعيد رقم الصفحة التي ضغط المستخدم عليها<br />
و ] Tabcontrol1.Tabs[ تعيد عنوان الصفحة التي يوجد رقمها بين القوسين<br />
نفذ البرنامج واضغط على الصفحات ولاحظ النتائج<br />
http://www.alshater.net<br />
i := strtoint(tabcontrol1.Tabs[tabcontrol1.tabindex] );<br />
label1.Caption := inttostr(i) + ' * 5 = ';<br />
label2.Caption := inttostr(i * 5);<br />
.<br />
. [ ]<br />
55<br />
...<br />
بالنسبة لباقي الخصائص فهي مشابهة تماما ً لخصائص العنصر السابق<br />
العنصر<br />
أضف عنصر<br />
.<br />
) : UpDown<br />
الصفحة<br />
( Win32<br />
UpDown وعنصر<br />
Associate<br />
Edit إلى مشروع جديد ، حدد العنصر<br />
UpDown1 واعط الخاصة<br />
القيمة ، Edit1 نفذ البرنامج واضغط على أسهم العنصر UpDown ولاحظ تغير الرقم داخل<br />
الخاصة Increment للعنصر تحدد مقدار الزيادة أو النقصان في العدد داخل ال<br />
الخاصتان<br />
Edit<br />
. Edit<br />
Min و<br />
Max تحددان القيمة الدنيا والعليا للعدد داخل<br />
الخاصة Position تحدد القيمة الابتدائية للعنصر<br />
الخاصة<br />
الخاصة<br />
. Edit<br />
.<br />
Orientation<br />
تحدد اتجاه الأسهم<br />
)<br />
عامودي أو أفقي<br />
. (<br />
: Warp<br />
عند إعطاء هذه الخاصة القيمة<br />
الزر Down بعكس عند الضغط على الزر<br />
ملاحظة : يوجد في الصفحة<br />
إلى حد ما<br />
. Up<br />
Sample العنصرين<br />
True يتحول العدد من القيمة السفلى إلى العليا عند الضغط على<br />
SpinEdit و<br />
.<br />
التعامل مع السلاسل النصية<br />
1 التابع<br />
:<br />
: Concat<br />
يقوم هذا التابع بوصل السلاسل S1..Sn مع بعضها<br />
مثال<br />
SpinButton الذين يشبهان عمل هذا العنصر<br />
Concat ( s1, [s2..sn]) :string<br />
:<br />
أكتب التعليمات التالية في حدث الضغط على زر<br />
:<br />
var s1,s2,s3 : string;<br />
begin<br />
s1:= 'abc';<br />
s2 := 'efg';<br />
s3:= 'hij';<br />
form1.caption:=concat(s1,s2,s3)<br />
يشبه هذا التابع عملية جمع السلاسل النصية أي أن النتيجة ستكون مشابه لو كانت التعليمة الأخيرة<br />
Form1.Caption := s1+s2+s3;<br />
2 التابع : Copy<br />
Copy ( S:string , Index,Count :Integer ) :String<br />
يعيد هذا التابع سلسلة رمزية جزئية من السلسة S تبدأ من الحرف الذي ترتبه Index وبطول . Count
http://www.alshater.net<br />
... Copy ( 'Hello All',5,1) = o<br />
Delete ( Var S:string ,Index,Count ) ;<br />
Index وبطول<br />
var s1 : String;<br />
Begin<br />
s1:= 'Hello All' ;<br />
Delete (s1,1,3);<br />
Form1.Caption := s1;<br />
S1,4,3) Delete ( ستكون<br />
; Copy ( 'Hello All',2,6)<br />
= ello A<br />
: Delete<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: مثال<br />
3 الإجراء<br />
يعيد هذا الإجراء في المتحول<br />
S قيمة نفس السلسلة بعد حذف الرموز ابتداء من الرمز الذي ترتيبه<br />
:<br />
Count<br />
مثال :<br />
اكتب في حدث الضغط على زر التعليمات التالية<br />
ستكون نتيجة تنفيذ البرنامج القيمة ، lo All وإذا غيرنا وسطاء الإجراء إلى الشكل<br />
DupeString ( S: String ,Count :Integer) :String;<br />
Count مرة<br />
. HelAll<br />
: DupeString<br />
S مكررة<br />
DupeString( 'Ha ',5) = Ha Ha Ha Ha Ha<br />
StrUtils<br />
Insert ( S1:String , var S:string ; Index :Integer ) ;<br />
. S<br />
النتيجة<br />
4 التابع<br />
يعيد هذا التابع القيمة<br />
مثال :<br />
ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة<br />
5 الأجراء : Insert<br />
مثال<br />
يقوم هذا الإجراء بحشر السلسة S1 في السلسة S ابتداء من الرمز Index في السلسة S ويعيد النتيجة في<br />
: تكتب التعليمات التالية في حدث الضغط على زر :<br />
var s : string;<br />
begin<br />
s:= 'Hello Friends' ;<br />
insert ( 'All ' ,s,7);<br />
form1.Caption := s;<br />
StuffString( s:string , start, length :integer , S1:string ) :string;<br />
56<br />
التابع : StuffString<br />
يقوم هذا التابع بحشر السلسة قيمة<br />
الرموز من قيمة<br />
S1 في قيمة السلسلة S ابتداء من الرمز الذي ترتيبه Start مع حذف عدد من<br />
: Length بطول S<br />
مثال all' stuffstring('Hello Friend',7,6,'all') = 'Hello قام التابع بحذف ستة أحرف ابتداء من الحرف<br />
السابع وحشر السلسة ، all في حال تغير الرقم 0 سيعمل التابع عمل الإجراء<br />
. Insert<br />
6 إلى<br />
يختلف هذا التابع عن سابقة ب :<br />
:
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
1 التابع يقوم بحذف قسم من السلسة وإدراج غيره<br />
الإجراء<br />
Insert بحاجة إلى متحول<br />
S ستعاد قيمة التابع فيه بينما التابع<br />
StuffString يعيد السلسة<br />
2<br />
. (<br />
النتيجة بدون<br />
التأثير على وسطاءه<br />
ملاحظة لتنفيذ هذا التابع نحتاج لاستدعاء الوحدة StrUtils<br />
LeftStr(S:String ,Count : integer) :string<br />
: Count وبطول S<br />
التابع<br />
: LeftStr<br />
يعيد هذا التابع سلسلة نصية تبدأ من يسار السلسلة<br />
. LeftStr( 'Good Morning,4 ) = Good<br />
، LeftStr( 'Hello Frind',6) = Hello<br />
مثال :<br />
:<br />
التابع : RightStr<br />
يشبه التابع السابق ولكنه يعيد ابتداء من نهاية السلسة<br />
Rightstr( 'Hello Friend',6)=Friend<br />
مثال :<br />
التابع : LowerCase<br />
) الأحرف اللاتينية ( .<br />
يعيد هذا التابع السلسلة<br />
S بعد تحويل جميع حروفها إلى حروف صغيرة<br />
LowerCase(Hello Friend) = hello friend :<br />
: UpperCase<br />
مثال<br />
التابع<br />
عكس التابع السابق ،مثال UpperCase (' Hello Friend') = HELLO FRIEND<br />
التابع : Trim<br />
يقوم هذا التابع بحذف الفراغات من بداية ونهاية السلسة S<br />
مثال :<br />
أضف زر وعنصر Edit إلى برنامج جديد وفي حدث الضغط على الزر اكتب التعليمات التالية<br />
أكتب نصا ً ما في العنصر Edit1 وحاول ترك فراغات في بداية هذه النص أو آخرة<br />
:<br />
edit1.Text:= Trim(edit1.Text );<br />
' Hello All<br />
'<br />
واضغط<br />
على الزر فيقوم التابع بحذف الفراغات وإعادة القيمة All' 'Hello .<br />
التابعين TrimLeft و<br />
التوالي<br />
TrimRight لهما نفس التأثير غير أنهما يحذفان الفراغات من بداية السلسة أو نهايتها على<br />
.<br />
التابع<br />
: Format<br />
Format ( S :String ; A:array of const ) ;<br />
داخلها وفقا ً لبعض المعايير ... A بعد إدراج القيم في Sيعيد هذا التابع السلسلة<br />
مثال :<br />
أضف التعليمات التالية في حدث الضغط على زر :<br />
var s1:string;<br />
var i,j :integer; z:real;<br />
begin<br />
i:= 200;j:=5; z:= i/j;<br />
57
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
سيعيد التابع القيمة<br />
http://www.alshater.net<br />
s1:= format('If You Divide %d by %d the result will be %g',[i,j,z]);<br />
form1.Caption := s1;<br />
. If You Divide 200 by 5 the result will be 40<br />
قام التابع بإعطاء قيمة العنصر الأول في المصفوفة<br />
الثاني وقيمة العنصر الثالث Z إلى الوسيط<br />
إذا ً يمكنك التابع<br />
( I<br />
)<br />
إلى الوسيط d% وقيمة العنصر الثاني إلى الوسيط<br />
%d<br />
. %g<br />
Format<br />
من إدراج مجموعة من الثوابت داخل الجملة عن طريق كتابة الرمز % داخل الجملة<br />
ملحقا ً برمز يدل على نوع الوسيط المراد إدراجه حسب الجدول التالي<br />
:<br />
عشري، قيمة العدد الصحيح يحول إلى جملة من الخانات العشرية.<br />
ست عشري، قيمة الرقم الصحيح ت ُحول إلى جملة من الخانات الست عشرية.<br />
مؤش ّر، قيمة المؤشر يحول إلى جملة معبر عنها بأعداد ست عشرية.<br />
d (decimal)<br />
x<br />
(hexadecimal)<br />
p (pointer)<br />
s (string)<br />
e<br />
(exponential)<br />
f (floating<br />
point)<br />
g (general)<br />
قيمة الجملة، الحرف، أو نوع<br />
PChar يتم نسخها في مخرجات الجملة.<br />
مرفوع القوة، قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز مرفوع القوة.<br />
نقطة عائمة، قيمة النقطة العائمة تحول إلى جملة مبنية على ترميز النقطة العائمة.<br />
عام، قيمة النقطة العائمة تحول إلى جملة عشرية بأقرب ما يمكن مستخدمة إما ترميز النقطة<br />
العائمة أو مرفوع القوة.<br />
رقم، قيمة النقطة العائمة تحول إلى جملة نقطة عائمة لكنها أيضا تستخدم فواصل الآلاف.<br />
نقود، قيمة النقطة العائمة تحول إلى جملة تمثل مقدار العملة. التحويل يعتمد على التوصيف<br />
الإقليمي لبيئة التشغيل- انظر ملف مساعدة <strong>دلفي</strong> تحت موضوع:<br />
Currency and<br />
.date/time formatting variables<br />
n (number)<br />
m (money)<br />
: مثال<br />
أضف عنصر Edit وزر إلى برنامج جديد ، اكتب في حدث الضغط على الزر التعليمة التالية<br />
نفذ البرنامج واكتب أسمك في العنصر Edit وأضغط على الزر<br />
:<br />
ShowMessage( Format مرحبا ً') %s',[Edit1.Text]));<br />
......<br />
58
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اللوائح النصية<br />
يستخدم النوع<br />
الجلسة الحادية عشرة<br />
http://www.alshater.net<br />
59<br />
:<br />
TSrings لتعريف اللوائح النصية حيث يقوم هذا النوع بتخزين عدد من السلاسل النصية ضمن<br />
سطور وقد تعاملنا معه في السابق فالخاصة<br />
Memo من النوع<br />
يبدأ التعامل مع النوع<br />
Items التابعة ل<br />
ListBox والخاصة<br />
. Tstrings<br />
TStrings بالتعليمة<br />
Lines التابعة لعنصر المذكرة<br />
TStringList.Create التي تقوم بحجز مكان لهذا النوع في الذاكرة،<br />
علما ً أن هذا النوع قد يأخذ مجال كبير من الذاكرة تبعا ً لحجم السلاسل النصية المراد تخزينها فيه، وينتهي استخدام<br />
هذا النوع بالتعليمة Free لتحرير الذاكرة المستخدمة من قبل هذا العنصر<br />
ملاحظة<br />
.<br />
:<br />
عند إنهاء البرنامج دون استخدام التعليمة<br />
مما يعطل موارد الجهاز<br />
Free سيبقى حيز الذاكرة المحجوز من قبل المتحول<br />
Tstrings مشغولا ً<br />
)<br />
وتقسم اللوائح النصية إلى قسمين<br />
1 اللوائح النصية قصيرة الأمد<br />
تظهر هذه المشكلة مع العديد من البرامج العربية<br />
. (<br />
:<br />
:<br />
تكون اللائحة قصيرة الأمد إذا تم إنشاؤها وتحريرها في نفس الإجراء أو التابع<br />
مثال<br />
.<br />
:<br />
أنشئ مشروعا ً جديد ًا<br />
الزر التعليمات التالية<br />
:<br />
وضع السطر<br />
وأضف إليه عنصر اللائحة ListBox وزر وعنصر ، Edit أكتب في حدث الضغط على<br />
var a:TStrings;<br />
Begin<br />
إنشاء اللائحة وحجز مكان لها في الذاكرة // TStringList.Create; a =:<br />
إضافة النص الموجود في صندوق النص إلى الائحة // a.Add(Edit1.text);<br />
Form1.Caption := a.Strings [0]; //<br />
ListBox<br />
a<br />
ListBox1.Items.AddStrings(a); //<br />
a.Free ;<br />
end;<br />
TsrtingList.Create<br />
( 0 )<br />
إضافة عناصر اللائحة<br />
حاول استخدام البرنامج بدون التعليمة<br />
2 اللوائح النصية طويلة الأمد<br />
:<br />
من سطور اللائحة في عنوان النموذج<br />
إلى عنصر اللائح ة<br />
تكون اللائحة طويلة الأمد عند تعريف متحول عام أو خاص من النوع TStrings وهنا علينا تحريره عند إغلاق<br />
النموذج الذي قام بإنشائه<br />
مثال<br />
:<br />
:<br />
أضف متحول A من النوع TStrings في القسم Puplic من برنامج جديد<br />
في الحدث<br />
OnCreat للنموذج أكتب التعليمة التالية<br />
A := TStringList.Create;<br />
.<br />
:
http://www.alshater.net<br />
A.Free;<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
في الحدث OnDestroy اكتب التعليمة التالية<br />
:<br />
بإمكانك الآن استخدام عنصر اللائحة في أي جزء من البرنامج<br />
.<br />
الحدث<br />
OnDestroy يتم تنفيذه عند إغلاق النافذة<br />
ملاحظة :<br />
معظم الأنواع التي تحتاج إلى<br />
Create تحتاج إلى<br />
Free عند انتهاء التعامل معها، وهذه الطريقة تشبه<br />
طريقة التعامل مع المؤشرات حيث يجب إنهاء المؤشر بعد الانتهاء منه .<br />
معالجة الأخطاء في <strong>دلفي</strong> :<br />
يجب على كل تطبيق جيد أن يعالج جميع احتمالات الأخطاء وأن يوجه المستخدم إلى حل ما للخروج من حالة<br />
الخطأ أو يقوم بإنهاء البرنامج بأسلوب جيد على الأقل ....<br />
)<br />
تدعى حالات حدوث الخطأ في <strong>دلفي</strong> بالاعتراضات<br />
Exceptions وهي عبارة عن أهداف<br />
متحولات، توابع ،<br />
إجراءات معرفة (<br />
تحوي معلومات عن وقوع الخطأ ومكان حدوثه.<br />
.<br />
تستخدم التعليمة<br />
Try لحماية كتل التعليمات والتي لها شكلين سنشرح كل منهما بالتفصيل<br />
1 التعليمة : Try. . . . . . Except<br />
(<br />
بفرض أننا نتوقع حدوث خطأ ما في كتلة من التعليمات )<br />
مجموعة تعليمات<br />
لمعالجة هذا الخطأ نضع هذه<br />
، End وتستخدم Except قبل<br />
التعليمات ضمن الكتلة<br />
Try والتي تنتهي ب<br />
End لتوجيه البرنامج لتنفيذ عمليات<br />
محددة عند حدوث الخطأ .<br />
مثال :<br />
أضف زر وEdit إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />
نفذ البرنامج واكتب نصا ً في<br />
:<br />
var i :integer;<br />
begin<br />
i:= strtoint(edit1.text);<br />
)<br />
Edit<br />
( لا تكتب أرقام<br />
واضغط على الزر سيتوقف عندها تشغيل البرنامج وتظهر<br />
<strong>دلفي</strong> الرسالة التالية :<br />
الرسالة الموضحة لسبب الاعتراض<br />
أسم الإعتراض<br />
أسم البرنامج<br />
60
http://www.alshater.net<br />
"<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
والتي تعني أن البرنامج قد رفع اعتراضا ً من النوع EconvertError مع رسالة<br />
صحيح ، تم إيقاف العملية اضغط على تنفيذ مرة أخرى لإكمال عمل البرنامج<br />
عند الضغط على تنفيذ تظهر الرسالة التالية<br />
"النص الذي أدخلته<br />
ليس عدد<br />
.<br />
:<br />
والتي تعني أن النص المدخل ليس عدد صحيح<br />
احفظ البرنامج باسم<br />
61<br />
..<br />
Exception1 ونفذه ..<br />
أكتب نصا ً واضغط على الزر ستلاحظ ظهور الرسالة الثانية فقط<br />
ثم اذهب إلى فهرس البرنامج وشغل الملف التنفيذي<br />
، Exception1<br />
..<br />
، إذا ً فهذه هي الرسالة التي ستظهر للمستخدم<br />
وعلى فرض أن المستخدم لا يعرف ال<strong>لغة</strong> الإنكليزية فإنه لا يفهم سبب المشكلة وسيعتقد أن البرنامج سيئ<br />
لمعالجة هذا الخطأ عدل البرنامج السابق ليصبح بالشكل<br />
.<br />
Var i :integer;<br />
Begin<br />
Try<br />
i:= strtoint(edit1.text );<br />
Except<br />
) ’أدخل عدد صحيح من فضلك‘ ( Showmessage<br />
end;<br />
)<br />
:<br />
نفذ البرنامج الآن بالطريقة السابقة وستلاحظ ظهور الرسالة الأولى نفسها<br />
وجود خطأ هنا<br />
التعليمة<br />
(<br />
تظهر هذه الرسالة لتنبيه المبرمج عن<br />
ولكن الرسالة الثانية لن تظهر ولكن ستنفذ مكانها التعليمات التي وردت بعد القسم<br />
Except من<br />
. Try<br />
أحفظ البرنامج و أعد تشغيله من فهرس البرنامج ولاحظ النتائج<br />
ملاحظة<br />
.<br />
:<br />
من الواضح أن الكتلة Try . . End لم تمنع حدوث الخطأ ولكنها تعاملت مع الخطأ بأسلوب متطور<br />
والبرامج الأقوى هي البرامج التي تمنع حدوث الخطأ قدر المستطاع قبل التعامل معه فمثلا ً في برنامجنا هنا من<br />
الأفضل منع المستخدم من إدخال الأحرف داخل Edit وبالتالي لن يحدث الخطأ.<br />
تحديد نوع الخطأ<br />
مثال<br />
:<br />
: 2<br />
أضف عنصر<br />
Edit إلى البرنامج السابق وعدله ليصبح بالشكل<br />
var i,j :integer;z:real;<br />
Begin<br />
Try<br />
i:= strtoint(edit1.text);<br />
j:= strtoint(edit2.text );<br />
z:= i/j;<br />
edit3.Text := floattostr(z);<br />
Except<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
احفظ البرنامج ونفذه ولاحظ تنفيذ القسم<br />
Edit2 أي أن جميع التعليمات بين<br />
سيتم تنفيذها في حال حدوث خطأ<br />
نفذ البرنامج الآن وأدخل في<br />
رسالة خطأ من النوع<br />
http://www.alshater.net<br />
Except<br />
;( ’أدخل عدد صحيح من فضلك‘ ( Showmessage<br />
end;<br />
في حال حدوث الخطأ عند إدخال نص في Edit1 أو في<br />
Try وExcept سوف تخضع للفحص و جميع التعليمات بين<br />
End و Except<br />
Edit1 القيمة /232/<br />
.<br />
وأدخل في<br />
Edit2 القيمة / 0 /<br />
EzeorDivide والرسالة الثانية ستظهر من قبل برنامج<br />
" )<br />
نفذ البرنامج وستظهر <strong>دلفي</strong><br />
أدخل عدد صحيح من فضلك" (<br />
بالرغم من قيامك بإدخال عدد صحيح لذلك أوجدت <strong>دلفي</strong> أسلوبا ً لتحديد نوع الخطأ وتنفيذ التعليمات المناسبة للتعامل<br />
معه ، عدل الآن البرنامج السابق ليصبح بالشكل<br />
:<br />
التعليمة<br />
أو<br />
Var i,j :integer;z:real;<br />
Begin<br />
Try<br />
i:= strtoint(edit1.text);<br />
j:= strtoint(edit2.text);<br />
z:= i/j;<br />
edit3.Text := floattostr(z);<br />
Except<br />
); ’أدخل عدد صحيح من فضلك‘ ( Showmessage On Econverterror Do<br />
On EZeroDivide Do shOwmessage ( ) ;<br />
end;<br />
Do<br />
On Econverterror Do تعني :<br />
'لا يمكن القسمة على صفر'<br />
وبذلك نستطيع تحديد كيفية التعامل مع كل خطأ على حدى<br />
...<br />
هناك عدد كبير من الاعتراضات والتي تصنف في مجموعات رئيسية<br />
EintError اعترضات الأعداد الصحيحة<br />
62<br />
عند وقوع خطأ من النوع EconvertError نفذ التعليمة بعد<br />
: EmathError )<br />
( ....<br />
ينبثق عنها اعتراضات جزئية<br />
)<br />
الاعتراضات الرياضية<br />
مثل<br />
EzerDivide أو<br />
( ErangeError<br />
وأفضل طريقة للتعرف على هذه الإعتراضات هي التعامل معها أثناء ظهورها حيث يمكننا<br />
الحصول على اسم الاعتراض من الرسالة التي<br />
تظهرها <strong>دلفي</strong> عند حدوثه كما رأينا عند ظهور<br />
EconvertError<br />
............<br />
2 التعليمة<br />
: Try .. .. Finally<br />
سنبدأ بالمثال التالي لشرح هذه التعليمة<br />
مثال<br />
:<br />
: 1<br />
أضف في حدث الضغط على زر التعليمات التالية<br />
:<br />
Var a:tstrings ;<br />
i:integer;<br />
begin<br />
إنشاء المتحول وحجز مكان له في الذاكرة // ; Tstringlist.Create =:a
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير strtoint(edit1.text);// =:i<br />
i:= i * 5;<br />
إضافة قيمة المتحول إلى اللائحة // a.Add(inttostr(i));<br />
Form1.Caption := 'Done'<br />
a.Free ;<br />
لنفرض أن المستخدم أدخل نصا ً في عنصر التحرير Edit ولم يدخل أرقاما ً سينشئ عندها الاعتراض<br />
EConvertErrorr وسيخرج البرنامج من الإجراء قبل تنفيذ التعليمة<br />
محجوزة من قبل المتحول<br />
)<br />
، a<br />
a.Free مما سيؤدي إلى بقاء الذاكرة<br />
جميع التعليمات التي تلي مكان الاعتراض لا يتم تنفيذها ولو عاد البرنامج إلى<br />
العمل، لا حظ مثلا ً التعليمة 'Done' Form1.Caption =: التي لم يتم تنفيذها في حال حدث<br />
الاعتراض)<br />
عدل البرنامج السابق بحيث يصبح بالشكل<br />
:<br />
Var a:tstrings ;<br />
i:integer;<br />
begin<br />
Try<br />
إنشاء المتحول وحجز مكان له في الذاكرة // ; Tstringlist.Create =:a<br />
وضع القيمة الموجودة في عنصر التحرير داخل عنصر التحرير strtoint(edit1.text);// =:i<br />
i:= i * 5;<br />
نفذ البرنامج ، ولاحظ حدوث الاعتراض ، أعد الضغط على الزر<br />
تنفيذها<br />
يحدث<br />
a.Add(inttostr(i));<br />
Finally<br />
Form1.Caption := 'Done' ;<br />
a.Free ;<br />
end;<br />
Finally تم<br />
)<br />
لا حظ تغير عنوان النافذة<br />
. (<br />
)<br />
Run وستجد أن التعليمات في القسم<br />
أكثر ما تتميز به التعليمة Try Finally بأنها ستقوم بتنفيذ التعليمات بعد Finally سواء حدث الاعتراض أم لم<br />
نفذ الإجراء وأدخل عدد صحيح في العنصر Edit ولاحظ أن القسم Finally قد تم تنفيذه<br />
. (<br />
تسمى هذه التعليمة بتعليمة تحرير الموارد لأن أكثر استخداماتها تكون عند الحاجة لإنشاء متحولات وتحريرها بعد<br />
. انتهاء عملها<br />
تداخل تعليمات<br />
: Try<br />
يمكن أن تتداخل تعليمات Try مع بعضها البعض إذا كانت من نفس النوع كما يلي<br />
:<br />
63
http://www.alshater.net<br />
Try<br />
…….<br />
Try<br />
…..<br />
Finally<br />
……….<br />
End;<br />
……..<br />
Finally<br />
………<br />
End;<br />
Try<br />
…….<br />
Try<br />
…..<br />
Except<br />
……….<br />
End;<br />
……..<br />
Except<br />
………<br />
End;<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
64
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
)<br />
( Except<br />
)<br />
كما أنها يمكن أن دمج نوعي عبارة<br />
Try الأولى لمعالجة الاعتراض<br />
القسم<br />
والثانية لحماية الموارد<br />
القسم<br />
( Finally وذلك لتزويد البرنامج بحماية أكبر ، ولكن يجب الحذر عند استخدام هذا التداخل لمعرفة أي منهما<br />
يحدث أولا ً .<br />
تنقيح البرنامج :<br />
بعد الانتهاء من كتابة البرنامج لا بد من فحص الأخطاء التي قد تحدث والتي لا يمكن التنبه لها عند تنفيذ البرنامج<br />
لأول مرة وتدعى هذه الأخطاء ب<br />
ويوجد مع <strong>دلفي</strong> العديد من الأدوات التي تمكن المبرمج من<br />
فحص<br />
( Bugs<br />
)<br />
برامجه والتأكد من خلوها من الأخطاء قبل النشر ، تسمى عمليات فحص البرنامج والتخلص من أخطائه ب )<br />
( Debug<br />
1 التحكم بتنفيذ برنامج :<br />
من المفيد معرفة قيم متحولات البرنامج أثناء التنفيذ ومعرفة كيفية تغير قيم هذه المتحولات ، ولهذا أوجدت <strong>دلفي</strong><br />
طرقا ً لتنفيذ جزء من تعليمات البرنامج ثم التوقف أو تنفيذ تعليمات البرنامج خطوة خطوة وفحص قيم المتحولات<br />
عند نقطة معينة ثم العودة للتنفيذ .<br />
تنفيذ البرنامج خطوة خطوة :<br />
يوجد أمرين لتنفيذ البرنامج خطوة خطوة أولاهما الأمر<br />
الضغط على الزر<br />
Trace into والذي يمكن اختياره من القائمة<br />
Run أو عبر<br />
Run<br />
من أزرار السرعة أو الضغط على<br />
F7 من لوحة المفاتيح والثاني<br />
Step Over الذي يمكن تنفيذه من القائمة<br />
. F8<br />
أو الضغط على الزر<br />
أو الضغط على<br />
عند اختيار الأمر<br />
Trace Into يقوم بتنفيذ التعليمة الأولى من البرنامج ثم نضغط عليه مرة ثانية لتنفيذ التعليمة<br />
الثانية وهكذا وإذا صادف هذا الأمر إجراء أو تابعا ً ينتقل إليه لينفذ تعليماته كذلك .<br />
والأمر<br />
Step Over يشابه الأمر Trace Into ولكنه إذا صادف إجراء أو تابعا ً فإنه ينفذه بالكامل ويعود إلى<br />
التعليمة التي تلي طلب هذا الإجراء .<br />
مثال :<br />
أضف زر وعنصر لائحة<br />
ListBox إلى برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />
:<br />
Var s:string ;<br />
i , j ,z :integer;<br />
begin<br />
for i := 0 to 500 do<br />
begin<br />
j:= i * 5;<br />
z:= j * 2 ;<br />
s:= inttostr ( j ) + ' ' + inttostr(z);<br />
Form1.Caption := s;<br />
listbox1.Items.Add(s)<br />
65
http://www.alshater.net<br />
end;<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أضغط على F7 عدة مرات حتى ينهي الأمر Trace Into تعليمات تهيئة البرنامج ويدخل في جملة التعليمات<br />
المكتوبة في الأعلى ، أضغط الآن على F7 مرة أخرى ولاحظ انتقال تنفيذ البرنامج إلى التعليمة التالية حيث يظهر<br />
سهم أخضر على يسار التعليمة التي ستنفذ عن الضغط على F7 في المرة التالية<br />
.<br />
كرر الضغط على F7 حتى يصل السهم الأخضر إلى التعليمة listbox1.Items.Add(s) ، حرك الآن مؤشر<br />
الفأرة ليقف فوق المتحولات في جسم الحلقة مثلا ً أوقف المؤشر فوق المتحول I ستظهر عندها القيمة المخزنة في<br />
وكذلك في<br />
I<br />
....S و Z<br />
أضغط على F7 مرتين حتى يقف السهم الأخضر بجانب التعليمة * 5 i =:j ولاحظ أنه يمكنك الحصول على قيمة<br />
I الجديدة ولا يمكنك الحصول على كل من قيمة<br />
القيم لم يتم إعطائها قيم جديدة بعد<br />
ملاحظة<br />
j و Z و<br />
.<br />
:<br />
s ويعود السبب لأن I قد أخذت قيمتها الجديدة بينما باقي<br />
يستخدم الأمر Step Over بنفس الطريقة ولكن عليك بدأ تنفيذ البرنامج ب Trace Into حتى يتم تنفيذ التعليمة<br />
Application.Run لأن الإجراء Step Over يعتبرها تعليمة واحدة وينفذ البرنامج بعدها بالكامل<br />
.<br />
الأمر<br />
: Run To Cursor<br />
قد يكون أحيانا ً من الصعب تنفيذ البرنامج خطوة خطوة للوصول إلى مجموعة تعليمات نريد فحصها لذلك وجد هذا<br />
الأمر حيث يكفي أن تضع مؤشر الكتابة في السطر البرمجي الذي تريد ثم تختار الأمر<br />
القائمة Run أو الضغط على F4 عندها سيتم تنفيذ البرنامج حتى التعليمة التي وقفت عندها<br />
Run To Cursor<br />
.<br />
من<br />
ملاحظة : لا تستخدم هذه الطرق الثلاث لمعرفة قيم المتغيرات فحسب ، فهي تستخدم في البرامج الكبيرة وخاصة<br />
عندما يعطي البرنامج في أماكن معينة نتائج غير متوقعة أو نتائج غير المطلوبة ، حيث تقوم هذه الأوامر بإعطائك<br />
معلومات عن سير البرنامج ومعرفة النقطة التي يحدث فيها الخلل، كما أن <strong>دلفي</strong> قد تعطيك بعض رسائل الأخطاء<br />
التي لا يمكن تحديد مكانها بسهولة<br />
نقاط التوقف<br />
.<br />
:<br />
تستخدم نقاط التوقف لإيقاف البرنامج في نقاط محددة حيث يستمر تنفيذ البرنامج حتى وصول البرنامج إلى السطر<br />
المحدد وتختلف نقاط التوقف عن الأمر Run To Cursor بأننا نستطيع إضافة عدد كبير من نقاط التوقف في<br />
. البرنامج<br />
ولإضافة نقطة توقف في البرنامج نضع المؤشر في السطر المراد التوقف عنده ونختار الأمر<br />
من القائمة<br />
Add Breakpoint<br />
Run<br />
ثم الضغط على Ok في صندوق الحوار أو الضغط على F5 أو الضغط على يسار السطر<br />
بالفأرة وتتميز السطور المعلمة بنقاط توقف بلونها الأحمر<br />
.<br />
سنتعلم الآن كيفية التعامل مع نقاط التوقف وسنتعلم لاحقا ً كيفية الاستفادة منها<br />
.<br />
66
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التعامل مع نقاط التوقف<br />
1 عرض جميع نقاط التوقف :<br />
يمكن توزيع نقاط التوقف في كل وحدات البرنامج بنفس الوقت ولعرض قائمة بجميع أوامر التوقف نختار من<br />
القائمة View<br />
View Debug Window Breakpoints<br />
حيث تظهر نافذة تظهر نافذة تخبرك باسم الوحدة الموجودة فيها نقطة التوقف وفي أي سطر من الشيفرة .<br />
2 تعطيل نقاط التوقف :<br />
يمكن تعطيل نقاط التوقف مؤقتا ً بالضغط على الدائرة الحمراء بزر الفأرة اليميني والضغط على الخيار Enable<br />
من القائمة المنبثقة حيث يتحول لون نقطة التوقف إلى اللون الأخضر ويمكن إعادة النقطة إلى العمل بتكرار العملية<br />
3 حذف نقطة توقف :<br />
يتم حذف نقطة التوقف بالطريقة التي تم إنشاءها بها )<br />
أي بإمكانك الضغط على الدائرة الحمراء بزر الفأرة اليساري<br />
أو الضغط على .... F5 (<br />
يمكن حذف جميع نقاط التوقف عن طريق View Debug Window Breakpoints ومن<br />
عرض الائحة<br />
ثم الضغط على إحدى النقاط في اللائحة بزر اليمين للفأرة واختيار الأمر .... Breakpoint Delete All<br />
4 استخدام نقاط توقف شرطية :<br />
يمكنك تحديد شرط لنقطة التوقف حيث لا يتوقف البرنامج إلا إذا حصل هذا الشرط )<br />
مثلا ً في المثال السابق وصول<br />
المتحول ( 500<br />
j إلى القيمة<br />
ويتم ذلك عن طريق الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار<br />
j =<br />
)<br />
Condition ومن ثم كتابة الشرط في القسم Breakpoint Properties<br />
في النافذة مثلا ً أكتب الشرط<br />
( 500<br />
5 استخدام عدد مرات العبور :<br />
يمكن أن نطلب من البرنامج أن يقف عن نقطة التوقف عند تنفيذها لعدد معين من المرات، ويتم ذلك عن طريق<br />
الضغط بزر الفأرة اليميني على النقطة الحمراء ومن ثم اختيار<br />
Breakpoint Properties ومن ثم كتابة عدد<br />
المرات المطلوبة في القسم Pass count<br />
Pass Count ب<br />
مثلا ً أضف نقطة توقف عن السطر<br />
listbox1.Items.Add(s) ثم حدد<br />
100 نفذ البرنامج الآن<br />
وستلاحظ توقف البرنامج عن العمل عندما تنفذ الحلقة 100 مرة .<br />
مراقبة التعابير والمتحولات :<br />
تستخدم المراقبة لمعرفة قيم تعابير ومتحولات محددة أثناء سير البرنامج ،ولإضافة نقطة مراقبة اتبع<br />
إحدى الطرق<br />
التالية :<br />
1 حدد المتحول الذي تريد إضافة نقطة مراقبة له واضغط بزر الفأرة اليميني وأختر الأمر Debug Add<br />
Watch at Cursor<br />
2 اختر Add Watch من القائمة<br />
Run أو اضغط<br />
. Ctrl F5<br />
3 إظهار النافذة Watch List من القائمة View Debug Windows watches View<br />
67
http://www.alshater.net<br />
. Expression<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
عندئذٍ سيظهر صندوق الحوار التالي حيث يمكنك كتابة القيمة المراد مراقبتها في القسم<br />
بعد إضافة المتحولات المطلوب مراقبتها عليك تنفيذ البرنامج خطوة خطوة أو استخدام نقاط التوقف، حيث ستبقى<br />
.<br />
نافذة المراقبة مفتوحة وتعطيك قيمة المتحولات في كل لحظة<br />
يتوقف فيها البرنامج<br />
التعامل مع عناصر المراقبة :أفتح أولا ً لائحة عناصر المراقبة عن طريق<br />
watches<br />
يمكنك تعطيل عنصر مراقبة عن طريق الضغط عليه بزر الفأرة اليميني واختيار الأمر<br />
View Debug Windows :<br />
، Disable ولحذف عنصر<br />
مراقبة نهائيا ً نختار . Delete<br />
للتغير في عنصر المراقبة نختار الأمر Edit Watch فتظهر النافذة :<br />
حيث<br />
Expression هو التعبير المراد مراقبته<br />
ونستطيع هنا أن نكتب تعبرا ً ما فرضا ً يمكن<br />
مراقبة قيمة<br />
i+j رغم أن هذه التعليمة غير<br />
موجودة في سطور البرنامج .<br />
: Repeat Count تستخدم مع الأنساق<br />
والسجلات فبفرض لدينا مصفوفة من أربع<br />
عناصر فنكتب في القسم Expression أسم<br />
الم صفوفة وف ي الحق ل<br />
4/ عندها ستظهر جميع عناصر المصفوفة أثناء المراقبة .<br />
Repeat Count القيمة /<br />
كما يمكن تحديد كيفية ظهور المعطيات من جزء النافذة في الأسفل فاختيار<br />
Hexadecimal سيظهر قيمة المتحول<br />
في النظام الست عشري ويحدد الحقل<br />
Digits عدد الأرقام بعد الفاصلة عند إظهار الرقم بالفاصلة العائمة<br />
. Floating Point<br />
رؤية استدعاء الروتينات :<br />
يمكننا مشاهدة المكدس الذي يحوي على استدعاء الاجراءات عن طريق<br />
Stack<br />
حيث يتوضع في أعلى النافذة التابع المستدعى حاليا ً والسطر الذي يليه التابع الذي قام باستدعائه .<br />
View Debug Windows call<br />
Add ( 10 ) ;<br />
:<br />
مثال :<br />
اكتب في حدث الضغط على زر التعليمة التالية<br />
Procedure Add ( x ) ;<br />
:<br />
وعرف الإجراء<br />
Add بالشكل التالي<br />
Begin<br />
X := x +1;<br />
If X < 50 then Add ( x ) ; // 50<br />
End;<br />
سيعيد هذا التابع تنفيذ نفسه حتى وصول المتحول إلى القيمة<br />
نفذ الآن البرنامج خطوة خطوة ولاحظ تغير<br />
. النتائج<br />
68
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الثاثثة عشر<br />
ما هي قاعدة المعطيات؟:<br />
http://www.alshater.net<br />
)<br />
قاعدة المعطيات Database هي تركيب تستطيع من خلاله تخزين كمية ً ضخمة ً من المعطيات التي تربطها علاقات<br />
معينة، وحقيقة ُ الأمر، فإن قاعدة المعطيات ما هي إلا ملف ّ File أو مجموعة ملف ّات ت ُخزن على القرص الصلب<br />
Hard Disk ككلّ الملف ّات العادية، ولكن ما يميزها عن باقي الملف ّات، هو قدرتك على كتابة المعطيات فيها<br />
وقراءتها منها، باستخدام الوسائل التي تمنحها لك برامج قواعد المعطيات، دون الحاجة إلى التعامل مع الملف ّ<br />
مباشرة ً، وهو ما يجعل الأمر أكثر سهولة ً وتنظيما بالنسبة لك.<br />
ولا مانع أن تخزن بياناتك في ملف ّ خاص بك بالطريقة التي تريحك، ولكن استخدام قواعد المعطيات يوف ّر لك<br />
الكثير من الوقتِ والجهد.<br />
في بدايات قواعد المعطيات كان كل مبرمج ينشئ ملف معطيات خاص به ويقوم بالتعامل مع هذا الملف بالطرق<br />
التي تتيحها لغات <strong>البرمجة</strong> للتعامل مع الملفات<br />
)<br />
سنتعرف عليها لاحقا ً<br />
(<br />
( ملفات )<br />
ولكن مع الوقت تطورت قواعد البيانات<br />
وأصبح المستخدمون بحاجة إلى قواعد بيانات ذات حجم كبير و إلى القدرة إلى الحصول على المعلومات المطلوبة<br />
بشكل سريع بالإضافة إلى إمكانية التشارك على المعلومات أي إمكانية إدخال المعلومات والحصول عليها من ملف<br />
قواعد المعطيات من قبل عدة مستخدمين بنفس الوقت، الأمر الذي جعل من المستحيل أن يقوم مبرمج<br />
عادي بتحقيق هذه الشروط<br />
(<br />
وهناك أنواع كثيرة من قواعد المعطيات، تبعا للشركة التي تنتجها والبرامج التي تنشئها، فهناك قواعد بيانات<br />
برنامج<br />
Access وبرنامج<br />
شركات أخرى.<br />
وتسمى هذه البرامج "أنظمة إدارة قواعد المعطيات"<br />
SQL Server وهما من إنتاج ميكروسوفت، وهناك عشرات البرامج غيرهما من إنتاج<br />
(DBMS) ،Database Management Systems ومهمتها<br />
الأساسية أن تمنحك الوسائل والأدواتِ اللازمة لإنشاءِ قواعدِ المعطيات والتعاملِ معها، بأسهلِ طريقةٍ وأفضلِ<br />
إمكانيات، بحيث ُ تقوم بدور الوسيط بينك وبين المعطيات المخزنة في ملف ّ قاعدة المعطيات.<br />
ومهما كان نوع قاعدة المعطيات التي تتعامل معها، ومهما كانت طريقة تخزينها في الملف ّ، فإن كلّ قواعد<br />
المعطيات تتبع قواعد أساسية وتحق ّق شروطا معينة متعارفا عليها دوليا، كما أن ّها كل ّها بلا استثناء تستخدم "<strong>لغة</strong><br />
الاستعلام المرك ّبة" (SQL) ،Structured Query Language وهي <strong>لغة</strong> خاصة لحفظ واسترجاع وتحديث<br />
المعطيات في قواعد المعطيات.<br />
: التالي<br />
مما تتألف قواعد المعطيات:<br />
العنصر الأساسي في أي قاعدة بيانات هو الجدول ويتألف الجدول من أعمدة وأسطر يدعى كل سطر سجل وكل<br />
عمود بحقل وبالتالي فإن السجل مكون من عدة حقول، لنفرض أنه لديك قاعدة بيانات لمكتبة فسيكون لديك الجدول<br />
69
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
( أسماء الحقول ) أسماء الأعمدة<br />
رقم الكتاب<br />
اسم الكتاب<br />
اسم المؤلف<br />
تاريخ<br />
دار النشر<br />
السجل الحالي<br />
الإصدار<br />
الحقل الحالي<br />
1997/1/2<br />
<strong>لغة</strong> <strong>البرمجة</strong><br />
ياسر عقاد<br />
دار شعاع<br />
1255<br />
<strong>دلفي</strong><br />
محمد حمدي 2002/2/9<br />
غانم<br />
كتاب<br />
إلكتروني<br />
VB.Net<br />
1256<br />
سجلات<br />
1944/3/3<br />
شجرة الحكم<br />
توفيق الحكيم<br />
مصر<br />
1257<br />
2000/4/2<br />
الأي دي<br />
توفيق الحكيم<br />
مصر<br />
1258<br />
الناعمة<br />
1990/3/12<br />
شهرزاد<br />
الحكيم توفيق<br />
مصر<br />
.(<br />
ملاحظة : )<br />
المعلومات في هذا الجدول غير دقيقة<br />
: السجل الحالي<br />
هو السجل الذي يقف مؤشر قاعدة البيانات عنده والحقل الحالي هو تقاطع السجل الحالي مع<br />
العامود الحالي حيث يمكنك دائما ً تحرير قاعدة البيانات عند السجل الحالي وفي الحقل الحالي ) سنتآلف مع هذه<br />
المعلومات لاحقا ً<br />
.(<br />
يمكن أن تتكون قاعدة المعطيات من عدة جداول وهذه الجداول قد تكون مخزنة في ملف واحد<br />
أكسيس مثلا ً<br />
)<br />
(<br />
يعرف كل حقل<br />
أو أن يكون كل جدول في ملف على حدة كما في قاعدة بيانات بارادوكس<br />
.<br />
( عمود )<br />
Integer أو<br />
وتاريخ الإصدار من النوع<br />
قاعدة بيانات<br />
في قواعد المعطيات نوع المعطيات التي سيحويها فمثلا ً الحقل رقم الكتاب من النوع<br />
LongInt حسب حجم المكتبة بينما أسم الكتاب و اسم المؤلف ودار النشر تكون من النوع نص<br />
. Date<br />
وأكثر من ذلك عندما نعرف الحقل من نوع نص علينا تحديد عدد الأحرف التي سيحويها هذا النص مثلا ً أسم<br />
الكتاب عشرين حرف علما ً أنه لا يسمح بكتابة أكثر من الحد المعطى ، كما أن حجم الحقل سيكون بحجم النص<br />
عشرين بايت<br />
)<br />
(<br />
سواء أكان أسم الكتاب من عشرين حرف أو أقل ،<br />
البيانات ، بالإضافة إلى قواعد البيانات التي تأخذ حقول متغيرة<br />
قواعد المعطيات العلائقية<br />
)<br />
. (<br />
:<br />
سنتعرف لاحقا ً على أنواع الحقول في قواعد<br />
في الجدول السابق وضعنا أسم المؤلف ضمن الجدول ، ومن الممكنِ أن يحتوى الجدول على أكثر من كتابٍ لنفس<br />
المؤل ّف.. في هذه الحالة سيتم تكرار اسم المؤل ّف أكثر من مرة، مما سيعمل على زيادة حجم قاعدة المعطيات،<br />
وإبطاء عمليات البحث.. إذن ما الحلّ؟<br />
الحلّ هو تخصيص جدولٍ للمؤل ّفين، هذا الجدول يحتوي على رقم مسلسل ID لكلّ مؤل ّف.. وفي جدول الكتب ننشئ<br />
عمودا نضع فيه رقم مؤل ّف الكتاب.. فمثلا لو كان رقم (توفيق الحكيم) في جدول المؤل ّفين هو 100، فإن خانة رقم<br />
70
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
المؤل ّف في جدول العناوين لا بد أن تكون<br />
100 لكلّ من الكتب التالية<br />
"شهرزاد"<br />
و"الأيدي الناعمة"<br />
و"أرني االله"<br />
:<br />
و"شجرة الحكم"<br />
وسيصبح لينا جدولين بالشكل<br />
رقم الكتاب<br />
اسم الكتاب<br />
اسم المؤلف<br />
تاريخ<br />
دار النشر<br />
الإصدار<br />
1997/1/2<br />
<strong>لغة</strong> <strong>البرمجة</strong> 50<br />
دار شعاع<br />
1255<br />
<strong>دلفي</strong><br />
2002/2/9 كتاب<br />
56<br />
VB.Net<br />
1256<br />
إلكتروني<br />
1944/3/3<br />
شجرة الحكم 100<br />
مصر<br />
1257<br />
2000/4/2<br />
الأيدي الناعمة 100<br />
مصر<br />
1258<br />
1990/3/12<br />
شهرزاد 100<br />
مصر<br />
جدول الكتب<br />
رقم المؤلف<br />
أسم المؤلف<br />
ياسر عقاد<br />
محمد حمدي غانم<br />
توفيق الحكيم<br />
سعيد الصافي<br />
50<br />
56<br />
100<br />
114<br />
ولكي تستوعب مقدار التوفير في الحجم، يجب أن تعرف أن كلّ حرف في النص يخزن في بايت<br />
،Byte مما يعني<br />
أن النص<br />
"توفيق الحكيم"<br />
يحتاج إلى<br />
12 بايت ، وتكراره أربع مرات يعني أن ّه يحتاج إلى<br />
48 بايت !.. بينما تخزين<br />
8 بيتات<br />
رقم يصل إلى<br />
32000 لن يحتاج إلا إلى بايتين فقط، مما يعني أن تخزين رقم<br />
100 أربع مرات يحتاج إلى<br />
فقط..<br />
طبعا الفرق واضح.<br />
وليت َ الأمر يقتصر على هذا..<br />
إن إنشاء عمود يحتوي على أسماء المؤل ّفين يقتضي تصميمه ليستوعب أطول اسم<br />
30<br />
من هذه الأسماء..<br />
افترض أن أطول اسم لمؤل ّف هو<br />
20 حرفا، في هذه الحالة لو كان جدول الكتب يحتوي على<br />
600 كيلو<br />
= 20<br />
ألف كتاب، فإن هذا معناه أن عمود أسماء المؤّلفين يحتاج إلى × 30000<br />
600 ألف بايت ، أي<br />
بايت!<br />
بينما لو استعضنا عن ذلك بعمود أرقام المؤل ّفين، فإن ّه سيحتاج إلى<br />
60 ألف وحدة، أي<br />
60 كيلو بايت فقط.<br />
طبعا ستتساءل:<br />
ولكن ّنا في كلّ الأحوال سننشئ عمودا لأسماء المؤل ّفين بالإضافة لعمود رقم المؤل ّف في جدول<br />
المؤل ّفين..<br />
نعم، ولكن عدد المؤّلفين قد لا يزيد عن<br />
3 آلاف مؤل ّف<br />
(باعتبار أن كلّ مؤل ّف له عشر كتب)، وهو ما<br />
سيحتاج إلى<br />
66 كيلو بايت.<br />
= (2<br />
+ 20)<br />
× 3000<br />
إذن فإن المجموع الكل ّي لمساحة التخزين في حالة تقسيم المعلومات على جدولين<br />
126 كيلو بايت،<br />
= 66<br />
+ 60<br />
=<br />
أي حوالي خمس المساحة المستهلكة عند وضع أسماء المؤل ّفين في نفس جدول الكتب!<br />
71
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
هذا بالإضافة إلى سرعة عملية البحث، فالكمبيوتر يكون أسرع بكثير عند البحث عن رقم 100 عنه عند البحث عن<br />
النص<br />
"توفيق الحكيم".<br />
ليس هذا فحسب..<br />
افترض أن الذي يدخل أسماء المؤل ّفين أخطأ وكتب اسم<br />
(توفيق الحكيم)<br />
كالتالي: "تفيق الحكيم"..<br />
في هذه الحالة ما عليه إلا أن يعدل الخطأ مرة واحدة في جدول المؤل ّفين..<br />
أما لو كانت أسماء المؤل ّفين في نفس<br />
جدول الكتب، فإن تكرار كتابة اسم المؤل ّف يجعل احتمالات الخطإ أكبر، بالإضافة إلى تضييع الوقت والجهد في<br />
كتابتها، وصعوبة تعديلها كل ّها!<br />
طبعا نفس هذا الكلام ينطبق على جدول دار النشر.<br />
قاعدة هامّة:<br />
كل ّما كان ممكنا، قم بتقسيم المعطيات التي تتكرر أكثر من مرة على أكثر من جدول، خاصة ً إذا كانت هذه المعطيات<br />
تستهلك مساحة تخزين كبيرة..<br />
إن هذه العملية تسمى التطبيع<br />
،Normalization ولها الكثير من القواعد، وإن كان<br />
. (<br />
من الممكن استنتاجها منطقيا )<br />
تدرس في قسم المادة النظري<br />
تسمى هذه القواعد التي تعتمد الطريقة السابقة بقواعد المعطيات العلائقية أو بقواعد المعطيات المترابطة<br />
:Relational Databases<br />
حيث قامت هنا علاقة بين جدولين وسيعتمد احدهما على الآخر في الحصول على معلوماته .<br />
رأينا في المثال السابق أن هناك علاقة ً<br />
Relationship بين جدولي الكتب والمؤل ّفين، حيث إن الرابط بينهما هو<br />
حقل رقم المؤل ّف..<br />
وهنا يجب أن تعرف هذه المصطلحات:<br />
يسمى الحقل المشترك في كلا الجدولين .Key field<br />
"حقل مفتاحي"<br />
-<br />
- يسمى حقل رقم المؤل ّف في جدول المؤل ّفين باسم<br />
"المفتاح الأساسي"<br />
،Primary Key وذلك لأن ّه متفرد<br />
Unique غير قابل للتكرار..<br />
ولا يحتوي الجدول على أكثر من مفتاح أساسي واحد.<br />
- يسمى حقل رقم المؤل ّف في جدول الكتب باسم<br />
"المفتاح الفرعي"<br />
،Foreign Key لأن ّه موضوع في هذا<br />
الجدول ليربطه بجدول آخر..<br />
وطبعا يمكن أن تتكرر قيمة هذا العمود بدون أدنى مشكلة..<br />
ويمكن أن يحتوى<br />
الجدول على أكثر من مفتاح فرعي يربطه بعدد من الجداول الأخرى.<br />
- يسمى جدول المؤّلفين باسم<br />
"الجدول الرئيس ي"<br />
،Master وجدول أسماء الكتب باسم<br />
"جدول التفاصيل"<br />
..Join<br />
،Detail حيث يمكنك أن تحصل منه على معلومات عن الكتب المتوافرة لكلّ مؤل ّف.<br />
- تسمى عملية مطابقة الصفوف بين الجدولين المترابطين عن طريق الحقل المفتاحي، عملية<br />
"ربط"<br />
مثل أن تحاول معرفة اسم مؤل ّف كتاب معين، أو أن تحاول أن تعرف كلّ الكتب التي كتبها نفس المؤل ّف.<br />
- تسمى العلاقة بين الجدولين علاقة<br />
يمكن أن يكون له أكثر من كتاب.<br />
"واحد بمتعدد"<br />
،One-to-many Relationship وذلك لأن مؤل ّف ًا واحدا<br />
- يمكن أن توجد علاقة<br />
"متعدد بمتعدد"<br />
،Many-to-many Relationship وذلك لو كان لدينا كتب اشترك<br />
في تأليفها أكثر من مؤل ّف..<br />
في هذه الحالة سيكون لدينا جدول ثالث هو جدول<br />
"مؤل ّفو الكتب"، يحتوى على<br />
72<br />
عمود يمث ّل رقم الكتاب في جدول عناوين الكتب، وعمود آخر يمث ّل رقم المؤل ّف في جدول المؤل ّفين،<br />
كالتالي:
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
AuthorID<br />
23<br />
106<br />
8<br />
8<br />
BookID<br />
1<br />
1<br />
2<br />
3<br />
حيث اشترك المؤّلفان رقما<br />
رقمي<br />
23 و<br />
106 في تأليف الكتاب رقم<br />
2، بينما قام المؤل ّف رقم<br />
8 بتأليف الكتابين<br />
2 و ..3<br />
هذه هي علاقة متعدد بمتعدد.<br />
صحّة المرجع<br />
:Referential Integrity<br />
ماذا سيحدث لو تم حذف سجلّ توفيق الحكيم من جدول المؤل ّفين؟.. ستظلّ هناك روايات في جدول الكتب تشير<br />
لسجلّ توفيق الحكيم، بينما هو محذوف.. إن هذا وضع مثالي لحدوث أخطاءٍ مزعجة في تطبيقك!<br />
والحلّ؟<br />
يجب أن تراعي منطقية وصحة العلاقات المرجعية<br />
Referential Integrity<br />
بين الجداول، فلو قمت بحذف سجلّ<br />
توفيق الحكيم من جدول الكتب، فيجب أيضا أن يتم حذف كلّ الروايات والكتب التي أل ّفها من جدول الكتب.<br />
عامة ً اطمئن، فكما ذكرنا من قبل، فإن برامج قواعد المعطيات مصممة لتريحك من معظم العمل اليدوي، لهذا فهي<br />
ستعينك على التحق ّق من صحة العلاقات المرجعية بين الجداول، كما سنرى بعد قليل.<br />
العمليات على قواعد المعطيات<br />
:<br />
قاعدة المعطيات عبارة عن مخزن يتم فيه تخزين المعطيات ويجب أن يتمتع هذا المخزن بالخصائص التالية<br />
1 الإضافة<br />
2 الحذف<br />
3 التعديل<br />
:<br />
:<br />
أي إمكانية إضافة سجلات جديدة إلى الجداول<br />
.<br />
:<br />
أمكانية حذف قيم من الجداول دون أن يؤثر ذلك على القاعدة<br />
.<br />
:<br />
يجب أن نكون قادرين على تعديل حقول قاعدة البيانات ، أفرض مثلا ً أن هناك حقل في جدول<br />
يحوي على عدد النسخ من الموجودة من الكتب ، علينا أن نعدل هذا الحقل كلما إشترى أحد الزبائن كتابا ً ما<br />
4 البحث<br />
.<br />
:<br />
5 الترتيب والفرز<br />
يجب الحصول على المعلومة المطلوبة بأسرع وقت ممكن<br />
.<br />
:<br />
حسب أسم الكتاب أو حسب أسم المؤلف<br />
القدرة على إظهار البيانات للمستخدم بالشكل الذي يريد<br />
)<br />
.<br />
في جدول يمكن ترتيب الكتب<br />
عليك أن تعرف أيضا ً الفرق بين تخزين المعطيات والفائدة التي يمكن أن تجنيها من هذه المعطيات ، فالعمليات على<br />
المعطيات هي التي تعطي المعلومات والتي يحتاجها مستثمر قاعدة البيانات ليتخذ قراره، تستخدم قواعد البيانات في<br />
بلادنا في مجال المحاسبة وإصدار الفواتير وفي مجالات الإحصاء على أكثر تقدير<br />
الاستفادة من المعلومات الإحصائية<br />
)<br />
(<br />
قليل من الشركات تعرف<br />
بينما تستخدم قواعد المعطيات في الخارج كالولايات المتحدة الأمريكية مثلا ً<br />
للحصول على كم هائل من المعلومات لا يمكن لإنسان عادي أن يتصوره ، افرض أن الزبون سعيد قد اشترى من<br />
المكتبة عدة كتب تتعلق بلغات <strong>البرمجة</strong> خلال سنة ، يتكون من هذه المعطيات أن سعيد يحب قراءة كتب <strong>البرمجة</strong><br />
73
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ويقوم صاحب المكتبة بإرسال إعلانات إلى سعيد كلما صدر مؤلف جديد في لغات <strong>البرمجة</strong>، لنفرض أيضا ً أنه في<br />
http://www.alshater.net<br />
أسبوع ما كثر الطلب على كتاب ما<br />
) Harry potter الكتاب الذي حصد أكبر مبيعات في العالم في الشهر السادس<br />
، عندها يقوم صاحب المكتبة بتعديل ترتيب الكتب الموضوعة على الرفوف ليكون<br />
هذا الكتاب على<br />
(<br />
2003<br />
الرفوف في واجه المكتبة<br />
.( طبعا ً لا يمكن تطبيق هذه الأمثلة عندنا هكذا ، لأن أي مكتبة في الولايات المتحدة يكون<br />
لها فروع في أكثر من ولاية ومدينة مما يعني عدد زبائن يفوق المليون زبون، مما يعطي إحصائيات واسعة عن<br />
حركة البيع والشراء (<br />
خطوات تصميم قواعد المعطيات :<br />
1 تحديد الغرض من قاعدة المعطيات .<br />
2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات .<br />
3 تحديد حقول الجداول التي نحتاج إليها .<br />
4 تعيين الحقول المفتاحية .<br />
5 تحديد العلاقات بين الجداول<br />
6 إدخال المعطيات .<br />
1 تحديد الغرض من قاعدة :<br />
المعطيات<br />
يجب المعرفة أولا ً ماذا يريد المستخدم من قاعدة المعطيات وثم معرفة المعطيات التي يجب تخزينها في القاعدة لأن<br />
أي زيادة في المعطيات سينتج عنه زيادة في حجم القاعدة بدون سبب ، وأي نقص في المعطيات سيتطلب منا تعديل<br />
الجدول فيما بعد والذي قد يؤدي بدوره إلى تعديل في الجداول المرتبة وبالتالي تعديل القاعدة بالكامل .<br />
2 تحديد الجداول التي نحتاج إليها في قاعدة المعطيات :<br />
بعد تحديد المعطيات المطلوب تخزينها يجب علينا العمل على تخطيط الجداول التي ستخزن هذه المعلومات .<br />
3 تحديد حقول الجداول التي نحتاج إليها :<br />
يجب<br />
أن لا يتضمن الجدول معلومات متكررة ،كما أنه لا يجب تكرار المعلومة الواحدة بين الجداول ، هذا يضمن<br />
تحديث المعلومة في مكانها ويقضي على احتمال إدخال معلومات متباينة لتلك المعلومة فيما لو وجدت في مكانين<br />
مختلفين .<br />
........<br />
قواعد المعطيات في <strong>دلفي</strong> : .....<br />
1 برامج قواعد المعطيات<br />
: هي البرامج التي تسمح للمستخدم بالتعامل مع المعطيات المخزنة ضمن قاعدة<br />
المعطيات، وعند كتابة برنامج لقاعد معطيات يجب أن تكون على علم كاف ببنية قاعدة المعطيات التي تتعامل معها<br />
)<br />
الجداول والحقول<br />
( حيث يمكنك ذلك من تصميم الواجهات التي تسمح للمستخدم بتعامل مع هذه المعطيات<br />
)<br />
استعراض ، إضافة ، حذف ، بحث ....... ( .<br />
74<br />
2 أنواع قواعد المعطيات<br />
:
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اختيار نوع قاعدة المعطيات التي ستخدم يعتمد على ثلاث نقاط رئيسية<br />
1 حجم المعطيات التي سيحويه كل جدول .<br />
2 كم هو عدد المستخدمين الذين سيتشاركون العمل على هذه القاعدة .<br />
3 سرعة الأداء المطلوبة من قاعدة المعطيات .<br />
وعلى هذا المبدأ تقسم قواعد المعطيات إلى قسمين :<br />
أ قواعد المعطيات المحلية :<br />
تعمل قواعد المعطيات المحلية على جهاز واحد أو على شبكة محلية صغيرة ، وهي سريعة عمليا ً ولكنها أبطئ في<br />
حالات التشارك على قواعد المعطيات )<br />
تصور عدد من الموظفين يقومون بإدخال الكتب الجديدة الواصلة إلى<br />
المكتبة بنفس الوقت ، عندها على قاعدة المعطيات العمل على جعل ذلك متاحا ً للموظفين (<br />
تقوم قواعد المعطيات<br />
(<br />
المحلية على قفل الملف )<br />
الجدول<br />
للمستخدم الحالي ومنع التعديل في هذا الجدول من<br />
قبل مستخدم آخر حتى ينهي<br />
(<br />
المستخدم الحالي تعديله )<br />
يوجد خوارزميات كثيرة لتطبيق هذا العمل<br />
واعتماد قواعد المعطيات على هذا النوع من<br />
. (<br />
القفل جعلها محدودة الحجم نوعا ً ما )<br />
هناك عدد أعظمي للسجلات التي يمكن لقاعدة المعطيات التعامل معها<br />
سرية المعلومات في هذه القواعد ضعيفة جدا ً ويمكن كسرها بسهولة.<br />
. Paradox, dBASE, FoxPro, and Access.<br />
كمثال على قواعد المعطيات المحلية لدينا :<br />
ب قواعد المعطيات الموزعة :<br />
(<br />
تسمح هذه القواعد لعدة مستخدمين )<br />
آلاف المستخدمين<br />
بالتعامل مع الجداول وتستخدم خوارزميات معقدة لتحقيق<br />
Microsoft SQL<br />
ذلك )<br />
جميع شركات الطيران في العالم موصولة إلى قاعدة بيانات واحدة)<br />
، قاعدة معطيات<br />
Server تستخدم القفل على مستوى السجل أي تسمح لعدة مستخدمين بتعديل نفس الجدول بنفس الوقت ولكنها لا<br />
تسمح لهم بتعديل نفس السجل .<br />
يمكن أن يصل حجم قواعد المعطيات هذه إلى كميات هائلة )<br />
بلغ حجم معطيات إحدى شركات التسويق في أمريكا<br />
( 3.6 TB كما أنه يمكن لقواعد المعطيات هذه أن توجد على أجهزة مختلفة .<br />
سرية المعلومات في هذه القواعد قوية جدا ً ، كما أنها تعطي سماحيات للمستخدمين ، فموظف المكتبة المسئول عن<br />
إدخال أسماء الكتب لا يحق له الإطلاع على كمية المبيعات ...<br />
تشترك قواعد المعطيات هذه باستخدامها ل<strong>لغة</strong> الاستفسارات البنيوية (SQL) Structured Query Language<br />
InterBase, Oracle, Sybase, Informix, Microsoft SQLserver,<br />
كمثال على قواعد المعطيات الموزعة لدينا :<br />
and DB2.<br />
3 بنية برنامج قواعد المعطيات:<br />
يبن الشكل المجاور بنية تطبيق قواعد<br />
المعطيات<br />
والذي يتألف من<br />
أ واجهة المستخدم<br />
: وهي النوافذ<br />
التي يصممها المبرمج ليسمح<br />
للمستخدم بالتعامل مع المعطيات<br />
.<br />
75
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ب عناصر الوصول<br />
: Data Access تستخدم للوصول إلى قواعد المعطيات وهي عبارة عن ربط بين<br />
) :<br />
عناصر التحكم بالمعطيات مع واجهة المستخدم .<br />
.<br />
ج عناصر التحكم بالمعطيات :<br />
تزود المستخدم بواجهة التعامل مع جداول المعطيات<br />
من المهم أن تلاحظ أن التطبيق<br />
البرنامج<br />
( مستقل عن قاعدة المعطيات، حيث توفر <strong>دلفي</strong> أدوات للوصول إلى<br />
)<br />
قواعد المعطيات ولالكنها لا تتدخل بكيفية تعامل القاعدة مع المعلومات المدخلة<br />
) عند إدخال سجل إلى جدول<br />
معطيات<br />
Oracle لا تهتم <strong>لغة</strong> <strong>البرمجة</strong> ولا حتى المبرمج بكيفية تخزين هذا السجل والطرق الخوارزمية المتبعة في<br />
ذلك و لا حتى طرق البحث ، فعمل <strong>لغة</strong> <strong>البرمجة</strong> هنا يقتصر على طلب أوامر محددة من قاعدة المعطيات والتي<br />
Data<br />
تقوم<br />
بدورها بتنفيذها وإعادتها إلى البرنامج وتدعى عناصر <strong>دلفي</strong> المسئولة عن ذلك بعناصر الوصول<br />
.Access<br />
76
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة الرابعة عشر<br />
بناء تطبيقات قواعد المعطيات<br />
http://www.alshater.net<br />
:<br />
يأتي مع <strong>دلفي</strong> قواعد معطيات جاهزة تستخدم كأمثلة على قواعد المعطيات وطرق التعامل معها، لذلك سنتعامل مع<br />
هذه القواعد حتى يصبح الوقت جاهزا ً لإنشاء قواعدنا الخاصة<br />
مثال<br />
.<br />
: 1<br />
بناء نموذج فيه جدول وحيد<br />
:<br />
أسهل طريقة لكتابة برنامج قواعد المعطيات هي استخدام معالج النماذج<br />
( Form Wizard )<br />
. Database<br />
للبدء بالعمل أنشئ مشروعا ً جديدا ً ثم أغلق النموذج الأول<br />
) الافتراضي (<br />
عن طريق الأمر<br />
من القائمة<br />
File Close أو<br />
التحويل إلى محرر الشيفرة والضغط على المفتاحين Ctrl+F4 ستظهر لك نافذة تسألك إن كنت تريد حفظ الوحدة<br />
. أجب بلا<br />
بهذه الطريقة نكون قد حصلنا على مشروع بدون نموذج أولي لأننا سننشئ هذه النافذة من خلال معالج النماذج<br />
اختر الأمر<br />
ستظهر النافذة التالية<br />
Database Form Wizard<br />
من قوائم ال<strong>دلفي</strong><br />
:<br />
:<br />
اترك الخيارات<br />
الافتراضية وستتعرف على خيارتها لاحقا ً<br />
اضغط على الزر<br />
.<br />
Next<br />
ستظهر عندها النافذة المجاورة والتي تطالبك<br />
بتحديد الجدول الذي سيتعامل معه النموذج ،<br />
لتحديد الجدول أختر DBDEMOS من القسم<br />
Drive or Alias Name (سيشرح معنى ذلك<br />
لاحقا ً)<br />
ستظهر جميع الجداول في القاعدة<br />
اختر منها الجدول<br />
DBDEMOS<br />
Country.db<br />
77
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اضغط على<br />
. Next<br />
تظهر عندها النافذة المجاورة والتي تطالبك بتحديد<br />
الحقول التي تريد إظهارها في الجدول .<br />
لإظهار حقل ما أختر هذا الحقل واضغط على الزر<br />
><br />
ولإظهار جميع الحقول اختر الزر ><br />
. ( >><br />
أضف الآن جميع الحقول )<br />
واضغط على Next للمتابعة<br />
ستظهر نافذة تطالبك بطريقة عرض البيانات :<br />
أفقي أو عامودي أو في جدول<br />
( In grid<br />
حدد الخيار في جدول )<br />
واضغط على Next<br />
تظهر النافذة الأخيرة<br />
) خيارات هذه النافذة سيتم<br />
توضيحها لاحقا ً (<br />
فعل الخيار Generate a main form<br />
إذا كان النموذج هو النموذج الرئيسي في برنامجك<br />
اضغط على<br />
Finish لإظهار النموذج التالي<br />
.<br />
78
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
عند الانتهاء يظهر النموذج التالي :<br />
عنصر التحكم<br />
TDBnaviagtor<br />
عنصر الوصول<br />
TDataSouce<br />
عنصر الوصول<br />
TTable<br />
عنصر التحكم<br />
DBGrid<br />
لقد قام معالج النماذج بإنشاء نموذج وضع عليه عدد من عناصر التحكم بالمعطيات وعناصر أخرى للوصول إلى<br />
المعطيات .<br />
نفذ التطبيق الآن ولاحظ ما يلي :<br />
1 عناصر الوصول على المعطيات لا تظهر أثناء التنفيذ .<br />
2 يظهر عنصر الشبكة<br />
DBGrid بيانات الجدول المرتبط معه حيث أعمدة هذا الجدول هي أسماء الحقول<br />
وتكون ظاهرة في السطر الأول و سطور هذه الجدول هي السجلات ويوجد سهم صغير يدل على السجل<br />
الحالي،كما أن الحقل الحالي يكون مفعلا ً أسماء باللون الحقول الأزرق .<br />
مؤشر إلى السجل الحالي<br />
السجل الحالي<br />
79
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
يمكن أن نقوم نحن بوضع العناصر على نموذج فارغ للحصول على النموذج السابق بدون استخدام معالج الأشكال.<br />
سنشرح الآن كل عنصر من هذه العناصر على حدى :<br />
العنصر : Table<br />
يستخدم هذا العنصر للربط بين البرنامج وقاعدة المعطيات وهو عنصر من مجموعة عناصر تدعى DataSet وهي<br />
عبارة عن عناصر لها القدرة على التعامل مع محرك قاعدة المعطيات للوصول للجداول ومن هذه العناصر .<br />
Table, Query, AdoTable, AdoQuery,<br />
في مثالنا يحتوي النموذج على عنصر واحد من النوع Table وقد ربطه معالج النماذج مع قاعدة المعطيات اعتمادا ً<br />
على الخصائص التالية :<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
القيمة<br />
DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى مكان<br />
DBDEMOS<br />
DataBaseName<br />
تواجد<br />
مسار<br />
الجداول<br />
) نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />
(<br />
)<br />
بدلا ً منها<br />
اسم الجدول الذي سيرتبط مع العنصر<br />
) اسم العنصر<br />
يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في <strong>دلفي</strong><br />
country.db<br />
Table1<br />
TableName<br />
Name<br />
(<br />
أعط القيمة<br />
True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />
False<br />
Active<br />
العنصر : DataSource<br />
DataSet وعناصر<br />
يرتبط هذا العنصر مع العنصر<br />
Table ويستخدم هذا العنصر للربط بين عناصر الوصول<br />
التحكم بالمعطيات وله الخصائض التالية :<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
تجعل هذه الخاصة المعطيات في وضع التحرير<br />
أمكانية التعديل<br />
( أما<br />
)<br />
True<br />
AutoEdit<br />
إذا أردنا استعراض<br />
قراءة دون تغيير<br />
( المعطيات فقط فنعطي هذه<br />
)<br />
الخاصة القيمة False<br />
Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1<br />
Dataset<br />
للحصول على المعطيات<br />
اسم العنصر<br />
.<br />
)<br />
80<br />
يمكن إعطاء هذا العنصر اسم كأي عنصر آخر في <strong>دلفي</strong><br />
Datasource1<br />
Name
http://www.alshater.net<br />
(<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: ( DBGrid<br />
عنصر التحكم بالمعطيات )<br />
يستخدم هذا العنصر لعرض وتحرير المعطيات ويرتبط مع العنصر<br />
Datasource ليحصل منه على أسماء الحقول<br />
وقيم الجدول وأعطاه معالج النماذج الخصائص التالية :<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
تحدد هذه الخاصة العنصر الذي سيزود<br />
اسم العنصر<br />
DBGrid بالمعطيات<br />
Datasource1<br />
Dbgrid1<br />
Datasource<br />
Name<br />
عنصر التحكم : DBNavigator<br />
يحوي هذه العنصر العديد من الأزرار مهمتها تحريك مؤشر السجل والقيام بأعمال الإضافة والحذف والتراجع عن<br />
التعديل ويرتبط هذا العنصر مع ال<br />
Datasource عن طريق الخاصة<br />
، DataSource اعط القيمة Trueللخاصة<br />
ShowHint التابعة لهذا العنصر .<br />
يضيف معالج النماذج أيضا ً سطر برمجي واحد في حدث إنشاء النموذج هو<br />
Table1.Open لفتح الجدول وإظهار<br />
.<br />
سجلاته ويمكن الاستعاضة عن هذه التعليمة بإعطاء الخاصة Active للعنصر Table القيمة True<br />
: (<br />
Database Engine<br />
محرك قواعد المعطيات )<br />
محرك قاعدة المعطيات يحدد أسلوب تعامل البرنامج مع القاعدة وهي عبارة عن مجموعة مكتبات جاهزة تربط بين<br />
عناصر ال<strong>دلفي</strong> وقواعد المعطيات ومن أهم المحركات في <strong>دلفي</strong> :<br />
: Borland Database Engine<br />
1 : BDE<br />
يتعامل هذا المحرك مع عناصر الوصول الموجودة في الصفحة<br />
Bde ويتعامل مع قواعد معطيات من النوع<br />
Pardox أو Dbase وغيرها كثير .<br />
: Microsoft ActiveX Data Objects<br />
2 : ADO<br />
Access أو<br />
يتعامل هذا المحرك على العناصر الموجودة في<br />
الصفحة<br />
Ado ويستخدم مع قواعد معطيات مثل<br />
. Oracle أو SQL SERVER<br />
3 :Interbase<br />
يتعامل هذا المحرك على العناصر الموجودة في الصفحة<br />
Interbase Express ويستخدم مع قواعد معطيات<br />
Interbase التي يمكن تحميلها من القرص الذي توجد عليه <strong>دلفي</strong> .<br />
:<br />
مثال : 2<br />
بناء نموذج لإدخال المعطيات<br />
( Vertical<br />
أعد خطوات المثال السابق حتى تصل إلى النافذة التي تطالبك بطريقة عرض المعطيات )<br />
اختر منها<br />
Finish ثم Next<br />
( Left<br />
وستظهر بعدها نافذة تسألك عن طريقة عرض عناوين الحقول )<br />
اختر منها<br />
أضغط على<br />
ليظهر النموذج التالي<br />
:<br />
81
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لاحظ ظهور حقول المعطيات بدلا ً من الجدول وتظهر<br />
هذا الحقول في العناصر<br />
Dbedit والتي ترتبط مع<br />
قاعدة المعطيات عبر الخاصة Datasource<br />
نفذ البرنامج واستخدم<br />
DBNavegator للتنقل بين<br />
الحقول<br />
) السجل الحالي هو الحقل الذي تظهر قيمه<br />
داخل الحقول (<br />
القيمة DataSource1 Datasource<br />
Datacontrole<br />
أضف عنصر<br />
DBGrid من الصفحة<br />
وأعطه الخاصة<br />
DBEdit تبعا ً<br />
نفذ البرنامج وحاول التنقل بين السجلات في<br />
DBGrid بالفأرة ولاحظ كيف تتغير قيم الحقول في<br />
لتغير السجل الحالي .<br />
:( Master \ Detail Form )<br />
مثال<br />
3:بناء نموذج من النوع الرئيسي تفصيلي<br />
وجدنا سابقا ً في مثال المكتبة كيف يمكن لمجموعة من الجداول أن ترتبط مع بعضها البعض لتشكل قاعدة معطيات،<br />
كما وجدنا<br />
:كيف أن جدول المؤلفين هو جدول رئيسي بينما جدول الكتب هو جدول ثانوي وقلنا أن هذه هي علاقة<br />
رأس بأطراف أو واحد إلى مجموعة لنفترض الآن أن المستخدم بحاجة لمعرفة جميع الكتب التي كتبت من قبل<br />
مؤلف ما، تدعى النماذج التي تقدم هذه المعلومات بالنماذج ذات النوع الرئيسي تفصيلي.<br />
سنستخدم في مثالنا الآن معالج النماذج لإنشاء نماذج من هذا النوع وسنعتمد على الجدول الرئيسي Customer.db<br />
.<br />
والجدول التفصيلي<br />
Orders.Db وقبل البدء سأشرح كل من الجدولين<br />
جدول الزبائن<br />
يحوي معلومات عن الزبائن<br />
) رقم الزبون ، الأسم ، العنوان ، المدينة ،<br />
: Customer.db<br />
:<br />
الهاتف<br />
، المفتاح الرئيسي فيه هو رقم الزبون.<br />
( ......<br />
جدول الطلبات<br />
يحوي معلومات عن طلبات الزبائن<br />
) رقم الطلبية ، رقم الزبون ، تاريخ التسليم ،<br />
: Orders.db<br />
طريقة التسليم .... (<br />
من الواضح أن المفتاح الرئيسي لهذا الجدول هو رقم الطلبية ، كما أن هناك مفتاح ثانوي هو رقم الزبون ( .<br />
سننشئ الآن نموذجا ً يظهر فيه جدولي الزبائن والطلبيات ولكن السجلات الظاهرة في سجل الطلبيات هي السجلات<br />
التابعة للزبون الحالي في جدول الزبائن .<br />
ابدأ مشروعا ً جديدا ً، أغلق النموذج الافتراضي ، اختر الأمر Database Form Wizard<br />
82
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
من النافذة الأولى للمعالج حدد الخيار Create Master Detail Form من القسم<br />
Next<br />
النافذة الثانية تطالبك بإدخال الجدول الرئيسي حدد DBDEMOS في Driver or alias name<br />
http://www.alshater.net<br />
Form Option واضغط على<br />
واختر الجدول<br />
Customer.db ومن النافذة التي تليها حدد جميع حقول هذا الجدول ، وفي النافذة التالية حدد طريقة العرض<br />
بجدول<br />
. in a grid<br />
النافذة التالية تطالبك بتحديد الجدول التفصيلي أختر<br />
وطريقة العرض جدول<br />
تظهر بعدها النافذة المجاورة<br />
Orders من<br />
)<br />
اختر من القسم<br />
CustNo Availableالقيمة Indexes<br />
واختر من اللائحة<br />
Master Fields القيمة<br />
CustNo<br />
ومن اللائحة Detail Fields القيمة CustNo<br />
إضغط بعدها على<br />
Add ثم على<br />
Next ثم على<br />
Next مرة أخرى .سيظهر عندها النموذج رئيسي<br />
: تفصيلي<br />
نفذ البرنامج وتنقل بين حقول الجدول<br />
حظ التغيرات على الجدول<br />
Master ولا<br />
... Detail<br />
DBDEMOS واختر بعدها جميع الحقول<br />
لقد أضاف معالج النماذج هنا عنصري Table بالإضافة إلى عنصري Datasource وقام بالربط بينهما في<br />
الحقول التالية<br />
في العنصر<br />
الخاصة<br />
:<br />
Tabel2<br />
الشرح<br />
القيمة<br />
Datasource1 MasterSource<br />
CustNo IndexName<br />
يعرف عنصر DataSource المرتبط مع الجدول الرئيسي<br />
يحدد الحقل الذي سيقوم بترتيب وفهرسة السجلات في الجدول<br />
:<br />
: 1 مثال<br />
بعد أن تعلمنا كيفية تنفيذ تطبيقات قواعد باستخدام معالج النماذج سنعيد الأمثلة السابقة باستخدام العناصر مباشرة<br />
سنقوم بكتابة برنامج يعرض الجدول Country.db الموجود ضمن القاعدة<br />
ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية<br />
1 العنصر Table من الصفحة<br />
DBDemos<br />
:<br />
BDE<br />
_ 2<br />
العنصر DataSource من الصفحة<br />
. Data Access<br />
83
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
. Data Control<br />
3 العنصر DBGrid و<br />
DBNavigator من الصفحة<br />
:<br />
أعط العنصر<br />
Table الخصائص التالية<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
القيمة<br />
DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />
DBDEMOS<br />
DataBaseName<br />
مكان تواجد<br />
)<br />
مسار (<br />
الجداول<br />
نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />
)<br />
بدلا ً منها<br />
اسم الجدول الذي سيرتبط مع العنصر<br />
أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />
country.db<br />
True<br />
TableName<br />
Active<br />
:<br />
أعط العنصر<br />
DataSource الخصائص التالية<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
تجعل هذه الخاصة المعطيات في وضع التحرير<br />
أمكانية التعديل<br />
( أما<br />
)<br />
True<br />
AutoEdit<br />
إذا أردنا استعراض<br />
قراءة دون تغيير<br />
( المعطيات فقط فنعطي هذه<br />
)<br />
الخاصة القيمة False<br />
Datasource تحدد هذه الخاصة اسم العنصر الذي سيرتبط معه ال Table1<br />
Dataset<br />
للحصول على المعطيات .<br />
:<br />
أعط العنصر DBGrid والعنصر<br />
DBNavigator الخاصة التالية<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
تحدد هذه الخاصة العنصر الذي سيزود<br />
DBGrid بالمعطيات<br />
Datasource1<br />
Datasource<br />
نفذ البرنامج .<br />
مثال : 2<br />
إنشاء Master Detail Form بدون استخدام المعالج :<br />
ابدأ مشروعا ً جديدا ً وأضف إليه عنصري Table وعنصري DataSource وعنصري DBGrid وعنصر<br />
. DBNavigator<br />
: ( Master<br />
1 ربط الجدول الرئيسي )<br />
:<br />
أعط العنصر<br />
Table1 الخصائص التالية<br />
الخاصة<br />
القيمة<br />
ملاحظات<br />
القيمة<br />
DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />
DBDEMOS<br />
DataBaseName<br />
مكان تواجد<br />
مسار<br />
الجداول<br />
) نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />
(<br />
)<br />
بدلا ً منها<br />
84
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
Customers.db<br />
True<br />
TableName<br />
Active<br />
أعط العنصر<br />
أعط العنصرين<br />
. القيمة Table1 DataSet الخاصة DataSource1<br />
اسم الجدول الذي سيرتبط مع العنصر<br />
أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />
. القيمة DataSource1 DataSource الخاصة و DBNavigator1 DBGrid1<br />
2 ربط الجدول التفصيلي<br />
: Detail<br />
أعط العنصر Table2 الخصائص التالية<br />
)<br />
:<br />
ملاحظات<br />
الخاصة القيمة<br />
القيمة DBDEMOS هي عبارة عن اسم معرف مسبقا ً يشير إلى<br />
مكان تواجد<br />
) الجداول ( مسار<br />
DBDEMOS DataBaseName<br />
order.db TableName<br />
True Active<br />
أعط العنصر<br />
أعط العنصرين<br />
. القيمة Table2 DataSet الخاصة DataSource2<br />
نستطيع أن نكتب مسار فهرس قاعدة المعطيات<br />
بدلا ً منها<br />
اسم الجدول الذي سيرتبط مع العنصر<br />
أعط القيمة True لهذه الخاصة لتستطيع مشاهدة الجدول أثناء التصميم<br />
. القيمة DataSource2 DataSource الخاصة DBGrid2<br />
بهذا نكون قد ربطنا العناصر مع الجدول ولآن علينا أن نعلم الجدول Table2 أنه جدول تفصيلي للجدول<br />
. Table1<br />
أعط العنصر<br />
Table2 الخاصة MasterSource القيمة<br />
Datasouce1 و الخاصة<br />
MasterField القيمة<br />
CustNo<br />
85
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
الخامسة عشر<br />
بناء قواعد البيانات :<br />
يوجد العديد من برامج بناء قواعد البيانات ويعتمد الأمر على نوع القاعدة التي تريد استخدامها فلبناء قاعدة محلية<br />
Oracle<br />
(<br />
Paradox<br />
تستخدم جداول باردوكس )<br />
هناك البرنامج<br />
Borland Paradox ولبناء جداول تستخدم<br />
هناك البرنامج<br />
Oracle 9i وهكذا وقد زودتنا <strong>دلفي</strong> بأداة سهلة لإنشاء قواعد البيانات وتعديل الجداول بدون العودة<br />
إلى تلك البرامج، حيث يوجد ضمن مجموعة أدوات <strong>دلفي</strong> البرنامج<br />
Database Desktop الذي يمكن عن طريقة<br />
تصميم العديد من أنواع جداول البيانات .<br />
: DataBase Desktop<br />
أفضل طريقة لتعلم هذا البرنامج هي نبدأ بمثال :<br />
المطلوب إنشاء جداول تتعلق بحركة الركاب في المطار باستخدام جداول الباردوكس وهذه الجداول هي<br />
جدول المسافرون<br />
اسم الحقل نوع الحقل الشرح<br />
:<br />
GoFrom<br />
( Passengers )<br />
Pno<br />
Pname<br />
Nationality<br />
PassNo<br />
عدد<br />
نص<br />
نص<br />
عدد<br />
*<br />
رقم المسافر<br />
اسم المسافر<br />
الجنسية<br />
رقم جواز<br />
السفر<br />
ArriveTo<br />
GoTime<br />
ArriveTime<br />
CardCount<br />
بلد المغادرة<br />
نص بلد الوصول<br />
نص وقت المغادرة<br />
تاريخ ووقت وقت الوصول<br />
تاريخ ووقت عدد البطاقات<br />
عدد المتوفرة<br />
اسم الحقل<br />
Pno<br />
TripNo<br />
SeatNo<br />
ClassNo<br />
جدول المسافرون والرحلات<br />
TripsAndPassengers<br />
نوع الحقل<br />
عدد<br />
عدد<br />
عدد<br />
عدد<br />
الشرح<br />
رقم المسافر<br />
رقم الرحلة<br />
رقم المقعد<br />
رقم الصف<br />
( Trips<br />
جدول الرحلات )<br />
اسم الحقل<br />
نوع الحقل<br />
عدد<br />
نص<br />
الشرح<br />
رقم الرحلة<br />
اسم الشركة<br />
*<br />
TripNo<br />
Company<br />
86
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
.<br />
تدل النجمة<br />
( * )<br />
وتبين الأسهم طريقة ربط الجداول<br />
رقم المقعد يجب أن يأخذ قيمة بين<br />
على أن هذا الحقل مفتاح رئيسي<br />
.<br />
.<br />
1 و . 200<br />
1 في البداية أنشأ الفهرس AirLines على القرص C حيث سيتم وضع قاعدة البيانات في هذا الفهرس<br />
2 تشغيل البرنامج : Database Desktop<br />
يمكنك تشغيل البرنامج خارج إطار <strong>دلفي</strong> عن طريق القائمة<br />
Start Programs Borland <strong>Delphi</strong> Database Desktop<br />
أو من داخل <strong>دلفي</strong> عن طريق القائمة Tools Database Desktop<br />
2 تحديد فهرس العمل<br />
:<br />
إن فهرس العمل في قواعد البيانات يعني المكان الذي سيبحث فيه<br />
البرنامج عن الملفات وسيكون هو الفهرس الافتراضي وسيظهر<br />
ضمن صندوقي فتح وحفظ الملفات ، ولتحديد الفهرس الافتراضي<br />
اختر الأمر<br />
File Working Directory<br />
فتظهر عندها النافذة ، اضغط على الزر Browse واختر<br />
AirLines<br />
اضغط بعدها على ok للخروج .<br />
C:\<br />
3 تعريف اسم بديل<br />
87<br />
: Alias<br />
قلنا أن الاسم البديل عبارة عن أسم يستخدمه النظام<br />
للوصول إلى فهرس قاعدة البيانات ولتعريف اسم بديل<br />
للفهرس C:\AirLines نختار الأمر<br />
من القائمة Tools في البرنامج<br />
Alias Manger<br />
Database Desktop<br />
:<br />
اضغط على الزر New واكتب في اللائحة<br />
Database<br />
Alias<br />
السلسلة ) Travel (<br />
وفي اللائحة<br />
) STANDARD القيمة Driver Type
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تحدد هذه اللائحة نوع قاعدة البيانات المستخدمة وتعطى القيمة<br />
Standard إذا كانت قاعدة البيانات من النوع<br />
بارادوكس ).<br />
( Browse<br />
) Path<br />
حدد بعدها مسار<br />
القاعدة<br />
C:\AirLiens في القسم<br />
يمكن أن تكتبه كتابة أو تختار الزر<br />
اضغط بعدها على الزر Keep New لإضافة القاعدة الجديدة إضغط بعدها على الزر<br />
Ok ستظهر رسالة تسألك إن<br />
.<br />
كنت تريد حفظ التغيرات في IDAPI32.CFG عليك أن تجيب على<br />
Yes لحفظ القاعدة الجديدة<br />
ملاحظات :<br />
1 يستخدم الاسم البديل في لغات <strong>البرمجة</strong> لإعطاء المستخدم الحرية في اختيار مكان تخزين قاعدة البيانات، لاحظ<br />
إن معظم البرامج تعطي المستخدم حرية في اختيار مكان وضع البرنامج أثناء التنصيب، تصور مثلا ً أنك لم<br />
تستخدم الاسم البديل وأعطيت الخاصة<br />
DatabaseName للعنصر Table القيمة C:\AirLiens عندها عليك<br />
أن تضع قاعدة البيانات في هذا الفهرس على جميع الأجهزة التي ستستخدم برنامجك .<br />
2 إحدى فوائد الاسم البديل الأخرى هي العودة إلى جداول سابقة وخاصة في برامج المحاسبة، تصور إن<br />
المستخدم يريد العودة إلى مدخلات سنة<br />
حيث كان قد حفظها على الفهرس<br />
1998\:D عندها عليك تغير<br />
1998<br />
مسار الاسم البديل فقط دون التغير في البرنامج .<br />
3 يمكن إنشاء وحذف الاسم البديل برمجيا ً .<br />
في النافذة السابقة<br />
Alias Manger في حال إزالة الخيار<br />
Public Alias سيتم تعريف Alias جديد في<br />
4<br />
.<br />
البرنامج<br />
Database Desktop فقط ولا يمكن الوصول إلى هذا ال<br />
Alias من ال<strong>دلفي</strong> مثلا ً<br />
.<br />
:<br />
5 يستخدم الزر<br />
البدء بجدول جديد<br />
Remove لحذف اسم بديل<br />
للبدء بجدول جديد اختر الأمر File New Table<br />
تظهر النافذة المجاورة لتحديد نوع الجدول حيث يمكن إنشاء العديد من<br />
أنواع قواعد البيانات باستخدام البرنامج ) Database Desktop<br />
اضغط على زر اللائحة لمشاهدة هذه الأنواع<br />
، اختر من اللائحة<br />
Paradox7 واضغط على موافق.<br />
(<br />
معظم العمل في البرنامج Database<br />
Desktop يتم في هذه النافذة لذلك<br />
ستشرح بشيء من التفصيل<br />
جدول الحقول : Field roster<br />
يتم في هذا الجدول<br />
تعريف حقول الجدول<br />
وتتألف من<br />
1 اسم الحقل<br />
: Field Name<br />
88
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
يوضع في هذا القسم اسم الحقل، وأسماء الحقول في جداول الباردوكس يجب أن لا تتجاوز 25 حرف، كما يمكن<br />
أن تحتوي على فراغات ويمكن أن يكون اسم الحقل بال<strong>لغة</strong> العربية ولكن ينصح باستخدام أسماء حقول إنكليزية دائما ً<br />
وعدم احتوائها على فراغات وخاصة عند استخدام<br />
، SQL كما يجب الابتعاد عن بعض الأسماء المحجوزة في <strong>لغة</strong><br />
... Date أو From أو SELECT مثل SQL<br />
2 نوع الحقل : Type<br />
يصف هذا الحقل نوع المعطيات الذي سيخزن في هذا الحقل وهناك عدد من الأنواع التي يمكن أن ينتمي إليها<br />
Space<br />
الحقل ولمعرفة هذه الأنواع إضغط بزر الفأرة اليميني في العمود<br />
Type أو اضغط على مفتاح المسافة<br />
:<br />
Paradox<br />
عندما يكون العمود<br />
Type فعالا ً ، والجدول التالي يبين الأنواع التي توفرها جداول<br />
النوع<br />
الحجم<br />
الرمز<br />
ملاحظات<br />
A نص عادي يمكن أن يحتوي رموزا ً أو أرقام ويحدد حجم الحقل طول<br />
255<br />
–<br />
1<br />
Alpha<br />
السلسلة التي سيأخذه الحقل<br />
N عدد حقيقي<br />
Number<br />
$ نفس النوع السابق ولكن بصيغة مالية<br />
Money<br />
Integer عدد صحيح طويل بطول بايتين من النوع S<br />
Short<br />
Longint عدد صحيح طويل من النوع I<br />
Long Integer<br />
عدد صحيح عشري مضغوط )<br />
التمثيل الثنائي لإعداد الفاصلة<br />
#<br />
0 .. 32<br />
BCD<br />
(1)<br />
العشرية (<br />
D تاريخ<br />
Date<br />
T وقت<br />
Time<br />
@ يدمج التاريخ والوقت في حقل واحد<br />
TimeStamp<br />
( 2 )<br />
M نص بحجم كبير.<br />
1..240<br />
Memo<br />
نص بحجم كبير مع تخزين طريقة تنسيق هذا النص )<br />
نوع الخط<br />
لون النص و<br />
( 2 )<br />
(..<br />
F<br />
0.. 240<br />
Formatted<br />
Memo<br />
( 3 )<br />
G صورة<br />
0..240<br />
Graphic<br />
( 3 )<br />
Excel مثلا ً (<br />
يمثل حاوية لربط وإدراج الكائنات )<br />
إدراج ملف<br />
O<br />
0..240<br />
OLE<br />
False أو True يمثل قيمة منطقية L<br />
Logical<br />
+ عدد صحيح طويل يزداد تلقائي ًا<br />
Auto increment<br />
( 3 )<br />
.Mb يخزن المعلومات ثنائيا ً داخل ملفات B<br />
0..240<br />
Binary<br />
Db معطيات بالصيغة الثنائية تخزن ضمن ملف قاعدة البيانات Y<br />
1..255<br />
Byte<br />
: ( 1<br />
) الرقم في العمود حجم تحدد عدد الأرقام بعد الفاصلة<br />
89
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
يستخدم النوع<br />
Memo في حال النصوص التي يبلغ حجمها أكثر من<br />
255 حرف وتخزن عادة خارج ملف<br />
: ( 2 )<br />
الجدول في ملفات ذات امتداد<br />
MB ويدل الرقم المدخل في عمود الحجم على عدد الأحرف الذي سيخزن داخل<br />
ملف الجدول<br />
بفرض أعطينا القيمة<br />
30 في عمود الحجم عندها في حال أدخل المستخدم<br />
30 حرف أو أقل<br />
) .Db<br />
ستخزن البيانات داخل ملف القاعدة أما إذا إدخل المستخدم أكثر من<br />
30 حرف ستخزن عندها البيانات داخل ملف<br />
من النوع .Mb<br />
( 3 يمكن عدم تحديد حجم هذا النوع .<br />
)<br />
حجم الحقل<br />
Size كما هو ملاحظ في الجدول السابق هناك بعض أنواع الحقول بحاجة لتحديد حجمها لنأخذ<br />
3<br />
، 20 نستطيع<br />
مثالا ً على ذلك الحقل من نوع<br />
Alpha بفرض أنه عرفنا حقل اسم المسافر من النوع A وبحجم<br />
عندها إدخال أسماء المسافرين ذات طول عشرين حرف أو أقل أما إذا كان اسم أحد المسافرين أطول من عشرين<br />
حرف فسيتم تخزين العشرين حرف الأولى وتجاهل الباقي ، مشكلة أخرى يمكن أن تظهر ، بفرض أن اسم أحد<br />
المسافرين مكون من عشرة أحرف<br />
محمد آغا<br />
" مثلا ً فإن اسم هذا المستخدم سيخزن في القاعدة بحجم عشرين<br />
"<br />
بايت ، أي أنه جميع حقول العمود في جدول الباردوكس تأخذ نفس الحجم مهما كان طول المعلومات المدخلة .<br />
المفتاح الرئيسي<br />
الأساسي<br />
: Key اضغط بزر الفأرة الأيسر في هذا الحقل إذا أردت أن يكون هذا الحقل<br />
(<br />
)<br />
4<br />
:<br />
مفتاح رئيسي وإذا أردت مزيد من المعلومات عن<br />
حول المفاتيح الأساسية<br />
المفاتيح الرئيسية اقرأ الفقرة التالية<br />
تأتي فاعلية نظام قاعدة البيانات العلائقية من القدرة على العثور على المعلومات المخزنة في جداول منفصلة بسرعة<br />
وتجميعها معا ً باستخدام استعلامات ونماذج وتقارير.<br />
لكي يتم ذلك، يجب أن يحتوي كل جدول على<br />
حقل أو<br />
مجموعة حقول تقوم بتعريف كل سجل مخزن في الجدول بشكل فريد، وتسمى هذه المعلومة المفتاح الأساسي<br />
للجدول(<br />
رقم المسافر يعرف المسافر بشكل فريد ، كذلك رقم الرحلة يعرف رحلة وحيدة أي بمجرد معرفة رقم<br />
الرحلة نستطيع معرفة المعلومات المتعلقة باسم شركة الطيران وبلد المغادرة وبلد الوصول وساعة المغادرة وساعة<br />
الوصول .. (<br />
متى قمت بتعيين مفتاحا ً أساسيا ً للجدول، يمنع إدخال أي قيم مكررة أو قيم<br />
"خالية"<br />
Null في حقول المفتاح الأساسي.<br />
هناك ثلاثة أنواع من المفاتيح الأساسية التي يمكن تعريفها :<br />
المفاتيح الأساسية من نوع الترقيم التلقائي<br />
يمكن إعداد حقل الترقيم التلقائي لإدخال رقم تسلسلي تلقائيا ً عند إضافة كل سجل إلى الجدول.<br />
تعد أبسط طريقة<br />
لإنشاء مفتاح أساسي هي تعيين مثل هذا الحقل كمفتاح أساسي ولتعريف حقل ترقيم تلقائي اختر Auto<br />
. Increment<br />
المفاتيح الأساسية من نوع الحقل المفرد :<br />
إذا<br />
كان لديك حقلا ً يتضمن قيم فريدة مثل رقم الهوية الشخصية، يمكنك تعيين هذا الحقل على أنه المفتاح الأساسي.<br />
ويمكنك تحديد مفتاح أساسي لحقل يحتوي بالفعل على بيانات طالما لا يحتوي هذا الحقل على قيم مكررة أو قيم<br />
"خالية" .Null<br />
90<br />
المفاتيح الأساسية من نوع الحقل المتعدد<br />
:
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
في الحالات التي لا يمكنك فيها ضمان وجود حقل فردي، قد يكون بإمكانك تعيين حقلين أو أكثر باعتبارهما مفتاحا ً<br />
أساسيا ً.<br />
والحالة الأكثر شيوعا ً التي يحدث فيها ذلك هي الجدول المستخدم لربط جدولين آخرين في علاقة أطراف<br />
بأطراف<br />
على سبيل المثال، يمكن<br />
أن يربط جدول<br />
"مؤلفي الكتب"<br />
بين جدولي<br />
"الكتب"<br />
.( Many to Many<br />
)<br />
و"المؤلفين".<br />
ويتكون مفتاحه الأساسي من حقلي: "رقم الكتاب"<br />
و"رقم المؤلف".<br />
إذا كان لديك أي شك حول إمكانية تحديد تركيب مناسب من الحقول لمفتاح أساسي متعدد الحقول، فربما يجب عليك<br />
إضافة حقل<br />
"ترقيم تلقائي"<br />
وتعيينه كمفتاح أساسي بدلا ً من ذلك.<br />
على سبيل المثال، فإن ضم حقلي<br />
"الاسم الأول"<br />
و"الاسم الأخير"<br />
لتكوين مفتاح أساسي لا يعتبر اختيارا ً صائبا ً، بسبب إمكانية مصادفة تكرار في ضم هذين الحقلين<br />
في المستقبل.<br />
إنشاء جدول المسافرين :<br />
مازلنا في النافذة السابقة، لإضافة الحقل رقم المسافر أكتب في العمود<br />
والعمود<br />
+ Type أي أن الحقل من النوع ترقيم<br />
" PNo<br />
" Filed Name<br />
Key<br />
(<br />
تلقائي )<br />
لا حاجة لتحديد حجم هذا النوع<br />
وضع إشارة في الحقل<br />
لأن هذا الحقل سيكون مفتاح أساسي .<br />
لإضافة الحقل اسم المسافر أكتب في السطر الثاني من العمود Field<br />
، 30 أي أن<br />
لأن الحقل من نوع نص ، في العمود<br />
Size اكتب القيمة<br />
"A"<br />
Type والعمود Pname القيمة Name<br />
.<br />
طول الحقل<br />
30 حرف ، واترك العمود<br />
Key فارغا ً واكمل كما في الشكل المجاور<br />
Alias القيمة<br />
لحفظ الجدول اضغط على الزر<br />
Save As سيظهر لك صندوق الحوار حفظ باسم اختر من اللائحة<br />
.<br />
Travel أدخل اسم الملف<br />
Passengers واضغط على حفظ<br />
إنشاء جدول الرحلات :<br />
اختر الأمر<br />
File new table واختر Paradox7 من القائمة<br />
فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :<br />
احفظ الجدول ضمن Travel باسم . Trips<br />
إنشاء جدول المسافرون والرحلات :<br />
اختر الأمر<br />
File new table واختر Paradox7 من القائمة<br />
فتظهر النافذة السابقة أدخل القيم فيها كما في الجدول المجاور :<br />
احفظ الجدول ضمن Travel باسم PassAndTrips<br />
:<br />
ملاحظة :<br />
تخزن قواعد البيانات<br />
Paradox في نوعين من الملفات<br />
.<br />
1 ملفات من الامتداد<br />
Db حيث يتم تخزين معظم بيانات الجدول<br />
....<br />
91<br />
2 ملفات من الامتداد<br />
فتح جدول<br />
Mb حيث يتم تخزين الأجزاء الكبيرة مثل المفكرات و الصور<br />
:
http://www.alshater.net<br />
FileOpen Table<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لفتح جدول المسافرين أختر الأمر<br />
تظهر عندها النافذة فتح ملف اختر منها الملف<br />
Passengers.db<br />
تعديل جدول :<br />
بفرض أنك بحاجة لإضافة حقل جديد إلى جدول أو حذف أحد الحقول أو تغير نوعه يمكن ذلك عن طريق فتح<br />
الجدول ومن ثم اختيار الأمر<br />
Table Restructure تظهر عندها نافذة بناء الجداول يمكنك العمل فيها كما تعلمنا سابقا ً.<br />
.<br />
سنتعرف الآن على عناصر القائمة Table properties<br />
في نافذة إنشاء جدول أو نافذة تعديل جدول<br />
1 ضبط المدخلات : Validity Checks<br />
يحدد هذا الخيار طريقة عرض وقبول البيانات في كل حقل وله الفروع التالية :<br />
<br />
: Required Field عند تفعيل هذا الصندوق ينبغي إدخال قيمة في هذا الحقل ولا يمكن أن يترك فارغا ً<br />
1<br />
.<br />
2 : Minimum يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا .<br />
3 : Maximum يجب أن تكون البيانات التي سندخلها في الحقل أكبر أو تساوي القيمة المحددة هنا .<br />
4 : Default Value القيمة المحدد في هنا ستكون القيمة الافتراضية ويمكن تعديلها فيما بعد<br />
تشبه هذه الخاصة في عملها العنصر<br />
MaskEdit حيث يمكن تحديد طريقة إدخال البيانات في<br />
5 : Picture<br />
.<br />
حقل ما، اضغط على الزر Assist<br />
لاختيار قوالب جاهزة<br />
مثال :<br />
في جدول الرحلات Trips<br />
اجعل الحقل اسم الشركة مطلوبا ً و الحقل عدد البطاقات المتوفرة يجب أن يأخذ قيمة<br />
بين 0 و 350<br />
نفتح الجدول Trips من القائمة FileOpen table ثم نختار<br />
الجدول<br />
Table Restructure فتظهر النافذة تعديل<br />
Required<br />
Table Properties ثم نختار الحقل<br />
Company ونفعل الخيار<br />
Validity Checks من اللائحة<br />
.Field<br />
0 وفي Maximum القيمة . 350<br />
ثم نختار الحقل<br />
CardNo ونضع في Minimum القيمة<br />
.<br />
نضغط على الزر<br />
Save لحفظ التغيرات<br />
2 تحديد جدول البحث : Table Lookup<br />
يمكن تحديد قيمة لحقل ما في جدول عبر لائحة من<br />
القيم من جدول آخر ، يدعى الجدول الآخر بجدول<br />
البحث .<br />
مثال<br />
: نعلم أن قيمة الحقل رقم المسافر في جدول<br />
المسافرون والرحلات يجب أن تكون مساوية<br />
لإحدى قيم العمود رقم المسافر في جدول<br />
92
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
المسافرون كما أن القيمة رقم الرحلة في جدول المسافرون والرحلات يجب أن تكون مساوية لإحدى قيم العمود<br />
رقم الرحلة في جدول الرحلات لتحقيق ذلك :<br />
Table Restructure<br />
افتح الجدول PassAndTrips<br />
وادخل إلى النافذة تعديل الجدول<br />
Define<br />
اختر الحقل PNo واختر Table LookUp من اللائحة<br />
Table Properties واضغط على الزر<br />
تظهر النافذة المجاورة :<br />
. Ok<br />
من اللائحة Lookup Table اختر الجدول<br />
Passengers.db واضغط على<br />
. Trips<br />
أعد نفس الخطوات للبحث عن قيمة<br />
TripNo في الجدول<br />
لن نشرح هذه الميزة بمزيد من التفصيل لأن تطبيقها برمجيا ً أسهل ..<br />
ولكن سنتعلم فائدتها عند إدخال قيم إلى<br />
الجدول .<br />
3 الفهرسة الثانوية :Secondary index<br />
تستخدم الفهرسة الثانوية لترتيب الجدول بترتيب مختلف عن الترتيبب المفتاحي للجدول )<br />
أي يختلف عن ترتيب<br />
المفتاح الرئيسي ( .<br />
:(<br />
ماذا تعني الفهارس الثانوية )<br />
للإطلاع<br />
افترض أن ّك تريد أن تبحث عن قيمة معينة في أحد الأعمدة، كأن تريد البحث مثلا عن<br />
(أحمد سعيد)<br />
في حقل اسم<br />
المسافر ..<br />
أول ما سيجول بذهنك هو أن الكمبيوتر سيفحص أسماء المسافرين واحدا وراء الآخر من البداية<br />
للنهاية..<br />
للأسف:<br />
ربما تبدو هذه الطريقة سهلة، ولكن ّها أسوأ طريقة يمكن أن يتم البحث بها، لأن ّها قد تتسبب في بطءٍ<br />
شنيع في أداء البرنامج، خاصة وأن العمود قد يحتوي على عدد كبير من الصفوف، قد يزيد عن عشرة آلافٍ أو<br />
أكثر.<br />
لهذا فإن هناك العديد من الطرق لتسريع البحث، تبدأ بترتيب العمود أبجديا، وذلك لأن البحث في عمود مرت ّب<br />
أسرع بكثير من البحث في عمود عشوائي، خاصة مع استخدام طريقة بحث جيدة،ولكن، رغم سرعة هذه البحث<br />
بعد الترتيب، إلا إن الترتيب نفسه قد يكون مأساة!..<br />
هل تتخيل كم من الوقت يمكن أن يضيعه برنامجك لترتيب<br />
خمسين ألف نص مثلا؟..<br />
فما بالك إذن حينما يقوم البرنامج بتكرار البحث في نفس العمود أكثر من مرة؟!<br />
إذن ما الحل؟<br />
بسيط جدا:<br />
نرت ّب العمود في قاعدة البيانات منذ البداية!<br />
جميل، ولكن ماذا لو كان الجدول يحتوي على أكثر من عمود تحتاج للبحث فيها، فتبعا لأي منها سوف نرت ّب<br />
الجدول؟!!<br />
هنا يبرز الحلّ العمل ي:<br />
الفهارس<br />
..Indexes تخيل معي أن ّنا طلبنا من قاعدة البيانات إنشاء فهرس لعمود اسم<br />
المسافر<br />
.. هنا ستقوم قاعدة البيانات بترتيب هذا العمود، مع إنشاء ما يشبه عمودا جديدا تضع فيه الترتيب الرقمي<br />
،2<br />
لكلّ مسافر..<br />
فمثلا، سيأخذ<br />
(أحمد سعيد)<br />
1 في هذا رقم<br />
العمود الخفي، بينما سيأخذ<br />
(توفيق الحكيم)<br />
رقم<br />
وهكذا... .<br />
بهذه الطريقة سنحق ّق ما يلي:<br />
93
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لن نحتاج لتغيير ترتيب عرض البيانات في قاعدة البيانات، وبالتالي سنترك للمستخدم حرية ترتيب البيانات كما<br />
يحلو له.<br />
يمكننا إنشاء أكثر من فهرس لأكثر من عمودٍ في نفس الجدول،<br />
مما يعني قدرتنا على ترتيب كلّ هذه الأعمدة.<br />
سنوف ّر وقت ترتيب العمود، أثناء <strong>البرمجة</strong>، وإن كان هذا الوقت سيستهلك عند إنشاء الفهرس لأول مرة.<br />
ستكون عملية البحث أسرع، حيث سيتم البحث في السجلات حسب ترتيب فهارسها.<br />
وفي الإمكان كذلك إنشاء فهرس لأكثر من عمود معا، حيث سيتم الترتيب تبعا للعمود الأول، فإن تماثلت قيم بعض<br />
الصفوف، يتم ترتيب هذه الصفوف على أساس العمود الثاني.<br />
ولكن..<br />
طبعا لا توجد طريقة مثالية..<br />
هناك عيبان أساسيان لهذه الطريقة:<br />
الفهارس المنشئة يتم حفظها في قاعدة البيانات، مما يعمل على زيادة حجمها..<br />
لهذا إذا كان حجم قاعدة بياناتك<br />
كبيرا، فلا بد أن توازن بين حاجتك لتوفير الوقت وحاجتك لتوفير الحجم!<br />
وكقاعدة:<br />
لا تنشئ فهارس إلا للحقول التي تتوق ّع أن برنامجك سيحتاج للبحث فيها بغزارة.<br />
عند تعديل قيمة أي خانة في العمود أو حذف أو إضافة أي صف ّ، لا بد من إعادة<br />
تحديث الفهارس لمراعاة<br />
الاختلاف الذي أحدثته القيمة الجديدة..<br />
مثل هذا الأمر يسبب عيبا خطيرا، هو بطء عمليات التحديث والحذف<br />
والإضافة بطريقة ملحوظة، تزداد سوءا مع ازدياد طول الجدول..<br />
هنا يجب أن توازن في برنامجك، بين حاجتك<br />
لسرعة البحث وحاجتك لسرعة التحديث والحذف والإضافة..<br />
فإذا كان من المتوق ّع أن يقوم برنامجك بمئات من هذه<br />
العمليات بطريقة متتالية، فمن الأفضل حذف الفهرس إلى أن تنتهي هذه العمليات، ثم إعادة إنشائه مرة أخرى قبل<br />
الشروع في عمليات البحث، رغم ما تضيعه عملية إعادة إنشاء الفهرس من وقت!<br />
لإنشاء فهرس :<br />
ثانوي<br />
بفرض أننا نريد إنشاء فهرس ثانوي للحقل اسم المسافر في جدول المسافرين .<br />
قم بفتح الجدول ثم اختر Table Restructure من اللائحة<br />
Table Properties اختر القيمة Secondary Index واضغط<br />
:<br />
على الزر<br />
Define عندئذ ستظهر النافذة المجاورة<br />
واضغط على Fields<br />
اختر الحقل<br />
PName من اللائحة<br />
سيظهر عندها اسم الحقل في القائمة Indexed Fields نلاحظ<br />
وجود الخيارات التالية في القسم : Index Option<br />
<br />
: Unique فعل هذا الخيار إذا كانت قيمة هذا الحقل فريدة<br />
1<br />
أي لا يمكن أن تتكرر<br />
) في مثالنا قد يكون هناك مسافرين لهما<br />
نفس الاسم لذلك لا يمكن تفعيل هذا الخيار ( .<br />
<br />
: فعل هذا الخيار إذا أردت من قاعدة البيانات تحديث جدول الفهرس كلما تم تعديل البيانات<br />
Maintained<br />
2<br />
في الجدول وفي حال عدم تفعيله يتم تحديث جدول الفهرس فقط عند استخدام الفهرس .<br />
3 : Case Sensitive فعل هذا الخيار إذا أردت من الفهرس التميز بين الحروف الكبيرة و الصغيرة .<br />
فعل هذا الخيار إذا أردت ترتيب الحقول تنازلي ًا<br />
.<br />
94<br />
4 : Descending
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
. PNameIndex<br />
اضغط على الزر<br />
Ok ستطالب بإعطاء اسم للفهرس أعطه الاسم<br />
ملاحظة :<br />
. (<br />
1 يمكن تطبيق الفهارس الثانوية على أكثر من حقل )<br />
لكل حقل فهرس ثانوي<br />
2 يمكن تطبيق فهرس ثانوي واحد على مجموعة من الحقول يمكن مثلا ً إنشاء فهرس ثانوي لحقلي اسم المسافر<br />
والجنسية تستخدم هذه الطريقة في حال كنا نبحث في جدول ما على الحقلين معا ً .<br />
3 ستتضح هذه الأمور لاحقا ً عند دراسة البحث في قواعد البيانات .<br />
تعريف علامة مرجعية متكاملة : Referential Integrity<br />
وجدنا سابقا ً كيف يتم الربط بين جداول قاعدة البيانات بشكل نظري )<br />
الربط بين جدولي المؤلفين والكتب والربط<br />
بين جدولي المسافرين وجدول المسافرين والرحلات (<br />
أي بعبارة أخرى سنقوم الآن بتعريف مفتاح ثانوي في جدول<br />
ما يأخذ قيمة من جدول .<br />
آخر<br />
إذا أنشأنا علامة مرجعية متكاملة بين الجدولين<br />
"المسافرين"<br />
و"المسافرين والرحلات"<br />
فهذا يعني أن الحقل رقم<br />
.<br />
"<br />
المسافر في جدول<br />
"المسافرين والرحلات<br />
سيأخذ قيمه من الحقل رقم المسافر في جدول المسافرين<br />
.<br />
يدعى الجدول الذي سنحصل منه على القيم بالجدول الأب والجدول<br />
الذي سيخزن القيم بالجدول الابن<br />
لإنشاء علامة تكامل مرجعية :<br />
Referential واختر القيمة Table Restructure<br />
افتح الجدول الإبن<br />
PassAndTrips واختر الأمر<br />
: Define<br />
Integrity من اللائحة<br />
Table Properties واضغط على الزر<br />
تظهر عندها النافذة التالية :<br />
Table<br />
نختار الحقل<br />
PNo من لائحة الحقول ونضغط على الزر ثم نختار جدول المسافرين من اللائحة<br />
ونضغط على الزر <br />
يجب بعد ذلك تحديد نوع التعديل في الصندوق Update Rule<br />
1 الخيار : Cascade<br />
هذا الخيار يعني أنه أي تعديل في الحقل الموجود في الجدول الأب سيؤدي إلى تعديلات<br />
في الحقول المربوطه معه في جدول الابن )<br />
في حال حذف الحقل سجل ما من جدول المسافرين سيتم حذف<br />
، "<br />
السجلات المرتبطة معه في جدول "<br />
المسافرين والرحلات<br />
95
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الخيار<br />
: Prohibit يمنع هذا الحقل تحديث الحقول في جدول الأب إذا كانت مرتبطة مع حقول في جدول<br />
2<br />
. (<br />
الابن )<br />
لا يمكن حذف سجل من جدول أب مرتبط مع سجلات في الجدول الابن<br />
3 : Strict Referential Integrity فعل هذا الخيار إذا كنت ستستخدم قواعد البيانات هذه مع برامج قديمة<br />
تعمل تحت النظام .Dos<br />
اضغط على بعدها على زر<br />
Ok ستطالب عندها باختيار اسم للعلامة المرجعية أدخل أي اسم تريده واضغط على<br />
موافق ...<br />
ملاحظات :<br />
الخيار<br />
Prohibit هو الخيار الذي تعمل به قواعد البيانات<br />
Paradox ولا يمكن الاستفادة من الخيار<br />
1<br />
Cascade إلا في حال استخدام بعض برامج SQL الحديثة.<br />
2 لحذف سجل أب مرتبط مع سجلات أبناء عليك أن تحذف جميع السجلات في الجدول الابن المرتبطة مع هذا<br />
السجل .<br />
.<br />
"<br />
بنفس الطريقة أربط بين رقم الرحلة في الجدول "<br />
المسافرين والرحلات<br />
مع رقم الرحلة في جدول الرحلات<br />
5 وضع كلمات سر للجداول :<br />
قد نحتاج في بعض الأحيان إلى حماية جداول أو الحقول من أن يصل إليها أو يستخدمها غيرنا، لذلك يمكن وضع<br />
كلمة سر للجدول كاملا ً أو لحقل أو عدد من حقوله فقط .<br />
ولإعطاء الجدول كلمة سر لجدول المسافرين<br />
1 افتح الجدول واختر الأمر Table Restructure واختار Table Security من اللائحة Table<br />
properties واضغط على الزر<br />
Define سيظهر عندها صندوق الحوار<br />
التالي :<br />
اكتب كلمة السر في الحقل<br />
Master Password وأعد كتابتها في الحقل<br />
.Ok واضغط على Verify Master Password<br />
أما لتحديد كلمة سر للحقول نعيد الخطوات السابقة ونختار بعدها<br />
Auxiliary Password فتظهر عندها النافذة<br />
(في الأسفل).<br />
أكتب كلمة السر في الحقل Current Password وحدد سماحيات<br />
الوصول من Table rights واضغط على Add<br />
يمكنك أن تعطي أكثر من كلمة سر للحقل الواحد<br />
أو لمجموعة حقول ،بالنسبة لسماحيات الوصول<br />
فتحدد طريقة تعامل المستخدم مع الجدول فإذا<br />
كانت القيمة<br />
Read Only فلا يمكن للمستخدم<br />
إدخال البيانات<br />
، كل مرة يتم فتح الجدول<br />
....<br />
فيها سيطالب المستخدم بإدخال كلمة السر و<br />
96
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تعطى السماحيات لهذا المستخدم تبعا ً لكلمة السر المدخلة<br />
لحذف كلمة سر وضعت على جدول أعد الخطوات في 1<br />
. Delete<br />
واضغط على الزر<br />
Modify واختر بعدها الزر<br />
ملاحظة هامة :<br />
إذا كانت سرية قاعدة البيانات تهمك فلا تستخدم قواعد بيانات<br />
Paradox فهناك مئات البرامج التي تستطيع اكتشاف<br />
كلمة سر القاعدة ، ويستطيع أي هاوي أن يدخل إلى جداولك والحصول على معلوماتها وتعديلها ،عمليا ً أقوى قواعد<br />
البيانات من حيث السرية والسماحيات أيضا ً هي قواعد البيانات<br />
وOracle MySQL<br />
وServer . MS SQL<br />
6 تحديد <strong>لغة</strong> الجدول : Table Language<br />
لتحديد <strong>لغة</strong> الجدول اختر<br />
Table Language من اللائحة خصائص<br />
الجدول<br />
إذا كانت بيانات الجدول التي تدخلها بال<strong>لغة</strong> العربية فأبق هذا<br />
الصندوق على الخيار الافتراضي 'Ascii' ANSI .<br />
7 عرض الجداول التابعة الجدول : Dependent Table<br />
:<br />
بعد أن ننشئ علاقة ربط متكاملة بين الجداول نكون قد عرفنا علاقة بين جدول أب وجدول ابن ولرؤية هذه العلاقة<br />
Dependent Table من اللائحة<br />
( Passengers<br />
نفتح الجدول الأب )<br />
ونفتح النافذة تعديل الجدول ثم نختار<br />
.<br />
( PassAndTrips<br />
Table properties عندئذ تظهر الجداول المرتبطة مع هذا الجدول )<br />
ملاحظات :<br />
إلى هنا نكون قد تعلمنا إنشاء جداول من النوع<br />
Paradox ويكون إنشاء جداول من أنواع أخرى مشابهة لهذه<br />
1<br />
الطريقة ولكن تتغير بعض الأشياء فأنواع الحقول في جداول<br />
Dbase مثلا ً تختلف عن أنواع الحقول في جداول<br />
Paradox بالاسم فقط ولكن تبقى جميع أنواع قواعد البيانات مصممة لتخزين النصوص و الأرقام و....<br />
2 يفضل في البداية تصميم الجداول على الورق بما فيها تحديد الارتباطات وأنواع الحقول والقيود إلى الحقول<br />
وثم البدء بإنشاء الجداول الآباء ثم الأبناء وتعريف خصائص الجدول عند إنشاءه .<br />
3 عمليا ً يفضل أن تكون جميع جداول القاعدة جاهزة قبل البدء بإدخال المعطيات إليها .<br />
4 جداول القاعدة المعتمدة في هذا المثال والطرق التي اتبعت في إنشاءها غير مثالية واعتمدت هنا بهدف تعليمي<br />
فقط .<br />
إدخال البيانات إلى الجداول :<br />
بالإضافة إلى إمكانية بناء الجداول يتيح البرنامج<br />
إدخال البيانات إليها وتعديلها<br />
.<br />
Database Desktop<br />
97
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إدخال البيانات بال<strong>لغة</strong> العربية<br />
لكي تستطيع إدخال نصوص بال<strong>لغة</strong> العربية في البرنامج<br />
Database Desktop عليك تغير الخط المستخدم في<br />
البرنامج ويتم ذلك باختيار الأمر<br />
والضغط على الزر<br />
Change لتغير الخط أختر من<br />
Edit Peferences<br />
القائمة أحد الخطوط التي تدعم ال<strong>لغة</strong> العربية Arabic Transparent مثلا ً .<br />
استخدام نمط التحرير :<br />
قبل البدء بإدخال البيانات إلى الجدول يجب الدخول إلى نمط التحرير ويتم ذلك عن طريق اختيار الأمر Edit من<br />
القائمة<br />
Table أو الضغط على الزر<br />
F9 أو زر السرعة في أقصى يمين شريط السرعة<br />
) طبعا ً يجب أن يكون<br />
الجدول مفتوحا ً ( .<br />
أدخل الآن المعلومات التالية إلى جدول المسافرين :<br />
افتح اولا ً جدول المسافرين وادخل في نمط التحرير<br />
استخدم الزر<br />
Tab للتنقل بين الحقول كما أن نفس الزر<br />
سينقلك إلى سجل جديد .<br />
لاحظ انه لا يسمح لك بإدخال قيمة في حقل من النوع ترقيم<br />
.<br />
تلقائي لإن هذا الحقل يأخذ قيمته تلقائيا ً ويزاداد بمقدار<br />
1 عند إضافة سجل جديد<br />
كما أنه لا حاجة لحفظ المعلومات المدخلة في الجدول ، حيث يقوم الجدول بحفظ المعلومات تلقائيا ً عند الانتقال إلى<br />
سجل جديد .<br />
أدخل المعلومات التالية إلى جدول الرحلات<br />
: افتح الجدول وانتقل إلى وضع التحرير<br />
حاول إدخال القيمة<br />
400 في الحقل<br />
CardCount ولاحظ عدم قبول البرنامج لهذه القيمة وتذكر الشرط الذي<br />
وضعناه على هذا الحقل<br />
) إقرأ الرسالة التي تظهر في الزاوية اليسارية السفلى للبرنامج ( .<br />
.<br />
في الحقول من النوع<br />
TimeStamp يمكن الضغط على مفتاح المسافة لإدخال الوقت والتاريخ الحالي<br />
أدخل البيانات إلى جدول المسافرين والرحلات<br />
: افتح الجدول وانتقل إلى جدول الرحلات<br />
تعلم أننا قد ربطنا الحقل PNo بجدول<br />
بحث<br />
للاستفادة من هذه الخاصة أضغط على<br />
المفاتيح Ctrl + Space أثناء وجود<br />
المؤشر في الحقل PNO ستظهر نافذة<br />
98
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
جديدة فيها جميع حقول جدول البحث<br />
Passengers.db أختر أحد السجلات واضغط عليه مرتين ستغلق النافذة<br />
.<br />
وتنتقل قيمة الحقل<br />
PNo في السجل المختار إلى الجدول الحالي<br />
يمكنك أيضا ً إدخال رقم المسافر يدويا ً ولكن لا يسمح لك بإدخال رقم مسافر غير موجود في جدول المسافرين ، كما<br />
(<br />
لا يسمح بإدخال نفس المسافر على نفس الرحلة مرتين )<br />
لا يمكن للمسافر أن يسافر في رحلة واحدة مرتين<br />
.<br />
وتظهر الرسالة<br />
Key Violation وذلك لأنه لا يمكن أن تكون القيم في المفتاح الرئيسي مكررة<br />
أخيرا ً حاول التدرب على الأوامر في القائمة<br />
. Record<br />
99
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ببعد أن قمنا ببناء الجداول باستخدام<br />
من خلال <strong>دلفي</strong> باستخدام هذه الجداول<br />
عرض جدول المسافرين في نافذة<br />
الجلسة السادسة عشر<br />
http://www.alshater.net<br />
Database Desktop<br />
:<br />
ابدأ مشروعا ً جديدا ً أضف إليه العناصر<br />
أعط العنصر Table1 الخصائص التالية<br />
الخاصة<br />
سنكمل الآن مشوارنا بتعلم التعامل مع قاعدة البيانات<br />
. Table, DBGrid, DataSource, DBNavigator<br />
DatabaseName<br />
TableName<br />
Active<br />
أعط العنصر<br />
أعط العنصرين<br />
نفذ البرنامج ولاحظ النتائج<br />
التعامل مع الحقول<br />
القيمة<br />
Travel<br />
Passengers<br />
True<br />
القيمة Table1 DataSet الخاصة DataSource<br />
القيمة DataSource1 DataSource الخاصة DBGrid و DBNavigator<br />
...<br />
:<br />
تمكننا العناصر الموجودة في الصفحة Data Control من رؤية البيانات وتحريرها أما إذا أردنا الوصول إلى<br />
البيانات والتحكم بطريقة عرضها علينا إنشاء عناصر الحقول<br />
إنشاء عناصر الحقول<br />
.<br />
:Tfield<br />
يمكن استخدام محرر الحقول لتعريف لائحة من الحقول ضمن الجدول<br />
حقل تنشئ <strong>دلفي</strong> عنصر من النوع<br />
خلاله الوصول إلى قيمة الحقل والتحكم بمواصفاتها<br />
)<br />
عنصر الجدول<br />
Tfield وهذا العنصر غير مرئي ولكن يمكن من<br />
( Table<br />
.<br />
لفتح صندوق حوار محرر الحقول اضغط مرتين على العنصر<br />
Table1 لتظهر النافذة<br />
المجاورة ، إضغط بزر الفأرة الأيمن في وسط هذه النافذة لتظهر قائمة اختر منها<br />
Add<br />
All Field عندها ستظهر حقول جدول المسافرين في هذه النافذة ، أعد الضغط بزر<br />
الفأرة اليميني على أحد هذه الحقول تظهر القائمة في هذه الحالة عمليات التعامل مع هذه<br />
اللائحة من قص ونسخ وحذف<br />
..<br />
1 احذف الحقل Pno من اللائحة ولاحظ اختفاءه من العنصر<br />
. DBGrid<br />
2<br />
ومن أجل كل<br />
أعد ترتيب الحقول ضمن القائمة وذلك عن طريق سحب الحقل PassNo وإفلاته في أعلى القائمة ولاحظ<br />
تأثير ذلك على العنصر<br />
. DBGrid<br />
افتح محرر الشيفرة وانتقل إلى القسم Type ولاحظ قيام<br />
<strong>Delphi</strong> بتعريف<br />
عدد من المتحولات<br />
تم تعريف حقل من النوع النصي لأن الحقل من النوع نص // TStringField; Table1Pname:<br />
Table1Nationalty: TStringField;<br />
تم تعريف حقل من النوع الصحيح لأن الحقل من النوع الصحيح // TIntegerField; Table1PassNo:<br />
100
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تحديد خواص العنصر من النوع<br />
افتح محرر الحقول واختر الحقل<br />
http://www.alshater.net<br />
: Tfield<br />
PassNo ولاحظ خواص هذا الحقل في محرر الخواص حيث يظهر في أعلى<br />
محرر الخواص اسم العنصر ونوع العنصر Table1Pname: TStringField حيث تعطي <strong>دلفي</strong> اسم هذا الحقل<br />
تلقائيا ً والذي يمكن تغيره عن طريق الخاصة<br />
. Name<br />
3 غير قيمة الخاصة Alignment إلى القيمة taCenter ولاحظ تأثير ذلك على العنصر<br />
4 أعط الخاصة<br />
. DBGrid<br />
DisplayLabel القيمة "<br />
رقم جواز السفر<br />
. "<br />
سنتعرف لاحقا ً على إمكانيات إضافية لهذا لمحرر الحقول أما الآن فسنتعلم كيفية الوصول إلى قيمة الحقل برمجيا ً<br />
قراءة قيم الحقول<br />
الطريقة الأولى<br />
:<br />
:<br />
:<br />
بالاعتماد على عناصر الحقول<br />
أضف إلى النموذج السابق عنصر<br />
: TFeild<br />
label1 وزر :<br />
في حدث الضغط على الزر اكتب التعليمة التالية<br />
Label1.Caption := Table1Pname.value ;<br />
:<br />
نفذ البرنامج واضغط على الزر ولاحظ ظهور قيمة الحقل<br />
واضغط على الزر مرة أخرى<br />
...<br />
تقوم هذه التعليمة بإلحاق قيمة الحقل<br />
Tabel1Pname في الخاصة<br />
Pname في العنصر<br />
، Label غير السجل الحالي<br />
Caption وذلك لأن الحقل والCaption من<br />
نوع String أما إذا أردت إلحاق قيمة حقل عددي إلى نوع نص استبدل التعليمة السابقة بالتعليمة التالية<br />
ويملك العنصر<br />
TField عدد من الخواص يشبه الخاصة السابقة وهي<br />
:<br />
Label1.Caption := Tabel1PassNo.AsString ;<br />
، AsFloat<br />
، AsInteger<br />
، AsBoolean<br />
. AsDateTime<br />
الطريقة الثانية<br />
:<br />
وله الشكل التالي<br />
باستخدام الخاصة<br />
المنهج )<br />
TableName.FeildByName('FieldName').Value<br />
:<br />
FieldByName (<br />
:<br />
وللتحويل بين الأنواع<br />
مثال<br />
TableName.FeildByName('FieldName').AsType<br />
101<br />
:<br />
: ( 1 )<br />
أضف زرين إلى البرنامج السابق وعنصر نص<br />
: Label<br />
في حدث الضغط على زر اكتب التعليمة التالية :<br />
label1.Caption := Table1.FieldByName('Pname').Value<br />
وفي حدث الضغط على الزر الثاني اكتب التعليمة التالية :<br />
Label2.Caption := table1.fieldbyname('PassNo').AsString ;<br />
الطريقة الثالثة :التعامل مع الحقل كنوع<br />
ولها الشكل التالي<br />
مثال<br />
Table1['FieldName']<br />
Variant<br />
:<br />
:<br />
في حدث الضغط على الزر الأول اكتب التعليمة التالية<br />
في حدث الضغط على الزر الثاني اكتب التعليمة التالية<br />
Label1.Caption := Table1['Pname'] ;<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لاحظ أنه لا حاجة لاستخدام المنهج<br />
الطريقة الرابعة<br />
مثال<br />
http://www.alshater.net<br />
Label2.Caption := table1['PassNo'] ;<br />
TableName.Field[Index].Value<br />
.AsString<br />
AsString<br />
:<br />
:<br />
في حدث الضغط على الزر الأول اكتب التعليمة التالية<br />
في حدث الضغط على الزر الثاني اكتب التعليمة التالية<br />
Label1.Caption := Table1['Pname'] ;<br />
:<br />
Label2.Caption := table1.Fields[3].AsString ;<br />
إلحاق قيم بالحقول<br />
1 تعديل سجل<br />
102<br />
:<br />
( : حقل )<br />
في هذه الحالة نريد أن نغير في قيمة السجل الحالي ونستخدم الأسلوب التالي<br />
Table1.Edit ;<br />
Tabel1.FieldByName( 'FieldName').Value := NewValue ;<br />
Table1.Post;<br />
كما وجدنا عند إدخال البيانات إلى الجداول في البرنامج Database Desktop قمنا بالانتقال إلى وضع التحرير<br />
:<br />
بنفس الطريقة عند إدخال البيانات في <strong>لغة</strong> <strong>البرمجة</strong> علينا أن نضع الجدول في وضع التحرير لذلك استخدمنا التعليمة<br />
. Table1.Edit<br />
التعليمة الثانية تقوم بإدخال القيمة الجديدة داخل الحقل ، أما التعليمة<br />
على الجدول وت ٌخرج الجدول من وضع التحرير<br />
مثال<br />
.<br />
:<br />
Table1.Post فمهمتها ثثبيت التغيرات المدخلة<br />
أضف ثلاثة عناصر تحرير Edit إلى النموذج السابق واكتب في حدث الضغط على زر التعليمات التالية<br />
يمكن استبدال التعليمة الرابعة<br />
:<br />
Table1.Edit ;<br />
Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />
Table1.FieldByName('Nationalty').Value := Edit2.Text ;<br />
Table1.FieldByName('PassNo').AsString := Edit3.Text ;<br />
Table1.Post ;<br />
; edit3.Text table1.FieldByName('PassNo').AsString := بالتعليمة<br />
Table1.FieldByName('PassNo').Value := strtoint( Edit3.Text) ;<br />
نفذ البرنامج وأدخل قيم في عناصر التحرير واضغط على الزر ولاحظ تغير قيم السجل .<br />
ملاحظة : وجدنا أنه يمكن تعديل الجدول من خلال العنصر DBGrid دون أن نقوم بوضع الجدول في وضع<br />
AutoEdit للعنصر<br />
DataSource حيث يقوم هذا العنصر بوضع الجدول في وضع<br />
التحرير وهذا يعود للخاصة<br />
التحرير بشكل تلقائي وبإعطاء هذه الخاصة القيمة False نفقد القدرة على تغير قيمة البيانات في جدول<br />
من المفيد أن تلاحظ أننا استطعنا أن نصل للمعطيات في الجدول بدون المرور على العنصر<br />
في القراءة أو الكتابة<br />
.<br />
) DataSoucre<br />
(<br />
حيث أن التعليمات تتعامل مع العنصر<br />
Table1 مباشرة .<br />
سواء
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
2 إضافة سجل<br />
تقوم التعليمة<br />
http://www.alshater.net<br />
Table1.insert ;<br />
Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />
Table1.FieldByName('Nationalty').Value := Edit2.Text ;<br />
Table1.FieldByName('PassNo').AsString := Edit3.Text ;<br />
Table1.Post ;<br />
:<br />
Table1.insert بوضع الجدول في وضع التحرير وتضيف سجل جديد فارغ إلى الجدول وتجعله<br />
السجل الحالي ، ثم تقوم التعليمات التالية بإلحاق قيم في هذا السجل والتعليمة الأخيرة تقوم بتثبيت المعلومات في هذا<br />
. الجدول<br />
يمكن استخدام طرق القراءة السابقة في الكتابة أي يمكن استبدال التعليمة<br />
Table1.Fieldbyname('Pname').Value := Edit1.Text ;<br />
Table1.Field[0].Value := بالتعليمة ['Table1['Pnameأو := Edit1.Text ;<br />
Edit1.Text ;<br />
.... Table1Pname.Value := Edit1.Text<br />
أو بالتعليمة بالتعليمة<br />
التعرف على عناصر الصفحة<br />
: Data Control<br />
العنصر 1 <br />
: DBGrid<br />
تعرفنا على هذا العنصر سابقا ً وسنشرح الآن بعض الخصائص المهمة له<br />
الخاصة<br />
القيمة<br />
:<br />
bdRightToLeft<br />
BiDiMode<br />
Color<br />
FixedColor<br />
Font<br />
TitleFont<br />
كما يوجد في الخاصة<br />
الخاصة<br />
أي لون<br />
أي لون<br />
Option العديد من الخصائص الفرعية الهامة:<br />
القيمة<br />
True or False<br />
True or False<br />
True or False<br />
True or False<br />
True or False<br />
True or False<br />
True or False<br />
dgEditing<br />
dgTitle<br />
dgIndicator<br />
dgColLines<br />
dgTabs<br />
dgRowSelect<br />
dgConfirmDelete<br />
العمل<br />
تحول اتجاه الجدول بحيث يصبح من اليمين إلى<br />
اليسار<br />
إعطاء لون لصفحة البيانات في العنصر<br />
إعطاء لون لحواف الجدول<br />
تغير نمط الخط المستخدم في صفحة البيانات<br />
تغير نمط الخط المستخدم في أسماء الأعمدة<br />
العمل<br />
التحكم بإمكانية التحرير أو عدمه في العنصر<br />
إظهار أو عدم إظهار أسماء الأعمدة<br />
إظهار أو إخفاء مؤشر السجل الحالي<br />
إظهار أو إخفاء خطوط بين الأعمدة<br />
منع استخدام الزر Tab للتنقل بين الحقول<br />
إمكانية اختيار السجل بالكامل<br />
التحكم بإظهار رسالة تأكيد حذف سجل<br />
103
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
True or False<br />
dgMutiSelect<br />
بقي أن نشرح الخاصة Columns لهذا العنصر<br />
:<br />
باختيار هذه الخاصة أو بالضغط مرتين على العنصر<br />
نافذة محرر الأعمدة كما في الشكل المجاور<br />
إمكانية اختيار أكثر من سجل بنفس الوقت<br />
DBGrid تظهر<br />
:<br />
حيث تظهر النافذة في البداية فارغة ، اضغط على الأيقونة الثالثة<br />
)<br />
( Add All Field<br />
فتظهر جميع أسماء حقول الجدول داخل هذه النافذة<br />
:<br />
في حال حذف أحد هذه الحقول من القائمة فلن يظهر في العنصر<br />
DBGrid وللقيام بذلك اضغط على الزر الثاني Delete بعد اختيار<br />
الحقل المراد حذفه<br />
.<br />
ملاحظة :يختلف الأمر هنا عن حذف الحقل من محرر الحقول وذلك لأنه في هذه الحالة الحقل المحذوف من محرر<br />
الأعمدة يمكن الوصول إليه بطريقة أخرى عن طريق العنصر Table مباشرة أو عن طريق ربطه بأحد عناصر<br />
، Data Control أما في حال حذف العنصر من محرر الحقول فلن نستطيع الحصول على قيم هذا الحقل<br />
العنصر Table لن يتصل مع قاعدة البيانات لإحضار قيم هذا الحقل<br />
)<br />
. (<br />
باختيار أحد هذه الحقول تظهر خصائص الحقل في محرر الخواص والتي يمكن الاستفادة منها كمايلي<br />
:<br />
عمليا ً<br />
العمل<br />
الخاصة القيمة<br />
Alignment<br />
Color<br />
Font<br />
Title-Alignment<br />
Title-Caption<br />
Title-Font<br />
سنشرح الخاصة الأخيرة<br />
التحكم بمكان ظهور البيانات داخل العمود<br />
إعطاء لون محدد لعمود<br />
إعطاء نمط خط محدد لعمود<br />
)<br />
(<br />
التحكم بمكان ظهور عنوان العمود<br />
إعطاء عنوان لعمود<br />
)<br />
إعطاء نمط خط ما لعنوان العمود<br />
إظهار أحد الأعمدة بلون خط آخر مثلا ً<br />
أعط إسم العمود بال<strong>لغة</strong> العربية<br />
(<br />
PickList بمثال :<br />
تقوم هذه الخاصة بإظهار لائحة من القيم لاختيار إحداها<br />
:<br />
اختر العمود Nationality اختر الخاصة PickList واضغط على الزر<br />
Editor أكتب فيها القيم التالية<br />
البحرين<br />
...<br />
، ستظهر النافذة<br />
String List<br />
:<br />
........<br />
نفذ البرنامج واضغط على الحقل<br />
من القيم المدخلة<br />
حلب في السطر الأول ، دمشق في الثاني ثم القاهرة ثم عمان ثم الرياض ثم<br />
Nationality<br />
.<br />
سيظهر سهم القائمة بجواره إضغط على هذا السهم واختر قيمة<br />
104
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
كما أنه يمكنك أن تدخل قيمه من خارج هذه اللائحة يدويا ً<br />
يمكن أيضا ً إضافة عمود جديد إلى محرر الأعمدة عن طريق اختيار الزر الأول<br />
) New ( Add وربط هذا العمود<br />
مع حقل ما عن طريق الخاصة<br />
، FieldName قد تريد مثلا ً أن تعرض عمود ما مرتين<br />
) سنتعرف لاحقا ً على<br />
ميزة هذه الخاصة ( .<br />
....<br />
يمكن أيضا ً تغير ترتيب الأعمدة في<br />
DBGrid بتغير ترتيبها في محرر الأعمدة<br />
:<br />
2 العنصر<br />
: DBNavigator بالإضافة إلى الخصائص السابقة يملك العنصر الخصائص المهمة التالية<br />
تجعل هذه الخاصة أزرار العنصر منبسطه ( .<br />
) مسطحة<br />
: Flat<br />
.<br />
الخاصة : Hints<br />
تمكن هذه الخاصة من كتابة تلميح لك زر من أزرار العنصر<br />
.<br />
الخاصة : VisibleButton<br />
تستخدم هذه الخاصة لإخفاء أو إظهار بعض أزرار العنصر<br />
.<br />
3 العنصر : DBtext<br />
يشبه العنصر<br />
Label ولكنه يمكن ربطه مع قاعدة البيانات<br />
.<br />
4 العنصر<br />
: DBEdit تم شرحه مسبقا ً<br />
.Memo<br />
5 العنصر : DBMemo<br />
يتم ربط هذا العنصر مع حقل من النوع<br />
6 العنصر<br />
يتم ربط هذا العنصر مع حقل من النوع صورة<br />
.<br />
: DBImage<br />
105
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة السابعة عشر<br />
سنتابع الآن مع العناصر في الصفحة<br />
6 العنصر<br />
مثال<br />
http://www.alshater.net<br />
: Data Control<br />
: DBImage<br />
يستخدم هذا العنصر لعرض وإضافة الصور إلى قاعدة البيانات<br />
.<br />
) :<br />
استخدام العنصرين<br />
: ( DBImage و DBMemo<br />
ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية<br />
: Table و Datasource و DBGrid و DBImage و<br />
DBNavigator و DBMemo<br />
اربط العنصر Table1 مع القاعدة DBDemos ومع الجدول<br />
بعض الأسماك<br />
) biolife.db<br />
(<br />
وأعطه الخاصة<br />
Active القيمة<br />
Table1 وأعط بقية العناصر في الخاصة<br />
DBMemo1 مع الحقل Notes في الخاصة<br />
،True وأعط الخاصة<br />
DataSet<br />
وهو جدول يحوي معلومات عن<br />
للعنصر<br />
DataSource<br />
.. القيمة DataSource1 DataSource<br />
، Datafield والعنصر<br />
DBImage1 مع الحقل<br />
القيمة<br />
، واربط العنصر<br />
... Graphic<br />
لاحظ أولا ً أن قيمة الحقلين<br />
Notes و<br />
Graphic غير ظاهرتين في العنصر DBGrid وذلك لأن هذا العنصر لا<br />
يستطيع عرض الحقول ذات الحجم الكبير وبالتالي لا يستطيع تحريرها لذلك إذا أردنا التعامل مع هذه الحقول لا بد<br />
لنا من استخدام عناصر التحكم التي تستطيع إظهار هذا النوع من الحقول لذلك استخدمنا العنصرين<br />
DBMemo و<br />
: DBImage<br />
حقل من نوع ( إضافة ) تحرير<br />
: Graphic<br />
عند الضغط على الزر Edit أو الزر Insert يمكنك تحرير الجدول من خلال العنصر DBGrid و العنصر<br />
DBMemo وتبقى المشكلة في كيفية تحرير عنصر الصورة<br />
.<br />
1<br />
يتم التعامل مع العنصر DBImage عن طريق حافظة الويندوز ClipBoard ويكون ذلك بإحدى الطريقين<br />
نسخ الصورة المطلوبة إلى الحافظة عن طريق أحد برامج الرسم ومن ثم اختيار العنصر<br />
DbImage إثناء<br />
التنفيذ والضغط على الزرين Ctrl+v أو استخدام الأمر DBImage1.PasteFromClipboard في حدث<br />
الضغط على زر<br />
.<br />
106
http://www.alshater.net<br />
2<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تحميل الصورة من ملف باستخدام العنصر OpenPictureDialog ومن ثم نسخ الصورة إلى الحافظة<br />
ولصقها ولتنفيذ ذلك أضف عنصر زر وعنصر<br />
الوحدة Jpeg في حال أردت استخدام صور<br />
OpenPictureDialog إلى النموذج السابق<br />
)<br />
( Jpg<br />
وفي حدث الضغط على الزر اكتب التعليمات التالية<br />
لا تنسى استخدام<br />
:<br />
If OpenPictureDialog1.Execute then Begin<br />
DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName );<br />
DBImage1.CopyToClipboard ;<br />
DBImage1.PasteFromClipboard ;<br />
end;<br />
نقوم في هذه الحالة بتحميل الصورة إلى العنصر DBImage1 ومن ثم نسخها إلى الحافظة وإعادة لصقها في<br />
. العنصر<br />
على كل حال هذه الطريقة ليست طريقة جيدة للتعامل مع الحافظة ولكنها الطريقة الأسهل وسوف نتعلم قريبا ً أسلوب<br />
التعامل مع الحافظة عند دراسة الرسم في <strong>دلفي</strong><br />
.<br />
3<br />
يمكن تحرير حقل من نوع صورة مباشرة دون العودة إلى العنصر<br />
في الجلسة الماضية ويكون ذلك عن طريق التعليمات التالية<br />
ملاحظة<br />
DBImage أو<br />
DataSource كما وجدنا<br />
:<br />
Table1.edit;<br />
If OpenPictureDialog1.Execute then<br />
Table1Graphic.LoadFromFile(OpenPictureDialog1.FileName);<br />
Table1.Post ;<br />
:<br />
1<br />
لا يمكن في هذه الطريقة استخدام صور من نوع Jpg لأن الحقل من نوع صورة لا يخزن إلا صور من نوع<br />
، Bmp أما في المثال السابق فتقوم الحافظة بتحويل الملف من نوع Jpg إلى ملف<br />
Bmp تلقائي ًا .<br />
2<br />
تخزين الصور من نوع Bmp في قاعدة البيانات سيحتاج إلى مساحة تخزين كبيرة لذلك يفضل بعض<br />
المبرمجين استخدام حقل من نوع<br />
لإظهاره<br />
Binary<br />
...<br />
7 العنصر<br />
: DBListBox<br />
وتخزين ملف الصورة<br />
Jpg ثنائيا ً ومن ثم إعادة هذا الحقل إلى ملف<br />
يعرض قائمة من القيم الجاهزة لتمكين المستخدم من اختيار إحداها لإدخالها ضمن سجل ما في حقل معين ولا يمكن<br />
للمستخدم إضافة قيم جديدة في هذه القائمة<br />
8 العنصر<br />
.<br />
: DBComboBox<br />
يظهر قائمة منسدلة من القيم بحيث يستطيع المستخدم اختيار إحداها لإدخالها لحقل ما، ويمكن للمستخدم أيضا ً أن<br />
يقوم بإدخال قيم أخرى ضمنها غير موجودة مسبقا ً لإلحاقها بقيمة حقل ضمن سجل<br />
9 العنصر<br />
.<br />
: DBDateTimePiker<br />
يرتبط هذا العنصر مع حقول من النوع<br />
Kind إذا كنا نريد إظهار الوقت أو التاريخ<br />
TimeStamp أو Time أو Date<br />
.<br />
وبالنسبة للنوع الحقل تحدد الخاصة<br />
107
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: ( DBcomboBox<br />
DBlistBox<br />
مثال : )<br />
العنصرين<br />
و<br />
ابدأ مشروعا ً جديدا ً أضف إلى النموذج العناصر<br />
Table و DataSource وعنصري DBedit وعنصر<br />
. DBNavigator<br />
DBComboBox و عنصري<br />
DBDateTimePiker و عنصر<br />
DBListBox و<br />
رتب العناصر كما في الشكل<br />
Travel والجدول Trips واعط<br />
اربط العنصر<br />
Table1 مع القاعدة<br />
الخاصة Active القيمة . True<br />
، Table1<br />
اربط العنصر<br />
DataSouce1 مع العنصر<br />
حدد باقي العناصر وأعطها القيمة<br />
Datasoucrce1 في الخاصة<br />
. DataSource<br />
Datafield<br />
اربط العنصر<br />
DBedit1 مع الحقل<br />
TripNo في الخاصة<br />
وأعط الخاصة<br />
ReadOnly القيمة ) True لأن الحقل حقل ترقيم تلقائي<br />
ولا حاجة إلى تحريره (<br />
............. Company<br />
اربط العنصر<br />
DBedit2 مع الحقل<br />
اربط العنصر<br />
DBListBox1 مع الحقل GoFrom وأعط الخاصة<br />
Items القيم التالية<br />
: حلب ، عمان ،دمشق ،<br />
اللاذقية ، أثينا ..<br />
اربط العنصر<br />
ComboBox1 مع الحقل<br />
ArriveTo وأعط الخاصة<br />
Items القيم التالية<br />
: القاهرة ، الرياض ، جدة<br />
، عمان ، هامبورغ ...<br />
اربط العنصر<br />
DBDateTimePiker1 مع الحقل<br />
GoTime وأعط الخاصة<br />
Kind القيمة ) dtkTime تذكر أن<br />
. ( Timestamp<br />
الحقل<br />
GoTime من النوع<br />
نفذ البرنامج ولاحظ ما يلي :<br />
1 تنقل بين السجلات ولاحظ التغير في العناصر ComboBox1 و . DbListBox1<br />
2 يمكن الإضافة في الحقل GoFrom من خلال اختيار أحد عناصر القائمة . DBListBox1<br />
DBComboBox1 أو<br />
يمكن الإضافة في الحقل<br />
ArriveTo من خلال اختيار أحد عناصر القائمة المنسدلة<br />
3<br />
كتابة قيمة ما داخل العنصر .<br />
...<br />
4 أضف إلى الشكل عنصر<br />
DbGrid وحاول الإضافة والحذف والتعديل<br />
. Logical<br />
10 العنصر : DBCheckBox<br />
يرتبط هذا العنصر مع حقل من نوع<br />
العنصر<br />
: DBRadioGroup يستخدم هذا العنصر لإدخال أو إظهار قيمة ما إلى حقل يأخذ عدد محدد من<br />
11<br />
القيم :<br />
مثال :<br />
في المثال السابق استبدل العنصر DBListBox بالعنصر ، DBRadioGroup اعط الخاصة DataSource<br />
القيمة<br />
Datasource1 و الخاصة<br />
Items القيم التالية<br />
: حلب ، عمان<br />
DataField القيمة GoFrom والخاصة<br />
108<br />
،دمشق ، اللاذقية ، أثينا<br />
..
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
. ..<br />
والخاصة Values القيم :<br />
حلب ، عمان ،دمشق ، اللاذقية ، أثينا<br />
حيث تستخدم الخاصة<br />
Items لإظهار عناوين لأزرار الراديو ، أما<br />
Values فتستخدم لإعطاء قيمة للحقل في حال<br />
ضغط المستخدم على زر الراديو ..<br />
العنصر<br />
يشبه العنصر<br />
DBListBox ولكن بدلا ً من الخاصة Item يتم<br />
: DBLookUpListBox<br />
_ 12<br />
الحصول على قيم القائمة من خلال جدول آخر .<br />
العنصر<br />
يشبه العنصر<br />
Item ولكن بدلا ً من الخاصة DBComboBox<br />
: DBLookUpComboBox<br />
13<br />
يتم الحصول على قيم القائمة من خلال جدول آخر .<br />
مثال :<br />
سوف نقوم الآن بإنشاء نموذج للإدخال إلى جدول<br />
المسافرين والرحلات<br />
PassAndTrip حيث سيتم إدخال رقم<br />
"<br />
"<br />
المسافر من خلال العنصر<br />
DBLookUpListBox الذي سيرتبط مع جدول المسافرين لإحضار اسم المسافر ،<br />
وسيتم إدخال رقم الرحلة من خلال العنصر<br />
DBLookUpComboBox الذي سيرتبط مع جدول المسافرين<br />
لإحضار اسم شركة الطيران .<br />
DataSource وعنصري DBedit وعنصر<br />
ابدِأ مشروعا ً جديدا ً وأضف إليه ثلاثة عناصر<br />
Table وثلاثة عناصر<br />
. DBGrid والعنصر DBLookUpComboBox وعنصر DBLookupListBox وعنصر DBNavigator<br />
DataSource1 معه .<br />
اربط العنصر<br />
Table1 مع الجدول<br />
PassAndTrip في القاعدة<br />
Travel واربط العنصر<br />
DataSource2 معه .<br />
اربط العنصر<br />
Table2 مع الجدول<br />
Passengers في القاعدة<br />
Travel واربط العنصر<br />
DataSource3 معه .<br />
اربط العنصر<br />
Table1 مع الجدول<br />
Trips في القاعدة<br />
Travel واربط العنصر<br />
أعط جميع الجداول الخاصة Active القيمة . True<br />
أعط بقية العناصر الخاصة Datasource القيمة . DataSource1<br />
:<br />
أعط<br />
DBLookupListbox1 الخصائص التالية<br />
. "<br />
"<br />
الخاصة DataField القيمة "PNo" :<br />
سيرتبط هذا العنصر مع الحقل<br />
Pno في جدول<br />
المسافرين والرحلات<br />
الخاصة<br />
Listsource القيمة : DataSource2 القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول<br />
. Passengers<br />
الخاصة<br />
ListField القيمة : Pname سيظهر في هذا العنصر قائمة بجميع أسماء المسافرين في الجدول<br />
. Passengers<br />
PassAndTrip عند<br />
الخاصة KeyField القيمة : PNo<br />
تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول<br />
اختيار اسم المسافر عمليا ً يتم في هذه الخاصة تحديد المفتاح الرئيسي<br />
KeyField المرتبط معه المفتاح الثانوي<br />
. DataFields<br />
:<br />
اعط العنصر<br />
DBLookupComboBox1 الخصائص التالية<br />
الخاصة<br />
سيرتبط هذا العنصر مع الحقل<br />
TripNo في جدول<br />
" المسافرين<br />
: "TripNo" القيمة DataField<br />
" . والرحلات<br />
109
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الخاصة<br />
http://www.alshater.net<br />
: القيمة DataSource3 Listsource<br />
.Trips<br />
الخاصة<br />
: Company القيمة ListField<br />
. Trips<br />
الخاصة<br />
:TripNo القيمة KeyField<br />
اختيار اسم الشركة<br />
القائمة التي سيظهرها هذا العنصر ستأتي عن طريق الجدول<br />
سيظهر في هذا العنصر قائمة بجميع أسماء شركات الطيران في الجدول<br />
تحدد هذه الخاصة القيمة التي سيتم إدخالها إلى جدول<br />
PassAndTrip عند<br />
.<br />
اربط العنصر Dbedit1 مع الحقل<br />
SeatNo والعنصر<br />
نفذ البرنامج وتنقل بين السجلات ولاحظ تغير القيم في العناصر<br />
DBEdit2 مع الحقل<br />
. ClassNo<br />
.<br />
اضغط على الزر + إضافة وأدخل قيم عن طريق اختيار اسم أحد المسافرين و اسم الشركة<br />
أضف عدد من السجلات للتآلف مع العناصر<br />
....<br />
...<br />
14 العنصر : DBRichEdit يمكن ربط هذا العنصر مع حقل من نوع Memo أو حقل من نوع<br />
Formatted Memo<br />
العنصر : DBCtrlGrid 15<br />
سطور بعدد سجلات الجدول أثناء التنفيذ<br />
مثال<br />
.<br />
:<br />
أضف هذا العنصر إلى النموذج السابق وأعط الخاصة<br />
DBedit واعط الخاصة<br />
16 العنصر<br />
هذا العنصر يقوم بإظهار صفحة من البيانات حيث يقوم هذا العنصر يتوليد<br />
القيمة DataSource2 DataSource<br />
DataField القيمة<br />
، Pname نفذ البرنامج ولاحظ النتائج<br />
.<br />
: DBChart<br />
لإظهار مخططات بيانية من للقيم الموجودة في جدول<br />
.<br />
وضع داخله عنصر<br />
110
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
الثامنة عشر<br />
البحث في قواعد البيانات :<br />
تعتبر عملية البحث عن سجل معين أو قيمة معينة لحقل ما في سجل من أهم تطبيقات قواعد البيانات ، ونظرا ً<br />
(<br />
لضخامة البيانات الموجودة في قواعد البيانات )<br />
بنوك المعلومات<br />
فإننا نحتاج إلى تقنيات بحث سريعة توصلنا إلى<br />
المعلومة المحددة وبدون عناء البحث ضمن جميع بيانات الجدول ، وسنستعرض الآن أهم طرق البحث التي زودتنا<br />
بها <strong>لغة</strong> <strong>دلفي</strong> .<br />
المنهج : Locate<br />
يقوم هذا المنهج بوضع مؤشر السجل الحالي عند أول سجل يطابق شروط البحث، باستخدام هذه الطريقة يمكننا<br />
Locate ( 'FieldName',SearchValue,Option ) ;<br />
البحث عن قيمة لحقل ما حيث يأخذ هذه المنهج الشكل<br />
حيث<br />
:<br />
: FieldName<br />
اسم الحقل الذي سيتم البحث فيه<br />
.<br />
: SearchValue القيمة التي سيتم البحث عنها.<br />
Option :تحدد خيارات البحث وتأخذ القيم التالية :<br />
عدم التميز بين الأحرف الكبيرة والصغيرة , ] [loCaseInsensitive Option =<br />
Option = [ loPartiaKey ] ;<br />
"<br />
"<br />
"<br />
البحث في جزء من الكلمة أي أن البحث عن قيمة "<br />
محم<br />
يمكن أن يعيد<br />
محمد<br />
أو " محمود "<br />
دمج الخيارين السابقين ]; loPartiaKey Option = [ loCaseInsensitive ,<br />
لا نريد استخدام أي من الخيارين السابقين ;[ [ = Option<br />
يعيد هذا المنهج القيمة<br />
True في حال استطاع إيجاد القيمة المطلوبة في جدول البحث والقيمة<br />
False في الحالة<br />
المعاكسة .<br />
مثال :<br />
ابدأ مشروعا ً جديدا ً وأضف إلى النموذج عنصر Table و DataSorce و DbGrid و Button و Edit<br />
: DBGrid<br />
أربط الجدول مع جدول<br />
Passengers في القاعدة<br />
Travel وأظهر محتويات الجدول ضمن<br />
اكتب في حدث الضغط على الزر التعليمة التالية<br />
:<br />
If Table1.Locate('Pname',Edit1.Text , [locaseinsensitive,lopartialkey]) Then<br />
Showmessage(' The record is found ') Else<br />
Showmessage ( ' There is no match , Try Another Value ' );<br />
يقوم البرنامج السابق بالبحث عن القيمة المدخلة في العنصر Edit1 ضمن الحقل PName في جدول المسافرين .<br />
نفذ البرنامج وابحث عن قيمة حقل ما في الجدول ولاحظ انتقال مؤشر الحقل الحالي إليها عند وجودها ، ثم ابحث<br />
عن جزء من اسم أحد المسافرين<br />
ابحث عن الحرف<br />
م<br />
" فقط ولاحظ توضع مؤشر السجل الحالي عند اسم أول<br />
"<br />
)<br />
مسافر يبدأ بحرف<br />
م<br />
ثم احذف الخيار<br />
loPartialKey من تعليمة البحث ولاحظ عدم قدرة المنهج من إيجاد<br />
( "<br />
"<br />
الحقل إلا في حال كانت القيمة مطابقة<br />
.<br />
111
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ثم أضف أسماء مسافرين بال<strong>لغة</strong> الإنكليزية<br />
loCaseInsensitive وأعد البحث<br />
http://www.alshater.net<br />
مثلا ً )<br />
( ahmed و Ahmed<br />
....<br />
استخدام المنهج Locate للبحث عن أكثر من حقل بنفس الوقت<br />
بفرض أننا نريد البحث عن اسم المسافر والجنسية بنفس الوقت<br />
المنهج<br />
:<br />
)<br />
وابحث عن القيمتين ثم احذف الخاصة<br />
المسافر محمد من سورية مثلا ً<br />
(<br />
نستخدم عندها<br />
Locate بالشكل :<br />
Locate ( 'FieldName1; FieldName2; FieldName3',VarArrayOf ( [SearchValue1,<br />
SearchValue2, SearchValue3]),Option ) ;<br />
:<br />
مثال :<br />
أضف عنصر<br />
Edit2 إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية<br />
if table1.Locate('pname;Nationalty',vararrayof([ edit1.Text,Edit2.text]) , [<br />
locaseinsensitive , lopartialkey ] ) then<br />
Showmessage('the record is found') else<br />
Showmessage ( 'there is no match , Try Anther Value' );<br />
التابع VarArrayOf ينشئ مصفوفة عناصرها من النوع . Variant<br />
: ملاحظة<br />
إذا كان الحقل من نوع عدد صحيح<br />
Short أو<br />
Long Integer يجب أن تكون SearchValue من النوع عدد<br />
صحيح أيضا ً ولذلك إذا أردنا أن نبحث عن رقم المسافر بدلا ً من اسمه نستبدل التعليمات السابقة بما يلي<br />
2 المنهج<br />
:<br />
if table1.Locate('PNo;Nationalty',vararrayof([ strtoint(edit1.Text),Edit2.text])<br />
,[locaseinsensitive,lopartialkey]) then<br />
Showmessage('the record is found') else<br />
Showmessage ( 'there is no match , Try Anther Value' );<br />
: Lookup<br />
يعيد هذا المنهج مصفوفة من القيم لمجموعة من حقول الجدول دون أن تغير موضع السجل الحالي والمثال التالي<br />
يوضح هذا المنهج<br />
:<br />
:<br />
مثال سنبحث عن رقم المسافر وسنطلب من التابع ان يعيد اسم المسافر وجنسيته<br />
زر التعليمات التالية<br />
:<br />
اكتب في حدث الضغط على<br />
var LookupResult : Variant;<br />
begin<br />
lookupResult := Table1.Lookup('Pno',strtoint(edit1.Text ),'Pname;Nationalty');<br />
if Not VarIsnull( lookupResult) then<br />
Showmessage(vartostr(lookupresult[0]) + ' ' + vartostr(lookupresult[1] ) );<br />
التعليمة الأولى للبحث عن رقم المسافر المكتوب في العنصر Edit1 ووضع النتيجة في متحول من النوع Variant<br />
يعيد هذا التابع<br />
Lookup القيمة<br />
Null في المتحول إذا لم يجد القيمة المطلوب البحث عنها والتابع<br />
يستخدم لمعرفة إذا كان المتحول من النوع Variant يحوي قيمة أم لا<br />
VarIsNull<br />
.<br />
112
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التابع VarToStr يحول قيمة المتحول variant إلى نص<br />
ملاحظات<br />
http://www.alshater.net<br />
.<br />
113<br />
:<br />
1<br />
يمكن استخدام التابع Lookup للبحث في أكثر من حقل في نفس الوقت مثال استبدل التعليمة الأولى في<br />
المثال السابق بالتعليمة<br />
lookupResult := Table1.Lookup('Pno;Pname',VarArrayof<br />
([strtoint(edit1.Text),Edit2.text]),'PName;Nationalty');<br />
:<br />
2 من أهم مزايا المنهجين<br />
Locate و<br />
lookup أنهما يستطيعان التعامل مع حقول مفهرسة وغير مفهرسة ،<br />
ويستخدمان أيضا ً خوارزميات متقدمة للبحث حيث يستفيدان من الحقل إذا كان مفهرسا ً و يطبقان عمليات الفرز<br />
الفلترة<br />
المنهج<br />
)<br />
(<br />
في حال كان غير مفهرس<br />
.<br />
: FindKey<br />
هذا المنهج خاص بالتعامل مع الحقول المفهرسة حيث تكون عمليات البحث أسهل حيث يأخذ المنهج<br />
Findkey<br />
قيمة الحقل التي سيبحث عنها ويعيد قيمة بوليانية تدل على عثور هذا المنهج على السجل المطلوب ويقوم بنقل<br />
مؤشر السجل الحالي إلى السجل المطابق لشروط البحث<br />
: مثال<br />
في حدث الضغط المثال السابق على زر اكتب التعليمة التالية<br />
تقوم هذه التعليمة بالبحث في الفهرس<br />
الافتراضي<br />
:<br />
If not Table1.FindKey( [ Strtoint ( edit1.text)]) Then<br />
Showmessage ( 'the Record is not Found');<br />
)<br />
PNo<br />
لأنه المفتاح الرئيسي<br />
(<br />
عن القيمة المكتوبة في العنصر<br />
Edit وفي حال تم إيجادها ينتقل مؤشر السجل الحالي للسجل المطابق لنتيجة البحث ويعيد المنهج القيمة<br />
في حال لم توجد النتيجة فيعيد التابع القيمة<br />
،True أما<br />
False<br />
للبحث في الفهارس الثانوية يجب تحديد الفهرس الثانوي عن طريق الخاصة<br />
ويمكن تحديدها أثناء التصميم أو أثناء التنفيذ<br />
مثال<br />
Table للعنصر IndexName<br />
.<br />
:<br />
في المثال السابق أعط العنصر Table1 في الخاصة<br />
عرفنا هذا الفهرس في البرنامج<br />
IndexName<br />
القيمة<br />
) PNameIndex<br />
( Database Desktop<br />
مباشرة حيث سيصبح ترتيب السجلات اعتمادا ً على الترتيب الأبجدي في الحقل<br />
عدل التعليمة في حدث الضغط على زر بالشكل التالي<br />
نفذ البرنامج وابحث عن اسم مسافر ما<br />
ولاحظ تغير ترتيب السجلات في العنصر<br />
تذكر أننا<br />
DbGrid<br />
. PName<br />
If not Table1.FindKey([edit1.text]) then<br />
Showmessage ( 'the Record is not Found');<br />
:<br />
.....<br />
وجدنا أيضا ً أنه يمكن أن تكون المفاتيح الرئيسية عبارة عن حقلين أو أكثر كذلك الأمر بالنسبة للفهارس<br />
الثانوية وفي هذه الحالة نستخدم المنهج<br />
مثال : يمكن البحث في جدول<br />
البحث عن المسافر رقم 2 في الرحلة<br />
FindKey بالشكل :<br />
TableName.FindKey ( [ SearchValue1,SearchValue2 ,…,SearchValue3]) ;<br />
: [2,3]) Table1.FindKey( حيث سيتم<br />
"<br />
المسافرين والرحلات"<br />
. 4<br />
باستخدام التعليمة
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
4 المنهج<br />
: FindNearest<br />
يشبه المنهج السابق إلا أنه ينتقل إلى سجل مطابق أو إلى أقرب سجل مطابق أو إلى أقرب سجل مطابق للقيمة<br />
( False أو True<br />
المراد البحث عنها ، كما أنه لا يعيد قيمة )<br />
لا يعيد<br />
مثال :<br />
عدل التعليمة في حدث الضغط على الزر السابق لتصبح بالشكل<br />
ادخل في العنصر Edit1 جزء من اسم مسافر<br />
:<br />
Table1.FindNearest ([edit1.text]);<br />
"<br />
مح" مثلا ً واضغط على الزر ستقوم التعليمات بوضع مؤشر السجل<br />
الحالي عند أول مسافر أسمه<br />
مح<br />
أو أسمه قريب إلى<br />
"محمود". أو "محمد" مثل "مح<br />
"<br />
"<br />
"<br />
: Filter<br />
(<br />
التصفية )<br />
الفلترة<br />
تستخدم التصفية لإظهار مجموعة من الحقول تحقق معايير محددة مثلا ً نريد من الجدول أن يعرض المسافرين من<br />
الجنسية السورية فقط في جدول المسافرين ، أو أن نظهر جميع الرحلات التي خرجت من مطار حلب في جدول<br />
الرحلات .<br />
. True القيمة Filter<br />
تستخدم لهذه العملية الخاصة Filter<br />
للعنصر<br />
Table ويجب أن تأخذ الخاصة<br />
التصفية أثناء التصميم :<br />
...<br />
مثال :<br />
سنظهر في جدول الرحلات الخارجة من مدينة حلب<br />
Table و DataSource و DBGrid و ، Button اربط<br />
ابدأ مشروعا ً جديدا ً واضف<br />
إلية العناصر التالية<br />
.<br />
العناصر مع بعضها بحيث يظهر جدول الرحلات<br />
Trips في العنصر<br />
DBGrid1 أثناء التصميم<br />
Filter القيمة :<br />
أعط الخاصة Filtered للعنصر Table1 القيمة<br />
True واكتب في الخاصة<br />
'حلب' = GoFrom<br />
سيتم تطبيق التصفية مباشرة وسيظهر الجدول جميع الرحلات المغادرة من مطار حلب ، نستطيع الآن إزالة<br />
التصفية بإعطاء الخاصة Filtered القيمة . False<br />
الآن على فرض أننا نريد أن نعرف جميع الرحلات المغادرة من مدينة حلب إلى القاهرة ، لتحقيق ذلك نكتب في<br />
الخاصة<br />
Filter القيمة التالية<br />
'القاهرة' = Arriveto and 'حلب' = Gofrom<br />
( True<br />
الخاصة<br />
Filter يجب أن تأخذ القيمة<br />
)<br />
كما يمكن أن نبحث عن جميع الرحل المغادرة من حلب أو دمشق إلى القاهرة ... :<br />
'القاهرة' = Arriveto and ('دمشق' = GoFrom Or 'حلب' = (Gofrom<br />
"<br />
كما يمكن أن نوجد جميع الرحل المغادرة من بلد يبدأ أسمه بحرف "<br />
ح<br />
'*ح'= Gofrom<br />
:<br />
CardCount > 10<br />
Filter القيمة<br />
كما يمكن نعرف الرحل التي بقي فيها أكثر من 10 بطاقات :<br />
اكتب في الخاصة<br />
114
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التصفية أثناء التنفذ<br />
أعط الخاصة<br />
http://www.alshater.net<br />
:<br />
Filtered القيمة<br />
التي بقي فيها أكثر من<br />
True أثناء التصميم واكتب في حدث الضغط على زر التعليمة التالية لمعرفة الرحل<br />
10 بطاقات :<br />
Table1.Filter := ' CardCount > 10 '<br />
Edit النموذج :<br />
Table1.Filter := ' CardCount > '+ edit1.Text ;<br />
...<br />
ولمعرفة الرحل التي بقي فيها أكثر من عدد محدد من البطاقات أضف عنصر<br />
أدخل رقما ً في العنصر Edit1 حتى لا يحدث أخطاء<br />
لمعرفة الرحل المغادرة من مدينة ما نستخدم التعليمة التالية<br />
يعيد التابع<br />
:<br />
Table1.Filter := 'GoFrom = '+ Quotedstr(edit1.Text) ;<br />
) = '<br />
Quotedstr (<br />
Quotedstr النص المعطى في وسيطه إليه مضاف إليه إشارتي حصر مثلا ً<br />
وهكذا أعد تنفيذ الأمثله السابقة<br />
خواص العنصر<br />
...<br />
: Table<br />
يملك العنصر Table عدد من الخواص للتحكم به أثناء التنفيذ وهي<br />
:<br />
1 المنهج Open :تسخدم التعليمة Table1.open لفتح الجدول وتكافئ التعليمة<br />
'حلب<br />
حلب<br />
Table1.Active := true<br />
.<br />
2 المنهج<br />
: Close<br />
تستخدم التعليمة Table1.Close لإغلاق الجدول وتكافئ التعليمة<br />
Table1.Active :=<br />
. False<br />
3 المنهج<br />
4 المنهج<br />
5 المنهج<br />
6 المنهج<br />
7 المنهج<br />
Table1.First<br />
Table1.Last<br />
First :استخدم<br />
لوضع مؤشر السجل الحالي عند أول سجل في الجدول<br />
.<br />
)<br />
: Last<br />
تكون قيمة X سالبة<br />
استخدم<br />
لوضع مؤشر السجل الحالي في آخر الجدول<br />
.<br />
: Next استخدم<br />
Table1.Next للانتقال إلى السجل التالي في الجدول<br />
.<br />
: Prior استخدم<br />
Table1.Prior للانتقال إلى السجل السابق في الجدول<br />
.<br />
: MoveBy( x)<br />
.(<br />
استخدم ) 5 Table1.MoveBy( للانتقال خمس سجلات إلى الأمام<br />
8 المنهج : Bof تعيد هذه الخاصة القيمة True إذا كان السجل الحالي في بداية الجدول<br />
9 المنهج<br />
.<br />
: Eof<br />
تعيد هذه الخاصة القيمة True إذا كان السجل الحالي في نهاية الجدول<br />
10 المنهج : RecordCount يعيد هذه المنهج عدد سجلات الجدول<br />
.<br />
.<br />
.<br />
: RecNo<br />
11 المنهج يعيد هذا المنهج رقم السجل الحالي<br />
12 المنهج : Delete يقوم هذا المنهج بحث السجل الحالي ويضع مؤشر السجل على السجل التالي<br />
الحقول الحسابية<br />
يمكن أن<br />
..<br />
:<br />
115
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الوظيفة :<br />
1ً أنشئ الجداول التالية باستخدم البرنامج :DataBase Desktop<br />
1 جدول المؤلفين : Writer<br />
Wadress<br />
WName<br />
رقم المؤلف * Wno<br />
اسم المؤلف<br />
عنوان المؤلف<br />
1<br />
2<br />
2 جدول دور النشر : Publisher<br />
PubAdr<br />
PubName<br />
رقم الدار * PubNo<br />
اسم الدار<br />
العنوان<br />
3 جدول الكتب :<br />
رقم الكتاب<br />
BookNo<br />
اسم الكتاب<br />
رقم المؤلف<br />
رقم الدار<br />
تاريخ الإصدار<br />
Edate<br />
PubNo<br />
WNo<br />
Book<br />
ً 2 اربط بين الجداول بالشكل الذي تراه منسابا ً .<br />
.<br />
ً 3 عرف فهرس<br />
ثانوي على الحقل اسم المؤلف و الحقل اسم الدار والحقل اسم الكتاب<br />
ً 4 اعرض جدول المؤلفين وجدول الكتب على نموذج واحد بحيث يكون الأول تفصيلي والثاني ثانوي .<br />
ً 5 ضع عدد من الأزرار على النموذج للبحث عن اسم المؤلف باستخدام أساليب البحث المختلفة<br />
ً 6 أعرض في نموذج جديد جميع الكتب الموجودة والتي من إصدار دار شعاع.<br />
116
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة19<br />
الحقول الحسابية<br />
http://www.alshater.net<br />
:<br />
تستخدم الحقول الحسابية عادة لإعطاء نتيجة حسابية أجريت على عدد من حقول الجدول وهذه الحقول لا تخزن في<br />
القاعدة البيانات ولكن تظهر للمستخدم فقط<br />
في الجدول<br />
مثال<br />
)<br />
.... (<br />
:<br />
لا حاجة أصلا ً لتخزين هذه المعطيات لأنها معتمدة على حقول أخرى<br />
على فرض أن جميع الرحلات قادرة على حمل 350 مسافر نريد أن ننشئ حقل حسابي يعرض عدد<br />
البطاقات المحجوزة على رحلة ما بالاعتماد على العلاقة<br />
CardCount عدد البطاقات المحجوزة<br />
= 350 -<br />
ابدأ مشروعا ً جديدا ً أضف إليه العناصر<br />
الجدول<br />
التصميم<br />
Trips بحيث يظهر الجدول في<br />
: DBGrid و DataSource<br />
117<br />
Table و<br />
DBGrid أثناء<br />
...<br />
اعط الخاصة<br />
. False القيمة للعنصر Table1 Active<br />
اضغط مرتين على العنصر<br />
Table ليظهر<br />
محرر<br />
الحقول، ثم اضغط بزر الفأرة اليميني وأضف جميع<br />
الحقول، اضغط بزر الفأرة اليميني مرة أخرى واختر<br />
New field ستظهر عندها النافذة حقل جديد<br />
اكتب<br />
اختر<br />
CapCard في القسم<br />
Name وفي القسم<br />
Type<br />
Integer واختر<br />
اضغط على<br />
Calculated في القسم<br />
Field type<br />
. Ok<br />
أغلق محرر الحقول واختر العنصر<br />
OnClacFields واكتب فيه التعليمة التالية<br />
أعط الخاصة<br />
Table1 وانتقل إلى الصفحة<br />
اربط العناصر مع بعضها ومع<br />
Event في محرر الخواص وانتقل إلى الحدث<br />
:<br />
Table1CapCard.Value := 350 - table1Cardcount.value ;<br />
، CapCard عدل<br />
Active القيمة True للعنصر<br />
في أحد حقول CardCount ولاحظ التغير المباشر في الحقل<br />
مثال<br />
Table1 ونفذ البرنامج، واستعرض الحقل الجديد<br />
... CapCard<br />
: 2<br />
الرحلة ستنطلق بتاريخ<br />
الحقل<br />
القسم<br />
نريد أن نضيف حقل جديد إلى الجدول السابق يعطي اسم اليوم الذي ستنطلق منه الرحلة<br />
15/9/2003 فإن قيمه هذا الحقل ستكون<br />
GoTime ولتحقيق ذلك أعط الخاصة<br />
)<br />
" ( الاثنين "<br />
Active للعنصر Table1 القيمة<br />
Name أكتب<br />
TheDay وفي القسم<br />
OnClacFields واكتب التعليمات التالية<br />
ملاحظة<br />
Type اختر<br />
:<br />
أي اذا كانت<br />
، سيعتمد هذا الحقل في قيمته على<br />
False وافتح محرر الحقول وفي<br />
، String اضغط على OK وانتقل إلى الحدث<br />
Case DayOfWeek ( Table1GoTime.AsDateTime ) of<br />
;'الأحد'=: 1: Table1Theday.Value<br />
:<br />
لا تؤثر الحقول الحسابية على بنية قاعد البيانات<br />
، وإذا أردنا استخدام هذه الحقول في أكثر من نموذج علينا<br />
تعريفها من جديد في كل عنصر<br />
Table جديد .
http://www.alshater.net<br />
;'الاثنين'=: 2: Table1Theday.Value<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
;'الثلاثاء'=: 3: Table1Theday.Value<br />
;'الأربعاء'=: 4: Table1Theday.Value<br />
;'الخميس'=: 5: Table1Theday.Value<br />
;'الجمعة'=: 6: Table1Theday.Value<br />
;'السبت' := Table1Theday.Value 7:<br />
end;<br />
....<br />
يعيد التابع<br />
DayOfWeek رقم اليوم في الأسبوع حيث أن اليوم الأول الأحد والثاني الاثنين<br />
..........<br />
نفذ البرنامج وعدل في قيم الحقل<br />
GoTime ولاحظ النتائج<br />
SQL ( Structured Query Language )<br />
<strong>لغة</strong> الاستفسارات البنيوية :<br />
تعريف : <strong>لغة</strong><br />
SQL هي <strong>لغة</strong> برمجة خاصة للتعامل مع قواعد البيانات وتعتبر <strong>لغة</strong> برمجة عالية المستوى، حيث<br />
يمكنها في سطر واحد إجراء عمليات با<strong>لغة</strong> التعقيد على قاعدة البيانات.<br />
:<br />
تستخدم<br />
SQL مجموعة من التعليمات للتعامل مع قواعد البيانات سنتعرف على بعض منها الآن<br />
التعليمة<br />
: Select<br />
التعليمات بين<br />
مهمة هذه التعليمة إحضار المعلومات من قواعد البيانات ولها الشكل العام التالي<br />
:<br />
Select FieldName1 , FieldName2 , FieldName13….<br />
From TableName1,TableName2 …<br />
[ Where Condition ]<br />
[ Group By FieldName1,…]<br />
[ Order By FieldName ]<br />
] [ اختيارية .<br />
تقوم هذه التعليمة بإحضار الحقول المحددة القسم<br />
From من الجدول المذكور اسمه في القسم Select<br />
مثلا ً إذا أردنا إحضار حقل اسم المسافر و الجنسية من جدول المسافرين نستخدم التعليمة التالية<br />
يتم التعامل في <strong>دلفي</strong> مع<br />
SQL باستخدام العنصر<br />
Query الموجود في الصفحة<br />
:<br />
Select PName , Nationality<br />
From Passengers<br />
BDE وهو عنصر يشابه العنصر<br />
Table بشكل كبير ولكنه لا يملك الخاصة<br />
TableName حيث يتم تحديد الجداول التي ستتعامل مع هذا العنصر<br />
SQL فيها .<br />
باستخدام الخاصة<br />
SQL التي يتم كتابة تعليمات<br />
SQL السابق<br />
مثال :<br />
تحقيق مثال تعليمة<br />
ابدأ مشروعا ً جديدا ً وأضف إلى النموذج العناصر التالية Query و DataSource و DBGrid وDBNavigator<br />
.<br />
SQL<br />
...<br />
أعط الخاصة DataBaseName للعنصر Query1 القيمة<br />
Travel ،عند الضغط على<br />
في الخاصة<br />
Select PName , Nationality<br />
From Passengers<br />
تظهر نافذة اكتب فيها التعليمات التالية :<br />
118
http://www.alshater.net<br />
) True<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أعط الخاصة<br />
Active القيمة في حال ظهور رسالة خطأ تأكد من التعليمات ومن كتابتك لأسماء الحقول<br />
والجدول بشكل صحيح)<br />
أعط الخاصة DataSet للعنصر DataSource1 القيمة Query1 واربط DBGrid1 و DBNavigator1 مع<br />
. DataSource1<br />
نفذ البرنامج ولاحظ ظهور الأعمدة المطلوبة في عبارة<br />
Select داخل العنصر<br />
، DBGrid لاحظ أيضا ً أن أزرار<br />
تعديل وإضافة السجلات في العنصر DBNavigator1<br />
غير فعالة ، كما أنه لا يمكن التعديل في البيانات من<br />
خلال العنصر<br />
DBGrid1 مباشرة وذلك يعود إلى أن عبارة<br />
Select تستخدم لجلب البيانات من قاعدة البيانات ،<br />
أما إذا أردنا التعديل أو الإضافة أو الحذف فهناك تعليمات<br />
SQL خاصة بذلك، ولكن العنصر<br />
Query يملك خاصة<br />
تجعل البيانات قابلة للتحرير وهي الخاصة<br />
، RequestLive فعند إعطاء هذه الخاصة القيمة<br />
True يمكن التعامل<br />
Table تمام ًا .<br />
مع العنصر Query كما<br />
كنا نتعامل مع العنصر<br />
مثال<br />
2 :إذا أردنا إحضار حقول الجدول بالكامل نستخدم التعليمة<br />
* Select بدلا ً من ذكر أسماء الأعمدة ، عدل<br />
Select *<br />
From Passengers<br />
False إلى Query<br />
العبارة في المثال السابق<br />
)<br />
بعد أي تعديل على الخاصة<br />
داخل الخاصة SQL لتصبح بالشكل<br />
:<br />
SQL ستعود<br />
قيمة الخاصة<br />
Active للعنصر<br />
استخدام الشرط : Where<br />
تستخدم التعليمة<br />
Where داخل عبارة<br />
Select لتحقيق شروط معينة على البيانات التي<br />
سيحضرها الاستعلام .<br />
. 5<br />
مثال<br />
: 3 نريد عرض جميع حقول جدول المسافرين والذين أرقامهم أكبر من<br />
عدل التعليمات السابقة في الخاصة SQL لتصبح بالشكل<br />
مثال<br />
مثال<br />
مثال<br />
مثال<br />
Select *<br />
From Passengers<br />
Where PNo > 5<br />
:<br />
119<br />
: 4<br />
نريد عرض اسم المسافر الذي رقمه<br />
: 3<br />
: 5<br />
: 6<br />
نريد عرض جميع المسافرين الذين أرقامهم بين<br />
نريد عرض المسافرين الذين أرقامهم خارج المجال<br />
Select *<br />
From Passengers<br />
Where PNo = 3<br />
2 و : 5<br />
Select *<br />
From Passengers<br />
Where PNo Between 2 and 5 ;<br />
: 5 – 2<br />
Select *<br />
From Passengers<br />
Where PNo Not Between 2 and 5 ;<br />
:<br />
Select *<br />
: 7<br />
نريد عرض جميع المسافرين الذين اسمهم محمد
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
مثال<br />
مثال<br />
http://www.alshater.net<br />
From Passengers<br />
'محمد' = PName Where<br />
: 8<br />
نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م<br />
Select *<br />
From Passengers<br />
'%م' Where Pname Like<br />
: 9<br />
نريد عرض جميع المسافرين الذين يبدأ اسمهم بحرف م وطول اسمهم أربع أحرف<br />
تستخدم % في تعليمة Like للإشارة إلى عدد من الأحرف<br />
تستخدم<br />
م<br />
:<br />
Select *<br />
From Passengers<br />
Where Pname Like '____ '<br />
.<br />
_<br />
استخدام الترتيب<br />
في تعليمة Like للإشارة إلى حرف وحيد<br />
.<br />
: Order By<br />
تستخدم تعليمة Order by لترتيب البيانات حسب حقل محدد<br />
مثال<br />
مثال<br />
مثال<br />
:<br />
:10<br />
نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />
5 بحيث يظهر ترتيب الأسماء تصاعديا ً<br />
Select * From Passengers<br />
Where PNo > 5<br />
Order By PName<br />
5 بحيث يظهر ترتيب الأسماء تصاعديا ً<br />
Select * From Passengers<br />
Where PNo > 5<br />
Order By PName desc<br />
:10<br />
نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />
11 :نريد عرض جميع المسافرين والذين أرقامهم أكبر من<br />
ومن ثم لأ للجنسية )<br />
5 بحيث يتم ترتيب الجدول بالنسبة<br />
للأسماء أولا ً<br />
أي إذا تطابق اسمي مسافرين سيوضع ترتيبها في الجدول حسب ترتيب الجنسية أبجديا ً ( .<br />
Select * From Passengers<br />
Where PNo > 5<br />
Order By PName ,Nationality<br />
التوابع الجامعة في<br />
1 التابع<br />
مثال<br />
120<br />
: SQL<br />
: Count<br />
يعيد عدد السجلات التي تعيدها عبارة<br />
: Select<br />
:12<br />
لمعرفة عدد الرحلات المغادرة من مدينة حلب في جدول الرحلات<br />
سيظهر في الجدول حقل وحيد فيه عدد السجلات المغادرة من مدينة حلب ،عنوان هذا الحقل<br />
تغير هذا العنوان بتعديل تعليمة<br />
Select Count( * )<br />
From Trips<br />
'حلب' = GoFrom Where<br />
Count(*) ، يمكن<br />
Select Count( * ) as Total ….<br />
Select إلى
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
2 التابع : Sum يعيد هذا التابع مجموع سجلات حقل ما<br />
SQL التالية :<br />
Select Sum(CardCount)<br />
From Trips<br />
'حلب' = GoFrom Where<br />
مثال : 13<br />
لمعرفة مجموع بطاقات الرحلات المغادرة من حلب نستخدم عبارة<br />
3 التابع<br />
Avg :يعيد هذا التابع المعدل الوسطي لمعطيات سجلات حقل ما<br />
Select Avg(CardCount)<br />
Form Trips<br />
: 14 مثال<br />
لمعرفة المعدل الوسطي لعدد البطاقات الموجودة بالنسبة لعدد الرحلات<br />
4 التابع : Max يعيد هذا التابع أكبر قيمة في الحقل<br />
:<br />
Select Max(CardCount)<br />
From Trips<br />
مثال<br />
لمعرفة أكبر عدد للبطاقات في حقل<br />
CardCount<br />
: 15<br />
5 التابع<br />
: Min يعيد هذا التابع أصغر قيمة في حقل ما<br />
.<br />
عبارة : Group By<br />
تستخدم ضمن تعليمة<br />
Select لإجراء عمليات على البيانات وفرزها ضمن مجموعات وهي مرتبطة بشكل وثيق مع<br />
التوابع الجامعة :<br />
:<br />
مثال<br />
: 16 لإظهار عدد الرحلات<br />
المغادرة من كل مطار<br />
Select GoFrom ,Count(GoFrom)<br />
From Trips<br />
Group by GoFrom<br />
:<br />
مثال<br />
: 17 لمعرفة عدد البطاقات للرحل المغادرة من كل مطار<br />
Select GoFrom ,Sum(CardCount)<br />
From Trips<br />
Group by GoFrom<br />
Select<br />
ملاحظة :<br />
جميع الحقول الواردة في تعليمة<br />
يجب أن ترد في تعليمة<br />
Group By ما عدا الحقول التي<br />
تستخدم التعليمات الجامعة .<br />
عبارة : Having<br />
.<br />
تستخدم تعليمة<br />
Having بعد التعليمة<br />
Group By لوضع شروط على عملية فرز البيانات<br />
121<br />
مثال : 18<br />
لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها أكبر من<br />
. 10<br />
Select GoFrom ,Sum(CardCount)<br />
From Trips<br />
Group by GoFrom<br />
Having Sum( CardCount) > 10<br />
Null<br />
Select GoFrom ,Sum(CardCount)<br />
مثال : 19<br />
لمعرفة عدد البطاقات للرحل المغادرة من كل مطار والتي عدد بطاقاتها لا يساوي
http://www.alshater.net<br />
From Trips<br />
Group by GoFrom<br />
Having Sum( CardCount ) is not null<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
122
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة 20<br />
ربط الجداول :<br />
Where<br />
يمكن استخدام عبارة<br />
Select لإحضار بيانات من أكثر من جدول وبتطبيق بعض الشروط في عبارة<br />
نحصل على جداول مرتبة وأكثر فاعلية من الجداول التي يظهرها العنصر . Table<br />
Passengers و<br />
مثال 1:<br />
ربط الجدولين<br />
PassAndTrips لإظهار اسم المسافر بدلا ً من رقمه<br />
:<br />
SELECT Pname,TripNo,SeatNo,ClassNo<br />
FROM PassAndtrips, Passengers<br />
WHERE PassAndtrips.PNo = Passengers.PNo<br />
"<br />
تقوم هذه التعليمة بإحضار أسماء الأعمدة المختارة من جدولي المسافرين و "<br />
المسافرين والرحلات<br />
بتطبيق الشرط<br />
الأخير والذي يسمى شرط ربط الجداول )<br />
في حال تشابه اسم الحقل في جدولين نكتب اسم الجدول قبل اسم الحقل<br />
وبينهما نقطة Passengers.PNo<br />
: Trips و Passengers و PassAndTrips<br />
مثال<br />
2 :ربط الجداول<br />
بحيث يظهر جدول فيه اسم المسافر و اسم<br />
الشركة التي سيسافر معها وبلد المغادرة و رقم المقعد ورقم الصف<br />
التعليمة<br />
هي تعليمة تستخدم للربط بين الجداول حيث يمكن كتابة عبارة<br />
:<br />
SELECT Pname, Company, GoFrom, SeatNo, ClassNo<br />
FROM Passandtrips, Passengers, Trips<br />
WHERE (PassAndtrips.PNo = Passengers.PNo)<br />
AND (PassAndtrips.TripNo = Trips.TripNo)<br />
: Inner join<br />
ويمكن كتابة عبارة SQL للمثال الثاني بالشكل<br />
ملاحظات<br />
SQL<br />
للمثال الأول بالشكل<br />
:<br />
SELECT Pname, TripNo,SeatNo, ClassNo<br />
FROM PassAndtrips<br />
INNER JOIN Passengers<br />
ON (Passengers.PNo = PassAndtrips.PNo)<br />
SELECT Pname, company, SeatNo, ClassNo<br />
FROM Passandtrips<br />
INNER JOIN Passengers<br />
ON (Passengers.PNo = Passandtrips.PNo)<br />
INNER JOIN Trips<br />
ON (Trips.TripNo = Passandtrips.TripNo)<br />
:<br />
:<br />
SQL<br />
1 هناك عبارات أخرى للربط مثل Outer Join و Left Join و<br />
Right Join يمكنك مراجعة كتب<br />
للتعرف عليها.<br />
SQL منها :<br />
1 بالإضافة لعبارة<br />
SELECT يوجد عبارات أخرى في<br />
العبارة<br />
العمل<br />
إنشاء جدول<br />
Create Table<br />
123
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إدخال قيم إلى جدول<br />
تعديل قيم جدول<br />
حذف سجلات من جدول<br />
Insert<br />
Update<br />
Delete From<br />
للتعرف على هذه الأوامر راجع كتب SQL المختصة ....<br />
البرنامج : SQL Builder<br />
يستخدم هذا البرنامج لكتابة<br />
تعليمات<br />
SQL بشكل مرئي<br />
وتفاعلي وبكلام آخر هو عبارة<br />
عن أداة تسهل كتابة تعليمات<br />
SQL كما تمكننا من استعراض<br />
النتائج ...<br />
لتشغيل SQL Builder<br />
ضع<br />
عنصر<br />
Query على النموذج<br />
واضغط عليه بزر الفأرة اليمني<br />
واختر SQL Builder من<br />
القائمة ستظهر عندها النافذة المجاورة<br />
: 1 مثال<br />
لإظهار حقول من جدول الرحلات<br />
:<br />
1<br />
من القائمة المنسدلة Database اختر اسم قاعدة المعطيات Travel عندها ستظهر جميع الجداول ضمن هذه<br />
القاعدة في النافذة المجاورة Table اختر منها<br />
Trips.db<br />
2 ستظهر عندها نافذة صغيرة تحوي جميع حقول جدول الرحلات وبجوار هذه الحقول صناديق خيار ، بتحفيز<br />
هذه الصناديق يمكن اختيار الحقول التي ستظهر في الاستعلام<br />
)<br />
حدد بعضا ً من هذه الحقول<br />
. (<br />
3<br />
اضغط على الزر Execute SQL من إزارا السرعة ستلاحظ مباشرة نتائج الاستعلام والذي يمكنك<br />
قراءة تعليماته بالضغط على الزر SQL المجاور للزر السابق<br />
4 أغلق البرنامج<br />
.<br />
SQL Builder<br />
ستشاهد التعليمات ضمن الخاصة<br />
سيسألك البرنامج إذا كنت تريد حفظ التغيرات إلى الاستعلام ، إذا اخترت نعم<br />
SQL للعنصر<br />
Query بشكل تلقائي<br />
..<br />
مثال<br />
: لإظهار جميع الرحلات المغادرة من مطار حلب قم بما يلي<br />
: 2 تعليمة Where باستخدام SQL Builder<br />
:<br />
124
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
:<br />
...<br />
1 ادخل إلى البرنامج SQL Builder<br />
كما في السابق<br />
2 حدد جميع حقول الجدول<br />
Trips.db بالضغط على صندوق الخيار المجاور لأسم الجدول<br />
) ضمن النافذة<br />
الصغيرة ( .<br />
Field Value واختر =<br />
: (<br />
3 ضمن الصفحة ) Criteria<br />
معايير<br />
اختر Trips.Gofrom من العمود الأيسر<br />
. (<br />
)<br />
Field Value<br />
من العمود<br />
Compare واكتب في العمود الأيمن<br />
حلب الكلمة<br />
...<br />
4 شاهد عبارة<br />
SQL ثم نفذها<br />
.<br />
:<br />
مثال 3<br />
سنضيف شرط جديد على المثال السابق وهو إظهار الرحلات التي غادرت حلب باتجاه القاهرة<br />
Compare<br />
في السطر التالي للشرط السابق اختر من العمود الأيسر<br />
Trips.ArriveTo واختر = من العمود<br />
1<br />
. (<br />
واكتب في العمود الأيمن )<br />
القاهرة<br />
تغير عناوين الحقول<br />
: يق SQL Builder اختر الصفحة Selection ستشاهد فيها جميع الحقول التي قمت<br />
)<br />
(<br />
Field<br />
)<br />
باختيارها من الجدول<br />
Trip يمكنك حيث يظهر في العمود الأيمن<br />
اسم الحقل ويظهر العمود الأيسر<br />
عنوان الحقل يمكنك في هذا القسم كتابة عنوان للحقل<br />
يمكنك استخدام ال<strong>لغة</strong> العربية<br />
،( يظهر<br />
(<br />
)<br />
( Output Name<br />
،<br />
( Query<br />
عنوان الحقل في القسم اسم الحقل في العنصر<br />
DBGrid المرتبط مع العنصر<br />
.<br />
نفذ عبارة<br />
SQL لتلاحظ النتائج<br />
ترتيب حقول الجدول :<br />
SQL Builder نختار<br />
وجدنا أن تعليمة<br />
Order By تستخدم لترتيب الجدول و لكتابة هذه التعليمة باستخدام<br />
الصفحة<br />
Sorting حيث تظهر في القسم الأيسر جميع الحقول المختارة من الجدول ، حدد أحد هذه الحقول واضغط<br />
على الزر<br />
Add ليضاف اسمه إلى القسم الأيمن من الصفحة<br />
، يمكنك إضافة أكثر من حقل كما<br />
( Sorted by<br />
)<br />
يمكنك تحديد طريقة الترتيب<br />
تصاعدي أم تنازلي<br />
باختيار الحقل في القسم<br />
Sorted By والضغط على أحد<br />
(<br />
)<br />
الزرين AZ أو Z A قي الوسط ....<br />
التجميع وشروط التجميع :Group by …Having<br />
.<br />
Group Criteria و Grouping<br />
يمكنك كتابة التعليمات Group by و Having<br />
باستخدام الصفحتين<br />
ربط الجداول باستخدام : SQL Builder<br />
حل المثال الأول :<br />
افتح البرنامج<br />
عن طريق الضغط بزر الفأرة اليميني على عنصر<br />
( Query اختر القاعدة<br />
) SQL Builder<br />
Travel واختر الجدول<br />
PassAndTrips ومن اللائحة<br />
Table ومن ثم اختر الجدول<br />
Passenegers من نفس<br />
اللائحة :<br />
Passengers<br />
ستظهر عندها نافذتي الجدولين ، اضغط بزر الفأرة الأيسر على الحقل<br />
PNo في نافذة الجدول<br />
وحرك يدك باتجاه الحقل<br />
PNo في نافذة الجدول<br />
PassAndTrips مع إبقاء الزر مضغوطا ً ، حرر زر الفأرة فوق<br />
الحقل<br />
PNo تماما ً ، سيظهر عندها خط يصل بين النافذتين دليل على عملية الربط<br />
) اختر بعض الحقول من<br />
الجدولين وشاهد النافذة<br />
SQL للمشاهدة التعليمات<br />
. (<br />
125
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
Trips<br />
لحل المثال الثاني :<br />
أضف الجدول<br />
من اللائحة<br />
Table ستظهر عندها نافذة الجدول<br />
Trips وبنفس الطريقة<br />
...<br />
:<br />
السابقة اربط بين الحقلين<br />
الاستفسارات الديناميكية<br />
TripNo في الجدولين<br />
(<br />
جميع الاستفسارات التي أجرينها حتى الآن تدعى استفسارات )<br />
استعلامات<br />
ستاتيكية وذلك لأنها شروطها تكون<br />
محددة أثناء التصميم فمثلا ً في المثال الذي بحثنا فيه عن الرحلات المغادرة من مطار حلب كتبنا العبارة<br />
'حلب<br />
' = GoFrom ، Where من الملاحظ أن هذا الاستفسار يعيد دائما ً الرحلات المغادرة من حلب ولا يستطيع<br />
المستخدم البحث عن الرحلات المغادرة من دمشق دون العودة إلى البرنامج إلى وضع التصميم و تغيير كلمة حلب<br />
إلى دمشق ...<br />
لذلك زودتنا <strong>دلفي</strong> بما يسمى بالاستفسارات الديناميكية والتي تمكن المستخدم<br />
من إعطاء الشرط أثناء التنفيذ وذلك عن<br />
طريق تعديل الشرط السابق بالشكل Where GoFrom = :ParamName حيث<br />
Query يعطى قيمة ما أثناء التنفيذ<br />
ParamName وسيط للعنصر<br />
.<br />
:<br />
مثال :<br />
إحضار معلومات من جدول الرحلات عن الرحلات المغادرة من بلد يحدده المستخدم<br />
ابدأ مشروعا ً جديد ًا وأضف عنصر<br />
Query و عنصر<br />
DataSource و عنصر<br />
DBGrid بالإضافة إلى عنصر<br />
Button و زر Edit<br />
اربط العناصر مع بعضها كالعادة<br />
حيث<br />
واكتب العبارة التالية في الخاصة<br />
للعنصر Query1 SQL<br />
...<br />
SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount<br />
FROM Trips<br />
Where GoFrom =:CityName<br />
)<br />
CityName هي عبارة عن وسيط ستمرر قيمته إلى العنصر<br />
. ( Button1<br />
Query1 أثناء التنفيذ<br />
عند الضغط على الزر<br />
، Edit Query1.Params<br />
...<br />
حدد الخاصة Params للعنصر<br />
Query1 واضغط على الزر المنقط<br />
لتظهر النافذة<br />
Data Type<br />
حدد الوسيط<br />
CityName من هذه النافذة<br />
لتظهر خواصه في محرر الخواص ومن ثم غير الخاصة<br />
إلى القيمة . ftString<br />
:<br />
في حدث الضغط على الزر<br />
Button1 اكتب التعليمات التالية<br />
query1.Close;<br />
query1.ParamByName('cityName').Value := edit1.Text;<br />
query1.Open<br />
( ... )<br />
نفذ البرنامج واكتب في العنصر<br />
Edit1 اسم البلد الذي تريد<br />
حلب ، دمشق<br />
واضغط على الزر ليحضر<br />
الاستعلام جميع الرحلات المغادرة من هذا البلد .<br />
مثال : 2<br />
يمكنك الاستعلام عن رقم الرحلة بشكل ديناميكي عن طريق الاستفسار التالي<br />
:<br />
SELECT Company, TripNo, GoFrom, ArriveTo, GoTime, ArriveTime, CardCount<br />
FROM Trips<br />
126
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
في النافذة<br />
http://www.alshater.net<br />
Where TripNo =: TripNumber ;<br />
. ftInteger إلى DataType<br />
Edit Query1.Params حدد الوسيط<br />
وفي حدث الضغط على الزر اكتب التعليمة التالية<br />
ملاحظة<br />
TripNumber وغير الخاصة<br />
:<br />
query1.Close;<br />
query1.ParamByName('TripNumber').Value := strtoint (edit1.Text) ;<br />
query1.Open ;<br />
:<br />
SQL Builder لا يدعم الوسطاء<br />
أردت التعديل في العبارة فعليك حذف الوسيط والدخول إلى البرنامج<br />
الخروج من البرنامج<br />
مناهج العنصر<br />
، Parameter ولا يمكن فتح البرنامج بعد إضافة وسيط إلى عبارة<br />
SQL وإذا<br />
.<br />
: Query<br />
جميع المناهج التي استخدمناها مع العنصر<br />
Table يمكن استخدامها مع العنصر<br />
SQL Builder ومن ثم إعادة الوسيط عند<br />
Query مثل ) Locate و<br />
( .... First و Eof و Bof و Lookup<br />
إلا أن العنصر Query لا يستخدم اسلوبي البحث<br />
FindNearest وذلك لأن الجداول التي يعيدها العنصر Query لا تعتمد على مفتاح أساسي<br />
مثال هام<br />
FindKey و<br />
..<br />
:<br />
ليكن قاعدة بيانات لشركة ما Company وليكن لدينا جدول الموظفين<br />
رقم<br />
الموظف<br />
Employees التالي :<br />
EmpNo<br />
10<br />
16<br />
20<br />
30<br />
اسم الموظف<br />
EmpName<br />
رقم المدير<br />
ManagerNo<br />
رقم الفرع<br />
Department_id<br />
تاريخ المباشرة<br />
Hiredate<br />
الراتب<br />
Salary<br />
9000<br />
12500<br />
11000<br />
14000<br />
10/1/2002<br />
06/08/2000<br />
09/01/2001<br />
05/07/2000<br />
3<br />
2<br />
3<br />
2<br />
200<br />
300<br />
100<br />
100<br />
Sara<br />
kala<br />
Dani<br />
Wleed<br />
أنشئ هذا الجدول باستخدام<br />
Database Desktop وأدخل البيانات إليه<br />
:<br />
ابدأ مشروعا ً جديدا ً وأضف إليه العناصر اللازمة كما في الشكل<br />
:<br />
127
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أربط العنصرين DBGrid و<br />
DBNavigator مع العنصر<br />
DataSource وسنقوم بربط<br />
DataSource مع ال<br />
Query أثناء التنفيذ .<br />
:<br />
كما تلاحظ لدينا ست عناصر<br />
Query وفيما يلي تعليمات<br />
SQL لكل منها<br />
Name للعنصر Query1 القيمة<br />
استعلام البحث عن موظف :<br />
أعط الخاصة<br />
QryEmpNo و اكتب<br />
1<br />
Select * from employees Where EmpNo = : No<br />
Name للعنصر Query2 القيمة<br />
التعليمات التالية في الخاصة : SQL<br />
2 استعلام البحث عن اسم موظف<br />
:أعط الخاصة<br />
QryEmpName وكتب في<br />
Select * from employees Where EmpName =:name<br />
Name للعنصر Query3 القيمة<br />
(<br />
استعلام الرواتب : )<br />
يعطي الرواتب التي بين قيمتين<br />
أعط الخاصة<br />
: SQl<br />
3<br />
Select * from Employees Where salary between :mn and :mx<br />
QryHireDate القيمة للعنصر Query4 Name<br />
Select * from Employees Where hiredate between :b and :e<br />
Name للعنصر Query5 القيمة<br />
Select Department_id ,sum(salary ) form employees<br />
Group by DepartMent_id<br />
128<br />
:<br />
... QrySal<br />
4 استعلام تاريخ المباشرة<br />
أعط الخاصة<br />
5 استعلام حساب مجموع الرواتب في كل قسم: أعط الخاصة<br />
QrysumsalaryByDepartment
http://www.alshater.net<br />
Name للعنصر Query6 القيمة<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
استعلام البحث عن الموظفين الذين يتبعون لمدير معين<br />
أعط الخاصة<br />
QryManager:<br />
Select Empname From employees Where managerNo = :mno<br />
وفيما يلي نستعرض أحداث الضغط على الأزرار :<br />
(<br />
)<br />
QryEmpNo.Close;<br />
DataSource1.DataSet := QryEmpNo ;<br />
QryEmpNo.ParamByName ( 'No') .value := Strtoint ( Edit1.text ) ;<br />
QryEmpNo.Open;<br />
: (<br />
)<br />
QryEmpName.Close ;<br />
DataSource1.DataSat := QryEmpName ;<br />
QryEmpName.ParamesByName ( 'Name').Value := Edit2.text ;<br />
QryEmpName.Open ;<br />
(<br />
)<br />
QrySal.Close ;<br />
DataSource1.DataSat := QrySal ;<br />
QrySal.ParamByName( ' mn') .Value := strtoint ( edit3.text ) ;<br />
QrySal.ParamByName( ' mx') .Value := strtoint ( edit4.text ) ;<br />
QrySal.Open ;<br />
: (<br />
)<br />
QryHireDate.Close ;<br />
DataSource1.DataSat := QryHireDate;<br />
QryHireDate.ParamByName ( 'b').asdate := datetimepicker1.date;<br />
QryHireDate.ParamByName ( 'e').asdate := datetimepicker2.date;<br />
QryHireDate.Open ;<br />
: (<br />
QrysumsalaryByDepartment.Close ;<br />
DataSource1.DataSat := QrysumsalaryByDepartment;<br />
QrysumsalaryByDepartment.Open ;<br />
: (<br />
)<br />
6<br />
1 حدث الضغط على الزر<br />
2 حدث الضغط على الزر<br />
3 حدث الضغط على الزر<br />
4 حدث الضغط على الزر<br />
5 حدث الضغط على<br />
بحث عن اسم الموظف<br />
ابحث عن اسم الموظف<br />
استعلام الرواتب<br />
استعلام التاريخ<br />
) مجموع الرواتب في كل قسم<br />
6 حدث الضغط على الزر<br />
موظفي المدير<br />
QryManager.Close ;<br />
DataSource1.DataSat := QryManager;<br />
QryManager.ParamByName ( 'mno').Value := strtoint ( Edit5.text ) ;<br />
QryManager.Open ;<br />
While not QryManager.eof Do<br />
Begin<br />
Showmessage (QryManager.fieldByName ('EmpName').Value ) ;<br />
QryManager.Next ;<br />
End;<br />
129
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
سيظهر هذا الحدث اسم أول موظف يأتي به الاستعلام وعند الضغط على<br />
Ok سيظهر اسم الموظف التالي وهكذا<br />
130
http://www.alshater.net<br />
21<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
إنشاء الجداول ببرنامج<br />
:Access<br />
افتح برنامج Access XP (وهو أحد تطبيقات<br />
يختلف الأمر كثير ًا<br />
،(Microsoft Office XP<br />
- يمكن استخدام<br />
office 2003 فلا<br />
-<br />
ومن قائمة "ملف ّ"<br />
جانب واجهة التطبيق كما في الصورة التالية:<br />
..New اختر "جديد" File<br />
ستظهر لك نافذة "ملف ّ جديد"<br />
New File في<br />
تحت شريط "جديد" اضغط الأمر "قاعدة بيانات فارغة".. سيظهر لك مربع حوار "حفظ ملف ّ" يطلب منك تحديد اسم<br />
قاعدة البيانات وموقع حفظها على الجهاز.. غير اسم قاعدة البيانات من الاسم الافتراضي إلى<br />
بحفظها في الموضع الذي تريده.<br />
ملاحظات<br />
،"Books.mdb" وقم<br />
:<br />
تخزن قاعدة بيانات أكسيس في ملف واحد من امتداد .Mdb على عكس قاعدة بيانات باردوكس التي تعتمد ملف<br />
مستقل لكل جدول أو فهرس<br />
....<br />
ليست هناك اختلافات كبيرة بين<br />
Access XP و Access 2000 و<br />
يمكنك أن تتبع معنا هذه الخطوات على أي من هذه النسخ.<br />
Access 97 فيما يتعل ّق بإنشاء الجداول، لهذا<br />
بعد إغلاق مربع الحوار ستظهر لك نافذة قاعدة البيانات كما<br />
في الصورة التالية:<br />
131
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
انقر الأمر<br />
"إنشاء جدول في طريقة عرض التصميم"<br />
مرتين بالفأرة..<br />
ستظهر لك نافذة تصميم الجدول كما في<br />
الصورة التالية:<br />
الآن كلّ ما عليك هو كتابة أسماء الحقول وتحديد نوعية البيانات في كلّ منها..<br />
تعالَ نبدأ بتصميم جدول أسماء<br />
المؤل ّفين..<br />
هذا الجدول سيتكون من العمودين التاليين:<br />
اسم الحقل<br />
نوع البيانات<br />
ترقيم تلقائي<br />
نص<br />
الوصف<br />
المفتاح الرئيسي لهذا الجدول<br />
اسم المؤل ّف<br />
ID<br />
Author<br />
بعد أن تنشئ هذه الأعمدة، اضغط بزر الفأرة الأيمن على المربع الرمادي الموجود على يمين الحقل ،ID ومن<br />
القائمة الموضعية اضغط<br />
"مفتاح أساسي"<br />
وذلك لجعل هذا الحقل مفتاحا أساسيا للجدول.<br />
ستلاحظ ظهور رمز المفتاح أمام هذا الحقل..<br />
ستلاحظ كذلك أن خاصية<br />
"مفهرس"<br />
Indexed في المنطقة السفلى<br />
من النافذة ستتحول إلى<br />
"نعم بدون<br />
تكرار"، وهو شيء متوق ّع، فلقد اتفق ّنا أن قيم المفتاح الأساسي غير قابلة للتكرار.<br />
شيء آخر..<br />
اضغط بالفأرة على حقل اسم المؤل ّف<br />
،Author وفي المنطقة السفلى من النافذة غير قيمة خاصية<br />
20 حرفا.<br />
"حجم الحقل"<br />
إلى<br />
30 بدلا من<br />
50، بافتراض أن أطول اسم لمؤل ّف لن يزيد عن<br />
Authors<br />
الآن اضغط<br />
Ctrl+S لحفظ الجدول..<br />
سيظهر لك مربع إدخال يطالبك بإدخال اسم الجدول..<br />
سمه<br />
واضغط زر .OK<br />
ملحوظة:<br />
سم الجداول والأعمدة بأسماء أجنبية، وذلك لأن هذه الأسماء ستدخل في كتابة الكود في<br />
،VB وسيكون من المرهق<br />
الانتقال من الإنجليزية إلى العربية والعكس أكثر من مرة أثناء كتابة الكود.<br />
132
http://www.alshater.net<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الآن لو أغلقت نافذة التصميم، فستجد أن الجدول Authors قد أضيف إلى نافذة قاعدة البيانات.. انقره مرتين<br />
بالفأرة.. ستجد أن نافذة جديدة قد فتحت، تعرض لك جدول المؤل ّفين.. أدخل البيانات التالية:<br />
توفيق الحكيم<br />
عباس العقاد<br />
محمد عبد الحليم عبد االله<br />
نبيل فاروق<br />
أحمد خالد توفيق<br />
محمد حمدي غانم<br />
منصور<br />
راتب<br />
عقل<br />
بنفس الطريقة صمم جدول الكتب كالتالي:<br />
اسم الحقل<br />
نوع البيانات<br />
ترقيم تلقائي<br />
نص<br />
نص<br />
الوصف<br />
المفتاح الرئيسي لهذا الجدول.<br />
اسم الكتاب<br />
رقم المؤل ّف<br />
ID<br />
Book<br />
AuthorID<br />
احفظ هذا الجدول باسم<br />
،Books وأدخل فيه البيانات التالية:<br />
AuthorID<br />
1<br />
1<br />
1<br />
2<br />
2<br />
2<br />
3<br />
4<br />
4<br />
Book<br />
أرني االله<br />
يوميّات نائب في الأرياف<br />
عصا الحكيم<br />
سارة<br />
عبقرية محمد<br />
عبقرية عمر<br />
شجرة اللبلاب<br />
مهنتي القتل<br />
الأفق الأخضر<br />
133<br />
ID<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
5<br />
5<br />
5<br />
6<br />
6<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
أسطورة الغرباء<br />
العاشر<br />
لا تدخلوا شيرود<br />
مجرد طريقة للتفكير<br />
حائرة في الحب<br />
بين قوسين من الخلود<br />
حياتي<br />
حياتي<br />
حياتي<br />
إنشاء علاقة بين جدولي المؤل ّفين والكتب:<br />
أعتقد أن ّك متشوق لمعرفة كيفية ربط حقلي رقم المؤل ّف بين الجدولين لتحقيق التكامل المرجعي<br />
Integration بين الجدولين.. ستجد الأمر غاية ً في البساطة:<br />
من قائمة أدوات Tools اضغط الأمر "علاقات"<br />
الصورة التالية:<br />
Referential<br />
..Relationships<br />
ستظهر لك نافذة "إظهار جدول" الموضحة في<br />
اختر كلّ جدول واضغط زر<br />
"إضافة"..<br />
بعد أن تضيف الجدولين أغلق هذه النافذة..<br />
ستبدو لك نافذة العلاقات<br />
كالتالي:<br />
134
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
حيث يظهر كلّ جدول كمستطيل عليه عنوان الجدول، وبه أسماء أعمدته.<br />
ولإنشاء علاقة بين الجدولين، اسحب حقل ID بالفأرة من جدول المؤل ّفين، وتحرك بالفأرة إلى الحقل AuthorID<br />
في جدول الكتب.. ستلاحظ تغير شكل مؤش ّر الفأرة.. اترك زر<br />
الفأرة الأيسر فوق هذا الحقل.. هنا ستظهر لك نافذة<br />
:<br />
إنشاء العلاقة بين الحقلين:<br />
اضغط اختيار "فرض التكامل المرجعي"<br />
Enforce Referential<br />
،Integrity لتقوم قاعدة البيانات آليا بالتحق ّق من صحة البيانات بين<br />
الجدولين.. وفي هذا الصدد لديك اختياران:<br />
تتالي تحديث الحقول المرتبطة<br />
Cascade Update Related<br />
:Fields<br />
فمثلا، لو غيرت رقم (توفيق الحكيم) من<br />
الكتب التي أل ّفها إلى<br />
1 إلى<br />
.10<br />
10، فسيتم تغيير رقم المؤل ّف AuthorID تلقائيا في سجلات كلّ<br />
ملحوظة:لن تستطيع تغيير قيمة رقم المؤل ّف ID في جدول المؤل ّفين، لأن ّه ترقيم تلقائي.. ولو أردت تغييره، فعليك<br />
بتغيير نوع الحقل من ترقيم تلقائي إلى رقم، على أن يكون هذا قبل إنشاء العلاقة، لأن ّه من غير المسموح تغيير نوع<br />
بيانات حقل داخل في علاقة.<br />
تتالي حذف السجلات المرتبطة<br />
:Cascade Delete Related Fields<br />
فمثلا، لو حذفت سجلّ (نبيل فاروق) من جدول المؤل ّفين، يتم حذف كلّ كتب<br />
اضغط زر "إنشاء" لإغلاق هذه النافذة.<br />
الآن سيظهر خط ّ يربط الجدولين كالتالي:<br />
(نبيل فاروق)<br />
تلقائيا من جدول الكتب.<br />
ولو أردت حذف هذه العلاقة، فاضغط الخط ّ بزر الفأرة الأيمن، ومن القائمة الموضعية اختر "حذف".<br />
قم بحفظ التغييرات، وأغلق نافذة العلاقات.. افتح الآن جدول المؤل ّفين.. ستلاحظ ظهور علامة<br />
حقل.. اضغط أيا منها، وليكن (توفيق الحكيم).. ستجد أن علامة<br />
"+"<br />
"+"<br />
يحتوي على الكتب التي أل ّفها توفيق الحكيم قد ظهر.. ولإخفائه ثانية ً أعد ضغط علامة<br />
بجوار كلّ<br />
تحولت إلى علامة "-"، وأن جدولا صغيرا<br />
."-"<br />
135
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ويمكنك إدخال المزيد من كتب<br />
(توفيق الحكيم) في هذا الجدول الفرعي، دون أن ت ُدخل رقمه في خانة AuthorID<br />
في كلّ مرة، إذ ستتم كتابة هذا الرقم آليا، مما يوف ّر لك الوقت ويعفيك من احتمالات الخطأ.<br />
ربط قواعد البيانات أكسيس مع عناصر BDE في <strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
وجدنا أنه تمكنا من ربط قاعدة البيانات Paradox مع العنصر<br />
Table في الخاصة<br />
البديل<br />
DataBaseName للعنصر عن طريق الاسم<br />
:<br />
Alias<br />
الذي تم إنشائه بواسطة البرنامج<br />
Database<br />
Desktop والسؤال المطروح هنا كيف يمكن أن نربط بين العنصر<br />
Table وجدول بيانات أكسيس<br />
:<br />
1 افتح لوحة التحكم في ويندوز واختر<br />
Adminstrative Tools →ODBC Data Sources<br />
ستظهر لك النافذة التالية<br />
اختر منها الصفحة<br />
System DNS<br />
2 اضغط على الزر Add لتظهر النافذة التالية<br />
اختر منها<br />
واضغط على الزر<br />
:<br />
Microsoft Access Driver ( *.mdb)<br />
. Finish<br />
3 تظهر عندها النافذة التالية<br />
:<br />
اكتب في القسم<br />
Data<br />
Source Name القيمة<br />
، Library واضغط بعدها على الزر<br />
136
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
( Books.mdb<br />
Select واختر قاعدة ملف قاعدة البيانات أكسيس )<br />
بعد تحديد الفهرس التي وضعته فيه ، اضغط<br />
بعدها على الزر Ok<br />
واخرج من . ODBC Data Source<br />
4 افتح البرنامج<br />
BDE Administrator من لوحة التحكم أو عن طريق<br />
Start Program Borland <strong>Delphi</strong> BDE Administrator<br />
مهمة هذا البرنامج هي تعريف ال Alias والتحكم في خصائص قواعد البيانات المستخدمة على الجهاز .<br />
حدد قاعدة البيانات<br />
Library من الصفحة<br />
، Database فتظهر خواص هذه القاعدة في<br />
الصفحة اليمينية ، Definition أكتب في<br />
الخاصة Database Name مسار قاعدة<br />
البيانات<br />
Books.mdb أو حدده عن طريق<br />
،<br />
الضغط على الزر ذو ...<br />
أغلق البرنامج BDE Administrator<br />
واضغط على الزر<br />
Yes عندما يطالبك بحفظ<br />
التغيرات .<br />
5 الآن يمكنك ربط قاعدة البيانات<br />
Library مع العنصر<br />
Table أو Query واستخدامها كما وجدنا في الأمثلة<br />
السابقة .<br />
ملاحظة :<br />
يمكن استخدام البرنامج لإضافة اسم بديل<br />
Alias لقاعدة بيانات<br />
Paradox وذلك باختيار الأمر New من القائمة<br />
Object ومثل اختيار النوع<br />
Standard ومن ثم تحديد كتابة الاسم البديل للقاعدة وتحديد مسارها في صفحة<br />
الخصائص .<br />
: بعد أن تعرفنا عن طريقة ربط قواعد البيانات بواسطة محرك قواعد بيانات ، Borland<br />
الصفحة ADO<br />
سنتعرف الآن على كيفية ربط البيانات مع محرك قواعد بيانات مايكروسوفت .<br />
تعتبر ADO أحدث من<br />
BDE وتستخدم خوارزميات أسرع في البحث والتعديل ، كما تقدم طرق قوية لربط قواعد<br />
معطيات موزعة مثل قواعد بيانات Oracle أو SQL Server<br />
:<br />
مثال :<br />
ربط قاعدة بيانات المكتبة بواسطة ADO<br />
ابدأ مشروعا ً جديدا ً واضف إلى النموذج العناصر التالية<br />
:<br />
137
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ADOTable من الصفحة ADO وأضف إليه أيضا ً العناصر DataSource و<br />
، ADOConnection<br />
. DBNavigator و DBGrid<br />
اضغط مرتين على العنصر<br />
ADOConnection لتظهر النافذة التالية :<br />
اختر زر الراديو Use Connection String<br />
Build<br />
:<br />
واضغط على الزر<br />
لتظهر النافذة التالية<br />
اختر من القائمة Microsoft Jet 4.0 OLE Db Provider<br />
واضغط على . Next<br />
ملاحظة<br />
إذا كنت تستخدم قاعدة بيانات<br />
Oracle فاختر<br />
:<br />
Microsoft OLE DB Provider for Oracle<br />
عند الضغط على<br />
Next تظهر الصفحة<br />
Connection في القسم<br />
Select Or Enter Database Name أدخل ملف قاعدة معطيات<br />
الكتب<br />
اضغط بعدها على الزر Ok لإنهاء المعالج<br />
138
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
:<br />
حدد الآن العنصر<br />
ADOTable1 وأعطه الخصائص التالية<br />
Authorsِ أعطها القيمة TableName<br />
الخاصة<br />
Connection أعطها القيمة<br />
ADOConnection1 و الخاصة<br />
والخاصة Active القيمة True<br />
أعط الخاصة DataSet للعنصر DataSource القيمة ADOTable1<br />
أعط الخاصة Datasource للعنصرين DBGrid1 و DBNavigator1 القيمة . DataSource1<br />
نفذ البرنامج ولاحظ النتائج .<br />
بنفس الطريقة يمكن ربط<br />
SQLConnection لاستخدام <strong>لغة</strong><br />
SQL في محرك ، ADO كما يمكننا استخدام نفس<br />
مناهج العنصرين<br />
Query للتعامل مع هذه العناصر<br />
.<br />
Table و<br />
139
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة 22<br />
:<br />
:<br />
برنامج دليل الهاتف<br />
1 قاعدة البيانات<br />
قبل الشروع بكتابة البرنامج علينا تحديد قاعدة البيانات المطلوبة وتحديد عدد الجداول وطرق الربط بين الجداول<br />
ونوعية البيانات والفهارس المطلوبة ...<br />
في برنامج دليل الهاتف سنحتاج إلى جدول واحد وهو<br />
s<br />
City<br />
Country<br />
Web<br />
Email<br />
Fax<br />
Mobil<br />
WPhon<br />
HPhon<br />
LName<br />
FName<br />
Num<br />
الاسم رقم<br />
الكنية<br />
هاتف<br />
هاتف<br />
الهاتف<br />
الفاكس<br />
البريد<br />
موقع<br />
الدولة<br />
المدينة<br />
المنزل<br />
العمل<br />
الخلوي<br />
الإلكتروني<br />
الانترنت<br />
)<br />
A(15)<br />
A(15)<br />
A(40)<br />
A(40)<br />
A(15)<br />
A(15)<br />
A(15)<br />
A(15)<br />
A(15)<br />
A(15)<br />
+<br />
حيث الحقل Num هو حقل مفتاح رئيسي .<br />
.<br />
سنحتاج أيضا ً إلى تعريف فهرسين ثانويين الأول لترتيب الجدول حسب الاسم والثاني لترتيب الجدول حسب الكنية<br />
وللبدء بإنشاء القاعدة :<br />
1 أنشئ المجلد<br />
MyPhon على القرص C وأنشئ داخله المجلد<br />
، Data حيث سنقوم بتخزين ملفات قاعدة<br />
البيانات في المجلد<br />
Data وسنخزن ملفات البرنامج في المجلد<br />
Data (حاول دائما ً أن تضع ملفات قاعدة البيانات في<br />
مجلد منفصل وخاصة إذا كانت القاعدة تتألف من عدد من الملفات كما في قاعدة البيانات . Paradox<br />
BDE باستخدام C:\MyPhon\Data<br />
2 أنشئ اسم بديل Alias باسم<br />
Myphon ليشير إلى المجلد<br />
.<br />
Database Desktop أو باستخدام البرنامج Administrator<br />
أنشئ الجدول السابق في البرنامج<br />
Database Desktop باستخدام قاعدة البيانات<br />
Paradox و لا تنس إنشاء<br />
3<br />
الفهارس الثانوية كما يلي :<br />
Define<br />
أ اختر Secondary Indexes من اللائحة Table properties<br />
واضغط على الزر<br />
وأضف الحقلين<br />
Lname على الترتيب واضغط على<br />
Ok وأعط اسم للفهرس<br />
Fname و<br />
. FNameIndex<br />
ب اضغط على<br />
Define مرة أخرى وأضف الحقلين<br />
FName على الترتيب<br />
.... وأعط<br />
Lname و<br />
الفهرس اسم . LNameIndex<br />
أحفظ الجدول باسم<br />
Phonebook ضمن الاسم البديل<br />
Alias الذي أنشأته سابقا ً<br />
MyPhon أو داخل المجلد<br />
4<br />
. C:\MyPhon\Data<br />
بهذا نكون قد أنشأنا قاعدة البيانات وسننتقل إلى المرحلة الثانية :<br />
2 كتابة البرنامج :<br />
قبل الشروع بكتابة البرنامج يجب عليك أن تملك تصورا ً كاملا ً للشكل الذي تريد للبرنامج أن يظهر عليه ، ما هو<br />
شكل النافذة الرئيسية وماهي العناصر التي ستتوضع عليها وما هي النوافذ الأخرى الواجب وضعها في البرنامج<br />
)<br />
140
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
بكلمات أخرى ، أمسك ورقة وقلم وحاول أن ترسم ما تريد أن تفعله وما هو المطلوب من البرنامج أن يقدمه<br />
http://www.alshater.net<br />
، (<br />
حدد ما هي النقاط الأصعب في البرنامج وهل هي لعدم خبرتك البرمجية في التعامل مع هذه النقاط أو لعدم قدرة<br />
<strong>لغة</strong> <strong>البرمجة</strong> على تقديم ما تطلبه<br />
) عمليا ً <strong>لغة</strong> <strong>البرمجة</strong> عالية المستوى لا تكون قاصرة عن أداء شيئ معين ولكن<br />
على المبرمج أن يبحث كثيرا ً لتعلم كيفية التعامل مع مواضيع معينه<br />
، سأورد الآن بعض الأمثلة على هذه<br />
(<br />
المشاكل ، تصور أن المستخدم طلب أن<br />
يكون برنامجه قادرا ً على طباعة حقول معينة وأنت حتى الآن لم تتعلم<br />
شيئا ً عن الطباعة ستكون هنا الآن أمام طريقين :<br />
الأول:<br />
البدء بكتابة البرنامج وتعلم الطباعة عند الوصول إلى النقاط التي تحتاج الطباعة في البرنامج<br />
) عمليا ً يترك<br />
هذا النوع من المبرمجين النقاط الصعبة حتى آخر نقطة من البرنامج ( .<br />
.<br />
الثاني :<br />
تعلم الطباعة والتعرف على إمكانيات الطباعة التي تقدمها <strong>لغة</strong> <strong>البرمجة</strong> ومن ثم الشروع بكتابة البرنامج<br />
المشكلة في الطريق الأول<br />
تصور أنك عرفت بعض الحقول من النوع مذكرة<br />
Memo ثم اكتشفت أن <strong>لغة</strong> <strong>البرمجة</strong><br />
:<br />
لا تستطيع أن تطبع الحقول من نوع<br />
Memo أو على الأقل لا تستطيع طباعتها بالشكل الذي تريده ، ماذا ستفعل<br />
الآن ، إما أن تقوم بكتابة خوارزميات جديدة للطباعة وهذا صعب جدا ً بالنسبة لمبرمج عادي أو العودة إلى قاعدة<br />
البيانات وتحويل نوع هذه الحقول إلى النوع نص Alpha<br />
وبالتالي العودة إلى النماذج وتعديلها أيضا ً لملائمة التغيرات في القاعدة الأمر الذي قد يضطرك أحيانا ً لكتابة<br />
البرنامج من جديد .<br />
الطريقة الثانية هي الطريقة الأفضل وربما هي الطريقة الوحيدة التي تجعلك تنهي ما بدأت بالشكل الذي تريد .<br />
.<br />
والقاعدة هي :<br />
ابدأ أولا ً من أصعب النقاط وحاول حلها حتى تستطيع الوصول إلى النهاية<br />
سننشئ الآن النافذة الرئيسية والتي ستظهر بالشكل :<br />
أضف الآن العناصر التالية<br />
:<br />
141
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
1 أعط النموذج الأول الخصائص التالية<br />
الخاصة<br />
القيمة<br />
:<br />
bdRightToLeft<br />
BiDiMode<br />
Caption<br />
Hieght<br />
Width<br />
Position<br />
برنامج دليل الهاتف<br />
470<br />
750<br />
poScreenCenter<br />
2 أضف العنصر<br />
TabControl من الصفحة<br />
Win32<br />
وأعطه الخصائص التالية<br />
:<br />
alTop<br />
True<br />
tsButtons<br />
أكتب الحروف الأبجدية من أ إلى ي وكل حرف في سطر<br />
True<br />
Align<br />
MultiLine<br />
Style<br />
Tabs<br />
HotTrack<br />
3 أضف العنصر Panel من الصفحة<br />
: Panel<br />
142<br />
Standard<br />
alClient<br />
Align<br />
bvLowered Bevelinner<br />
bvRaised BevelOuter<br />
'' فراغ<br />
Caption<br />
4 العنصر<br />
: Table<br />
MyPhone DatabaseName<br />
Phonebook TableName<br />
FnameIndex IndexName<br />
True<br />
Active<br />
وأعطه الخصائص التالية :<br />
أدخل إلى محرر الحقول وأضف جميع الحقول ثم احذف الحقل Num لكي لا يظهر في الجدول ثم أعط لكل حقل<br />
اسمه بال<strong>لغة</strong> العربية في الخاصة DisplayLabel التابعة لكل حقل.<br />
5 العنصر : DataSource ضعه ضمن العنصر<br />
: Tabcontrol<br />
Table1<br />
Dataset<br />
6 العنصر<br />
: DbGrid<br />
alClient<br />
Align<br />
DataSource1 DataSource<br />
أدخل إلى محرر الأعمدة وأضف جميع الحقول ثم حددها واذهب إلى الخاصة Titel واضغط على<br />
الخاصة<br />
+<br />
taCenter إلى Aligment<br />
7 العنصر : GroupBox ضعه ضمن العنصر<br />
Caption<br />
ترتيب حسب<br />
وغير
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
8 العنصر : RadioButton1 ضعه داخل العنصر<br />
الاسم<br />
GroupBox1<br />
True<br />
RBTName<br />
Caption<br />
Checked<br />
Name<br />
9 العنصر : RadioButton2 ضعه داخل العنصر<br />
GroupBox1<br />
Caption<br />
Name<br />
الكنية<br />
RBTLname<br />
10 العنصر : Edit1 ضعه داخل العنصر<br />
: GroupBox1<br />
"<br />
Text<br />
فراغ<br />
11 العنصر : Button ضعه داخل العنصر<br />
GroupBox1<br />
Caption<br />
Name<br />
بحث حسب الاسم<br />
BtnSearch<br />
سنبدأ الآن بكتابة التعليمات اللازمة حتى هذه النقطة وسنعود لإكمال بقية العناصر لاحقا ً<br />
عندما يضغط المستخدم على زر الراديو الاسم سيتم ترتيب الجدول حسب حقل الاسم وسيكون البحث متاحا ً<br />
حسب اسم الشخص لذلك نكتب التعليمة التالية في حدث الضغط على زر الراديو الاسم<br />
: RBTName<br />
table1.IndexName := 'FnameIndex';<br />
;'بحث حسب الاسم' =: btnSearch.Caption<br />
وفي حدث الضغط على زر الراديو الكنية سيرتب الجدول حسب حقل الكنية وسيكون البحث متاحا ً حسب حقل<br />
الكنية لذلك اكتب التعليمات التالية في حدث الضغط على زر الكنية<br />
عندما يضغط المستخدم على أي صفحة من صفحات العنصر<br />
: RBTLname<br />
table1.IndexName := 'LnameIndex';<br />
btnSearch.Caption := '<br />
';<br />
بحث حسب الكنية<br />
Tabcontrol سيتم إظهار الأسماء التي تبدأ<br />
بالحرف التي ضغط عليه المستخدم ، أما إذا كان المستخدم قد اختار الترتيب حسب الكنية فستظهر الحقول التي يبدأ<br />
فيها حقل الكنية بالحرف الذي ضغط عليه المستخدم لذلك اكتب في الحدث<br />
التعليمات التالية<br />
للعنصر Tabcontrol1 OnCahnge<br />
:<br />
if RBTName.Checked then<br />
table1.Filter := 'fname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*') else<br />
table1.Filter := 'Lname = ' + quotedstr( tabcontrol1.Tabs[tabcontrol1.tabindex]+ '*')<br />
لمعرفة عمل هذه التعليمات راجع المحاضرات السابقة ...<br />
: زر البحث<br />
143
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
(<br />
)<br />
سيتم البحث عن القيمة المكتوبة في العنصر<br />
Edit1 في حقل الاسم أو حقل الكنية<br />
حسب خيار المستخدم<br />
وفي<br />
حال عدم وجدوها سيتوقف مؤشر السجلات عند أقرب قيمة للبحث ، بما أن البحث سيتم في كامل الجدول فيجب<br />
إلغاء التصفية Filter قبل القيام بالبحث ، اكتب التعليمات التالية في حدث الضغط على الرز<br />
أضف بعض السجلات على سبيل التجربة<br />
: BtnSearch<br />
table1.Filtered := false;<br />
table1.FindNearest([edit1.text]);<br />
.............<br />
البحث عن رقم هاتف :<br />
عندما تريد أن تبحث عن رقم هاتف فلن يكون مهما ً أن تحدد في أي حقل أي لا يهم إن كان الهاتف الذي سنبحث<br />
عن صاحبه هو هاتف المنزل أو هاتف العمل فالمهم أن يعيد البحث اسم الشخص الذي نبحث عن رقم هاتفه لذلك<br />
ستبحث في الحقل<br />
HPhon فإذا لم نجد الرقم نبحث في الحقل<br />
WPhon فإذا لم نجد الرقم سنبحث في الحقل<br />
Mobil وإذا لم نجد الرقم تظهر رسالة تخبرنا بأن الرقم غير موجود<br />
لذلك أضف العناصر التالية إلى النموذج السابق :<br />
: Panel<br />
1 العنصر<br />
: GroupBox ضعه ضمن العنصر<br />
بحث عن رقم الهاتف<br />
Caption<br />
2 عنصر Edit2<br />
" فراغ<br />
Text<br />
:<br />
3 العنصر<br />
: Button<br />
Caption<br />
Name<br />
بحث<br />
BtnPhSearch<br />
وفي حدث الضغط على هذا الزر اكتب التعليمات التالية<br />
يمكنك الآن إضافة أزرار للبحث عن البريد الالكتروني و الفاكس و....<br />
Table1.Filtered := false;<br />
if not Table1.Locate('HPhon',edit2.text,[]) then<br />
if not Table1.Locate('WPhon',edit2.text,[]) then<br />
if not Table1.Locate('Mobil',edit2.text,[]) then<br />
; ) 'الرقم غير موجود' showmessage(<br />
حفظ البرنامج<br />
:احفظ التطبيق في المجلد<br />
C:\MyPhon أعط الوحدة اسم<br />
Main.pas وأعط المشروع اسم<br />
. MyPhone<br />
أضف الآن العناصر التالية إلى النموذج :<br />
: Panel<br />
العنصر<br />
: GroupBox ضعه ضمن العنصر<br />
خيارات<br />
Caption<br />
144
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أربع أزرار<br />
الإدخال<br />
http://www.alshater.net<br />
Caption أعطها Button<br />
:<br />
جرت العادة على استخدام العناصر في الصفحة Data control لإدخال البيانات إلى القاعدة وعدم<br />
الاعتماد على العنصر DBGrid فقط وخاصة أنه لدينا حقل من نوع Memo الذي لا يمكن الإدخال إليه ضمن<br />
) DBGrid<br />
في أغلب الأحيان يعطى العنصر<br />
أنشئ نموذجا ً جديدا ً وأعطه الخصائص التالية<br />
DBGrid الخاصة<br />
ReadOnly وذلك لاستخدامه للعرض فقط<br />
. (<br />
:<br />
bdRightToLeft<br />
BiDiMode<br />
Caption<br />
Position<br />
Name<br />
إدخال<br />
poScreenCenter<br />
DataEnter<br />
وأضف اسم الوحدة Main إلى القسم Uses لهذه الوحدة وذلك لكي نتمكن من الوصول إلى العنصر<br />
النموذج الأول<br />
Table1 على<br />
:<br />
احفظ الوحدة باسم . DataEnterU<br />
ضع مجموعة من عناصر ال<br />
DBEdit وعناصر Label وعنصر<br />
:<br />
DBNavigator على النموذج كما في الشكل<br />
حدد جميع عناصر التعامل مع قواعد المعطيات<br />
الخاصة<br />
)<br />
جميع العناصر على النموذج عدا عناصر ال<br />
(<br />
Label<br />
. القيمة Form1.DataSource1 DataSource<br />
ثم اربط كل عنصر من عناصر DBEdit بحقل في الخاصة DataField وذلك حسب العنصر<br />
لإظهار هذا النموذج عد إلى النموذج الأول واكتب في حدث الضغط على الزر إدخال التعليمة التالية<br />
من المفيد إيضا ً ظهور هذا النموذج عندما يضغط المستخدم على اسم أحد الأشخاص داخل العنصر<br />
اكتب التعليمة التالية في الحدث<br />
وأعطها<br />
Label المجاور .<br />
:<br />
DataEnter.ShowModal ;<br />
DBGrid لذلك<br />
DataEnter.ShowModal ;<br />
للعنصر DBGrid1 OnDbClick<br />
145
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
: الطباعة<br />
يستخدم صفحة العناصر<br />
QReport للطباعة في <strong>دلفي</strong> وتستطيع هذه الصفحة التعامل مع قواعد البيانات كما يمكنك<br />
طباعة الصور والأرقام والحسابات عن طريقها :<br />
ملاحظة لمستخدمي <strong>دلفي</strong> : 7<br />
أضافت بورلاند صفحة مجموعة جديدة من العناصر في الصفحة<br />
Rave بدلا ً من الصفحة<br />
QReport وإذا أردت<br />
استخدام QReport في <strong>دلفي</strong> 7 أضف هذه الصفحة عن طريق<br />
أضف الوحدة dclqrt60.bpl من الفهرس Bin داخل مجلد<br />
:<br />
Commponnant install package add<br />
. <strong>Delphi</strong>7<br />
لطباعة دليل الهاتف :<br />
أضف وحدة جديدة إلى البرنامج وأضف اسم الوحدة<br />
Main إلى القسم<br />
Uses لهذه الوحدة وذلك لكي نتمكن من<br />
. Printform Name<br />
الوصول إلى العنصر Table1 على<br />
النموذج الأول وأعطها الخاصة<br />
:<br />
وأضف إليها العنصر<br />
QuickRep من الصفحة<br />
Qreport وأعطه الخصائص التالية<br />
HasColumnHeader و HasDetail و<br />
: Band<br />
أعط القيمة<br />
True للخصائص التالية الموجودة ضمن الخاصة<br />
. HasPagefooter و HasPageHeader<br />
الخاصة Dataset أعطها . Form1.DataSource1<br />
القيمة<br />
"<br />
" Caption<br />
أضف الآن العصر<br />
QRlabel إلى القسم<br />
Page Header أو أعطه ال<br />
برنامج دليل الهاتف<br />
:<br />
أضف لل<br />
Column Header عدد من العناصر<br />
QRlabel كما في الشكل<br />
Dataset كما<br />
أضف إلى<br />
Detail مجموعة من العناصر<br />
QRDbText واربطها مع الحقول المناسبة في الخاصة<br />
في الشكل السابق .<br />
... Page Number القيمة data<br />
أضف إلى Page Footer العنصر<br />
QRSysData وأعطه الخاصة<br />
احفظ الوحدة باسم . PrintUnit<br />
.<br />
اضغط بزر الفأرة اليميني على العنصر QUickRep1 واختر Preview<br />
لتشاهد النتائج<br />
:<br />
Printform.QuickRep1.Preview<br />
اكتب في حدث الضغط على الزر طباعة في النموذج الأول التعليمة التالية<br />
146
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
لمسات برمجية<br />
الجلسة<br />
http://www.alshater.net<br />
23<br />
:<br />
يمكن أن نعتبر برنامج الهاتف برنامج جاهز للتوزيع والنشر ولكن بإضافة بعض اللمسات إلى البرنامج يمكن أن<br />
نحول هذا البرنامج إلى برنامج سهل الاستخدام ومرغوب بشكل أكبر من قبل المستخدمين، وأقصد باللمسات<br />
البرمجية بمجموعة الأعمال التي يقوم بها المبرمج والتي يمكن أن تأخذ وقت طويلا ً لتسهيل عمل المستخدم<br />
1 تمكين المستخدم من التعامل مع البرنامج بدون استخدام الفأرة وبأسرع الطرق الممكنة<br />
مثلا ً عندما يكتب المستخدم اسم للبحث عنه ضمن<br />
الزر لكي يتم تنفيذ البحث بل يكفي أن يضغط المستخدم على الزر إدخال<br />
ولتحقيق ذلك برمجيا ً<br />
حيث<br />
.<br />
:<br />
Edit1 فلا حاجة لأن يعود المستخدم إلى الفأرة ليضغط على<br />
( Enter )<br />
:<br />
اكتب التعليمات التالية في حدث<br />
VK_Return ثابت معرف في <strong>دلفي</strong> ويحوي شيفرة الأسكي للزر<br />
الثوابت والتي تحوي شيفرة الأزرار الافتراضية<br />
الأسهم و<br />
من لوحة المفاتيح ليتم البحث<br />
: للعنصر Edit1 OnKeyPress<br />
if key = char( VK_Return ) then<br />
btnsearch.Click ;<br />
( Virtual Key )<br />
End و Delete و Caps lock و Tab<br />
،Enter في الحقيقة يجود الكثير من هذه<br />
وهذه الأزرار هي المفاتيح F1..F12 و مفاتيح<br />
... (أي مجموعة أزرار لوحة المفاتيح عدا الأحرف والأرقام)<br />
وللتعرف على هذه الثوابت راجع ملفات المساعدة في <strong>دلفي</strong> أو اكتب في مكان في محرر الشيفرة<br />
Windows.VK_ وستكمل <strong>دلفي</strong> بقية الثوابت.<br />
: ملاحظات<br />
أ يمكن الاستعاضة عن التعليمة السابقة بالتعليمة<br />
حيث<br />
13 هي القيمة التي يحويها الثابت<br />
If key = #13 then btnsearch.Click ;<br />
Enter و #<br />
:<br />
VK_Return وهي القيمة الاسكي للزر<br />
الأسكي لتحويل الرقم إلى حرف ، مثلا ً إذا كتبنا التعليمة التالية<br />
'You'<br />
ب يمكن الاستعاضة عن التعليمة السابقة بالتعليمة :<br />
بدلا ً من استخدام المنهج<br />
:<br />
تستخدم قبل شيفرة<br />
#89#111#117=:S فهذا يكافئ التعليمة<br />
S :=<br />
If key = #13 then BtnSearchClick (Sender);<br />
)<br />
Click للزر<br />
الإجراء BtnSearchClick قد تم تعريفة من قبل ال<strong>دلفي</strong> في القسم<br />
ضغطك على الزر<br />
BtnSearch نستخدم الإجراء الذي يقوم بهذه العملية مباشرة<br />
Implementation والقسم Type<br />
....<br />
لا حظ أن<br />
بمجرد<br />
2 من الملاحظ أننا نستخدم العنصر Edit2 لإدخال الأرقام فقط أو على الأقل رموز لوحة مفاتيح الهاتف<br />
وبالتالي يجب منع المستخدم من إدخال الحروف والرموز غير المرغوبة ولتحقيق ذلك اكتب التعليمة التالية<br />
:<br />
const s = ['0','1','2','3','4','5','6','7','8','9','p',char(VK_back)];<br />
begin<br />
if not ( key in s )<br />
then key:= char(vk_capital)<br />
147
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
نعرف مجموعة من الرموز التي يستخدمها الهاتف بالإضافة إلى الزر<br />
VK_back و هو زر الحذف ، فإذا لم<br />
يكن الزر المدخل من هذه المجموعة فحوله إلى الزر<br />
Vk_Capital وهو زر<br />
Caps Lock والذي لن يؤثر على<br />
.<br />
وضع الزر<br />
Caps Lock ولكنه سيصدر صوت ما<br />
في النافذة إدخال على المستخدم أن ينتقل من عنصر تحرير<br />
DBEdit إلى آخر بواسطة الضغط على الزر<br />
3<br />
Tab من لوحة المفاتيح على الرغم من أن معظم البرامج الجيدة تستخدم الزر<br />
Enter للتنقل بين عناصر الإدخال<br />
: DBEdit1<br />
If key = #13 then DBEdit2.SetFocus ;<br />
If key =#13 then dbedit3.SetFocus ;<br />
لذلك اكتب التعليمة التالية في الحدث<br />
واكتب في حدث OnKeyPress التعليمة التالية<br />
وهكذا في بقية العناصر<br />
OnKeyPress للعنصر<br />
:<br />
.<br />
(<br />
)<br />
المنهج<br />
SetFocus يستخدم لتحفيز<br />
تفعيل العنصر<br />
وهو يستخدم مع معظم العناصر في <strong>دلفي</strong> فمثلا ً التعليمة<br />
Button1.SetFocus ستظهر إطار شفاف داخل الزر والذي يعني أن هذا هو الزر الفعال والذي يمكن الضغط<br />
.<br />
عليه بواسطة الزر<br />
Enter أو الزر<br />
Space من لوحة المفاتيح<br />
4 التحكم بتحميل النوافذ في الذاكرة :<br />
افتح القائمة Project View Source<br />
سيظهر لك ملف المشروع<br />
MyPhone.Dpr وستجد فيه تعريف<br />
الوحدات في القسم Uses و ستجد التعليمات التالية في القسم<br />
التعليمة<br />
Begin<br />
Application.Initialize;<br />
Application.CreateForm(TForm1, Form1);<br />
Application.CreateForm(TDataEnter, DataEnter);<br />
Application.CreateForm(TForm2, Form2);<br />
Application.Run;<br />
TFom1,Form1) Application.CreateForm ( تقوم بإنشاء النافذة<br />
Form1 والتي من النوع<br />
TForm1 والمعرف في القسم Interface للوحدة<br />
Main.pas التي يتبع لها النموذج<br />
Form1 وكذلك الأمر بالنسبة<br />
لتعليمات CreateForm التالية ، ولكن ماذا يعني إنشاء نافذة.... عند استخدام التعليمة<br />
Application.CreateForm ( TFom1,Form1)<br />
1 سيتم إنشاء هذه النافذة في الذاكرة )<br />
أي حجز حيز في الذاكرة يحوي النافذة التي ستظهر<br />
. (<br />
2 سيتم إنشاء جميع العناصر الموجودة على هذه النافذة من أزرار و عناصر<br />
قواعد البيانات و....<br />
3 سيتم حجز المتحولات العامة وإعطاءها حيز من الذاكرة أيضا ً .<br />
. Form1<br />
4 سيتم تنفيذ التعليمات التي تم وضعها في الحدث<br />
OnCreate التابع للنموذج<br />
سيتم الآن تنفيذ هذه الخطوات بالنسبة للنوافذ الثلاثة المستخدمة في البرنامج ، لنقم الآن بدراسة<br />
بسيطة لحجم<br />
استخدام كل نافذة :<br />
النافذة الأولى<br />
: Form1 سيستخدم أي مستخدم هذه النافذة عند كل دخول إلى البرنامج وذلك لأنها تحوي<br />
1<br />
عناصر البحث والفهرسة بالإضافة إلى عرض البيانات.<br />
148
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
النافذة<br />
: DataEnter تستخدم هذه النافذة عدة مرات في الأسبوع الأول لاستخدام البرنامج لأن المستخدم<br />
2<br />
سيقوم بإدخال أرقام هواتفه إلى البرنامج وبعد ذلك لن يدخل المستخدم إلى هذه النافذة إلا مرة في الأسبوع أو الشهر<br />
أو حتى بالسنة .<br />
النافذة<br />
: Form2 هذه النافذة تحوي عناصر الطابعة وإذا فرضنا أن المستخدم يملك طابعة فإنه لن يطبع دفتر<br />
3<br />
هواتفه كل يوم .<br />
هذا يعني أننا نحجز حيز من الذاكرة لنافذتين لن يستخدمها المستخدم إلا مرات قليلة، لهذا زودتنا <strong>دلفي</strong> بطريقة<br />
لإنشاء النموذج عن الحاجة إليه وذلك عن طريق :<br />
أ إزالة النموذج من قائمة التحميل التلقائي :<br />
افتح القائمة Project Options لتظهر النافذة التالية :<br />
حدد منها<br />
الصفحة<br />
Forms والتي فيها القائمة المنسدلة Main Form وهي تحدد<br />
النموذج الذي سيظهر عند تشغيل البرنامج.<br />
اللائحة<br />
Auto-Create Forms وتظهر فيها أسماء النماذج التي سيتم<br />
إنشاءها تلقائيا ً عند تشغيل البرنامج ،<br />
اللائحة Available Form وتحوي جميع بقية النوافذ في البرنامج<br />
والتي لا توجد في لائحة التشغيل التلقائي.<br />
حدد النوافذ التي لا تريد أن تعمل تلقائيا ً واضغط على السهم<br />
> لتنتقل هذه الاسماء إلى اللائحة Avialable Form<br />
.<br />
ب إنشاء النموذج عند الطلب :<br />
بما أنه النافذة لن تنشأ تلقائيا ً فعلينا أن نكتب بعض التعليمات لإنشائها قبل استخدام المنهج Show أو<br />
ShowModal أو حتى قبل طلب أي متحول ما منها لذلك لنكتب التعليمات التالية في حدث الضغط على الزر<br />
Dataenter := TDataEnter.Create(application);<br />
Try<br />
DataEnter.Showmodal;<br />
Finally<br />
DataEnter.Release ;<br />
end;<br />
) TDataEnter<br />
: إدخال<br />
التعليمة الأولى تقوم بإنشاء المتحول<br />
DataEnter من النوع<br />
المعرف في القسم<br />
Var التابع للقسم<br />
Interface في الوحدة<br />
ويأخذ المنهج<br />
Create لعناصر <strong>Delphi</strong> وسيطا ً وحيدا ً يدل على<br />
( DataEnterU.pas<br />
العنصر المالك للعنصر المراد إنشائه وتمرر هنا القيمة<br />
Application عادة لأن النموذج المنشأ سيعود لتطبيق<br />
. مباشرة<br />
149
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التعليمة DataEnter.Release هي عملية لإزالة النموذج من الذاكرة بعد انتهاء عمله والتي يمكن استبدالها<br />
بالتعليمة<br />
. بالفعل<br />
DataEnter.Free ولكن المنهج<br />
إذا كنا نستخدم المنهج Show بدلا ً من المنهج<br />
البرنامج بشكل صحيح<br />
في الحدث<br />
:<br />
OnClose<br />
Release يعتبر أفضل لأنه لا يعيد رسالة خطأ إذا لم يكن النموذج منشأً<br />
للنافذة DataEnter أضف التعليمة التالية<br />
واكتب الآن التعليمات التالية في حدث الضغط على الزر إدخال<br />
الحدث<br />
OnClose لنافذة يتم تنفيذه عندما يتم إغلاق النافذة<br />
الوسيط Action والذي يمكن أن يأخذ القيم التالية :<br />
القيمة<br />
:<br />
ShowModal فيجب إضافة التعليمات التالية للتأكد من عمل<br />
action := Cafree;<br />
DataEnter := nil;<br />
: (<br />
)<br />
If DataEnter = nil then<br />
DataEnter := TDataEnter.Create(application);<br />
DataEnter.Show;<br />
(<br />
CaNone<br />
CaFree<br />
CaHide<br />
في النموذج الأول<br />
) ضغط المستخدم على زر إغلاق<br />
المعنى<br />
لا يمكن إغلاق النافذة ولن يحدث شيء إذا ضغط المستخدم على الزر إغلاق<br />
سيتم إغلاق النافذة وتحرير كامل الذاكرة المستخدمة من قبلها<br />
ويأخذ هذا الحدث<br />
سيتم إخفاء النافذة بدلا ً من إغلاقها ويمكن إعادة إظهارها عن طريق المنهج Show وهو الخيار<br />
الافتراضي للنوافذ من النوع<br />
FormStyle :=<br />
fsNormal<br />
CaMinimize<br />
سيتم تصغير النافذة وهو الخيار الافتراضي مع النوافذ من النوع<br />
التعليمة DataEnter = Nil تقوم بتحميل قيمة اللاشيء<br />
فيما بعد أن الحدث<br />
ملاحظة<br />
fsMDIChild<br />
( Null )<br />
OnClose<br />
قد تم تنفيذه ومن ثم تنفيذ عملية إنشاء النموذج<br />
.<br />
:<br />
في المتحول DataEnter الأمر الذي يجعلنا<br />
هذه إحدى الطرق المستخدمة لإنشاء النافذة بشكل ديناميكي وهناك طرق أخرى متعددة<br />
.<br />
مسجل النظام<br />
: Windows Registry<br />
مسجل النظام عبارة عن مجموعة من الملفات يتم تخزين فيه جميع معلومات نظام التشغيل<br />
Windows<br />
بما فيها<br />
خصائص النظام واسم المستخدم واسم الكمبيوتر بالإضافة إلى أن معظم البرامج تضيف بعض المفاتيح إلى مسجل<br />
النظام للتحكم بطريقة إظهار البرنامج حسب خيارات يحددها المستخدم ، يدعى مسجل النظام بقاعدة بيانات النظام<br />
ويكون مخزن في الملفين<br />
System.dat و<br />
وتحريره افتح القائمة أبدأ و اضغط على<br />
User.dat الموجودين داخل فهرس الويندوز ،لمشاهدة مسجل النظام<br />
Run واكتب<br />
Regedit في النافذة تشغيل ثم اضغط على<br />
. Ok<br />
150
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ستظهر عندها النافذة التالية والتني تحوي في جهة<br />
اليمين ستة من المفاتيح الرئيسية تدعى عادة مفاتيح<br />
الجذر ، Root key بالضغط على إشارة +<br />
بجانب هذه<br />
المفاتيح تظهر لها مفاتيح فرعية و التي يمكن الوصول<br />
من خلالها إلى مفاتيح فرعية أخرى، تدعى الرموز التي<br />
تظهر على القسم اليميني من النافذة بالقيم وهي على<br />
ثلاثة أنواع ،<br />
قيم عددية و قيم نصية وقيم منطقية ،<br />
قبل أن تعدل أي قيمة ما في مسجل النظام عليك أن تعرف ما تفعل لأن بعض التعديلات قد تؤدي إلى توقف النظام<br />
عن العمل أو تعطيل البرنامج الذي عدلته على الأقل ، يمكنك أن تأخذ نسخة عن مسجل النظام أو عن جزء منه<br />
ضع حدد بمؤشر الفأرة المفتاح الذي تريد أخذ نسخه منه واختر الأمر Regestry Export ستطالب بإدخال<br />
اسم ملف ما وسيتم بعدها حفظ نسخة عن المفتاح ، لاستعادة مسجل النظام اضغط مرتين على ملف الملف الذي<br />
كنت قد حفظته سابقا ً .<br />
سأشرح بشكل موجز ماهي المعلومات المخزنة في كل مفتاح رئيسي :<br />
يحوي هذا المفتاح معلومات عن كل أنواع الملفات المعرفة في النظام<br />
) لا حظ<br />
: HKEY_ClASSES_ROOT<br />
أنه يحوي قائمة بجميع امتدادات الملفات التي يتعامل معها ويندوز<br />
( بالإضافة إلى معلومات عن البرامج القادرة<br />
على التعامل مع هذه الملفات مثلا ً .jpg أو .Doc ...<br />
: HKEY_CURRENT_USER يحوي معلومات عن مستخدم النظام والقيم الافتراضية التي أعطاها لبعض<br />
برامج الويندوز بالإضافة إلى الخصائص لوحة التحكم والبرامج التي تنصبها المستخدم على الجهاز .....<br />
: HKEY_LOCAL_MACHINE يحوي معلومات عن جهاز الحاسوب بالكامل بما فيها أنواع الأجهزة<br />
المستخدمة في الجهاز بالإضافة إلى مشغلات هذه الأجهزة<br />
( Driver مثلا ً تستطيع معرفة نوعية كرت الشاشة<br />
)<br />
المستخدم ونوعية الشاشة المعرفة على الجهاز ....<br />
يحوي معلومات عن التشكيلات الجانبية للمستخدم<br />
) الخصائص التي يحددها المستخدم<br />
: HKEY_USERS<br />
لألوان سطح المكتب مثلا ً<br />
، بالإضافة إلى التشكيلات الجانبية الافتراضية التي ستعطى عندما يدخل مستخدم<br />
( ..<br />
جديد إلى الويندوز .<br />
: HKEY_CURRENT_CONFIG يعتبر جزء من المفتاح HKEY_LOCAL_MACHINE ولكن<br />
بطريقة عرض أخرى .<br />
Windows NT<br />
يحوي معلومات عن أجهزة النظام وطرق إعدادها<br />
) غير موجود في<br />
: HKEY_DYN_Data<br />
. (<br />
التعامل مع مسجل النظام يسمح لك بالتحكم بالنظام بشكل كامل ولا بد أنك سمعت عن برامج تتحكم بسرعة قائمة<br />
ابدأ و تغير أسم سلة المحذوفات وتغير الصورة التي تظهر بجانب قائمة ابدأ<br />
) الصورة المكتوب فيها<br />
151<br />
(<br />
WINDOWS Me مثلا ً و بالإضافة إلى تغير صورة جهاز كمبيوتر و بالإضافة إلى البرامج التي تضيف نفسها
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إلى القائمة التي تظهر عند الضغط بزر اليمين على سطح المكتب أو مستكشف ويندوز ، حتى أن البرامج التي<br />
تدعي أنها تتحكم بسرعة الاتصال انترنت تتعامل مع مسجل النظام<br />
( ......<br />
هذه موجز صغير جدا ً عن Windows Registry وإذا أردت أن تصبح مبرمجا ً محترفا ً عليك قراءة أحد الكتب<br />
المختصة بهذا الموضوع فكتاب<br />
التعامل مع Registry في <strong>دلفي</strong><br />
Windows 2000 Registry بحجم<br />
152<br />
800 صفحة تقريب ًا<br />
.<br />
:<br />
إذا لم تكن تريد أن تتحكم بنظام ويندوز من داخل برنامجك فأنت بحاجة إلى تخزين بعض المعلومات عن برنامجك<br />
داخل مسجل النظام الأمر الذي يطرك إلى التعامل مع النظام<br />
مثال<br />
.<br />
:<br />
سنقوم بإنشاء برنامج يقوم بمعرفة اسم المستخدم الذي سجل النظام باسمه ومن ثم تغيره<br />
)<br />
نستطيع معرفة<br />
اسم المستخدم عن طريق الضغط بزر الفأرة اليميني على أيقونة جهاز الكمبيوتر واختيار خصائص من القائمة<br />
اسم المستخدم يوجد داخل مسجل النظام تحت المفتاح<br />
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]<br />
افتح البرنامج Regedit للتأكد من ذلك<br />
ومخزن في القيمة النصية<br />
. (<br />
. (<br />
) RegisteredOwner<br />
ابدأ مشروعا ً جديدا ً وأضف زرين إلى النموذج وعنصر<br />
، Edit1<br />
للتعامل مع مسجل النظام عليك إضافة الوحدة Registry إلى القسم<br />
USES<br />
للقراءة من مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الأول<br />
التعليمة<br />
Var reg:tregistry ;<br />
Begin<br />
إنشاء المتحول وحجز مكان له في الذاكرة// ; tregistry.Create reg:=<br />
try<br />
تحديد المفتاح الرئيسي ;// HKEY_LOCAL_MACHINE reg.RootKey :=<br />
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;<br />
قراءة القيمة النصية المخزنة في الوسيط المذكور // reg.ReadString('RegisteredOwner'); edit1.text =:<br />
وسيطها الثاني<br />
reg.CloseKey ;<br />
إغلاق المفتاح //<br />
Finally<br />
تحرير الذاكرة بعد استخدام المتحول// ; reg.Free<br />
end;<br />
OpenKey تقوم بفتح المفتاح المرر لها كوسيط أول وإذا لم يكن موجودا ً فتقوم بإنشاء هذا المفتاح إذا كان<br />
.True<br />
للكتابة إلى مسجل النظام اكتب التعليمات التالية في حدث الضغط على الزر الثاني<br />
:<br />
Var reg:tregistry ;<br />
Begin<br />
إنشاء المتحول وحجز مكان له في الذاكرة //; tregistry.Create reg:=<br />
try<br />
تحديد المفتاح الرئيسي ;// HKEY_LOCAL_MACHINE reg.RootKey :=<br />
reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion',false ) ;
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
كتابة القيمة المدخلة في عنصر التحرير إلى اسم // ;( reg.WriteString('RegisteredOwner',edit1.Text<br />
القيمة المحددة<br />
reg.CloseKey ;<br />
إغلاق المفتاح //<br />
Finally<br />
تحرير الذاكرة بعد استخدام المتحول // ; reg.Free<br />
end;<br />
:<br />
مثال : 2<br />
سنعود إلى برنامج الهاتف<br />
يقوم برنامجنا بالترتيب حسب الاسم دائما ً وعلى فرض أن المستخدم يفضل الترتيب حسب الكنية فإن عليه عن<br />
يضغط على زر الراديو الكنية كلما دخل إلى البرنامج ، سنضيف الآن مفتاح إلى مسجل النظام يقوم بتخزين الخيار<br />
الافتراضي للمستخدم ، وسنقوم بفحص قيمة هذا المفتاح كلما دخلنا إلى البرنامج :<br />
سنخزن قيمة عددية تحت أسم IndexBy في المفتاح :<br />
HKEY_CURRENT_USER\Software\MyPhone<br />
وعند تشغيل البرنامج سنفحص قيمة هذا المتحول فإذا كان هذا المتحول يحوي قيمة 1 فالفهرسة ستتم حسب الكنية<br />
وإلا فالفهرسة ستتم حسب الاسم .<br />
. "<br />
"<br />
أضف زر إلى النموذج الأول<br />
Form1 في برنامج الهاتف وأعطه العنوان<br />
فهرس دائما ً حسب الكنية<br />
وفي حدث الضغط على هذا الزر اكتب التعليمات التالية<br />
تقوم التعليمة<br />
OpenKey بإنشاء المفتاح إذا لم يكن موجودا ً وتقوم التعليمة<br />
:<br />
Var reg:tregistry ;<br />
Begin<br />
reg:= tregistry.Create ;<br />
try<br />
reg.RootKey := HKEY_CURRENT_USER ;<br />
reg.OpenKey('SOFTWARE\MyPhone',True ) ;<br />
if button4.Caption = فهرس دائما ً حسب الكنية' ' Then<br />
reg.WriteInteger ('IndexBy',1 )<br />
else reg.WriteInteger ('IndexBy',0 )<br />
reg.CloseKey ;<br />
Finally<br />
reg.Free ;<br />
end;<br />
WriteInteger بإنشاء القيمة<br />
.<br />
IndexBy وتخزن فيها القيمة<br />
1 أو صفر حسب الشرط<br />
RBTLname<br />
reg:= tregistry.Create ;<br />
try<br />
reg.RootKey := HKEY_CURRENT_USER ;<br />
reg.OpenKey('SOFTWARE\MyPhone',True) ;<br />
if reg.ReadInteger ('IndexBy') = 1 then begin<br />
153<br />
الآن سنفحص هذا المفتاح عند تشغيل البرنامج :
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تفحص<br />
هذه التعليمات القيمة المخزنة<br />
IndexBy فإذا كانت تساوي<br />
http://www.alshater.net<br />
RBTLname.Checked := true;<br />
RBTLnameClick(Sender);<br />
; 'رتب دائما ً حسب الاسم ' =: button5.Caption<br />
؛end<br />
reg.CloseKey ;<br />
Finally<br />
reg.Free ;<br />
end;<br />
154<br />
1 فإنها تقوم بتحفيز زر الراديو الكنية وتنفيذ<br />
الحدث الخاص بالضغط على هذا الزر والذي فيه تعليمات تغيير الفهرس بالإضافة إلى تغير عنوان الزر إلى رتب<br />
دائما ً حسب الاسم<br />
.<br />
بهذا نكون قد تعلمنا التعامل مع مسجل النظام<br />
وظيفة<br />
.<br />
:<br />
فكر بطريقة تقوم بها بإضافة كلمة سر إلى برنامج الهاتف ، حيث ستظهر نافذة عند تشغيل البرنامج<br />
تطالب المستخدم بإدخال كلمة السر فإذا أدخل كلمة السر الصحيحة فستظهر النافذة الرئيسية وإلا فسيطالب بإدخال<br />
كلمة السر مرة أخرى وإذا فشل في الدخول ثلاث مرات<br />
النظام<br />
متتالية فيتم إغلاق البرنامج<br />
)<br />
. (<br />
توابع وثوابت الويندوز<br />
: Windows API<br />
خزن كلمة السر في مسجل<br />
توابع وثوابت الويندوز هي مجموعة هائلة من التوابع والثوابت المعرفة في ويندوز والموجودة ضمن مكتبات<br />
ويندوز في ملفات ذات الامتداد<br />
.DLL وتستخدم هذه النوافذ للتحكم في ويندوز وفي كل شيء في ويندوز ابتداء<br />
بلوحة المفاتيح وانتهاء مرورا ً بالذاكرة والمعالج و الشاشة بما في ذلك التحكم بالبرامج والنوافذ وطرق إظهارها<br />
يمكنك على سبيل المثال التحكم بارتفاع الصوت باستخدام توابع<br />
)<br />
Api و معرفة معلومات معينة عن الأجهزة مثل<br />
معرفة حجم السواقة الصلبة Hard Disk يمكنك الحصول على معلومات في برنامج آخر من برنامجك كأن تحصل<br />
على معلومات من ملف ورد والمزيد الذي لا يمكن حصره هنا<br />
سنشرح أمثلة عن التوابع وطرق التعامل معها<br />
1 إغلاق<br />
يستخدم التابع<br />
فيه<br />
.<br />
:<br />
: Windows<br />
) ExitWindowsEx( لإطفاء الجهاز أو إعادة التشغيل<br />
ابدأ برنامجا ً جديدا ً واضف زر إلى النموذج واكتب التعليمة التالية<br />
ExitWindowsEx(ewx_ShutDown,0) ;<br />
)<br />
:<br />
:<br />
(<br />
احفظ البرنامج وقم بتنفيذه ولا تضغط على الزر ،أغلق البرنامج وشغله من خارج ال<strong>دلفي</strong><br />
، اضغط على الزر الآن وسيتم إيقاف تشغيل ويندوز<br />
لإعادة إقلاع النظام استخدم التعليمة<br />
. ExitWindowsEx(ewx_Reboot,0)<br />
.<br />
:<br />
2<br />
التحكم ب<strong>لغة</strong> البرنامج الافتراضية<br />
:<br />
من المكان الذي حفظته<br />
إذا كانت ال<strong>لغة</strong> الافتراضية على الجهاز هي ال<strong>لغة</strong> الإنكليزية فإن برنامجك<br />
سيظهر المؤشر في عناصر التحرير بحيث يتم الكتابة بال<strong>لغة</strong> الإنكليزية وعلى المستخدم أن يحول إلى أسلوب الكتابة<br />
با<strong>لغة</strong> العربية كلما أراد الكتابة ، ويمكن حل هذه المشكلة عن طريق التعليمة<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ابدأ مشروعا ً جديدا ً وضع فيه عنصر تحرير<br />
البرنامج وستلاحظ أن المؤشر أصبح بجهة الكتابة با<strong>لغة</strong> العربية<br />
الرقم<br />
http://www.alshater.net<br />
LoadKeyboardLayout('00002801',klf_activate) ;<br />
OnCreate للنموذج<br />
.<br />
Edit وأضف التعليمة السابقة إلى الحدث<br />
وشغل<br />
00002801 هو الرقم الذي يرمز إلى لوحة المفاتيح العربية السعودية إذا أردت العودة إلى ال<strong>لغة</strong> الإنكليزية<br />
الأمريكية بدل هذا الرقم إلى<br />
تطبيق<br />
التابع<br />
. 00000409<br />
:<br />
اذهب إلى برنامج الهاتف وأضف هذه التعليمة للحدث OnCreate للنموذج الأول<br />
. Form1<br />
يوجد لدينا في النافذة إدخال في برنامج الهاتف حقلين يجب كتابتهما بال<strong>لغة</strong> الإنكليزية هما حقل البريد الإلكتروني<br />
وحقل موقع الانترنت لذلك يمكنك كتابة التعليمة التالية في الحدث OnEnter لهذين الحقلين :<br />
LoadKeyboardLayout('00000409 ',klf_activate) ;<br />
حيث سيتم التحول إلى ال<strong>لغة</strong> الإنكليزية عند دخول المؤشر إلى هذين الحقلين واكت التعليمة التالية في الحدث<br />
OnExit<br />
LoadKeyboardLayout('00002801',klf_activate) ;<br />
إذا أردت أن يعود المؤشر إلى ال<strong>لغة</strong> العربية عن خروج المؤشر من هذين الحقلين .<br />
: MessageBox<br />
تعاملنا مع التابعين<br />
ShowMessage وMessageDlg سابقا ً ولكن مشكلة هذين التابعين أن عناوين الأزرار تظهر<br />
با<strong>لغة</strong> الإنكليزية دائما ً لذلك يمكنك استخدام التابع<br />
تبعا ً ل<strong>لغة</strong> النظام<br />
.<br />
أكتب التعليمة التالية في حدث الضغط على الزر<br />
نفذ البرنامج ولاحظ أن الزر Ok سيظهر با<strong>لغة</strong> العربية<br />
اكتب التعليمة التالية في حدث الضغط على زر آخر<br />
MEssageBox من ويندوز<br />
Api الذي سيظهر عناوين الأزرار<br />
:<br />
MessageBox ( هذا عنوان الرسالة ' , ' هذا نصر الرسالة',0 ' , MB_Ok ) ;<br />
( موافق )<br />
إذا كنت تستخدم ويندوز با<strong>لغة</strong> العربية<br />
.<br />
:<br />
If MessageBox ( تغير لون النافذة ' , ' هل تريد تلوين النافذة باللون الأحمر',0 ' ,Mb_YesNo ) = IDYES<br />
then<br />
Form1.color := clred;<br />
لمزيد من التعليمات ضع المؤشر فوق اسم التابع MessagBox واضغط على . F1<br />
التعامل مع النوافذ<br />
:<br />
لكل نافذة في ويندوز مقبض أو ممسك يدعى Handle وهو من النوع Thandle وهو عبارة عن عدد صحيح<br />
طويل يتعامل النظام مع هذا المقبض للوصول إلى النافذة<br />
على النموذج مقبض أيضا ً فهناك مقبض للزر وللعنصر<br />
)<br />
لا يقصد بالنافذة هنا النموذج Form فقط بل لكل عنصر<br />
Edit و.... (<br />
، المقبض ليس له قيمة ثابتة إذ يعطى للنافذة<br />
رقم مقبض جديد عند كل إنشاء للنافذة ، عندما تقوم يتحريك نافذة ما على سطح المكتب فإن النظام يستدعي<br />
مجموعة من توابع Api لتنفيذ هذه الحركة<br />
.<br />
يوجد عدد هائل من التوابع المتعلقة بالنوافذ سنذكر بعض منها في هذه العجالة<br />
:<br />
155
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
1 برنامج يعيد أسماء جميع النوافذ الموجودة في الذاكرة<br />
أضف زر و عنصر<br />
ListBox إلى النموذج في برنامج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />
var h:Thandle;<br />
p:pchar;<br />
begin<br />
getmem(p,250);<br />
h:= gettopwindow ( getdesktopwindow) ;<br />
getwindowtext(h,p,250);<br />
listbox1.Items.Add(p);<br />
while h > 0 do begin<br />
h:= getnextwindow( h,gw_hwndnext);<br />
getwindowtext(h,p,250);<br />
listbox1.Items.Add(p) ;<br />
end;<br />
freemem(p,200);<br />
end;<br />
:<br />
:<br />
شرح البرنامج<br />
) Pchar<br />
في البداية تم تعريف المتحول<br />
h وهو من النوع<br />
Thandle بالإضافة إلى المتحول<br />
P من النوع<br />
ملاحظة<br />
( Pchar<br />
جميع توابع<br />
Api تتعامل مع النوع<br />
. p<br />
التعليمة (200,p GetMem( تخصص<br />
200 بايت من الذاكرة للمتحول<br />
: GetDesktopwindow يعيد مقبض سطح المكتب في ويندوز .<br />
GetTopWindow يعيد النافذة الموجودة في أعلى النوافذ في حيز الذاكرة المخزن فيه مقبض النافذة الذي يمرر<br />
كوسيط لهذا التابع<br />
250<br />
يعيد هذا التابع في المتحول p<br />
عنوان النافذة التي مقبضها<br />
h ويعيد نص بطول<br />
:getwindowtext(h,p,250)<br />
حرف<br />
يعيد مقبض النافذة التي تلي النافذة<br />
h وفي حال وصلنا إلى آخر<br />
: GetNextWindow( h, gw_hwndnext)<br />
نافذة فيعيد القيمة . Nil<br />
2 برنامج إخفاء وإظهار شريط المهام :<br />
ابدأ مشروعا ً جديدا ً وأضف إليه زرين :<br />
1 عرف المتحول التالي في القسم Private للوحدة :<br />
hTaskBar: THandle;<br />
2 اكتب التعليمة التالية في الحدث<br />
OnCreate للنموذج :<br />
hTaskBar := FindWindow('Shell_TrayWnd', nil);<br />
تعيد هذه التعليمة النافذة التي نوعها مذكور في الوسيط الأول وعنوانها مذكور في الوسيط الثاني<br />
156
http://www.alshater.net<br />
ShowWindow(hTaskBar, SW_HIDE);<br />
:<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
3 أكتب التعليمة في حدث الضغط على الزر الأول<br />
:<br />
تقوم هذه التعليمة بإظهار أو إخفاء النافذة تبعا ً للوسيط الثاني<br />
4 أكتب التعليمة التالية في حدث الضغط على الزر الثاني<br />
ShowWindow(hTaskBar, SW_SHOW);<br />
نفذ البرنامج .<br />
ملاحظات :<br />
.<br />
1 للمزيد من المعلومات عن التوابع المذكورة سابقا ً اضغط F1<br />
فوق بعد وضع المؤشر فوق اسم التابع<br />
2 للحصول على اسماء معظم توابع<br />
Windows Api اكتب Windows في أي مكان من محرر الشيفرة و<br />
ضع النقطة ، فسيتم كتابة جميع الثوابت والتوابع المعرفة في الوحدة<br />
Windows.pas وهي مرتبطة مباشرة مع<br />
. Windows Api<br />
للحصول على معلومات وافرة عن<br />
Windows Api عليك مراجعة الكتب المختصة أو الحصول على<br />
3<br />
. MicroSoft Visual Studio<br />
مجموعة الأقراص الليزرية المسماة<br />
MSDN Library والتي تباع مع<br />
إعداد المهندس :<br />
محمد خالد ناصر آغا<br />
157
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
إضافة عناصر جديدة<br />
http://www.alshater.net<br />
24<br />
: ( Add new omponant )<br />
قبل إضافة عناصر جديدة إلى <strong>دلفي</strong> علينا أن نعرف ما هي العناصر:<br />
لقد تعاملنا مع مجموعة كبيرة من العناصر في <strong>دلفي</strong> منها المرئي ومنها المخفي وهي عبارة عن كتل برمجيه جاهزة<br />
يضعها المبرمج على النموذج لإعطاء برنامجه شكل وخصائص معينة، وتختلف العناصر بطبيعتها فمنها البسيط<br />
العنصر TLabel أو عناصر معقدة كعناصر BDE وعناصر الطباعة<br />
.<br />
من المعروف أن <strong>لغة</strong> ال<strong>دلفي</strong> هي <strong>لغة</strong> برمجة غرضية التوجه object-oriented programming أي أننا نستطيع<br />
أن نكتب كتلنا البرمجية اعتمادا ً على كتل أخرى ، فعند إنشاء النموذج لسنا بحاجة إلى كتابة التعليمات لإنشاء<br />
النموذج وإظهاره ولسنا بحاجة أيضا ً لكتابة التعليمات البرمجية لإظهار كل عنصر على النموذج ، إذ يكفي أن<br />
نسحب العنصر ونضعه على النموذج لتقوم <strong>Delphi</strong> بإضافة التعليمات البرمجية اللازمة لإظهار العنصر وطرق<br />
التعامل مع هذه العناصر<br />
(<br />
تنحدر جميع العناصر في <strong>دلفي</strong> من العنصر<br />
Tobject<br />
وهو العنصر الرئيسي<br />
( الأب )<br />
في <strong>دلفي</strong> حيث تنحدر جميع<br />
العناصر منه وحيث تأخذ العناصر بعض خواص العنصر Tobject وتضيف إليها خواص جديدة أو تعدل في<br />
بعض هذه الخواص بما يلائم عمل كل عنصر والشجرة التالية توضح البناء الهيكلي للعناصر<br />
:<br />
لماذا يتم إنشاء عناصر جديدة<br />
:<br />
يقوم بعض المبرمجين المحترفين أو بعض المبرمجين الهواة بإنشاء عناصر جديدة حتى يجعلوا من <strong>البرمجة</strong> أمر<br />
سهل وممتع ، لأنك كمبرمج عادي لا تستطيع أن تبرمج كل شيء بنفسك وعليك أن تعتمد على الغير في أنشاء<br />
158
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
برامجك فلا حدود للإمكانيات التي تستطيع العناصر أن تقدمها وكل يوم نسمع عن عناصر جديدة وابتكارات جديدة<br />
http://www.alshater.net<br />
في عالم العناصر .<br />
طرق إضافة عناصر جديدة إلى لوحة العناصر :<br />
هناك العديد من الطرق لإضافة عناصر جديدة إلى صفحة العناصر وأفضل طريقة هي قراءة ملفات المساعدة التي<br />
تأتي مع العنصر ولكننا سنركز على بعض الطرق العامة :<br />
1 عن طريق استخدام المكتبة .bpl :<br />
:<br />
إذا وجدت في فهرس العنصر ملف من النوع bpl<br />
فاتبع الطريقة التالية لإضافة هذا العنصر إلى صفحة العناصر<br />
أ من الصفحة Component اختر Install Package<br />
تظهر عندها النافذة المجاورة اختر منها<br />
Add واذهب إلى المسار<br />
الموجود فيه العنصر الذي تريد إضافته واختر ملف .bpl واضغط<br />
على . Ok<br />
) مثال<br />
TIBEAntialiasButton02_all<br />
. (<br />
نفذ الطريقة السابقة على العنصر<br />
الموجود على الديسك المرفق<br />
أو حمله من الموقع<br />
http://www.ibe-software.com<br />
ستلاحظ أن العنصر وضع نفسه في الصفحة الأخير في لوحة<br />
العناصر .<br />
ب الآن يجب إضافة مجلد العنصر إلى مسار المكتبات<br />
المستخدمة في <strong>دلفي</strong> :<br />
من القائمة Tools Environment Options<br />
ستظهر عندها نافذة أختر منها الصفحة Library<br />
اضغط على الزر Library path لتظهر النافذة<br />
التالية :<br />
اضغط على الزر المجاور لعنصر التحرير بالأسفل<br />
( ... )<br />
159
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
وحدد مسار العنصر الذي قمت بإضافته<br />
حدد مسار ملفات<br />
bpl أو ملفات<br />
Dcu وملفات ( pas ثم اضغط على<br />
)<br />
Ok ومن Add<br />
بإمكانك الآن استخدام العنصر الجديد بالطريقة التي كنا نستخدمها مع<br />
أي عنصر سابق من عناصر <strong>دلفي</strong> ،(<br />
يفضل<br />
استعراض الأمثلة التي تأتي مع العنصر عادة في الفهرس ( Demo<br />
:<br />
2 استخدام ملفات .Dpk<br />
إذا وجد مع العنصر ملف من النوع<br />
ملف حزمة <strong>دلفي</strong><br />
( <strong>Delphi</strong> Package فاتبع الخطوات التالية<br />
) .Dpk<br />
لإضافة هذا العنصر إلى صفحة العناصر :<br />
:<br />
القائمة أ من<br />
File Open حدد الملف ذو الامتداد<br />
.Dpk واضغط على<br />
ok لتظهر النافذة التالية<br />
اضغط منها على الزر<br />
Install ستظهر عندها رسالة تعلمك<br />
بأنه قد تم تحميل العنصر .<br />
ب اعد الخطوة ب الطريقة السابقة .<br />
ملاحظة قد تظهر بعض المشاكل عن استخدام هذه الطريقة،<br />
لحل المشكلة اضغط على الزر<br />
option واختر من الصفحة<br />
Description وغير في القسم الموضح في النافذة التالية :<br />
ثم أغلق نافذة الخيارات واضغط على . Install<br />
3 في حال العنصر الجديد مكون من ملف واحد من الامتداد : Pas<br />
أ افتح الملف من القائمة File<br />
: Open<br />
اختر القائمة Component Install<br />
Component تظهر عندها النافذة<br />
المجاورة<br />
اختر الصفحة Into New package<br />
واكتب أي اسم تريد في الحقل<br />
ok واضغط على Package file name<br />
تظهر عندها النافذة الموضحة في الطريقة الثانية ، اضغط منها على<br />
. Install<br />
160
http://www.alshater.net<br />
.<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ب أعد الخطوة ب السابقة<br />
.<br />
( Setup<br />
4 بعض العناصر تأتي مع برنامج تنصيب )<br />
وتقوم بتنصيب نفسها تلقائي ًا<br />
لماذا هذه الطرق المتعددة :<br />
عمليا ً هناك طريقة واحدة لتركيب العناصر وهي الطريقة الثالثة ولكن بعض المبرمجين يحتاج<br />
إلى أكثر من وحدة<br />
، .Dpk<br />
Unit في عنصره ولذلك يقوم بحزم هذه الوحدات في ملف حزمة<br />
Package وبالتالي ينشأ عندنا ملف<br />
عندما تضغط على الزر<br />
Install في النافذة<br />
Package في الطريقة الثانية أو الثالثة ، تقوم <strong>دلفي</strong> بإنشاء الملف ذو<br />
)<br />
الامتداد<br />
Bpl وهو ملف المكتبات في <strong>دلفي</strong><br />
في <strong>لغة</strong> الفيجول سي أو الفيجول بيسك يتم اعتماد الملفات ذات الامتداد<br />
. ( OCX أو DLL<br />
تتميز <strong>دلفي</strong> عن لغات <strong>البرمجة</strong> الأخرى بأنه لا حاجة لإضافة ملفات<br />
Bpl إلى البرنامج عن توزيعه حيث يتم إدراج<br />
هذه الملفات تلقائيا ً في الملف التنفيذي<br />
.Exe بينما يجب عليك إدراج ملفات ال<br />
.DLL وOcx عند استخدام فيجول<br />
سي أو فيجول بيسك .<br />
إنشاء العناصر في <strong>دلفي</strong> :<br />
:<br />
1 الطريقة الأولى :<br />
سوف نتعرف الآن على أسهل طريقة لإنشاء العناصر في <strong>دلفي</strong><br />
سوف نقوم بإنشاء عنصر تحرير لا يقبل إدخال الأحرف ولعمل ذلك :<br />
ابدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />
حدد بعدها العنصر<br />
Edit واكتب التعليمات التالية في الحدث<br />
: OnKeyPress<br />
const s= [ '1','2','3','4','5','6','7','8','9','0',char(Vk_back)];<br />
begin<br />
if not (key in s ) then<br />
key := char(VK_CAPITAL )<br />
end;<br />
Component Create Component Template واختر Edit1<br />
تظهر عندها النافذة<br />
التالية :<br />
أكتب في الحقل<br />
Component name اسم العنصر التي تريد<br />
( TNumEdit في الحقل وحدد Palette Page اسم<br />
)<br />
الصفحة التي تريد أن يظهر فيها العنصر<br />
) بإمكانك أن تكتب<br />
اسم صفحة جديدة (<br />
كما يمكنك تحديد أيقونة للعنصر الجديد عن طريق الضغط<br />
على الزر . Change<br />
.<br />
اضغط على<br />
Ok سيظهر العنصر الجديد في الصفحة التي حددتها<br />
يمكنك عندئذٍ استخدامه في جميع برامجك اللاحقة .<br />
.<br />
2 الطريقة الثانية<br />
: سنقوم بكتابة نفس العنصر السابق ولكن بطريق أفضل<br />
أغلق جميع الوحدات في <strong>دلفي</strong><br />
File Close All<br />
161
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اختر الأمر<br />
: Component New Component<br />
تظهر عندها النافذة التالية :<br />
اختر من اللائحة Ancestor type القيمة TCustemEdit<br />
وهي العنصر الأب الذي سيرث عنصرنا الجديد خواصه .<br />
في الحقل<br />
Class Name اكتب اسم الصنف الذي تريده<br />
لعنصرك أن<br />
TMyNumberEdit<br />
) يجب أن يبدأ بحرف ( T<br />
في الحقل<br />
Palette Page اكتب اسم الصفحة التي تريد أن<br />
. ( MyComponent<br />
يظهر بها العنصر )<br />
:<br />
اضغط على الزر<br />
ok ستظهر الوحدة<br />
MyNumEdit بالشكل التالي<br />
unit MyNumberEdit;<br />
interface<br />
uses<br />
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;<br />
type<br />
T MyNumberEdit = class(TCustomEdit)<br />
private<br />
{ Private declarations }<br />
protected<br />
{ Protected declarations }<br />
public<br />
{ Public declarations }<br />
published<br />
{ Published declarations }<br />
end;<br />
procedure Register;<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterComponents('Standard', [MyNumberEdit]);<br />
end;<br />
end.<br />
سنشرح كل سطر من هذه الأسطر بشكل مبسط :<br />
1 class(TCustomEdit) TMyNumberEdit = هذه التعليمة تعرف نوع جديد باسم TMyNumEdit من<br />
TEdit<br />
) TEdit<br />
النوع<br />
TCustomEdit وهو النوع المشتق منه النوع<br />
النوع<br />
TCustomEdit هو النوع<br />
ولكن بدون أي خاصة أو حدث ، حيث سنقوم بإدخال الأحداث والخصائص المطلوبة بعد قليل<br />
. (<br />
162
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
يتم في<br />
: هذا القسم تعريف بعض المتحولات والتوابع والخصائص والتي يمكن الوصول إليها من<br />
2 protected<br />
.<br />
(<br />
)<br />
(<br />
قبل هذه الوحدة )<br />
الوحدة المعرفة بها<br />
ومن أي وحدة مشتقة<br />
موروثة<br />
من هذه الوحدة<br />
أي أننا إذا عرفنا<br />
متحول في هذه المنطقة فإننا يمكننا قراءة قيمته والكتابة فيه ضمن أي وحدة ترتبط مع الوحدة<br />
.MyNumberEdit<br />
يستخدم هذا القسم لتعريف الخصائص وهو يشبه القسم<br />
Public ويختلف عنه أن الخاصة<br />
:<br />
3 published<br />
... Event<br />
( Object inspector<br />
المعرفة هنا ستظهر في محرر الخواص )<br />
وفي صفحة<br />
سيتضح عمله فيما<br />
بعد .<br />
4 : procedure Register<br />
مهمة الإجراء هي استدعاء الإجراء [MyNumberEdit]); RegisterComponents('Standard',<br />
والذي<br />
.<br />
يقوم بإظهار العنصر<br />
MyNumberEdit في الصفحة<br />
Standard من صفحات العناصر<br />
الآن سوف نبدأ بإضافة بعض الخاصة<br />
About والتي ستظهر في صفحة الخواص الخاصة<br />
About وفيها اسم<br />
مبرمج العنصر .<br />
أضف التعليمة التالية في القسم<br />
: Public<br />
constructor Create(AOwner: TComponent); override;<br />
حيث Constructor هو منهج خاص يستخدم مع Create فقط ويقوم بإنشاء العنصر وتهيئته أي إعطاءه القيم<br />
. Procedure<br />
الابتدائية ويمكن اعتباره إجراء تستخدم فيه الكلمة المحجوزة<br />
Constructor بدلا ً من<br />
أضف في القسم<br />
ضع مؤشر التحرير<br />
Published<br />
: التعليمة التالية<br />
Property About : string Read FAbout Write Fabout;<br />
)<br />
مؤشر لوحة المفاتيح<br />
(<br />
عند هذا السطر واضغط على المفاتيح Ctrl + Shift + C سيضاف<br />
. private<br />
عندها المتحول<br />
FAbout من النوع<br />
String إلى القسم<br />
تقوم<br />
هذه التعليمة بتعريف خاصة من اسمها<br />
About من النوع<br />
String تأخذ هذه الخاصة قيمتها أثناء التصميم من<br />
التعليمة<br />
. Write FAbout وتأخذ قيمتها أثناء التنفيذ من التعليمة Read FAbout<br />
ضع مؤشر التحرير على المنهج<br />
Constructor واضغط على المفاتيح Ctrl + Shift + C سيضاف عندها<br />
هذا المنهج إلى القسم<br />
Implementation والذي سيبدأ بالتعليمة<br />
Inherited والتي تجعل هذا التابع يرث جميع<br />
خواص التابع الأصل المعرف في الوحدة . TCustomEdit<br />
FABout := 'M.Khaled Nasser Agha';<br />
أضف التعليمة التالية بعد التعليمة<br />
قم بحفظ الوحدة باسم<br />
: Inherited<br />
. MyNumberEdit<br />
افتح النافذة<br />
Component install component ستظهر النافذة المشروحة في الفقرة الثالثة من طرق<br />
تركيب عنصر جديد على كل حال افتح الصفحة<br />
into new package واكتب Editnumber في الحقل<br />
ok ستفتح عندها نافذة جديدة<br />
اضغط فيها على أحد الزرين<br />
Install أو<br />
Package File Name واضغط على الزر<br />
163
http://www.alshater.net<br />
) Standard<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
، Compile سيظهر عندها العنصر في آخر الصفحة<br />
إذا كنت قد كتبت التعليمات السابقة بدون<br />
.<br />
أخطاء (<br />
أغلق نافذة واحفظ الملفات إذا ط ٌلب ذلك<br />
ابدأ مشروعا ً جديدا ً وضع عليه العنصر الجديد ستجد أن أول خاصة له في محرر الخواص هي الخاصة About<br />
بالإضافة إلى أن الخواص مختصرة بشكل كبير ، افتح الصفحة<br />
Events ولاحظ عدم وجود أي حدث لهذا العنصر<br />
.<br />
سنقوم الآن بإضافة الخاصة Num لهذا العنصر حيث سيتم إدخال رقم إلى العنصر و الحصول منه على رقم من<br />
. ( TEdit<br />
خلال هذه الخاصة )<br />
ستحل هذه الخاصة محل الخاصة<br />
Text في العنصر من النوع<br />
أغلق الآن جميع النوافذ ومن القائمة File ReOpen اختر<br />
Editnumber.dpk ستظهر الآن النافذة المجاورة، اضغط مرتين<br />
MyNumberEdit.pas ستظهر عندها هذه الوحدة في محرر<br />
الشيفرة ، نستطيع الآن إجراء التعديلات التي نريد على هذه الوحدة<br />
ومن ثم الضغط على الزر<br />
Compile للتنقل التعديلات إلى العنصر<br />
... Standard الموجود على الصفحة TMyNumberEdit<br />
أضف الآن السطر التالي إلى القسم . Published<br />
property Num: Extended read FNum write SetFNum;<br />
ضع مؤشر التحرير عند هذا السطر واضغط على Ctrl + Shift + C سيتم عندها تعريف المتحول FNum في<br />
القسم<br />
Private وتعريف الإجراء SetNum أيضا ً ، وفي القسم<br />
Implementation سيتم إضافة جسم الإجراء<br />
SetNum وستوجد فيه التعليمة التالية<br />
احفظ الوحدة وعد إلى النافذة السابقة<br />
FNum := Value :<br />
أضف إليها التعليمة التالية<br />
:<br />
Text := floattostr(value);<br />
Compile ثم<br />
)<br />
ستكون موجودة في الخلف عادة<br />
(<br />
اضغط منها على الزر<br />
Standard ستلاحظ<br />
أغلق هذه النافذة وابدأ مشروعا ً جديدا ً أضف إليه العنصر MyNumberEdit<br />
من الصفحة<br />
أن لهذا العنصر الخاصة Num أدخل فيها أي قيمة عددية لتظهر في العنصر أثناء التصميم ، أدخل مجموعة من<br />
.<br />
الأحرف واضغط على الزر<br />
Enter ستلاحظ عدم قبول هذه الخاصة لإدخال الأحرف<br />
نفذ البرنامج وأدخل حروف في العنصر ستلاحظ قبول العنصر لها وهذا يدفعنا إلى الخطوة التالية في تطوير<br />
العنصر وهي منع إدخال الأحرف إليه .<br />
. MyNumberEdit.pas<br />
افتح الحزمة<br />
EditNumber.dpk ثم افتح الوحدة<br />
سوف نضيف التابع<br />
KeyPress إلى وحدتنا وهذا التابع معرف في الوحدة<br />
TCustomEdit وهو المسؤول عن<br />
استقبال أحرف لوحدة المفاتيح لذلك أضف السطر التالي في القسم<br />
: Public<br />
procedure KeyPress(var Key: Char); override;<br />
اضغط على المفاتيح Ctrl + Shift + C ليضاف جسم الإجراء تلقائيا ً وتضاف فيه التعليمة Inherited<br />
لكي<br />
TCustomEdit<br />
يورث جميع التعليمات الموجودة في الإجراء<br />
KeyPress الموجود في الوحدة الأب المعرف فيها<br />
أضف الآن التعليمة التالية فوق التعليمة Implementation مباشرة :<br />
164
http://www.alshater.net<br />
const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];<br />
: Inherited<br />
If not (key in NumberChar ) Then key := char(VK_Capital);<br />
.<br />
Edit بالإضافة<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
وأضف التعليمة التالية في جسم الإجراء KeyPress وبعد التعليمة<br />
احفظ الوحدة واضغط على الزر Compile في نافذة المجموعة EditNumber.dpk ثم أغلقها<br />
ابدأ مشروعا ً جديدا ً وأضف إليه عنصرنا الجديد ونفذ البرنامج .<br />
بقيت مشكلة وحيدة في عنصرنا وهي عدم وجود عدد كبير من الخصائص الموجودة في العنصر<br />
إلى عدم وجود أحداث ولإضافتها افتح الحزمة Editnumber.dbk<br />
تحتاجها في عنصرك في القسم Published كما في الشكل<br />
وأكتب أسماء الخواص والأحداث التي<br />
property BiDiMode;<br />
property CharCase;<br />
property Color;<br />
property OnEnter;<br />
property OnKeyPress;<br />
property OnKeyDown;<br />
property OnKeyUp;<br />
:<br />
واحفظ الوحدة بعدها واضغط على<br />
الخواص فيه<br />
وفيما يلي النص الكامل للوحدة<br />
Compile ثم أضف عنصرنا الجديد إلى مشروع جديد لتلاحظ وجود هذه<br />
: MynumberEdit.pas<br />
unit MyNumberEdit;<br />
interface<br />
uses<br />
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;<br />
type<br />
TMyNumberEdit = class(TCustomEdit)<br />
private<br />
FAbout: string;<br />
FNum: Extended;<br />
procedure SetFNum(const Value: Extended);<br />
{ Private declarations }<br />
protected<br />
{ Protected declarations }<br />
public<br />
constructor Create(AOwner: TComponent); override;<br />
procedure KeyPress(var Key: Char); override;<br />
{ Public declarations }<br />
published<br />
Property About : string Read FAbout Write Fabout;<br />
property Num: Extended read FNum write SetFNum;<br />
property BiDiMode;<br />
property CharCase;<br />
property Color;<br />
165<br />
.
http://www.alshater.net<br />
property Enabled;<br />
property Font;<br />
property ParentBiDiMode;<br />
property ParentColor;<br />
property ParentCtl3D;<br />
property ParentFont;<br />
property PasswordChar;<br />
property ReadOnly;<br />
property ShowHint;<br />
property TabOrder;<br />
property TabStop;<br />
property Visible;<br />
property OnChange;<br />
property OnClick;<br />
property OnDblClick;<br />
property OnEnter;<br />
property OnExit;<br />
property OnKeyDown;<br />
property OnKeyUp;<br />
{ Published declarations }<br />
end;<br />
procedure Register;<br />
const NumberChar = [ '1','2','3','4','5','6','7','8','9','0','.'];<br />
implementation<br />
procedure Register;<br />
begin<br />
RegisterComponents('Standard', [TMyNumberEdit]);<br />
end;<br />
{ TMyNumberEdit }<br />
constructor TMyNumberEdit.Create(AOwner: TComponent);<br />
begin<br />
inherited;<br />
FABout := 'M.Khaled Nasser Agha';<br />
end;<br />
procedure TMyNumberEdit.KeyPress(var Key: Char);<br />
begin<br />
inherited;<br />
if not (key in NumberChar ) then<br />
key := char(VK_Capital);<br />
end;<br />
procedure TMyNumberEdit.SetFNum(const Value: Extended);<br />
begin<br />
FNum := Value;<br />
Text := floattostr(value);<br />
end;<br />
end.<br />
166<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong>
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة 25<br />
: Drag and Drop<br />
السحب والإفلات :<br />
1 فهم الوسيط : Sender<br />
لا بد أنك لاحظت أن الوسيط<br />
Sender يدخل في جميع معالجات أحداث الصفحة<br />
Event ففي حدث الضغط على<br />
الزر يظهر الإجراء التالي والذي له وسيط واحد هو Sender من النوع . TObject<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
مهمة هذا الوسيط هي إرجاع اسم العنصر الذي قام بالحدث أي أن قيمته عن الضغط على الزر Button1 هي<br />
. Button1<br />
ولفهم أعمق لهذا الوسيط نفذ المثال التالي :<br />
ابدأ مشروعا ً جديدا ً وأضف إليه زرين : Button<br />
1 اكتب في حدث الضغط على الزر Button1 أكتب التعليمة التالية<br />
:<br />
If sender = Button1 Then Showmessage ( ' You Click On Button1 ');<br />
If sender = Button2 Then Showmessage ( ' You Click on Button2 ');<br />
OnClick واختر<br />
2<br />
حدد الزر Button2 ثم انتقل إلى الصفحة Event واضغط على السهم المجاور للخاصة<br />
من القائمة<br />
. Button1Click<br />
نفذ البرنامج واضغط على الزرين ولاحظ النتائج .<br />
2 السحب والإفلات :<br />
: ListBox وعنصر Label<br />
:<br />
مثال 1<br />
أضف إلى النموذج في مشروع جديد ثلاثة عناصر<br />
سنقوم الآن بكتابة<br />
التعليمات <strong>البرمجة</strong> التي تمكننا من سحب العناصر<br />
Label وإفلاتها فوق العنصر<br />
ListBox بحيث يصبح لون<br />
العنصر اللائحة<br />
LIstBox1 بلون العنصر<br />
Label المسحوب، لذلك أعط كل من<br />
العناصر<br />
Label لون مختلف<br />
وأعطهم جميعا ً في الخاصة DragMode القيمة . dmAutomatic<br />
Accept := Source is Tlabel;<br />
:<br />
اكتب في الحدث<br />
OnDragOver للعنصر<br />
يحوي الإجراء ListBox1DragOver الوسطاء التالية<br />
ListBox1 التعليمة التالية<br />
:<br />
العنصر الذي يستدعي الإجراء وهو . ListBox1<br />
هنا العنصر<br />
: Sender<br />
.<br />
العنصر الذي يتم سحبه وهو أحد العناصر<br />
Label في مثالنا<br />
: Source<br />
: X,Y إحداثيات مؤشر الفأرة .<br />
: State يحدد طريقة تحرك الفأرة فوق العنصر .<br />
عندما يأخذ هذا المتحول القيمة<br />
True فإن العنصر سوف يكون جاهزا ً لإفلات العنصر فوقه<br />
) سيتغير<br />
: Accept<br />
شكل مؤشر الفأرة ليظهر بالشكل الذي يبين أن الإفلات مقبول<br />
)وإلا فإن العنصر سيرفض إفلات العنصر المسحوب<br />
. فوقه<br />
167
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
http://www.alshater.net<br />
. Tlabel<br />
: Source Is Tlabel<br />
تعيد هذه التعليمة القيمة True إذا كان المتحول Source من النوع<br />
اكتب في الحدث OnDragDrop لنفس العنصر التعليمة التالية<br />
:<br />
( sender as Tlistbox ).color := (Source as Tlabel ).color ;<br />
Tlistbox نفسه<br />
.<br />
التعليمة Sender As TlistBox تسمح لنا بالتعامل مع الوسيط Sender كما نتعامل مع العنصر<br />
كذلك بالنسبة للعنصر<br />
مثال<br />
. Source As Tlabel<br />
نفذ البرنامج واسحب أحد العناصر Label وأتركه فوق العنصر ListBox1 ولاحظ النتائج<br />
.<br />
: 2<br />
أضف عنصر صورة<br />
الخاصة<br />
Image<br />
إلى المثال السابق واجعله يظهر صورة ما عن طريق الخاصة<br />
،Picture أعط<br />
DragMode القيمة<br />
في مكان على النموذج<br />
dmAutomatic سنكتب التعليمات اللازمة التي تمكننا من وضع العنصر<br />
Image1<br />
.<br />
اكتب في الحدث اكتب في الحدث<br />
OnDragOver للنموذج<br />
Form1 التعليمة التالية<br />
:<br />
accept := Source is Timage;<br />
اكتب في الحدث OnDragDrop للنموذج التعليمة التالية<br />
نفذ البرنامج وحرك العنصر<br />
فوق العنصر<br />
(Source as Timage).Top := y;<br />
(Source as Timage).Left := X;<br />
:<br />
.ListBox<br />
Image1 ولاحظ تنقله فوق أي مكان من النموذج ولاحظ أيضا ً أنه لا يمكن إفلاته<br />
168
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الرسم في <strong>دلفي</strong><br />
Timage ويمكننا<br />
يتم الرسم في <strong>دلفي</strong> فوق عنصر الكنفا<br />
Canvas وهو أحد خصائص العنصر TForm والعنصر<br />
رسم عدد من الأشكال الهندسية بواسطة توابع معرفة فوق عنصر الكنفا .<br />
رسم مستقيم :<br />
لرسم مستقيم يجب تحديد نقطة البداية ونقطة للنهاية<br />
أ يتم تحديد نقطة البداية عن طريق التعليمة Form1.Canvas.MoveTo(x,y) حيث<br />
x,y هما إحداثيات نقطة<br />
البداية، إذا أردت من المستخدم أن يحدد نقطة البداية عن طريق الضغط على زر الفأرة فوق النموذج ضع هذه<br />
التعليمة في الحدث OnMouseDown للنموذج . Form1<br />
ب يتم تحديد نقطة النهاية للمستقيم ضمن تعليمة رسم مستقيم وهي Form1.Canvas.LineTo(x,y) حيث x,y<br />
هما إحداثيات نقطة النهاية لمستقيم ، وإذا أردت أن يتم رسم المستقيم في المكان الذي يحرر فيه المستخدم زر<br />
الفأرة ضع هذه التعليمات في الحدث OnMouseUp للنموذج . Form1<br />
نفذ الآن البرنامج واضغط على مؤشر الفأرة وأبقه مضغوطا ً ثم حرك الفأرة إلى مكان جديد وحرر زر الفأرة ،<br />
سيظهر عندها خط مستقيم بين نقطتي البداية والنهاية .<br />
لإظهار الخط أثناء تحريك الفأرة ضع التعليمة التالية ضمن الحدث<br />
OnMouseMove والذي يحدث أثناء<br />
تحريك الفأرة :<br />
Form1.Canvas.LineTo(x,y);<br />
تقوم هذه التعليمة بالرسم فوق النافذة عند تحريك الفأرة ، وإذا أردنا الرسم فقط عندما يكون زر الفأرة مضغوطا ً<br />
يجب إضافة التعليمات التالية:<br />
أ عدل القسم Var للوحدة بحيث يصبح بالشكل<br />
ب عدل التعليمات في الحدث<br />
var<br />
Form1: TForm1; Drawing : boolean = false;<br />
:<br />
Drawing := True;<br />
Canvas.MoveTo(x,y);<br />
:<br />
if Drawing Then Form1.Canvas.LineTo(x,y);<br />
:<br />
Drawing := false;<br />
:<br />
OnMouseDown لتصبح بالشكل<br />
ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />
د عدل التعليمات في الحدث OnMouseUp لتصبح بالشكل<br />
نفذ البرنامج واضغط على زر الفأرة وارسم الخط<br />
.<br />
إن مشكلة الحدث<br />
OnMouseMove هو أنه يرسم خط منحني ولا يرسم مستقيم بين نقطتين يحددهما المستخدم<br />
ولذلك نضيف متحول جديد على الوحدة يقوم بحفظ النقطة التي ضغط عليها المستخدم وهذا المتحول من النوع<br />
.<br />
TPoint هذا النوع عبارة عن سجل يحوي متحولين<br />
X,y من النوع<br />
Integer يخزن فيهما إحداثيات النقطة<br />
:<br />
أ أضف تعريف المتحول على القسم<br />
private كما يلي<br />
Origin : TPoint;<br />
169
http://www.alshater.net<br />
:<br />
Drawing := True; Canvas.MoveTo(x,y);<br />
Origin := point(x,y);<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ب عدل التعليمات في الحدث<br />
OnMouseDown لتصبح بالشكل<br />
ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />
:<br />
If Drawing then Begin<br />
Canvas.MoveTo(origin.X,origin.y) ; Form1.Canvas.LineTo(x,y);<br />
end;<br />
د عدل التعليمات في الحدث OnMouseUp لتصبح بالشكل :<br />
Canvas.MoveTo(origin.X,origin.Y);<br />
canvas.LineTo(x,y);<br />
Drawing := false;<br />
نفذ البرنامج واضغط على زر الفأرة وحركها سيتم رسم العديد من المستقيمات من نقطة التي ضغطت عليها إلى<br />
النقطة التي يتحرك مؤشر الفأرة فوقها ، ولكننا نريد فقط أن يظهر في النهاية المستقيم الذي يرسمه الحدث<br />
OnMouseUp ،لذلك سنقوم بمسح المستقيمات التي ترسم في الحدث<br />
لحذف مستقيم معين لذلك سنقوم برسم خط جديد فوق الخط الذي يرسم في الحدث<br />
، OnMouseMove لكن لاتوجد تعليمة<br />
OnMouseMove ولكن بلون<br />
الأرضية وبهذا يبدوا عمليا ً أن الخط قد تم مسحه، ولتحقيق ذلك عدل التعليمات في الوحدة لتغدو بالشكل<br />
أ أضف على القسم<br />
:<br />
Private المتحول<br />
Movept من النوع Tpoint الذي سنخزن فيه قيمة آخر نقطة مر عليها<br />
الحدث OnMoseMove وبالتالي هي نفسها إحداثيات نهاية الخط الذي رسم باستخدام هذا الحدث<br />
ب أضف التعليمة في نهاية تعليمات الحدث الحدث<br />
.<br />
Origin,Movept :Tpoint;<br />
Movept := Point(x,y);<br />
:<br />
OnMouseDown<br />
ج عدل التعليمات في الحدث OnMouseMove لتصبح بالشكل<br />
عندما غيرنا الخاصة<br />
If Drawing then begin<br />
canvas.Pen.Mode := pmNotXor;<br />
canvas.MoveTo(origin.X,origin.y) ;<br />
Canvas.LineTo(Movept.x,movept.y);<br />
Canvas.moveto(origin.X,origin.y) ;<br />
Canvas.LineTo(x,y);<br />
end;<br />
movept := point(x,y);<br />
Canvas.Pen.Mode := pmCopy;<br />
end;<br />
:<br />
Mode للقلم<br />
pen وأعطيناها القيمة<br />
pmNotXor فإننا بذلك طلبنا دمج الخط مع عنصورات<br />
الأرضية وبذلك سيرسم الخط بنفس لون الأرضية وسيبدو وكأنه ممسوح وقد أعدنا القيمة<br />
تعليمة لكي يكون القلم جاهز لرسم الخط النهائي عندما نحرر زر الفأرة<br />
.<br />
1<br />
2<br />
PmCopy في آخر<br />
170
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التعليمتان 1 تقومان برسم خط بين النقطة التي حددها المستخدم وبين آخر نقطة مرت فوقها الفأرة<br />
http://www.alshater.net<br />
النقطة )<br />
المخزنة في المتحول<br />
وسيكون لون الخط بلون الأرضية<br />
) بما أننا نرسم خط جديد فوق خط سابق لونه<br />
( Movept<br />
(<br />
أسود فإن الخاصة<br />
mode ذات القيمة<br />
pmNotXor ستقوم بطرح اللونين من بعضهما وإعادة لون الخلفية<br />
التعليمتان<br />
2 تقومان برسم خط جديد بين النقطة التي ضغط عليها المستخدم والنقطة التي تتحرك الفأرة فوقها<br />
وسيظهر الخط باللون الأسود.<br />
OnMouseMove<br />
(<br />
إذا أردت أن تتأقلم مع التعليمات السابقة )<br />
أن تفهمها بشكل جيد<br />
عدل التعليمات في الحدث<br />
لتصبح بالشكل :<br />
If Drawing then begin<br />
canvas.Pen.Color := form1.Color ;<br />
canvas.MoveTo(origin.X,origin.y) ;<br />
Canvas.LineTo(Movept.x,movept.y);<br />
canvas.Pen.Color := clblack;<br />
canvas.moveto(origin.X,origin.y) ;<br />
Form1.Canvas.LineTo(x,y);<br />
end;<br />
movept := point(x,y);<br />
لكن عليك أن تعيدها على شكلها السابق لكي نكمل برنامجنا بالطريقة الصحيحة ...<br />
حتى الآن استطعنا أن نرسم مستقيم ولرسم بقية الأشكال الهندسية سنقوم بإضافة شريط أدوات للبرنامج للتمكن من<br />
:<br />
اختيار<br />
الشكل الذي نريد رسمه<br />
إضافة شريط أدوات للشكل :<br />
New Button من القائمة ، كرر<br />
أضف العنصر<br />
Toolbar إلى الشكل واضغط عليه بزر الفأرة اليميني واختر<br />
العملية لإضافة أربع أزرار.<br />
يجب إعطاء كل زر من الأزرار السابقة صور ما تدل على العمل الذي سيقوم به الزر، فإذا كنت تملك أيقونات<br />
جاهزة فبإمكانك استخدامها وإلا فعليك أن ترسم هذه الأيقونات بنفسك ، قبل البدء بإنشاء الإيقونات قم بحفظ<br />
. ( Painting<br />
المشروع )<br />
احفظ الوحدة باسم<br />
Gragh واحفظ المشروع باسم<br />
إنشاء أيقونات جديدة :<br />
اختر من القائمة Tools الأمر Image Editor سيظهر<br />
عندها برنامج تحرير الصور كما في الشكل :<br />
اختر File New icon File<br />
ستظهر لك نافذة اختر منها Small Icon و 16 Color<br />
ستظهر عندها النافذة<br />
Icon1.ico كما في الشكل المجاور<br />
فيها مربع الأخضر وهو يدل على المساحة الشفافة في<br />
الأيقونة<br />
171
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
استخدم أداة رسم خط لرسم خط بين الزاوية اليسرى العلوية والزاوية اليمنى السفلية وبهذا نكون قد رسمنا أيقونة<br />
لزر رسم خط احفظ الملف باسم Line.ico وأغلقه ، ثم أنشأ الأيقونات الأخرى جديدة بنفس الطريقة بحيث تظهر<br />
الأشكال التالية فيها<br />
:<br />
لاتنس أن تحفظ كل أيقونة باسم مناسب<br />
نعود الآن إلى مشروعنا<br />
أضف العنصر<br />
172<br />
.<br />
:<br />
ImageList من الصفحة<br />
الأيقونات الأربعة التي رسمتها<br />
اختر العنصر<br />
Win32 واضغط عليه مرتين تظهر عندها نافذة أختر منها<br />
Add وأضف<br />
.<br />
Toolbar1 واعط القيمة<br />
على لكي تظهر الأيقونات بالترتيب التالي<br />
حدد العنصر ToolBars وأعط الخاصة<br />
Imagelist1 للخاصة<br />
. True القيمة Flat<br />
:<br />
حدد الأزرار الأربعة سوية وأعطها في الخاصة<br />
وأعطها في الخاصة<br />
زرين مضغوطين بنفس الوقت<br />
Grouped<br />
tbsCheck القيمة Style<br />
.<br />
Images ثم عدل الخاصة<br />
ImageIndex لكل زر<br />
القيمة ،True لتجميع هذه الأزرار مع بعضها<br />
، هذه الخاصة ستجعل أحد الأزرار مضغوطا ً فقط ولايمكن أن نبقي<br />
عندما نضغط على أحد الأزرار فإننا سنحدد الشكل الذي سترسمه الفأرة أثناء تحريكها لذلك سنعرف متحول يأخذ<br />
قيمة مختلفة عند الضغط على كل زر من الأزرار وأفضل طريقة هي تعريف نوع معطيات تعدادي ، هذا النوع<br />
سيربط بين سلسلة رمزية وبين رقم داخلي ويستبدله تلقائيا ً ،لذلك صرح عن نوع المعطيات التالي في القسم<br />
من الوحدة<br />
ملاحظة<br />
Type<br />
type<br />
TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);<br />
TForm1 = class(TForm)<br />
:<br />
const<br />
dtLine = 0;<br />
dtRectangle = 1;<br />
dtEllipse = 2;<br />
dtRoundRect = 3;<br />
: Private<br />
DrawingTool: TDrawingTool;<br />
:<br />
DrawingTool := dtLine;<br />
:<br />
DrawingTool := dtRectangle;<br />
:<br />
: Gragh<br />
:<br />
تعريف هذا النوع يكافئ التعريف التالي<br />
بما أننا عرفنا نوع فعلينا تعريف متحول من هذا النوع، لذلك أضف تعريف المتحول التالي للقسم<br />
أكتب التعليمة التالية في حدث الضغط على الزر الأول<br />
والتعليمة التالية في حدث الضغط على الزر الثاني<br />
والتعليمة التالية في حدث الضغط على الزر الثالث
http://www.alshater.net<br />
DrawingTool := dtEllipse;<br />
DrawingTool := dtRoundRect;<br />
.<br />
OnMouseUp<br />
173<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
والتعليمة التالية في حدث الضغط على الزر الرابع<br />
وبهذا نكون قد أعطينا قيمة محددة للمتحول DrawingTool عند الضغط على كل زر من الأزرار<br />
الآن علينا أن نفحص قيمة DrawingTool عند رسم الأشكال لذلك نعدل التعليمات في الحدث<br />
للنموذج كما يلي<br />
case DrawingTool of<br />
dtLine:<br />
begin<br />
Canvas.MoveTo(Origin.X, Origin.Y);<br />
Canvas.LineTo(X, Y)<br />
end;<br />
dtRectangle: Canvas.Rectangle(Origin.X, Origin.Y, X, Y);<br />
dtEllipse: Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />
dtRoundRect: Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />
(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />
end;<br />
Drawing := False;<br />
End;<br />
ولكي نستطيع مشاهدة الشكل الذي يرسم أثناء تحريك الفأرة نعدل التعليمات في الحدث OnMuseMove لتصبح<br />
if Drawing then<br />
begin<br />
Canvas.Pen.Mode := pmNotXor;<br />
case DrawingTool of<br />
dtLine: begin<br />
Canvas.MoveTo(Origin.X, Origin.Y);<br />
Canvas.LineTo(MovePt.X, MovePt.Y);<br />
Canvas.MoveTo(Origin.X, Origin.Y);<br />
Canvas.LineTo(X, Y);<br />
end;<br />
dtRectangle: begin<br />
Canvas.Rectangle(Origin.X, Origin.Y, MovePt.X, MovePt.Y);<br />
Canvas.Rectangle(Origin.X, Origin.Y, X, Y);<br />
end;<br />
dtEllipse: begin<br />
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);<br />
end;<br />
dtRoundRect: begin<br />
Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />
(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />
Canvas.RoundRect(Origin.X, Origin.Y, X, Y,<br />
بالشكل :
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
شرح بعض التعليمات الواردة في الحدثين السابقين<br />
تعليمة رسم مستطيل<br />
http://www.alshater.net<br />
(Origin.X - X) div 2, (Origin.Y - Y) div 2);<br />
end;<br />
end;<br />
end;<br />
MovePt := Point(X, Y);<br />
Canvas.Pen.Mode := pmCopy;<br />
end;<br />
:<br />
: ( Rectangle )<br />
تقوم هذه التعليمة برسم مستطيل بمعرفة إحداثيات نقطتي البداية والنهاية لأحد أقطاره<br />
تعليمة رسم قطع ناقص<br />
.<br />
: ( Ellipse)<br />
تقوم هذه التعليمة برسم قطع ناقص أو دائرة بمعرفة :إحداثيات نقطتي قطر المستطيل الذي يمس القطع الناقص<br />
أقطاره الأربعة أضلاع<br />
تعليمة رسم مستطيل ذو زوايا مستديرة<br />
: ( RoundRect )<br />
تقوم هذه التعليمة برسم مستطيل ذو زوايا مستديرة بمعرفة نقطي القطر كما في رسم مربع<br />
الأولى<br />
)<br />
(<br />
تغير شكل الخط<br />
ومعرفة الطول الذي سيأخذه القوس من ارتفاع وعرض المستطيل<br />
.<br />
:<br />
يمكننا التحكم بشكل الخط، حيث يمكن أن يظهر بشكل منقط أو خطوط متتالية أو خط ونقطة<br />
التحكم بلون الخط وعرضه.<br />
الوسطاء الأربعة<br />
...<br />
، كما يمكننا<br />
سنضيف الآن شريط أدوات جديد للتحكم بشكل الخط، هذا الشريط سيبقى مخفيا ً حتى يضغط المستخدم على زر في<br />
شريط الأدوات السابق ولتحقيق ذلك<br />
:<br />
أ أضف شريط ادوات Toolbar من الصفحة Win32 وأعط الخاصة<br />
. False القيمة Visible<br />
ب أضف الآن ستة أزرار عن طريق الضغط على زر الفأرة اليميني والضغط على الزر<br />
ج أضف عنصر ImageList1 جديد واربط العنصر<br />
الصور إلى هذا العنصر<br />
اذهب إلى المجلد<br />
. New Button<br />
Toolbar2 معه<br />
)<br />
وأضف مجموعة من الأيقونات أو<br />
C:\Program Files\Borland\<strong>Delphi</strong>6\Demos\Doc\Graphex<br />
:<br />
solid.bmp - dashed.bmp - dotted.bmp - dashdot.bmp - dashdot2.bmp - clear.bmp<br />
:<br />
واضف الصور التالية منه على الترتيب<br />
بحيث يصبح في النهاية بالشكل<br />
حدد الأزرار الستة وأعط الخاصة Grouped لها القيمة<br />
د اضغط بزر الفأرة اليميني على العنصر<br />
الصور التالية إلى العنصر ImageList1 من المجلد السابق<br />
tbsCheck القيمة Style والخاصة True<br />
New Separator واختر toolbar1<br />
:<br />
174<br />
ثم أضف زر جديد وأضف
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أعط هذا الزر في الخاصة<br />
http://www.alshater.net<br />
pen.bmp - brush.bmp<br />
:<br />
tbsCheck القيمة Style<br />
ه في حدث الضغط على هذا الزر أكتب التعليمة التالية<br />
toolbar2.Visible := not toolbar2.Visible ;<br />
عند الضغط هذا الزر فسيظهر شريط الأدوات الثاني وسيختفي إذا كان ظاهرا ً .<br />
أكتب التعليمة التالية في حدث الضغط على الزر الأول في شريط الأدوات الثاني<br />
والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />
والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />
والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />
والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />
والتعليمة التالية في حدث الضغط على الزر الذي يليه<br />
: Toolbar2<br />
canvas.Pen.Style := pssolid;<br />
canvas.Pen.Style := psDash;<br />
canvas.Pen.Style := psdot;<br />
canvas.Pen.Style := psdashdot ;<br />
canvas.Pen.Style := psdotdot ;<br />
canvas.Pen.Style := psclear ;<br />
:<br />
:<br />
:<br />
:<br />
:<br />
تغير لون القلم<br />
175<br />
:<br />
يمكن أن نرسم بألوان مختلفة باستخدام عنصر القلم Tpen ولتحقيق ذلك<br />
أ أضف العنصر ColorDialog إلى النموذج<br />
ب أضف إلى<br />
التعليمة التالية<br />
:<br />
.<br />
( Separator<br />
Toolbar2 فاصل )<br />
:<br />
ج أعط هذا الزر أيقونة مناسبة<br />
نفذ البرنامج ولاحظ النتائج<br />
تغير عرض القلم<br />
ومن ثم زر جديد وفي حدث الضغط على هذا الزر أكتب<br />
if ColorDialog1.Execute then<br />
Canvas.Pen.Color := ColorDialog1.Color;<br />
. (<br />
)<br />
.<br />
:<br />
الأيقونة<br />
colors.bmp من الفهرس السابق<br />
لكي يتمكن برنامجنا بالتحكم بعرض الخط المرسوم أضف ما يلي<br />
أ عنصر Edit ضعه فوق العنصر<br />
:<br />
. ToolBar2<br />
ب عنصر UpDown من الصفحة Win32 أعطه في القيمة Edit1 في الخاصة<br />
ج أضف التعليمة التالية في الحدث<br />
تغير نوع الفرشاة<br />
: Associate<br />
للعنصر :Edit1 OnChange<br />
canvas.Pen.Width := strtoint(edit1.Text );<br />
:<br />
تستخدم الفرشاة في <strong>دلفي</strong> لتحديد النمط الذي ستمتلئ به الأشكال في <strong>دلفي</strong><br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
سنضيف الآن شريط أدوات جديد للتحكم بالفرشاة على غرار شريط الأدوات المستخدم للتحكم بالقلم ولتحقيق ذلك<br />
أ أضف شريط أدوات جديد إلى النموذج<br />
http://www.alshater.net<br />
:<br />
.<br />
ب أضف زر جديد إلى شريط الأدوات Toolbar1 وأعط الخاصة Style لهذا الزر القيمة<br />
tbsCheck واكتب<br />
في حدث الضغط عليه التعليمة التالية :<br />
Toolbar3.Visible := Not Toolbar3.Visible ;<br />
ج أضف إلى شريط الأدوات الجديد تسعة أزرار ، حدد الأزرار الثمانية الأولى منها وأعط الخاصة Grouped<br />
لها القيمة<br />
True والخاصة Style القيمة<br />
tbsCheck وأعطها صور من المجلد السابق بحيث تظهر بالشكل<br />
:<br />
أكتب في حدث الضغط على الزر الأول التعليمة التالية<br />
وفي حدث الضغط على الزر التالي القيمة<br />
وفي حدث الضغط على الزر التالي القيمة<br />
:<br />
canvas.Brush.Style := bssolid;<br />
:<br />
canvas.Brush.Style := bsclear;<br />
:<br />
canvas.Brush.Style := bshorizontal;<br />
:<br />
bsVertical – bsFdiagonal – bsbdiaognal – bsColor – bsDiagCross<br />
كرر التعليمة وغير القيمة المحلقة بالمنهج Style للأزرار الباقية على التوالي<br />
تغيير لون الفرشاة<br />
:<br />
اكتب التعليمة التالية في حدث الضغط على الزر التاسع في شريط الأدوات<br />
: ToolBar3<br />
If ColorDialog1.Excetue then canvas.Brush.Color := ColorDialog1.Color ;<br />
إضافة شريط الحالة إلى النموذج<br />
:<br />
يستخدم شريط الحالة Status bar لإظهار معلومات عن حالات معينة ضمن التطبيق، سيظهر برنامجنا معلومات<br />
عن موقع المشيرة الحالي بالإضافة إلى النقطة البدائية التي ضغط عليها المستخدم ولتحقيق ذلك<br />
أ أضف العنصر StatusBar من الصفحة<br />
:<br />
. Win32<br />
2<br />
إضغط عليه بزر الفأرة اليميني واختر Panel Editor ستظهر عندها نافذة تحرير اللوحات اضغط فيها على<br />
الزر Add New مرتين لإضافة لوحتين<br />
3 حدد اللوحة 0 وأعطها في الخاصة<br />
4 أضف التعليمة التالية في حدث<br />
5 أضف التعليمة التالية في الحدث<br />
Width القيمة . 150<br />
OnMouseDown للنموذج :<br />
StatusBar1.Panels[0].Text := Format ('origin = %d , %d',[x,y]);<br />
OnMouseMove للنموذج :<br />
StatusBar1.Panels[1].Text := Format ('Point = %d , %d',[x,y]);<br />
.<br />
176
http://www.alshater.net<br />
26<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
الرسم على عنصر صورة<br />
:<br />
بما أننا نرسم على النموذج مباشرة فلن نستطيع إجراء عمليات على الصور المرسومة كالنسخ واللصق والحفظ<br />
والطباعة، لذلك علينا تطوير برنامجنا ليكون قادرا ً على الرسم فوق عنصر الصورة ، قبل إضافة عنصر الصورة<br />
إلى الشكل عليك<br />
.<br />
1 إضافة مساحة قابلة للتدرج<br />
:<br />
بما أنك سترسم فوق عنصر صورة فقد يكون حجم الصورة أكبر من حجم النموذج وبالتالي علينا إضافة أشرطة<br />
تمرير لكي يمكن المستخدم من الوصول إلى أجزاء الصورة الغير ظاهرة على النموذج ولتحقيق ذلك:<br />
أضف العنصر ScrollBox من الصفحة Win32 وأعط الخاصة<br />
. alClient القيمة Align<br />
2 إضافة عنصر صورة Image فوق العنصر ScrollBox1 وأعطاه الخصائص التالية<br />
True<br />
0<br />
True<br />
0<br />
AutoSize<br />
Left<br />
Stretch<br />
Right<br />
تحديد الحجم والصورة الابتدائية لعنصر الصورة<br />
:<br />
عندما وضعنا صور على الشكل فإننا لم نحدد صورة لعرضها ولكننا حددنا مكان لتعرض فيه الصورة، وما علينا<br />
الآن إلا وضع صورة فارغة في الخاصة<br />
Picture للعنصر<br />
Image1 ويمكن تحقيق ذلك بطريقتين<br />
1 أثناء التصميم : إضافة صورة فارغة ذات لون أبيض ذات امتداد .Bmp إلى الخاصة<br />
الصورة<br />
:<br />
Picture لعنصر<br />
.<br />
2 أثناء التنفيذ<br />
التالية في الحدث<br />
:<br />
الرسم على عنصر الصورة<br />
إنشاء عنصر صورة نقطية Bitmap وإلحاقة بالصورة Image1 ولتحقيق ذلك اكتب التعليمات<br />
Var<br />
Bitmap : TBitmap ;<br />
Begin<br />
Bitmap := Tbitmap.Create ;<br />
Bitmap.Width := 200;<br />
Bitmap.Height := 200;<br />
Image1.Picture.Graphic := Bitmap;<br />
Bitmap.Free ;<br />
OnCreate للنموذج :<br />
:<br />
لن يختلف الرسم على عنصر الصورة عن الرسم على النموذج ، فعنصر الصورة يملك الخاصة<br />
الرسم بدون إجراء تغيرات كبيرة في البرنامج نفذ مايلي<br />
Canvas ولتحقيق<br />
:<br />
177
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
1 ضع مؤشر التحرير في أول الوحدة<br />
Graph واختر من<br />
الأمر Search Replace فتظهر النافذة :<br />
Canvas<br />
اكتب في الحقل Text To Find<br />
القيمة<br />
واكتب في Replace With القيمة Image1.Canvas<br />
واضغط على الزر Replace All<br />
سيتغير الآن كل سطر في الوحدة من Canvas.pen… مثلا ً<br />
Event واضغط<br />
إلى Image1.Canvas.pen..<br />
2 حدد عنصر الصورة وأذهب إلى الصفحة<br />
السهم المجاور للحدث<br />
OnMousemove واختر من القائمة<br />
Form1MouseUp للنموذج<br />
، FormMouseMove كذلك أربط الحدث<br />
OnMouseup للصورة مع الحدث<br />
وكذلك الأمر بالنسبة للحدث .. OnmouseDown<br />
نفذ البرنامج ولاحظ النتائج<br />
.<br />
178
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
إضافة قائمة إلى برنامج الرسم<br />
:<br />
سنضيف الآن قائمة إلى برنامج الرسم للتحكم بعنصر الصورة<br />
:<br />
أضف العنصر MainMenu من الصفحة Standard وأنشأ القائمة<br />
الموضحة بالشكل<br />
وأنشأ فيها القائمة<br />
File تحوي الأوامر<br />
:<br />
Edit التي يجب أن تظهر كما في الشكل<br />
:<br />
سنكتب الآن الأوامر التي يجب تنفيذها عند الضغط على كل زر من أزرار القائمة<br />
:<br />
:<br />
File<br />
Exit<br />
1 في حدث الضغط على الزر في القائمة اكتب التعليمة التالية<br />
Close ;<br />
2 عندما يضغط المستخدم على الزر New ستظهر نافذة تطلب من المستخدم تحديد ارتفاع وعرض الصورة<br />
الجديدة وعندما يضغط على الزر موافق سيتم إنشاء صورة فارغة<br />
أنشأ نموذج جديدا ً وأعطه الخواص المناسبة بحيث يبدو كما في<br />
الشكل<br />
:<br />
:<br />
أضف المتحول التالي في القسم<br />
الأولى<br />
Public للوحدة ) Graph الوحدة<br />
CurrentFile : String;<br />
(<br />
سنستخدم هذا المتحول لحفظ الملف لاحقا ً<br />
.<br />
في حدث الضغط على الزر New أكتب التعليمة التالية<br />
وفي حدث الضغط على الزر موافق في النموذج الثاني أكتب التعليمات التالية<br />
وفي حدث الضغط على الزر إلغاء الأمر أكتب التعليمة<br />
نفذ البرنامج<br />
وأنشأ صورة جديدة<br />
:<br />
Form2.ShowModal;<br />
:<br />
var bitmap : tbitmap;<br />
begin<br />
Bitmap := Tbitmap.Create ;<br />
Bitmap.Width := strtoint(edit1.Text );<br />
Bitmap.Height := strtoint(edit2.Text );<br />
form1.Image1.Picture.Graphic := Bitmap;<br />
bitmap.Free ;<br />
Form1.CurrentFile := '' ;<br />
close;<br />
Close; :<br />
.<br />
179
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
4 عند الضغط على الزر Open سيقوم البرنامج بفتح صورة في العنصر Image وبالتالي يمكن تحرير هذه<br />
الصورة أو الرسم فوقها<br />
http://www.alshater.net<br />
180<br />
:<br />
أضف العنصر OpenPictureDialog من الصفحة<br />
في حدث الضغط على الزر<br />
3 عندما يضغط المستخدم على الزر<br />
CurrentFile أما إذا كان<br />
Open من القائمة<br />
. Dialog<br />
File اكتب التعليمة التالية<br />
:<br />
if OpenPictureDialog1.Execute then<br />
begin<br />
CurrentFile := OpenPictureDialog1.FileName;<br />
Image1.Picture.LoadFromFile(CurrentFile); end;<br />
CurrentFile = ''<br />
: Saveas1Click<br />
Save سنقوم بحفظ الصورة في اسم الملف المخزن في المتحول<br />
فهذا يعني أن الصورة جديدة وبالتالي نستدعي الأجراء<br />
اكتب التعليمات التالية في حدث الضغط على الزر . Save<br />
if CurrentFile '' then<br />
Image1.Picture.SaveToFile(CurrentFile)<br />
else SaveAs1Click(Sender);<br />
4 عندما يريد المستخدم أن يحفظ الصورة في ملف جديد فإنه سيضغط على الزر : Save As<br />
اضف العنصر SavePictureDialog إلى النموذج واكتب في حدث الضغط على الزر<br />
File التعليمات التالية<br />
5 طباعة الصورة<br />
Save As من القائمة<br />
if SavePictureDialog1.Execute then<br />
begin<br />
CurrentFile := SavePictureDialog1.FileName;<br />
Image1.Picture.SaveToFile(CurrentFile); end;<br />
:<br />
تعاملنا سابقا ً مع الصباعة باستخدام صفحة العناصر<br />
سنستخدم أسلوبا ً جديد ًا<br />
)<br />
أ أضف الوحدة Printers إلى القسم<br />
File اكتب التعليمات التالية<br />
علما ً أن التعامل مع Qreport يبقى أفضل<br />
: (<br />
Uses للوحدة<br />
:<br />
يستخدم المنهج BeginDoc لإعطاء الطابعة إيعاز تبدأ عمليات الطباعة<br />
يستخدم المنهج Canvas.Draw لنسخ<br />
تستخدم التعليمة<br />
،QReport وبإمكننا استخدام هذه الصفحة للصباعة هنا ولكن<br />
Graph وفي حدث الضغط على الزر Print من القائمة<br />
printer.BeginDoc ;<br />
printer.Canvas.Draw(0,0,image1.Picture.Graphic );<br />
printer.EndDoc ;<br />
.<br />
( رسم )<br />
EndDoc<br />
الصورة Image1 في الخاصة Canvas لعنصر الطابعة<br />
لإنهاء تكليف الطابعة وعند هذا الأمر تبدأ عملية الطباعة<br />
.<br />
إذا أردت أن تتحكم بحجم الصورة استخدم التعليمة StretchDraw بدلا ً من التعليمة Draw مثال<br />
حيث التابع<br />
:<br />
printer.Canvas.StretchDraw(rect(0,0,4000,4000),image1.Picture.Graphic );<br />
Rect يحدد المستطيل الذي ستتمدد الصورة فيه .
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
استخدام الحافظة Clipboard في برنامجنا<br />
http://www.alshater.net<br />
:<br />
سنستخدم الحافظة لكي نتمكن من نسخ صورة ولصقها بلإضافة إلى قصها في برنامجنا<br />
:<br />
استخدمنا الحافظة سابقا ً للتعامل مع العنصر DbImage حيث كان لهذا العنصر المنهجين<br />
CopyToClipbord و<br />
CutToClipord بالإضافة إلى PasteFromClipboard ولكن للأسف العنصر Image المستخدم في برنامجنا<br />
لا يملك هذه المناهج ولذلك علينا التعامل مع الوحدة ClipBrd للتعامل في برنامجنا مع الحافظة ، لذلك أضف<br />
الوحدة ClipBrd إلى القسم<br />
1 نسخ الصورة إلى الحافظة<br />
Graph للوحدة Uses<br />
:<br />
اكتب التعليمة التالية في حدث الضغط على الزر<br />
تقوم هذه التعليمة بإلحاق هدف الصورة بهدف الحافظة<br />
Copy<br />
Clipboard.Assign(Image.Picture);<br />
. Clipboard<br />
2 قص الصورة إلى الحافظة<br />
181<br />
:<br />
لقص الصورة إلى الحافظة نقوم أولا ً بنسخ الصورة إلى الحافظة ومن ثم مسح الصورة<br />
اكتب التعليمات التالية في حدث الضغط على الزر<br />
النوع<br />
:<br />
: Cut<br />
Var ARect :TRect ;<br />
Clipboard.Assign(Image.Picture);<br />
image1.Canvas.CopyMode := cmwhiteness;<br />
ARect :=rect(0,0,image1.Width,image1.Height);<br />
image1.Canvas.CopyRect( ARect,image1.Canvas,ARect);<br />
image1.canvas.copymode := cmsrccopy;<br />
TRect عبارة عن نوع مستطيل وهو يعرف مستطيل من خلال معرفة إحداثيات البداية والنهاية للمستقيم<br />
الذي يمثل أحد الأقطار.<br />
: Canvas.CopyMode := cmWhiteness<br />
أن الصورة ستصبح بيضاء<br />
تعني أن عملية نسخ صورة إلى الحافظة ستتم باللون الأبيض<br />
)<br />
. (<br />
: ARect := Rect ( 0,0,…)<br />
تحدد أبعاد المستطيل بأبعاد العنصر<br />
Image الحالية .<br />
: Canvas.CopyRect( ARect,Image.Canvas,ARect)<br />
أي<br />
عملية نسخ إلى المستطيل المحدد بالوسيط الأول<br />
ARect من الكنفا المحددة بالوسيط الثاني والوسيط الثالث يحدد أبعاد المستطيل الذي سينسخ من الكنفا الأصل<br />
.<br />
بكلمات أخرى تقوم هذه التعليمة بنسخ مستطيل بحجم الصورة من عنصر الكنفا إلى عنصر الكنفا نفسه وستكون<br />
النتيجة صورة بيضاء لأننا الخاصة<br />
التعليمة الأخيرة<br />
. CopyMode := cmWhiteness<br />
: Canvas.CopyMode := cmsrcCopy<br />
تعيد الخاصة<br />
CopyMode<br />
.<br />
لصق الرسومات من الحافظة<br />
:<br />
عملية لصق صورة من الحافظة هي عملية معاكسة لعملية نسخ صورة إلى الحافظة وتتم بالتعليمة التالية<br />
إلى قيمتها الافتراضية<br />
:
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
ولكن تظهر لدينا هنا المشكلة التالية<br />
أي برنامج تحرير نصوص<br />
http://www.alshater.net<br />
image1.Picture.Bitmap.Assign(clipboard) ;<br />
)<br />
:<br />
(<br />
تصور أن الحافظة تحوي عنصر نص<br />
قد تكون نقلت نص إلى الحافظة في<br />
وبالتالي ستكون التعليمة السابقة تطلب لصق نص فوق عنصر صورة الأمر الذي<br />
سيظهر رسالة خطأ ولذلك علينا فحص نوع المعلومات في الحافظة قبل إجراء عملية اللصق<br />
اكتب التعليمات التالية في حدث الضغط على الزر<br />
تعيد التعليمة<br />
:<br />
if Clipboard.HasFormat(cf_BITMAP) then<br />
image1.Picture.Bitmap.Assign(clipboard) ;<br />
.<br />
: Paste<br />
(CF_BITMAP) HasFormat إذا كانت هناك صورة في الحافظة<br />
بهذا نكون قد انهينا برنامج الرسم وسننتقل الآن للتعامل مع الوسائط المتعددة<br />
: في <strong>دلفي</strong> ( الملتميديا )<br />
برمجة الأوساط المتعددة<br />
:<br />
إن مصطلح الأوساط المتعددة يشير إلى أي شكل من أشكال العروض المتحركة<br />
في الحاسب ،<br />
يستخدم العنصر<br />
( الأفلام )<br />
MediaPlayer<br />
ا تشغيل ملفات الأصوات<br />
مثال<br />
في الصفة System للتعامل مع الأوساط المتعدد في <strong>دلفي</strong><br />
:<br />
:<br />
: 1<br />
أبدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />
MediaPlayer وأعطه الخصائص التالية<br />
:<br />
C:\WINDOWS\MEDIA\ CHORD.WAV<br />
True<br />
Filename<br />
Autoopen<br />
والصوت والمستخدمة<br />
تحديد الملف الصوتي الذي سيعرضه<br />
العنصر<br />
إمكانية التشغيل التلقائي<br />
نفذ البرنامج واضغط على الزر الأخضر وستسمع الصوت إذا كانت أجهزة الصوت في حاسوبك جاهزة<br />
.<br />
مثال2 :<br />
تحديد الملف الصوتي أثناء التنفيذ<br />
:<br />
أضف زر وعنصر OpenDialog إلى النموذج السابق وفي حدث الضغط على الزر اكتب التعليمات التالية<br />
عدل الخاصة<br />
:<br />
Filter للعنصر<br />
OpenDialog1 بحيث يعرض ملفات من الامتداد<br />
.WAV و الامتداد<br />
.MP3 فقط<br />
.<br />
أكتب التعليمة التالية في حدث الضغط على الزر<br />
التعليمة الأولى تعمل على إيقاف عمل العنصر<br />
MediaPlayer1.Close ;<br />
if openDialog1.Execute then begin<br />
MediaPlayer1.FileName := Opendialog1.FileName ;<br />
MediaPlayer1.Open ;<br />
end;<br />
MediaPlayer إذا كان يعرض ملف صوتي عند ضغط الزر .<br />
182
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
والتعليمة الأخرى تسند أسم ملف جديد إلى العنصر MediaPlayer ،أما التعليمة<br />
جعل العنصر فعالا ً ، نفذ البرنامج وحدد ملف ما واضغط على الزر الأخضر<br />
عرض ملفات الفيديو<br />
http://www.alshater.net<br />
Mediaplayer.Open فمهمتها<br />
.<br />
:<br />
لعرض ملفات الفيديو أضف العنصر<br />
Display القيمة<br />
Panel1 ،ثم عدل الخاصة<br />
Panel إلى النموذج السابق وأعط العنصر MediaPlayer في الخاصة<br />
Filter للعنصر<br />
OpenDialog1 بحيث يعرض ملفات<br />
.AVI و<br />
. .MPG و .DAT<br />
نفذ البرنامج الآن واضغط على الزر وحدد الملف<br />
واضغط على الزر<br />
Play وشاهد العرض<br />
سماع الصوت بدون استخدام العنصر<br />
ابدأ مشروعا ً جديدا ً وأضف إليه الزر<br />
أضف الوحدة MMSystem للقسم<br />
طبعا ً إذا كنت لا تملك غيره<br />
: (<br />
)<br />
C:\Program Files\Borland\<strong>Delphi</strong>6\Demos\CoolStuf\ speedis.avi<br />
.<br />
: MediaPlayer<br />
: SpeedButton<br />
Uses واكتب التعليمات التالية في الحدث<br />
OnMouseUP للعنصر<br />
SpeedButton<br />
PlaySound('C:\WINDOWS\MEDIA\DING.WAV',0,0)<br />
طبعا ً بإمكانك تحديد اسم الملف الذي تريد في الوسيط الأول .<br />
183
http://www.alshater.net<br />
27<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
التعامل مع الملفات<br />
ا نسخ ملف<br />
مثال<br />
:<br />
:<br />
:<br />
أنشئ صورة باستخدام برنامج الرسام واحفظها على القرص<br />
\:C باسم<br />
Test.Bmp وأنشأ المجلد<br />
وأبدأ مشروعا ً جديدا ً واكتب في حدث الضغط على زر التعليمات اللازمة لنسخ هذا الملف إلى المجلد<br />
الوسيط الأول<br />
الوسيط الثاني<br />
،C:\temp<br />
: C:\temp<br />
copyfile('c:\Test.bmp','c:\Temp\Test.bmp',False) ;<br />
. (<br />
:<br />
هو الملف المصدر<br />
: هو الملف الهدف<br />
)<br />
)<br />
الملف الذي سيتم نسخه<br />
أيضا ً تغير اسم الملف الهدق أي يمكن أن يكون الوسيط الثاني<br />
C:\test.bmp إلى الملف<br />
البيانات<br />
الملف الذي سيتم إنشاءه وسيكون نسخة عن الأصل في الملف الأول<br />
(<br />
.<br />
: الوسيط الثالث<br />
يمكن<br />
'C:\Temp\Des.bmp' وبهذا سيتم نسخ الملف<br />
C:\temp\des.bmp وبالتالي سيكون للملفين أسمين مختلفين ولكنهما سيحويان نفس<br />
في حال أعطيت هذا الوسيط القيمة<br />
True فإن التابع سيفشل في حال كان هناك ملف بنفس الأسم<br />
في المجلد الهدف وأما أن كانت قيمته False فهذا يعني أنه ستتم الكتابة فوق الملف الهدف إذا كان موجودا ً<br />
2 نقل ملف<br />
.<br />
:<br />
تقوم التعليمة التالية بنقل الملف من مكان إلى آخر مع إمكانية تغيير أسمه<br />
) :<br />
:<br />
أضف زر إلى المشروع السابق<br />
واكتب فيه التعليمة التالية<br />
Movefile('c:\temp\test.bmp','c:\movetest.bmp');<br />
الوسيط الأول هو الملف الأصل ، والوسيط الثاني هو الملف الهدف ، سيفشل التابع في حال كان الملف الأصل غير<br />
موجود أو في حال كان الملف الوجهة موجودا ً<br />
3 حذف ملف<br />
)<br />
ليس هناك هنا اكانية للكتابة فوق الملف<br />
. (<br />
:<br />
لحذف ملف ما استخدم التعليمة التالية<br />
DeleteFile('c:\movetest.bmp');<br />
:<br />
4 طرق أنشاء الملفات والتعامل معها في <strong>دلفي</strong><br />
:<br />
1<br />
ملفات <strong>لغة</strong> الباسكل<br />
:<br />
يمكنك إنشاء الملفات النصية والملفات محددة النوع والملفات غير محددة النوع<br />
)<br />
( Untyped File<br />
باستخدام التعليمات المعروفة في <strong>لغة</strong> تربو باسكل مثل(<br />
AssignFile و Reset و Rewrite و<br />
Readln و Writeln و<br />
ولكن تفضل الطرق الأخرى<br />
.<br />
2<br />
التعامل مع مقابض الملف في ويندوز<br />
.. CloseFile )، تعتبر هذه الطريقة غير متوافقة مع ويندوز ولكنها تعمل على أية حال<br />
: ( File Handles )<br />
ثم يتم التعامل مع هذا المقبض حيث تستدعي التوابع المستخدمة في هذه الحالة توابع<br />
وجميع هذه التوابع موجودة في الوحدة<br />
يتم تعين مقبض للملف عند إنشاءه أو فتحة ومن<br />
Windows Api لإتمام عملها<br />
.<br />
SysUtils<br />
184
http://www.alshater.net<br />
: File Streams (معنى كلمة<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
3 ملفات ستريم<br />
Stream هو نهر أو جدول أو سيل ولا أعرف كيف أترجمها<br />
في هذه الحالة وقد جرت العادة بين المبرمجن الحديث عنها ب ستريم فيل (<br />
هذه الملفات من النوع TFileStream<br />
وهي ملفات تستطيع أن تخزن فيها أي نوع من البيانات كما يمكن أن تحفظ فيها بياناتك بطريقة مشفرة بحيث لا<br />
يستطيع أحد غيرك الإطلاع عليها تتعامل هذه الملفات مع النوعين TStream و TMemoryStream وهذا يمكنك<br />
من التعامل مع الذاكرة بشكل مباشر ويمكنك تحميل بياناتك إلى الذاكرة ومن ثم تخزينها في ملف أو يمكنك تحميلها<br />
بياناتك إلىالذاكرة ليتشارك عليها أكثر من جزء من برنامجك .<br />
: ( Working With File Handles<br />
التعامل مع الملفات عن طريق المقبض )<br />
سنوضح مثالا ً يبين طريقة التعامل مع هذه الملفات :<br />
:<br />
(<br />
أ الكتابة إلى )<br />
ملف في<br />
أكتب في حدث الضغط على زر التعليمات التالية<br />
في البداية نستخدم التعليمة<br />
:<br />
var FileHandle:integer;<br />
S:string;<br />
Begin<br />
if Not FileExists('c:\MyFile.mka') then<br />
FileHandle:= FileCreate('c:\MyFile.mka') Else<br />
FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;<br />
s:= 'khaled Nassr Agha' ;<br />
FileWrite(FileHandle,Pointer(s)^,length(s ));<br />
Fileclose(FileHandle);<br />
end;<br />
FileExists التي تعيد القيمة<br />
True في حال كان الملف موجودا ً وفي حال عدم وجود<br />
، FileHandle أما<br />
الملف نستخدم التابع<br />
FileCreate التي ينشأ الملف ويعيد رقم مقبض هذا الملف في المتحول<br />
في حال وجود الملف سابقا ً فنستخدم التابع<br />
FileOpen الذي يقوم بفتح الملف ويعيد رقم مقبض هذا الملف في<br />
المتحول<br />
، FileHandle والوسيط الثاني fmOpenReadWrite هو أحد القيم التي يأخذها هذا الملف ويعني انه<br />
سنستخدم الملف للقراءة والكتابة وهناك عدة قيم أخرى راجع ملفات المساعدة للحصول على<br />
معلومات عنها.<br />
FileHandle وبطول<br />
التابع<br />
FileWrite يقوم بكتابة القيمة<br />
S والتي هي من نوع مؤشر في الملف ذو المقبض<br />
المتحول الثالث والذي يشير هنا إلى طول السلسلة . S<br />
.<br />
التعليمة الأخيرة<br />
FileClose تقوم بإغلاق الملف المفتوح<br />
ب القراءة من ملف :<br />
أضف عنصر<br />
Memo و زرا ً<br />
جديدا ً واكتب في حدث الضغط عليه التعليمات التالية<br />
:<br />
var FileHandle,FileSize : integer;<br />
s:string;<br />
begin<br />
if FileExists ('c:\MyFile.mka') then begin<br />
FileHandle:= FileOpen('c:\MyFile.mka',fmOpenReadWrite) ;<br />
185
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
للتنقل ضمن الملف تستخدم التعليمة<br />
و Offset مقدار الإزاحة عن<br />
http://www.alshater.net<br />
FileSize:=getfilesize(FileHandle,nil);<br />
setlength(s,FileSize);<br />
Fileread(FileHandle,pointer(s)^,FileSize);<br />
Memo1.Text := s;<br />
Fileclose(FileHandle);<br />
end;<br />
: SeekFile ( Handle, Offset ,origin)<br />
Origin ويأخذ<br />
Origin القيم التالية<br />
:<br />
حيث Handle هو مقبض الملف<br />
186<br />
0<br />
يتم اعتبار الإزاحة Offset من أول الملف<br />
.<br />
1<br />
يتم اعتبار الإزاحة Offset من موقع المؤشر الحالي<br />
.<br />
2<br />
يتم اعتبار الإزاحة Offset من آخر الملف<br />
.<br />
م ثلا ً التعليم ة SeekFile(FileHandle,0,0) ت ضع مؤش ر المل ف ف ي بداي ة المل ف و التعليم ة<br />
Seekfile(FileHandle,12,2) تضع مؤشر الملف على بعد 12 حرف من آخر الملف<br />
.<br />
الملفات ستريم : File Stream<br />
سنأخذ مثالا ً بسيطا ً عن كيفية أنشاء هذا النوع من الملفات زمن القراءة والكتابة إليها<br />
إنشاء ملف من النوع TFileStream والكتابة إليه<br />
:<br />
:<br />
أضف زر إلى نموذج جديد واكتب في حدث الضغط على الزر التعليمات التالية<br />
التعليمة<br />
TFileStream.Create تنشأ الملف<br />
:<br />
Var FileStream : TFileStream ;<br />
buffer : String;<br />
begin<br />
FileStream := TFileStream.Create('c:\MyStream.tst',fmCreate) ;<br />
Buffer := ' This Line Will Be Save to File ' ;<br />
FileStream.Write(pointer(Buffer)^,Length(Buffer));<br />
FileStream.Free ;<br />
end;<br />
MyStream.Tst على القرص<br />
C أما الوسيط<br />
بإنشاء الملف إذا لم يكن موجدا ً وفي حال كان موجودا ً يفتح الملف في وضع للكتابة فقط<br />
التعليمة<br />
التعليمة<br />
القراءة من ملف<br />
.<br />
: FileStream.Write<br />
تقوم بكتابة النص في المتحول<br />
)<br />
Buffer<br />
لا تتعامل إلا مع المؤشرات<br />
fmCreate فإنه يقوم<br />
(<br />
: FileStream.Free<br />
تقوم بتحرير المتحول FileStream وإغلاق الملف المرتبط معه<br />
.<br />
: TFileStream<br />
أضف عنصر Memo إلى النموذج السابق واكتب التعليمات التالية في حدث الضغط على زر جديد<br />
:<br />
Var FileStream : TFileStream ;<br />
buffer : String;<br />
FileSize : integer;<br />
begin<br />
FileStream := TFileStream.Create('c:\MyStream.tst',fmOpenRead) ;<br />
FileSize := (FileStream.size );
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
قمنا اولا ً بفتح الملف للقراءة فقط في التعليمة<br />
الملف وأعطينا المتحول<br />
Buffer ووضعنا النتيجة في العنصر<br />
http://www.alshater.net<br />
Setlength(Buffer,FileSize);<br />
FileStream.read(pointer(Buffer)^,FileSize);<br />
memo1.text := Buffer;<br />
FileStream.Free ;<br />
end;<br />
Create ومن ثم استخدمنا التعليمة<br />
Buffer حجم هذا الملف عن طريق التعليمة<br />
. Memo1<br />
FileStream.Size لتحديد حجم<br />
SetLength ثم قرأنا من الملف إلى المتحول<br />
( Origin<br />
: ملاحظات<br />
التعليمة 1<br />
راجع الوسيط<br />
: FieStream.Seek<br />
Origin للتعليمة<br />
تقوم التعليمة Seek لنقل مؤشر الملف لمسافة محددة تبعا ً للوسيط<br />
SeekFile للإطلاع أكثر على وسطاء هذه التعليمة<br />
.(<br />
معلومات مفيدة<br />
187<br />
:<br />
ا تشغيل برنامج آخر من داخل برنامجك<br />
:<br />
بفرض أنك تريد تستدعي برنامج الآلة الحاسبة ضمن برنامج<br />
الملف<br />
:<br />
من المعلوم أن برنامج الحاسبة يتم تنفيذة عن طريق<br />
Calc.exe الموجود ضمن فهرس الويندوز ولاستدعاء هذا البرنامج من برنامج اكتب التعليمة التالية في<br />
حدث الضغط على زر<br />
WinExec('C:\Windows\Calc.exe' ,Sw_Show) ;<br />
:<br />
تقوم هذه التعليمة بإظهار بتشغيل برنامج الآلة الحاسبة .<br />
: ملاحظة<br />
تفترض هذه التعليمة أن مجلد الويندوز على جهازك هو<br />
عند تنصيب Windows 98 وMe Windows أما الفهرس الافتراضي ل<br />
C:\Windows وهذا يحصل بشكل افتراضي<br />
Windows و Windows 2000<br />
Xp فهو<br />
التعليمة<br />
C:\Win32 وكما تعلم يمكن للمستخدم تغير هذه الفهارس أثناء تنصيب نظام التشغيل لذلك تستخدم عادة<br />
GetWindowsDirectory<br />
للوصول إلى فهرس نظام التشغيل مثال<br />
GetWindowsDirectoy<br />
:<br />
;(200,p) حيث<br />
GetMem(p,200)<br />
p من النوع<br />
Pchar وسيكون فيه اسم مجلد الويندوز<br />
قبل هذه التعليمة والتعليمة<br />
2 تشغيل ملف تابع لبرنامج آخر من برنامج<br />
)<br />
FreeMem(p,200) بعدها .<br />
:<br />
بقرض أنك تريد من برنامجك أن يشغل برنامج مايكروسوفت وورد<br />
لتحقيق ذلك استخدم التعليمات التالية<br />
( Microsoft Word )<br />
:<br />
لاتنس استخدام التعليمة<br />
أضف أولا ً الوحدة ShellApi إلى القسم Uses ومن ثم أكتب التعليمة التالية في حدث الضغط على زر<br />
ويعرض أحد الملفات<br />
.<br />
shellapi.ShellExecute(0 ,'Open','C:\My Documents\Test.doc',Nil,Nil,0) ;<br />
تقوم هذه التعليمة بفتح الملف Test.doc الموجود في المجلد<br />
إذا أردت من برنامجك فتح الملف وطباعته مباشرة استبدل الوسيط<br />
. My Document<br />
. 'Print' بالوسيط 'Open'
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تقوم هذه التعليمة بالعودة إلى بيئة ويندوز لمعرفة البرنامج الافتراضي الذي تستخدمه لفتح هذا النوع الملفات ومن<br />
ثم تقوم بتشغيل البرنامج وفتح الملف بداخله فإذا اخترت استخدمت في التعليمة الملف C:\Mypicture.jpg ستقوم<br />
التعليمة التعليمة بالبحث عن البرنامج الافتراضي الذي يفتح هذا النوع من الصور فقد يكون فوتوشوب أو Internet<br />
. Explorer<br />
استخدام التعليمة السابقة لفتح مجلد ما :<br />
إذا أردت فتح مجلد ما في مستكشف ويندوز أكتب التعليمة التالية<br />
تقوم التعليمة السابقة بفتح مجلد<br />
:<br />
shellapi.ShellExecute(0 ,'Open','C:\My Documents',Nil,Nil,0) ;<br />
. C:\My Document<br />
188
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
الجلسة<br />
برنامج المفكرة<br />
http://www.alshater.net<br />
27<br />
:<br />
سنقوم الآن بكتابة برنامج يشابه برنامج المفكرة في ويندوز<br />
( Notepad )<br />
ويختلف عنه بأنه سيتعامل مع ملفات<br />
من النوع Rtf بالإضافة إلى الملفات ، Txt كما أنه سيكون من النوع MDI بحيث يمكننا أن نفتح أكثر من ملف<br />
. بنفس الوقت<br />
أبدأ مشروعا ً جديدا ً وأضف إليه العنصر<br />
MainMenu والعنصر<br />
:<br />
عنصر النموذج<br />
الخاصة<br />
: Form1<br />
bdRightToLeft<br />
BiDiMode<br />
Caption<br />
FormStyle<br />
Name<br />
Position<br />
عنصر القائمة<br />
أعط الزر (ملف<br />
برنامج المفكرة<br />
fsMDIForm<br />
MainForm<br />
poDesktopCenter<br />
: MainMenu<br />
أنشئ في هذا العنصر القائمة<br />
)<br />
OpenDialog وأعط الخصائص التالية للعناصر<br />
القيمة<br />
) والقائمة ( ملف<br />
)<br />
): إطار<br />
(<br />
قيمة الخاصة<br />
&جديد<br />
&فتح<br />
&خروج<br />
في الخاصة<br />
أعط الزر (إطار) في الخاصة<br />
قيمة الخاصة<br />
ترتيب<br />
تتالي<br />
FileMenu وأضف إليه الأوامر<br />
: التالية ( الأزرار<br />
Name القيمة<br />
Caption<br />
New<br />
قيمة الخاصة<br />
Name<br />
قيمة الخاصة<br />
Shortcut<br />
OpenFile<br />
CloseApp<br />
Name القيمة<br />
Window1 وأضف إليه الأوامر<br />
: التالية ( الأزرار )<br />
Caption<br />
قيمة الخاصة<br />
Name<br />
قيمة الخاصة<br />
Shortcut<br />
-<br />
العنصر<br />
: OpenDialog1<br />
.rtf<br />
DefaultExt<br />
Filter<br />
ضع في الخاصة Filter الأسطر التالية<br />
:<br />
Filter Name<br />
Filter<br />
Rich Text<br />
*.rtf<br />
Text File<br />
*.Txt<br />
All File<br />
*.*<br />
احفظ الوحدة باسم Main.pas والمشروع باسم<br />
. MyTextEditor.Dpr<br />
189
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
أضف إلى المشروع نموذجا ً جديد ًا File New Form وأضف أليه العناصر التالية<br />
و عنصر RichText من الصفحة<br />
أعط النموذج الجديد الخصائص التالية<br />
http://www.alshater.net<br />
MainMenu :<br />
190<br />
عنصر<br />
.FontDialog وعنصر PrintDialog و SaveDialog وعنصر Win32<br />
:<br />
bdRightToLeft BiDiMode<br />
fsMDIChild FormStyle<br />
EditForm Name<br />
أنشئ في العنصر MainMenu1 ثلاث قوائم باسم<br />
حسب الجدول التالي<br />
أعط الزر (ملف<br />
قيمة الخاصة<br />
&جديد<br />
&فتح<br />
حفظ<br />
حفظ باسم<br />
طباعة<br />
إغلاق<br />
&خروج<br />
( تنسيق ) و ( تحرير ) و ( ملف )<br />
:<br />
(<br />
أعط الزر (تحرير<br />
قيمة الخاصة<br />
نسخ<br />
قص<br />
لصق<br />
تحديد الكل<br />
أعط الزر (تنسيق<br />
في الخاصة<br />
Name القيمة<br />
FileMenu وأضف إليه الأوامر<br />
( الأزرار )<br />
وأنشئ في كل منها أزرار<br />
: التالية<br />
Caption<br />
قيمة الخاصة<br />
Name<br />
قيمة الخاصة<br />
Shortcut<br />
New<br />
OpenFile<br />
Ctrl+S<br />
Save<br />
SaveAs<br />
PrintFile<br />
CloseFile<br />
CloseAll<br />
في الخاصة (<br />
EditMenu القيمة Name<br />
وأضف إليه الأوامر<br />
: التالية ( الأزرار )<br />
Caption<br />
قيمة الخاصة<br />
Name<br />
قيمة الخاصة<br />
Shortcut<br />
Ctrl+C<br />
CopyText<br />
Ctrl+X<br />
Cuttext<br />
Ctrl+V<br />
PasteText<br />
Ctrl+A<br />
SelectAll<br />
(<br />
قيمة الخاصة<br />
محاذاة إلى اليسار<br />
محاذاة إلى اليمين<br />
محاذاة إلى الوسط<br />
في الخاصة<br />
EditMenu القيمة Name<br />
وأضف إليه الأوامر<br />
: التالية ( الأزرار )<br />
Caption<br />
Left1<br />
قيمة الخاصة<br />
Name<br />
قيمة الخاصة<br />
Shortcut<br />
Right1<br />
Center1<br />
WordWrap1<br />
Font1<br />
-<br />
التفاف تلقائي<br />
خط<br />
حدد الأزرار الثلاثة الأولى من القائمة تنسيق وأعطها في الخاصة RadioItem القيمة True هذا سيجعلها تبدو
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
كأزرار الراديو ولا يمكن اختيار إلا واحد منها في ذات الوقت<br />
أعط العنصر Richedit1 الخصائص التالية<br />
http://www.alshater.net<br />
.<br />
:<br />
alClient<br />
Editor<br />
Align<br />
Name<br />
أعط العنصر Savedialog1 الخصائص التالية<br />
:<br />
.rtf<br />
DefaultExt<br />
Filter<br />
ضع في الخاصة<br />
Filter الأسطر التالية<br />
Filter Name<br />
Rich Text<br />
Text File<br />
:<br />
Filter<br />
*.rtf<br />
*.Txt<br />
_<br />
احفظ البرنامج وسمي الوحدة الجديدة باسم<br />
EditText.pas<br />
اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج : MainForm<br />
TEditForm.Create(Self);<br />
الوسيط Self وسيط معرف يعود إلى النموذج الذي يطلب فيه هذا الوسيط<br />
.<br />
- اكتب التعليمة التالية في حدث الضغط على الزر جديد في القائمة ملف للنموذج :EditForm<br />
TEditForm.Create(Self);<br />
- في الحدث OnClose للنموذج EditForm اكتب التعليمة التالية<br />
Action := CaFree ;<br />
CaMinimized حيث<br />
:<br />
تمكننا هذه التعليمة من إغلاق النافذة الابن وتكون قيمتها الافتراضية في النموذج الابن هي<br />
يتم تصغير النموذج الابن بدلا ً من إغلاقه عند الضغط على الزر إغلاق<br />
عندما يقوم المستخدم بالضغط على الزر فتح من القائمة<br />
ابن جديدة وسنقوم تحميل الملف إلى العنصر<br />
الملف الذي نفتحه<br />
.<br />
)<br />
سواء في النافذة الأب أو الابن<br />
(<br />
( TrichEdit ) Editor<br />
.<br />
قبل البدء بكتابة التعليمات الخاصة بفتح ملف سنقوم بتعريف ما يلي<br />
عرف المتحول PathName من النوع String في القسم<br />
:<br />
سنقوم بإنشاء نافذة<br />
، كما سنغير عنوان النافذة ليكون باسم<br />
. EditText للوحدة Private<br />
عرف الثابت _<br />
const<br />
;'بدون عنوان' = DefaultFileName<br />
:<br />
_<br />
أضف تعريف الإجراء التالي في القسم<br />
: EditText<br />
Procedure Open(const AFileName: string);<br />
public للوحدة<br />
ضع مؤشر لوحة المفاتيح عند السطر السابق واضغط الأزرار Ctrl+Alt+C سيتم عندها إضافة التابع السابق<br />
إلى القسم<br />
، Implementation اكتب التعليمات التالية في جسم التابع<br />
:<br />
PathName := AFileName;<br />
191
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
التابع<br />
http://www.alshater.net<br />
Caption := ExtractFileName(AFileName);<br />
with Editor do<br />
begin<br />
Lines.LoadFromFile(PathName);<br />
SelStart := 0;<br />
Modified := False;<br />
end;<br />
.<br />
: ExtractFileName ( AFileName)<br />
التعليمات ضمن الكتلة<br />
يعيد اسم الملف مع امتداده وبدون ذكر المسار<br />
End; With Editor Do begin …. تكافئ التعليمات :<br />
Editor.Lines.LoadFromFile(PathName);<br />
Editor.SelStart := 0;<br />
Editor .Modified := False;<br />
أي أننا نستخدم التعليمة Width لنتخلص من ذكر العنصر في كل سطر من سطور البرنامج .<br />
التعليمة =: 0 Editor.selstart ضع مؤشر التحرير للعنصر Editor في بداية الملف<br />
التعليمة Editorr.Modified تأخذ القيمة<br />
.<br />
True في<br />
حال عدل المستخدم في أي نقطة من الملف المفتوح<br />
في حدث الضغط على الزر فتح في القائمة ملف للنموذج MainForm اكتب التعليمة التالية<br />
.<br />
:<br />
If OpenDialog1.Execute Then<br />
TeditForm.Create(Self).Open(OpenDialog1.FileName ) ;<br />
تقوم التعليمة بعد Then بإنشاء نافذة جديدة ومن ثم طلب تنفيذ الإجراء Open الذي كتبناه سابقا ً .<br />
في حدث الضغط على الزر فتح في القائمة ملف للنموذج EditForm اكتب التعليمة التالية<br />
:<br />
MainForm.Openfile.Click ;<br />
_<br />
الحدث<br />
عند إنشاء ملف جديد سنعطي عنوان النافذة التي تفتح هذا الملف اسم افتراضي لذلك اكتب التعليمات التالية<br />
: EditForm للنموذج OnCreate<br />
أي أن المتحول PathName سيدل على الاسم الافتراضي للملف الجديد<br />
حفظ الملف<br />
العنصر<br />
بامتداد<br />
في<br />
PathName := DefaultFileName;<br />
.<br />
:<br />
Editor وهو من النوع<br />
rtf أو بالامتداد<br />
TRichEdit يقوم بحفظ الملفات بامتداد<br />
Txt لذلك سنستخدم متحول من النوع<br />
rtf فقط وعلى برنامجنا حفظ الملف<br />
Tstrings لنقل أسطر العنصر<br />
حفظ أسطر هذا المتحول على ملف ÷ذا طبعا ً عند اختيار المستخدم حفظ الملف بالامتداد<br />
. .Txt<br />
في حدث الضغط على الزر حفظ في القائمة ملف للنموذج EditForm اكتب التعليمات التالية<br />
Editor إليه ومن ثم<br />
:<br />
var S: Tstringlist;<br />
begin<br />
if PathName = DefaultFileName then<br />
SaveAsClick(Sender)<br />
else<br />
begin<br />
if uppercase(rightstr(PathName,3)) = uppercase( 'rtf' ) then<br />
Editor.Lines.SaveToFile(PathName) else<br />
try<br />
192
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تقوم التعليمات السابقة بفحص المتحول<br />
PathName فإذا كانت قيمته هي القيمة الافتراضية أي<br />
http://www.alshater.net<br />
S:=Tstringlist.Create ;<br />
s.AddStrings(Editor.Lines )<br />
finally<br />
s.SaveToFile(PathName) ;<br />
end;<br />
Editor.Modified := False;<br />
end;<br />
"بدون عنوان"<br />
يعني أن الملف جديد ولم يتم حفظه سابقا ً ،مما يستدعي طلب التعليمات التي تنفذ عند الضغط على حفظ باسم أما أذا<br />
كان PathName لا يساوي القيمة الافتراضية مما يدل أن للملف مسار وأسم محددين وسندرس هنا احتمالين<br />
1 أن يكون امتداد الملف هو rtf وبالتالي ننفذ التعليمة<br />
واضح أن الشرط الذي يسبق هذه التعليمة يقارن الأحرف الثلاثة الأخيرة في المتحول<br />
بعد تحويل القيمتين على أحرف كبيرة<br />
)<br />
:<br />
Editor.Lines.SaveToFile(PathName)<br />
PathName مع القيمة<br />
'rtf'<br />
.<br />
2<br />
أن يكون امتداد الملف هو Txt وبالتالي ننشئ المتحول S من النوع TStringList وننقل أسطر العنصر<br />
Editor إليه ومن ثم نحفظه ، ثم نعيد القيمة<br />
الحفظ الأخير<br />
False للخاصة<br />
.<br />
حفظ الملف باسم<br />
:<br />
Editor.Modified أي أن الملف لم يتم تعديله بعد<br />
اكتب التعليمات التالية في حدث الضغط على الزر حفظ في القائمة ملف للنموذج : EditForm<br />
SaveDialog1.FileName := PathName;<br />
if SaveDialog1.Execute then<br />
begin<br />
PathName := SaveDialog1.FileName;<br />
Caption := ExtractFileName(PathName);<br />
SaveClick(Sender);<br />
end;<br />
التعليمة الأولى تجعل صندوق الحوار حفظ باسم أن يظهر الاسم الحالي للملف كاسم افتراضي والتعليمات التالية<br />
تقوم بوضع اسم الملف الذي اختاره المستخدم في صندوق الحوار حفظ باسم في المتحول<br />
عنوان النافذة ليأخذ اسم الملف الجديد .ومن ثم تستدعي الإجراء<br />
الامتداد الذي اختاره المستخدم<br />
إغلاق الملف<br />
PathName وتغير<br />
) Sender SaveClick ( ليتم حفظ الملف وفق<br />
.<br />
:<br />
اكتب التعليمة التالية في حدث الضغط على الزر إغلاق في القائمة ملف للنموذج : EditForm<br />
الخروج من البرنامج<br />
Close;<br />
:<br />
اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذجMainForm:<br />
Close;<br />
193
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اكتب التعليمة التالية في حدث الضغط على الزر خروج في القائمة ملف للنموذج : EditForm<br />
MainForm.CloseApp.Click ;<br />
يتم إغلاق جميع النوافذ الأبناء عند إغلاق النموذج الأب .<br />
أمامنا الآن مشكلة جديدة ، افرض أن المستخدم قد عدل الملف ثم ضغط على الزر إغلاق بدون حفظ الملف ،<br />
سيقوم البرنامج في هذه الحالة بإغلاق الملف دون حفظ ولذلك علينا إظهار رسالة حوار تسأل المستخدم إذا كان<br />
يريد أن يحفظ الملف أم لا .<br />
اكتب التعليمة التالية في حدث الضغط على الحدث<br />
: EditForm للنموذج OnCloseQuery<br />
Const<br />
;'هل تريد حفظ التغيرات المدخلة على الملف' = SWarningText<br />
begin<br />
if Editor.Modified then<br />
begin<br />
case MessageDlg(Format(SWarningText + #13 + '%s', [PathName]), mtConfirmation,<br />
[mbYes, mbNo, mbCancel], 0) of<br />
mrYes: SaveClick(Self);<br />
mrCancel: CanClose := False;<br />
end;<br />
end;<br />
end;<br />
يتم تنفيذ الحدث OnCloseQuery عندما يضغط المستخدم على زر إغلاق وقبل أن يتم إغلاق النموذج ويجود مع<br />
هذا الحدث الوسيط<br />
CanClose والذي يأخذ قيمة افتراضية<br />
True ،وعند إعطاءه القيمة<br />
False يرفض البرنامج<br />
إغلاق النافذة .<br />
نفحص عندها المتحول<br />
Editor.Modified (الذي يأخذ القيمة<br />
True إذا قام المستخدم بإجراء أي تعديل على<br />
:<br />
الملف (<br />
، وعندها نظهر صندوق حوار يسأل المستخدم إذا كان يريد حفظ الملف وهذا الصندوق ذو ثلاث أزرار<br />
. SaveClick إذا ضغط المستخدم على هذا الزر فإنه يريد حفظ الملف ونستدعي عندها التابع : Yes<br />
: No إذا ضغط المستخدم على هذا الزر فإنه لا يريد حفظ الملف وسيتم إغلاق النافذة .<br />
CanClose إذا ضغط المستخدم على هذا الزر فإنه لا يريد إغلاق الملف وبالتالي نغير قيمة الوسيط : Cancel<br />
.<br />
إلى<br />
False وبالتالي لن يستجيب البرنامج لحدث الضغط على الزر إغلاق<br />
الرمز<br />
#13 في التابع<br />
MessageDlg يجعل اسم الملف يظهر في السطر الثاني من الرسالة ، هذا يكافئ كتابة نص<br />
.<br />
الرسالة ومن ثم الضغط على زر<br />
Enter ومن ثم كتابة اسم الملف<br />
برمجة القائمة تحرير :<br />
Editor.CopyToClipboard;<br />
Editor.CutToClipboard;<br />
اكتب التعليمة التالية في حدث الضغط على الزر نسخ في القائمة تحرير<br />
اكتب التعليمة التالية في حدث الضغط على الزر قص في القائمة تحرير<br />
اكتب التعليمة التالية في حدث الضغط على الزر لصق في القائمة تحرير<br />
:<br />
:<br />
:<br />
194
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
Editor.PasteFromClipboard;<br />
اكتب التعليمة التالية في حدث الضغط على الزر تحديد الكل في القائمة تحرير :<br />
Editor.SelectAll;<br />
من الواضح أن الزرين نسخ و قص يجب أن يكونا غير فعالين إذا لم يحدد المستخدم نصا ً ما في العنصر ، Editor<br />
كما أن الزر لصق يجب أن يكون غير فعال في حال كانت الحافظة فارغة<br />
لتحقيق ذلك أكتب التعليمات التالية في حدث الضغط على الزر تحرير<br />
وأضف الوحدة ClipBrd إلى القسم<br />
المنهج<br />
حرف<br />
SelLength يعيد عدد الأحرف المحددة في العنصر<br />
)<br />
أو في حال كانت فيها صورة<br />
، (<br />
:<br />
Copytext.Enabled := editor.SelLength > 0;<br />
Cuttext.Enabled := editor.SelLength > 0;<br />
Pastetext.Enabled := clipboard.HasFormat(CF_text);<br />
. EditForm في للوحدة uses<br />
.<br />
برمجة القائمة تنسيق<br />
:<br />
اكتب في حدث الضغط على الزر محاذاة إلى اليسار التعليمات التالية<br />
ثم حدد الزرين<br />
Editor وهي تساوي الصفر إذا لم يحدد المستخدم أي<br />
:<br />
with Sender as TMenuItem do Checked := True;<br />
with Editor.Paragraph do<br />
if Left1.Checked then<br />
Alignment := taLeftJustify<br />
else if Right1.Checked then<br />
Alignment := taRightJustify<br />
else if Center1.Checked then<br />
Alignment := taCenter;<br />
OnClick في<br />
(<br />
)<br />
محاذاة إلى اليمين<br />
(<br />
و(محاذاة إلى اليسار<br />
الصفحة Event من محرر الخواص واختر من القائمة<br />
ثم أضغط على السهم المجاور للحدث<br />
. Left1Click<br />
اكتب التعليمة التالية في حدث الضغط على الزر التفاف تلقائي<br />
:<br />
with Editor do<br />
begin<br />
WordWrap := not WordWrap; { toggle word wrapping }<br />
if WordWrap then<br />
ScrollBars := ssVertical<br />
else<br />
ScrollBars := ssBoth;<br />
WordWrap1.Checked := WordWrap; { set menu item check }<br />
end;<br />
اكتب التعليمات التالية في حدث الضغط على الزر خط :<br />
FontDialog1.Font := Editor.Font;<br />
if FontDialog1.Execute then<br />
Editor.SelAttributes.Assign(FontDialog1.Font);<br />
195
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
يتميز العنصر RichEdit عن العنصر<br />
Memo بإنه يمكن تحديد نمط خط لكل سطر أي أنه يمكن تنسيق النص<br />
.<br />
المكتوب بداخله على عكس العنصر<br />
Memo الذي يمكنك استخدام خط وتنسيق واحد لكل الأسطر<br />
.TRichEdit<br />
والمنهج<br />
SelAttributes يعطيك أمكانية التحكم بتنسيق السطر المحدد في العنصر<br />
)<br />
برمجة القائمة إطار في النموذج : MainForm<br />
في البداية تلاحظ أن هذه القائمة لن تظهر أثناء تنفيذ البرنامج إذا كان أحد الأبناء ظاهرا ً<br />
أغلق جميع النوافذ الأبناء<br />
المفتوحة ولاحظ ظهور القائمة إطار من جديد (<br />
هذا يحدث لأن قائمة النموذج الابن تأخذ مكان قائمة النموذج الأب<br />
:<br />
وإذا أردنا إظهار قوائم النموذج الأب بجوار قوائم النموذج الابن علينا استخدام ما يدعى بدمج القوائم ولتحقيق ذلك<br />
. GroupIndex<br />
افتح محرر القوائم في النموذج الأب وحدد الزر إطار ثم اكتب القيمة<br />
1 في الخاصة<br />
لاحظ أن جميع قوائم النافذة الابن تأخذ القيمة الافتراضية<br />
0 في هذه الخاصة وإذا أعطيت القيمة<br />
1 لأحد هذه القوائم<br />
GroupIndex فإنها<br />
فإنها ستأخذ مكان القائمة إطار ، أما إذا أعطيت أحد قوائم النافذة الاين القيمة<br />
2 في الخاصة<br />
ستظهر بعد القائمة إطار .<br />
.<br />
إذا ً الخاصة<br />
GroupIndex تستخدم لدمج وترتيب القوائم بين النموذج الأب والنماذج الأبناء<br />
اكتب التعليمة التالية في حدث الضغط على الزر ترتيب الكل في القائمة إطار<br />
تقوم هذه التعليمة بترتيب النوافذ الأبناء بشكل أفقي<br />
:<br />
MainForm.Tile<br />
.<br />
)<br />
عليك أن تفتح أكثر من نافذة ابن لتلاحظ النتائج<br />
MainForm.Cascade;<br />
اكتب التعليمة التالية في حدث الضغط على الزر تتالي الكل في القائمة إطار:<br />
تقوم هذه التعليمة بصف النوافذ فوق بعضها البعض<br />
.<br />
إظهار أسماء النوافذ الأبناء ضمن القائمة إطار :<br />
عند<br />
الضغط على القائمة إطار في برنامج الوورد تظهر في نهاية القائمة أسماء جميع ملفات النصوص المفتوحة<br />
ولتحقيق ذلك في برنامجنا حدد النموذج MainForm ثم اذهب إلى الخاصة<br />
WindowsMenu وأعطاها القيمة<br />
اسم زر القائمة إطار<br />
، نفذ البرنامج الآن وافتح أكثر من ملف<br />
واضغط على القائمة إطار ستلاحظ<br />
(<br />
) Window1<br />
ظهور أسماء جميع هذه الملفات في القائمة الإطار ويمكنك التنقل بين هذه الملفات عن طريق الضغط على اسم<br />
الملف في هذه القائمة .<br />
أحفظ البرنامج الآن وانتقل إلى الخطوة التالية وهي عمل برنامج تنصيب<br />
لتوزيع برنامج المفكرة<br />
.<br />
( Setup<br />
)<br />
196
http://www.alshater.net<br />
:<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
البرنامج<br />
Install Shelled Express<br />
بعد أن يصبحك برنامجك جاهزا ً وخاليا ً من الأخطاء عليك أن تحضره ليعمل على أي حاسب وبأسهل طريقة<br />
ممكنة، فليس من المعقول أن يكون المبرمج موجودا ً لتنصيب البرنامج على عند كل مستخدم للبرنامج لذلك جرت<br />
العادة على استخدام معالجات تنصيب<br />
وهي عبارة عن مجموعة من صناديق الحوار تسأل المستخدم عن مسار<br />
البرنامج وال<strong>لغة</strong> المستخدمة ومكان وضع الاختصارات .....<br />
تستطيع أن تكتب برنامج التنصيب بنفسك فهو في النهاية عبارة عن نسخ ملفات من قرص مرن أو قرص ليزري<br />
إلى الحاسب ولكن هناك برامج مختصة بهذه العملية ، ويأتي مع قرص <strong>دلفي</strong> البرنامج Install Shelled Express<br />
وهو نسخة مجانية من البرنامج Install Shelled Professional ولكنه يفي بالغرض .<br />
سنشرح الآن بشكل سريع البرنامج Install Shelled Express<br />
عمل برنامج تنصيب لبرنامج المفكرة :<br />
عليك أولا ً تنصيب البرنامج<br />
Install Shelled Express من قرص <strong>دلفي</strong> ومن تشغيله من القائمة<br />
:<br />
Start Program IntallShelled Express – Borland Limited Edition .<br />
تظهر عندها نافذة اختر منها : Create new project<br />
في الصندوق Project name and location أكتب C:\My Documents\MySetups\MyNotpad.ism ثم<br />
اضغط على الزر . Create<br />
تظهر عندها نافذة تتألف من نافذة تحوي شجرة على اليسار وتظهر في النافذة اليمنى خصائص الفرع المختار من<br />
هذه الشجرة .<br />
:<br />
اختر<br />
General Information من الشجرة فستظهر الخصائص التالية في النافذة المجاورة<br />
هناك بعض الخواص الواضحة<br />
والتي ليست بحاجة إلى شرح<br />
لذلك سأشرح أكثر الخصائص<br />
أهمية :<br />
: INSTALLDIR تحدد هذه<br />
الخاصة المجلد الافتراضي<br />
الذي سيتم فيه تنصيب<br />
البرنامج بالضغط على هذه<br />
الخاصة تظهر القيم التي يمكن<br />
أن تأخذها هذه الخاصة، كما<br />
يمكنك كتابة المجلد الذي تريد<br />
لتنصيب برنامجك داخله .<br />
تحدد هذه الخاصة اسم البرنامج وسيظهر اسم البرنامج عند بداية التنصيب<br />
.<br />
: Product Name<br />
197
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اختر Setup Types من الشجر ة اليسارية فتظهر نافذ على اليسار تستخدم لتحديد نوع التنصيب وهناك ثلاث<br />
أنواع عادة لتنصيب الملف وهي إما تنصيب نموذجي<br />
أو تنصيب اصغري<br />
( Minimal أو تنصيب<br />
)<br />
( Typical<br />
)<br />
مخصص<br />
( Custom تتحكم طرق التنصيب بالملفات التي سيتم نسخها إلى الحاسب وبما أن برنامجنا مؤلف من<br />
)<br />
.<br />
ملف واحد فلا حاجه لأن يكون هناك ثلاث أنوا من التنصيب لذلك اختر فقط<br />
Typical من النافذة<br />
اختر<br />
Files من الشجرة تظهر عندها أربع نوافذ متجاور إلى في النافذة اليسرى ، سنحدد هنا الملفات التي سيتم<br />
نسخها إلى القرص الصلب وهي ملفات التي يحتاجها البرنامج<br />
) معظم البرامج المكتوبة با<strong>لغة</strong> <strong>دلفي</strong> لا تحتاج إلا إلى<br />
الملف ذو الامتداد<br />
.Exe إلا إذا كان برنامجك يتعامل مع ملفات خارجية، كملفات صور أو نصوص أو صوت أو<br />
قاعدة بيانات ...<br />
اضغط بزر الفأرة اليميني على<br />
Destination Computer في النافذة اليسرى في الأسفل ستظهر لك قائمة حدد<br />
منها ، INSTALLDIR حدد بعدها الفهرس الذي حفظت فيه برنامج المفكرة في النافذة Source Computer's<br />
. Folder<br />
Destination إلى النافذة Source Computer's Files<br />
ثم أنقل الملف من<br />
TextEditor.Exe من النافذة<br />
Computer Files عن طريق سحب الملف إفلاته .<br />
:<br />
اختر : Object/ Merge Modules<br />
وحدد من النافذة المجاورة المكتبات التي يتعامل معها برنامج وأهمها<br />
حدد هذا الخيار إذا كان برنامجك يستخدم العناصر في الصفحة<br />
BDE في <strong>دلفي</strong> وبمجرد تحديد هذا<br />
: BDE_ent<br />
.<br />
الخيار يظهر نموذج حوار لتحديد نوع قاعدة المعطيات المستخدمة ولإنشاء<br />
Alias إذا كنت بحاجة لذلك<br />
... . QuickRep حدد هذا الخيار إذا استخدمت في برنامجك العناصر في الصفحة : QuickReport<br />
:<br />
اختر بعدها : Shortcuts /folder's<br />
فتظهر عندها النافذة التالية<br />
اضغط بزر الفأرة اليمني على القائمة<br />
Program Menu واختر New Folder وسم المجلد الجديد باسم شركتك ثم<br />
اضغط على بزر الفأرة اليميني على المجلد الجديد واختر من القائمة<br />
، New Shortcut أعط هذا الاختصار الاسم<br />
.<br />
Notepad ثم حدد الخصائص لهذا الاختصار كما هو موضح في الأعلى وهذا شرح<br />
لهذه الخصائص<br />
تظهر هذه الخاصة تلميح عندما يقف مؤشر فوق أيقونة الاختصار في Win2000 :Description<br />
تحدد هذه الخاصة الملف الذي سيتم تشغيله عند الضغط على الاختصار<br />
) لا حظ أن هذا الاختصار<br />
: Target<br />
يجب أن يحدد على الكمبيوتر الهدف وليس على حاسبك لذلك وضع داخل . INSTALLDIR\TextEditor.exe<br />
يتم تحديد في هذه الخاصة الأيقونة التي سيحملها الاختصار<br />
.<br />
: IconFile<br />
198
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
تحدد مجلد عمل البرنامج<br />
) هذه الخاصة ضرورية جدا ً إذا كان البرنامج يستدعي ملفات<br />
: Working Directory<br />
من مجلد البرنامج ).<br />
يمكنك عمل أكثر من اختصار لنفس الملف ، كما يمكنك أن تظهر اختصار لبرنامج على سطح المكتب و إذا أردت<br />
لبرنامجك أن يعمل في بداية تشغيل ويندوز ضع اختصارا ً له في القائمة . Startup<br />
اختر<br />
Registry من الشجرة اليسارية إذا كان برنامجك يتعامل مع ملف تسجيل ويندوز<br />
) إذا كان برنامجك يحتاج<br />
إلى إضافة قيم إلى مسجل النظام ليعمل بشكل جيد ( .<br />
اختر<br />
Dialog من الشجرة اليسارية لتحدد النوافذ التي ستظهر أثناء تشغيل برنامج التنصيب ، حدد منها النوافذ التي<br />
تريد أن تظهر ولاتنس أن تتحكم بخصائص هذه النوافذ<br />
) لا حظ أن كثرة النوافذ ستؤدي إلى زيادة حجم ملفات<br />
برنامج التنصيب ( .<br />
اختر<br />
إذا كان برنامجك مخصص ليعمل على نظام تشغيل محدد<br />
ويندوز<br />
2000 فقط مثلا ً<br />
( أو<br />
)<br />
Requirement<br />
انه بحاجة إلى معالج من طراز معين ، أو بحاجة إلى حد معين من الذاكرة ليعمل و...<br />
اختر<br />
Build your release واختر Custom من النافذة المجاورة وحدد الخصائص من النافذة المجاورة وفيما<br />
يلي شرح مختصر لهذه الخواص :<br />
حدد هنا حجم وسيلة التخزين التي تريد أن تخزن عليها برنامج التنصيب<br />
) إذا كان قرص مرن<br />
: Media Size<br />
أعط القيمة ( 1.38 .<br />
يمكنك أن تختار بين<br />
Mb أو Gb أي أن الحجم الذ1ي حددته في الخيار الأول سيقاس<br />
: Media Size Unite<br />
بالميغا بايت أو .<br />
في جيغا بايت<br />
.<br />
يمكنك أن تختار<br />
512 أو 1024 تبعا ً لوسيط التخزين المستخدم<br />
: Cluster Size<br />
أعط القيمة<br />
True لهذه الخاصة ليتم ضغط ملفات برنامجك و(<br />
يفضل أن تفعل ذلك إذا كنت<br />
: Compress Media<br />
تريد حجم التخزين أصغر ما يمكن ( .<br />
في برامج التنصيب الحديثة لم يعد الملف<br />
Setup.exe هو الملف المسؤول عن تنصيب البرنامج<br />
: Setup.exe<br />
ويقوم بتنصيب البرنامج الملفات ذات الامتداد<br />
Msi ومهمة البرنامج<br />
Setup.exe هي تحديد نظام التشغيل وتسليم<br />
العمل إلى برامج تنصيب ملفات<br />
Msi المناسبة، يفضل أن تعطي هذه الخاصة القيمة<br />
True لأن أغلب المستخدمين<br />
تعود على تشغيل ملفات . Setup.exe<br />
سيضيف هذا الخيار الملف<br />
instmsia.exe وهو يقوم بتنصيب البرنامج الذي<br />
: Include Msi Win9x engine<br />
يستطيع التعامل مع ملفات<br />
الملف ذو الامتداد<br />
Msi ليس ملف تنفيذي ولذلك هو بحاجة لبرنامج آخر لتشغيله<br />
) Msi<br />
فإذا قمت بتنصيب برنامجك على حاسوب لا يحوي برنامج تشغيل ملفات<br />
Msi فلن يتم تنصيب البرنامج، لذلك<br />
عليك أن تضيف الملف<br />
instmsia.exe الذي يحوي البرنامج المسؤول عن فتح الملفات من نوع<br />
، إذا كنت<br />
( Msi<br />
ستستخدم القرص المرن كوسيلة تخزين فأعط هذا الخيار القيمة . True<br />
.<br />
سيضيف هذا الخيار الملف<br />
.... instmsiw.exe نفس الشرح السابق<br />
: Include Msi Windows Nt engine<br />
199<br />
أعط هذا الخيار القيمة<br />
True إذا كنت ستنسخ برنامج إلى قرص ليزري أو قرص<br />
: Generate AutoRun.inf<br />
. DVD
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
اختر الآن Build Custom من القائمة<br />
هذا يعني أن لم يحدث أي أخطاء أثناء عملية بناء ملفات التنصيب<br />
http://www.alshater.net<br />
.<br />
Build سيتم عندها إنشاء ملفات التنصيب ويجب أن تكون الرسالة الأخيرة<br />
build completed with 0 errors, 0 warnings<br />
Run Your<br />
اختر بعد ذلك<br />
Test Your Release من الشجرة واضغط على Custom في النافذة الجديدة ومن ثم<br />
، Setup سيتم الآن تنصيب البرنامج بشكل كامل لا حظ الخطوات وتأكد من أنها تعمل بشكل صحيح وإذا تم العمل<br />
بدون رسائل أخطاء ، ستجد الاختصارات التي وضعتها في القائمة أبدا ، كما يمكنك إزالة البرنامج من النافذة<br />
إضافة إزالة البرامج من لوحة التحكم .<br />
.<br />
في حال حدوث أخطاء يجب عليك التأكد من القيم التي اخترتها في النوافذ السابقة وإعادة بناء البرنامج ومن تجربته<br />
بعد الانتهاء ستجد نسخة من برنامج التنصيب في الفهرس الذي حددته لحفظ برنامج التنصيب وهو غاليا ً من الشكل<br />
C:\My Documents\MySetups\MyNotpad\Express\Custom\DiskImages\DISK1<br />
Distributed your release<br />
:<br />
حدد الخيار<br />
واختر Custom من الشجرة المجاورة ومن ثم حدد المكان الذي تريد<br />
أن تضع فيه برنامج التنصيب ،ليكن القرص \:A مثلا ً ...<br />
Install Shelled<br />
ملاحظة<br />
:هذه النسخة من<br />
لا تدعم ال<strong>لغة</strong> العربية وفي حال استخدام ال<strong>لغة</strong> العربية في عمليات<br />
إعداد برنامج التنصيب من المحتمل أن تشاهد الكثير من رسائل الأخطاء .<br />
وآخر دعواهم أن الحمد الله رب العالمين<br />
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وانفع الناس بنا واغفر لنا وارحمنا إنك أنت الغفور الرحيم<br />
محمد خالد ناصر آغا<br />
200
http://www.alshater.net<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
المراجع<br />
<strong>لغة</strong> <strong>البرمجة</strong> <strong>دلفي</strong><br />
مجموعة محاضرات في كلية الهندسة المعلوماتية جامعة<br />
حلب<br />
المهندس ياسر عقاد<br />
أسامة معراوي<br />
دار شعاع<br />
احتراف<br />
محمد حمدي غانم<br />
Visual Basic .Net<br />
http://www.arabdevelopers.com<br />
مواقع على الانترنت<br />
من أول وأقوى مواقع ال<strong>دلفي</strong> ولكنه للأسف لا يعمل في<br />
الوقت الحالي<br />
الفريق العربي للبرمجة<br />
موقع إنكليزي ولكنك بالتأكيد ستحب ال<strong>دلفي</strong> إذا فهمت<br />
http://www.arabteam2000.com<br />
http://www.delphiforfun.com<br />
برامج هذا الموقع<br />
201