الجمعة، 8 يوليو 2011

شرح فيجوال بيسك للمبتدئين والمحترفين


لمصدر: منتديات كتاب العرب
شرح فيجوال بيسك للمبتدئين والمحترفين
موضوعى الجديد دلوقتى هو شرح مبسط زتفصيلى لبرنامج من اهم البرامج ويارب تستفيدوا طيب يلا
بسم الله الرحمن الرحيم


الفصل الأول
كتابة أول برنامج لك في فيجول بيسك


سنكتب في هذا الفصل، أول برنامج لك في فيجول بيسك. تمر مرحلة كتابة البرنامج في فيجول بيسك بخطوتين:
· خطوة التصميم المرئي للبرنامج.
سندعوها عبر الكتاب بالتمثيل المرئي Visual Implementation للنموذج.
· خطوة كتابة نص البرنامج.
يُصمِم المستخدم خلال الخطوة الأولى، البرنامج باستخدام الأدوات التي تأتي مع برمجية فيجول بيسك. تمكّنك هذه الأدوات من تصميم البرنامج باستخدام الفأرة ولوحة المفاتيح.
لا يلزمنا خلال مرحلة البرمجة المرئية (أي التصميم المرئي) كتابة أي نص برمجي!، وكل ما عليك معرفته هو كيف تشغّل وتستخدم الأدوات البرمجية التي تأتي مع فيجول بيسك. وسوف تلاحظ أن عملية التصميم المرئي فيها قدر كبير من المتعة وتعتمد بكثرة على النقر بالفأرة. يركز هذا الفصل على معرفة كيفية استخدام أدوات التصميم المرئي في فيجول بيسك.

أما في خطوة كتابة نص البرنامج، فيستخدم محرر نصوص لكتابة البرنامج. وتتألف البرامج من عبارات مكتوبة بلغة البرمجة فيجول بيسك. تتشابه عملية كتابة نصوص البرامج في فيجول بيسك مع كتابة البرامج في اللغات الأخرى. إلا أن كتابة البرامج في فيجول بيسك أسهل بكثير من كتابتها باللغات الأخرى.
حول هذا الفصل
ستلاحظ إذا استعرضت باقي فصول الكتاب، أن هذا الفصل ليس نموذجياً، فهو يركز على ناحية البرمجة المرئية Visual Programmingللغة فيجول بيسك، ولهذا فهو يدقق على كيفية استخدام الأدوات البرمجية للغة (عناصر التحكم). بينما تتولى فصول الكتاب المتبقية تعليمك، كيفية كتابة نص البرامج في فيجول بيسك.
إنشاء دليل حفظ الملفات
قبل البدء بعملية كتابة أول برنامج لك في لغة فيجول بيسك، سننشئ دليلاً يحوي على ملفات العمل المنجز. وسنفترض عبر هذا الفصل، أن الدليل موجود لديك على القرص الصلب، وسنطلب منك فقط حفظ الملفات فيه، لهذا أنشئ الدليل التالي C:\VB5Prg\Ch01.
برنامج الترحيب
سنكتب برنامجاً يدعى برنامج الترحيب. وقبل كتابة برنامج الترحيب بنفسك دعنا ندرس أولاً مواصفاته، وبهذه الطريقة سنتمكن من فهم ما يفترض أن ينجزه هذا البرنامج بشكل أفضل.
يظهر الإطار المبين في الشكل 1-1، عند بدء تشغيل برنامج الترحيب وكما تلاحظ يحوي إطار البرنامج على ثلاثة أزرار أوامر (الزر إظهار الترحيب والزر مسح والزر خروج) ومربع نص فارغ.
الشكل 1-1 برنامج الترحيب.
تظهر الرسالة مرحباً بكم ضمن مربع النص، عند النقر على الزر إظهار الترحيب.
الشكل 1-2 إظهار مرحباً بكم في مربع النص.
يمحو برنامج الترحيب محتوى مربع النص، عند النقر بالفأرة على الزر مسح.
ينتهي تنفيذ برنامج الترحيب عند النقر على الزر خروج.
إنشاء مشروع جديد
الآن وقد علمت ما ينجزه برنامج الترحيب، نستطيع الشروع بكتابته.
ملاحظة
برنامج الترحيب عبارة عن برنامج بالغ البساطة، لكن مع ذلك يتوجب عليك كتابته بنفسك، لأنه يمثل برنامجاً نموذجياً في فيجول بيسك. وفي الواقع، حال تعلمك كيفية كتابة برنامج الترحيب بنفسك، تستطيع فهم ما هي لغة فيجول بيسك! طبعاً هنالك كمّ هائل من المعلومات الأخرى في فيجول بيسك لا بد لك من معرفتها، إلا أن كتابة هذا البرنامج بنفسك يعني أنك تعرفت على أساسيات فيجول بيسك.
أُولى الأوليات التي يجب عليك إنجازها، هي إنشاء مشروع جديد New Project لبرنامج الترحيب باتباع الخطوات التالية:
· شغّل فيجول بيسك. إذا رأيت مربع الحوار المبين في الشكل 1-3، فأغلق هذا المربع بنقر الزر إلغاء الأمر.
· اختر البند New Project من القائمة File لفيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الحوار New Project المبين في الشكل 1-4.
الشكل 1-3 مربع الحوار New Project الذي قد يظهر عند تشغيل فيجول بيسك.
كما يبدو من الشكل 1-4. يمكّنك مربع الحوار New Project من إنشاء أنواع مختلفة من المشاريع (Project). لكننا في الوقت الراهن، نرغب بإنشاء تطبيق تنفيذي قياسي
(Standard EXE).
الشكل 1-4 مربع الحوار New Project الذي يُظهره فيجول بيسك بعد اختيار New Project من القائمة File.
لهذا أَخبر فيجول بيسك بذلك باتباع الخطوة التالية:
· انقر الرمز Standard EXE الذي يظهر ضمن مربع الحوار New Project ثم انقر الزر OK لمربع الحوار New Project.
يظهر عند ذلك إطار خال يدعى النموذج Form1 (انظر الشكل 1-5). سنستخدم أدوات لغة فيجول بيسك المتنوعة حتى يصبح النموذج الخالي، كالمبين
في الشكل 1-1.
الشكل 1-5 النموذج Form1 الفارغ.
حفظ المشروع الجديد
رغم أننا لم نجر أي تعديلات بعد على النموذج الفارغ، لكن يتوجب عليك حفظ المشروع في هذه المرحلة المبكرة من التصميم. يؤدي حفظ المشروع إلى تخزين ملفين:
· ملف المشروع Project File، ويمتلك الامتداد vbp. يحتوي هذا الملف على المعلومات التي يستخدمها فيجول بيسك لبناء المشروع.
· ملف النموذج Form File، ويمتلك الامتداد frm. ويحتوي على معلومات تتعلق بالنموذج نفسه.
استخدم الآن الخطوات التالية لحفظ الملفين: Hello.vbp (ملف المشروع)، و Hello.frm (ملف النموذج).
· تحقق من تمركز الإضاءة عند عنوان الإطار Form1، ثم اختر Save Form1 As من القائمة File لفيجول بيسك. (يعني تمركز الإضاءة عند نموذج ما، أنه تم اختياره).
يستجيب فيجول بيسك بإظهار مربع الحوار Save File As.
· استخدم مربع الحوار Save File As لاختيار الدليل C:\VB5Prg\Ch01 من أجل حفظ الملف فيه. بدّل الاسم الافتراضي للنموذج من Form1.frm إلى Hello.frm
· (انظر الشكل 1-6).
· انقر الزر حفظ في مربع الحوار Save File As.
يستجيب فيجول بيسك بحفظ النموذج باسم Hello.frm في الدليل C:\VB5Prg\Ch01.
ملاحظة
لا تستخدم الاسم الافتراضي الذي يقدمه فيجول بيسك عند حفظ نموذج ما. بل احفظ النموذج باسم مناسب للتطبيق الذي تصممه. لاحظ مثلاً، أننا استخدمنا الاسم Hello.frm كاسم لنموذج برنامج الترحيب.
الشكل 1-6 حفظ النموذج بالاسم Hello.frm.
والآن، احفظ ملف المشروع:
· اختر Save Project As من القائمة File لفيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الحوار Save Project As.
· الاسم الافتراضي الذي يقدمه فيجول بيسك للمشروع هو Project1.vbp.
لكن لا بد من تغيير الاسم الافتراضي إلى اسم يتناسب مع التطبيق الذي تعمل على تطويره.
· استخدم مربع الحوار Save Project As لحفظ المشروع بالاسم Hello.vbp في الدليل C:\VB5Prg\Ch01.
ملاحظة
لا تستخدم الاسم الافتراضي الذي يعطيه فيجول بيسك للمشروع عند حفظ ملف المشروع. ولكن بدلاً من ذلك أطلق على المشروع اسماً يتناسب مع التطبيق الذي تصممه. لاحظ مثلاً أننا أطلقنا على مشروع برنامج الترحيب تسمية Hello.vbp. نكون حتى هذه اللحظة قد أنهينا حفظ الملفين Hello.vbp (ملف المشروع) وHello.frm (ملف النموذج).
فحص إطار المشروع Project Window
حتى هذه النقطة، يدعى المشروع بالاسم Hello.vbp ويتألف من ملف نموذج واحد هو الملف Hello.frm. سنمر عبر الفصول القادمة على مشاريع تحوي أكثر من ملف نموذج.
يعتبر إطار المشروع Project Window من الأدوات الهامة التي يقدمها فيجول بيسك، ويمكّنك من رؤية الملفات المختلفة الموجودة في المشروع. (ستشعر بقيمة هذه الميزة بشكل أفضل كلما زاد تعقيد المشروع).
اتبع الخطوات التالية لفهم محتويات إطار المشروع Project Explorer:
· اختر Project Explorer من القائمة View لفيجول بيسك.
يظهر إطار المشروع حسب ما هو مبين في الشكل 1-7.
الشكل 1-7 إطار نافذة المشروع Project Window.
ملف المشروع، حسب ما يظهر من إطار المشروع هو Hello.vbp. وهو يحتوي على نموذج وحيد باسم Hello.frm. يعتبر المشروع الحالي بسيط جداً، بحيث لا تغدو أهمية إطار المشروع واضحة للعيان. لكن مع تزايد تعقيد المشاريع التي ستكتبها مستقبلاً، سوف تلاحظ مدى أهمية هذا الإطار.
تغيير الخاصية Caption للنموذج (تغيير عنوان النموذج)
اتفقنا أن النموذج الفارغ الذي أنشأه فيجول بيسك يحمل العنوان Form1 (انظر الشكل 1-5). هذا العنوان يمثل العنوان الافتراضي الذي يعطيه فيجول بيسك للنموذج الفارغ عند إنشائه. تستطيع ترك هذا العنوان على حاله، ولكننا نفضل أن نطلق عنواناً على النموذج يكون مناسباً لموضوعه. فمثلاً حسب الشكل 1-1، يحمل النموذج عنوان برنامج الترحيب، وفي هذا دلالة على أن البرنامج هو برنامج ترحيب.
ملاحظة
النموذج هو إطار (Window) بنفس الوقت. فمثلاً، النموذج Form1 المبين في
الشكل 1-5 يدعى نموذج ويدعى إطار (Window) بذات الوقت. يطلق مصطلح النموذج، على النافذة التي أنشأتها في مرحلة التصميم، ويستخدم مصطلح الإطار (أو نافذة)، عند تنفيذ البرنامج. بكلام آخر، عند ذكر مصطلح النموذج، يكون المقصود مرحلة التصميم، وعند ذكر مصطلح الإطار أو النافذة، يكون المقصود مرحلة التنفيذ.
نبين لك الآن طريقة تغيير عنوان النموذج الفارغ لبرنامج الترحيب:
· تحقق من اختيار النموذج الفارغ. تستطيع التأكد بسهولة من اختيار نموذج، بتفحص شريط عنوانه. فإذا كان شريط العنوان (Caption) مضاءً، فهذا يعني أن النموذج تم اختياره. أما إذا لم يكن قد تم اختيار النموذج، فيكفي النقر النموذج في أي مكان على سطحه لاختياره.
أو تستطيع بدلاً من ذلك اللجوء إلى إطار المشروع Project Window (اختر Project Explorer من القائمة View لفيجول بيسك)، ثم اختيار العنصر Hello.frm بنقر الفأرة عليه، ثم نقر الرمز View Object الذي يظهر أعلى إطار المشروع. (انظر الشكل 1-7. يظهر الرمز View Object أعلى نافذة المشروع وثاني رمز من جهة اليمين).
بعد اختيار النموذج، اختر إطار الخصائص Properties Window من القائمة View لفيجول بيسك.
يستجيب فيجول بيسك بإظهار إطار الخصائص (Properties Window)، الشكل 1-8.
الشكل 1-8 إطار الخصائص Properties Window.
ملاحظة
يمكنك في فيجول بيسك نقل شتى الإطارات إلى أي موقع ضمن سطح مكتب فيجول بيسك وذلك بسحب عناوين هذه الإطارات بواسطة الفأرة.
قد يتغير شكل الإطارات قليلاً تبعاً للموقع الذي تأخذه على سطح المكتب. فمثلاً قد يتغير شكل إطار الخصائص Properties Window إلى حد ما، عما هو مبين في الشكل 1-8، بحسب الموقع الذي يحتله على سطح المكتب، لكن مهما كان موقعه، تستطيع التعرف عليه، بسبب احتوائه على كلمة الخصائص Properties في عنوانه.
· انقر على الخلية التي تظهر يمين اسم الخاصية Caption (خلية العنوان) في إطار الخصائص (Properties Window).
الآن ستجد، أن الخلية الواقعة يمين الخلية Caption تملك النص Form1.
· استخدم المفتاح Delete ومفاتيح الأسهم على لوحة المفاتيح، لحذف النص Form1، واستبدله بكتابة النص برنامج الترحيب.
يفترض أن يبدو إطار الخصائص كما في الشكل 1-9.
تهانينا! لقد أنهيت للتو عملية تبديل الخاصية Caption (العنوان) للنموذج.
ألق نظرة على النموذج الفارغ (انظر الشكل 1-10). يحمل هذا النموذج الآن العنوان برنامج الترحيب.
الشكل 1-9 تبديل الخاصية Caption للنموذج.
الشكل 1-10 النموذج frmHello وهو يحمل الآن عنواناً جديداً.
ما هي الخاصية ؟!
الخاصية Caption ما هي إلا إحدى خصائص النموذج، فكما تشاهد من إطار الخصائص Properties Window، فإن النموذج يمتلك الكثير من الخصائص الأخرى. ولفهم معنى الخاصية لا بد لك من فهم كيفية تعامل فيجول بيسك مع الكائنات Objects مثل النماذج Forms وأزرار الأوامر Command Buttons وأشرطة التمرير Scroll bars ومربعات الاختيار Check Boxes . . . الخ.
تُعرّف خصائص الكائن (Object) كيف يبدو هذا الكائن وكيف يتصرف. فمثلاً النموذج عبارة عن كائن. تحدد الخاصية Caption للنموذج، النص الذي يظهر في شريط عنوانه.
خذ مثلاً الخاصية BackColor للنموذج، تحدد هذه الخاصية لون خلفية النموذج. اتبع الخطوات التالية لتغيير الخاصية BackColor للنموذج:
· تحقق من اختيار النموذج. (انقر أي مكان من النموذج لاختياره).
· اختر Properties Window من القائمة View لإظهار إطار الخصائص.
· انقر على الخلية الواقعة يمين الخلية BackColor في إطار الخصائص.
يضع فيجول بيسك عند نقر هذه الخلية، رمز سهم نازل فيها، (انظر الشكل 1-11).
الشكل 1-11 الخاصية BackColor.
· انقر رمز السهم النازل الذي يظهر في الخلية.
يستجيب فيجول بيسك بإظهار مربع الحوار المبين في الشكل 1-12.
الشكل 1-12 مربع الحوار الذي يظهر عند نقر رمز السهم النازل الموجود جانب الخاصية BackColor.
لاحظ أن مربع الحوار المبين في الشكل 1-12 يمتلك صفحتين:
الصفحة Palette، والصفحة System. الصفحة التي تظهر وفق الشكل 1-12 هى الصفحة System.
· انقر على الصفحة Palette في مربع الحوار المبين في الشكل 1-12.
يستجيب فيجول بيسك بإظهار صفحة الألوان Palette (انظر الشكل 1-13).
الشكل 1-13 الصفحة Palette صفحة الألوان.
· اختر اللون الذي تحبذه بنقره في الصفحة Palette. لنفترض الآن أن اللون الذي اخترته هو اللون الذي يظهر في المربع الواقع عند العمود الثالث والسطر الثالث من جهة الأعلى. (أو اختر أي لون تفضل).
ملاحظة
تفحص الخلية التي تقع يمين اسم الخاصية في نافذة الخصائص والتي ترغب بتعيينها. فإذا كانت تلك الخلية تحمل رمز سهم نازل داخلها، أو زر يحوي ثلاث نقاط متجاورة. انقر على السهم أو الزر، فيظهر إطار آخر أو لائحة، تمكنك من اختيار قيمة ما بواسطة الفأرة للخاصية المحددة.
جرب عدة ألوان بتكرار العملية، إلى أن تشعر بالرضا عن اللون الذي تختاره.
تبديل الخاصية Name للنموذج (اسم النموذج البرمجي)
يجب أن يمتلك كل كائن (Object) في فيجول بيسك اسماً، يتحدد ذلك الاسم بواسطة الخاصية Name لذلك الكائن.
فمثلاً، عندما أنشأنا النموذج الجديد لبرنامج الترحيب، أطلق فيجول بيسك من تلقاء نفسه الاسم Form1 على النموذج (أي أسند الاسم Form1 إلى الخاصية Name لنموذج برنامج الترحيب).
ملاحظة
لا تخلط بين الخاصية Caption، والخاصية Name للنموذج. تستخدم الخاصية Caption لإظهار عنوان ما، في شريط عنوان النموذج. أما الخاصية Name فتستخدم لإسناد اسم برمجي خاص بالنموذج نفسه. مع أن فيجول بيسك يفترض القيمة Form1 لكلتا الخاصيتين عند إنشاء نموذج جديد فارغ.
غيّر الآن الخاصية Name للنموذج:
· انقر على النموذج في أي مكان منه لاختياره.
· اختر Properties Window من القائمة View.
يستجيب فيجول بيسك بإظهار إطار خصائص النموذج Form1.
يملك إطار الخصائص Properties صفحتين هما: الصفحة Alphabetic والصفحة Categorized (انظر الشكل 1-. عند اختيار الصفحة Alphabetic، تُرتب الخصائص أبجدياً (باستثناء أهم خاصية وهي Name التي تظهر أولاً). بينما تظهر الخصائص مصنفة حسب مواضيعها، عند اختيار الصفحة Categorized.
· اختر الصفحة Alphabetic لإطار الخصائص.
تظهر الخاصية Name في مقدمة لائحة الخصائص.
· انقر الخلية التي تظهر يمين الخاصية Name، يمكّنك فيجول بيسك من تعديل الخاصية Name.
· استبدل الاسم الافتراضي Form1 بالاسم frmHello.
غيّرنا في الخطوة السابقة الخاصية Name للنموذج من Form1 إلى frmHello. تشير الأحرف الثلاث الأولى من قيمة الخاصية Name للكائنات Objects إلى نوع الكائن.
وهكذا فالأحرف الثلاث الأولى من الخاصية Name لنموذج ما، هي frm، كما في مثالنا الحالي frmHello.
ملاحظة
غيّر الأسماء الافتراضية للكائنات بحيث تعكس أسماؤها ووظائفها في البرنامج. فمثلاً frmHello عبارة عن اسم النموذج الذي يستخدم من قبل برنامج الترحيب. يؤدي بدء اسم النموذج بالأحرف الثلاث frm إلى تسهيل فهم البرنامج وتصحيحه.
ألق نظرة على الاسم frmHello، بما أنه يبدأ بالأحرف frm. تستطيع بسهولة
(أنت أو من يقرأ الاسم) أن تعلم مباشرة أن نوع الكائن frmHello عبارة عن نموذج. لا يعتبر هذا الأمر من متطلبات البرمجة في لغة فيجول بيسك، لكنه كما قلنا يسهل قراءة وفهم البرنامج.
تبديل الخاصية RightToLeft للنموذج (تعريب النموذج)
يمكّنك فيجول بيسك، من إنشاء برامج عربية المظهر والمضمون، بشرط تطوير برنامجك في نظام تشغيل يدعم اللغة العربية، مثل Windows95 العربي أو WinNT الداعم للغة العربية.
وما عليك سوى تغيير قيمة الخاصية RightToLeft من القيمة False إلى القيمة True، لأي كائن من كائنات فيجول بيسك، حتى يظهر الكائن بشكل مقبول للمستخدم العربي.
ملاحظة
للحصول على معلومات كاملة، عن موضوع إنشاء التطبيقات العربية في فيجول بيسك، اقرأ الفصل الثاني والعشرين (إنشاء تطبيقات عربية السمة مع فيجول بيسك 5). وكل ما يهمنا معرفته الآن، أن الخاصية RightToLeft = True تعني تعريب الكائن.
غيّر الآن الخاصية RightToLeft للنموذج:
· انقر على النموذج في أي مكان منه لاختياره.
· اختر Properties Window من القائمة View.
يستجيب فيجول بيسك بإظهار إطار خصائص النموذج Form1.
· انقر خلية الخاصية RightToLeft نقراً مزدوجاً، لتغيير قيمتها من القيمة False إلى القيمة True.
يستجيب فيجول بيسك، بتعريب النموذج بأن يظهر عنوانه على يمين المستخدم، بدلاً من يساره.
أصبح النموذج الآن، نموذجاً عربياً. وعند إضافة أي عنصر تحكم (أداة من أدوات فيجول بيسك)، سيقوم فيجول بيسك بإسناد القيمة True للخاصية RightToLeft للعنصر الجديد آلياً.
حفظ العمل المنجز
لم ننته بعد من النموذج (تذكر أن النموذج سيبدو عند انتهائه كما في الشكل 1-1)، لكن رغم ذلك يفضل حفظ العمل الذي أنجزته حتى هذه اللحظة، حتى لا تضطر إلى إعادة العمل مرة ثانية، إذا انهار الحاسب لديك لسبب ما. لهذا اتبع الخطوات التالية لحفظ العمل:
· اختر Save Project من القائمة File.
يستجيب فيجول بيسك بحفظ كل التغيرات المنجزة على ملف المشروع أو أي من الملفات التابعة للمشروع (مثال ذلك، الملف Hello.frm).
إضافة الزر خروج إلى النموذج frmHello
حسب ما يظهر من الشكل 1-1، فالنموذج المكتمل سيحوي ثلاثة أزرار أوامر داخله، وهي: إظهار الترحيب و مسح و خروج.
لوضع زر أمر ما ضمن النموذج، لا بد لك من تحديده أولاً من مربع الأدوات.
إطار مربع الأدوات Toolbox Window
يحوي إطار مربع الأدوات، رموز جميع الكائنات المتاحة لمشروعك الحالي. ومهمتك هي التقاط الكائن من مربع الأدوات، ووضعه على النموذج.
· أظهر إطار مربع الأدوات، باختيارToolbox من القائمة View لفيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الأدوات (الشكل 1-14).
الشكل 1-14 إطار مربع الأدوات Toolbox.
ملاحظة
قد يختلف شكل إطار مربع الأدوات قليلاً عما هو عليه في الشكل 1-14، وذلك تبعاً للموقع الذي يأخذه على سطح مكتب فيجول بيسك (أي حسب المكان الذي تضعه فيه).
كما أن إطار مربع الأدوات، قد يحوي رموزاً أكثر أو أقل، تبعاً لنوع نسخة فيجول بيسك 5 التي تملكها، وتبعاً لإعدادات فيجول بيسك 5.
يبين الشكل 1-15 رمز زر الأمر مكبراً، وهو طبعاً أحد الرموز التي تظهر في مربع الأدوات. تستطيع التعرف بسهولة على مختلف الرموز في مربع الأدوات بوضع مؤشر الفأرة فوق أي رمز بدون النقر عليه، ليظهر مستطيل أصفر يحمل بداخله اسم الكائن الذي يمثله هذا الرمز.
فمثلاً. عند وضع مؤشر الفأرة فوق رمز زر الأمر دون النقر عليه، يظهر مستطيل أصفر يحمل الرسالة CommandButton داخله.
الشكل 1-15 رمز زر الأمر CommandButton في إطار مربع الأدوات.
وضع الزر خروج على النموذج
اتبع الخطوات التالية لوضع زر أمر على النموذج:
· انقر نقراً مزدوجاً على رمز زر الأمر في مربع الأدوات. (انظر الشكل 1-15 للتعرف على شكل زر الرمز).
يستجيب فيجول بيسك بوضع زر أمر في مركز النموذج (انظر الشكل 1-16).
الشكل 1-16 النموذج مع زر الأمر بداخله.
يتولى فيجول بيسك تعيين مختلف القيم الافتراضية لخصائص زر الأمر CommandButton الذي وضعته على النموذج. فمثلاً العنوان الافتراضي (Caption) لذلك الزر هو Command1.
تغيير الخاصية Name للزر خروج (تغيير الاسم البرمجي)
ستغير اسم زر الأمر من Command1 إلى cmdExit باعتبار أن هذا الزر سيعمل عمل زر الإنهاء خروج:
· اختر Properties Window من القائمة View لفيجول بيسك.
يستجيب فيجول بيسك بإظهار إطار الخصائص.
· تحقق أن مربع السرد عند قمة إطار الخصائص يظهر البند التالي:
Command1 CommandButton. (انظر الشكل 1-17 لتحديد موقع مربع السرد).
الشكل 1-17 مربع السرد عند قمة إطار الخصائص ويظهر البند التالي: Command1 CommandButton.
ملاحظة
يمتلك النموذج الآن كائنين: النموذج frmHello وزر الأمر Command1. يُظهر إطار الخصائص، خصائص الكائن الذي يظهر اسمه حالياً في مربع السرد الواقع عند قمة إطار الخصائص.
للانتقال بين الكائنات، انقر رمز السهم النازل، الموجود يمين مربع السرد واختر الكائن المطلوب من اللائحة المنسدلة للأسفل.
· غير الخاصية Name للزر Command1 إلى cmdExit.
لاحظ كيف وضعنا الحروف الثلاثة cmd قبل كلمة Exit، وذلك كما اتفقنا سابقاً، للدلالة على نوع الكائن ووظيفته في آن واحد (تعتبر وظيفة زر الأمر في مثالنا هذا، تنفيذ أمر الخروج من البرنامج)، هذا العمل ليس من متطلبات لغة فيجول بيسك، ولكن لتسهيل قراءة وفهم البرنامج، فعندما نشاهد الاسم cmdExit، نستطيع القول مباشرة، أن هذا الاسم يخص زر أمر وأن وظيفته هي إنهاء البرنامج.
تغيير الخاصية Caption للزر خروج (تغيير العنوان)
العنوان الافتراضي الذي يعطيه فيجول بيسك لزر الأمر هو Command1. وبما أن وظيفة زر الأمر هذا الخروج من البرنامج، فأنسب عنوان له هو خروج:
· غير الخاصية Caption لزر الأمر cmdExit من Command1 إلى &خروج.
للحصول على الرمز (&)، اضغط المفتاحين Shift+7 على لوحة المفاتيح. عند استخدام الرمز & (مثل استخدامه قبل الحرف خ في الخطوة السابقة)، يتسبب بقيام فيجول بيسك بوضع خط تحت الحرف الذي يليه (الحرف الذي يأتي بعد الرمز &)، ولاحظ وجود خط تحت الحرف خ في عنوان الزر خروج. انظر الشكل 1-1.
والآن، عند تنفيذ البرنامج، يؤدي الضغط على المفتاحين (خAlt+) من لوحة المفاتيح إلى نفس تأثير النقر على الزر خروج.
ملاحظة
يُنصح دائماً باستخدام الرمز & قبل أحد حروف عنوان زر ما. يتسبب هذا الرمز & بظهور خط تحت الحرف الذي يليه مباشرة، وأثناء التنفيذ يصبح المستخدم قادراً، إما على نقر الزر بالفأرة أو ضغط المفتاح Alt إضافة لضغط الحرف المحدد (ضغط المفتاح Alt والمفتاح الذي تحته خط). والذي يمثل حرف وصول سريع.
تبديل موقع الزر خروج
كما ترى من الشكل 1-1، يجب أن يقع الزر خروج بقرب الحافة السفلى من النموذج.
اسحب الزر خروج إلى الموقع المطلوب بضغط زر الفأرة الأيسر على أي مكان من الزر، ثم سحب وتحريك مؤشر الفأرة دون تحرير الزر الأيسر للفأرة، ثم تحرير زر الفأرة عند الوصول للموقع المناسب.
تبديل خصائص الخط (Font) للزر خروج
كما تلاحظ من الشكل 1-1، يختلف نوع الخط المستخدم في الزر خروج عن الخط الافتراضي الذي استخدمه فيجول بيسك لعنوان الزر، الذي وضعته على النموذج.
اتبع الخطوات التالية لتبديل نوع الخط للزر خروج:
· انقر على الخلية الواقعة يمين الخاصية Font التابعة للزر cmdExit. كما تلاحظ تحوي الخلية على مربع داخله ثلاث نقاط، يؤدي نقره إلى فتح مربع حوار تحديد الخطوط، يمكّنك من اختيار قيم معينة بواستطه.
· انقر على الزر ذى الثلاث نقط الموجود جانب الخاصية Font للزر cmdExit.
يستجيب فيجول بيسك بإظهار مربع الحوار Font.
· غير نوع الخط إلى System.
· غير حجم الخط إلى 10.
· انقر على الزر Ok في مربع الحوار Font.
· ألقِ نظرة على الزر خروج الآن، ولاحظ أن العنوان مكتوب بالخط الذي حددته مسبقاً بواسطة مربع الحوار Font.
يشبه النموذج الذي نبينه حتى الآن، ذاك المبين في الشكل 1-18.
الشكل 1-18 النموذج يحتوي الزر خروج على سطحه.
ملاحظة
لعل إحدى المزايا الرئيسية لفيجول بيسك، أنه يمكّنك من رؤية نتائج البرمجة المرئية لحظياً. تمرّن دوماً وجرّب خيارات مختلفة (كأن تجرب أنواع خطوط مختلفة، وأحجام وألوان مختلفة) حتى تقنع بالنتائج.
احفظ العمل الذي أنجزته:
· اختر Save Project من القائمة File لفيجول بيسك.
إضافة أزرار أخرى إلى النموذج frmHello
لعل الوقت قد حان، لإضافة زرين جديدين إلى النموذج؛ الزر إظهار الترحيب والزر مسح.
وضع الزرين على النموذج
يحوي النموذج حسب ما يفترضه الشكل 1-1، زري أمر آخرين:
الزر إظهار الترحيب والزر مسح، سنضع هذين الزرين على النموذج:
· أضف الزر إظهار الترحيب إلى النموذج بالنقر المزدوج على رمز زر الأمر
· Command Button ضمن مربع الأدوات. اسحب زر الأمر الجديد إلى اليمين (سيأخذ هذا الزر دور الزر إظهار الترحيب).
· انقر نقراً مزدوجاً رمز زر الأمر في مربع الأدوات مجدداً، ثم اسحب زر الأمر الجديد إلى اليسار. (يأخذ هذا الزر دور الزر مسح). تغيير حجم الأزرار
الأحجام الافتراضية للزرين إظهار الترحيب و مسح أصغر مما هي عليه في الشكل 1-1.
· كبّر الزرين الجديدين اللذين وضعتهما للتو في النموذج، يتم تكبير أو تصغير كائن باختياره أولاً. يحيط فيجول بيسك الكائن حال اختياره بمستطيل يتألف من ثماني مربعات سوداء، تدعى بالمقابض. اسحب أحد المقابض حتى يصل الكائن إلى الحجم المطلوب، فمثلاً لتغيير حجم الكائن أفقياً اسحب أحد المقابض أفقياً، أما لتغيير حجم الكائن عمودياً فاسحب أحد مقابضه عمودياً (انظر الشكل 1-19).
الشكل 1-19 تغيير حجم كائن بسحب مقابضه.
تبديل خاصية الاسم Name للزرين السابقين
الاسمان الافتراضيان الذين يطلقهما فيجول بيسك على الزرين الذين وضعتهما للتو في النموذج هي Command1 و Command2، ولكننا سنستبدلهما باسمين يناسبان عملهما أكثر:
· بدّل الخاصية Name لزر الأمر اليميني إلى cmdHello.
· بدّل الخاصية Name لزر الأمر اليساري إلى cmdClear.
تبديل عنواني الزرين السابقين
حسب ما يوضحه الشكل 1-1، يجب أن يكون عنوان الزر الأيمن هو إظهار الترحيب، وأن يكون عنوان الزر الأيسر هو مسح.
· بدّل الخاصية Caption للزر الأيمن إلى إ&ظهار الترحيب.
· بدّل الخاصية Caption للزر الأيسر إلى م&سح.
تبديل نوع الخط المستخدم في الزرين
· بدّل الخاصية Font للزر cmdHello إلى System واجعل حجم الخط مساوياً إلى 10.
· بدّل الخاصية Font للزر cmdClear إلى System واجعل حجم الخط مساوياً إلى 10.
ستكتشف بعد هاتين الخطوتين أن مساحة الزر صغيرة جداً، لهذا كّبر مساحة الزر، بسحب مقابضه.
يفترض أن يبدو النموذج لدى اكتماله كما في الشكل 1-20.
الشكل 1-20 النموذج بعد انتهاء تصميمه مع ثلاثة أزرار داخله.
احفظ العمل المنجز حتى الآن:
· اختر Save Project من القائمة File لفيجول بيسك.
إضافة كائن مربع نص (Text Box) إلى النموذج frmHello
هناك كائن آخر يجب إضافته إلى النموذج، وهو كائن مربع النص.
مربع النص عبارة عن مساحة مستطيلة، يتم إظهار نصوص أو كتابة نصوص فيها. يسمى مربع النص أحياناً بمربع تحرير.
وضع مربع النص في النموذج
يبين الشكل 1-21 موقع رمز مربع النص Text Box في مربع الأدوات، وطبعاً قد تختلف مواقع الرموز في إطار مربع الأدوات عما هي عليه في الشكل 1-21 تبعاً للإصدار المستخدم للغة ولإعداداتها.
ملاحظة
يظهر مستطيل أصفر يحوي النص TextBox بداخله، عند وضع مؤشر الفأرة فوق رمز مربع النص (دون ضغط أزرار الفأرة).
اتبع الخطوتين التاليتين لوضع مربع نص Text Box على النموذج:
· انقر نقراً مزدوجاً على رمز مربع النص Text Box ضمن إطار مربع الأدوات.
· انقل وغير حجم مربع النص حتى يظهر كما في الشكل 1-22.
الشكل 1-21 رمز أداة مربع النص Text Box في إطار مربع الأدوات.
الشكل 1-22 النموذج بعد وضع مربع نص بداخله.
تبديل خصائص مربع النص
اتبع الخطوات التالية لتعديل بعض خصائص مربع النص:
· غيّر الخاصية Name لمربع النص من الاسم الافتراضي Text1 إلى txtDisplay.
خاصية Text الافتراضية لمربع النص هي Text1، وبالتالي فعند تنفيذ برنامج الترحيب يظهر النص Text1 ضمن مربع النص. نرغب أن يكون هذا المربع خالياً عند بدء تشغيل البرنامج، لهذا، احذف النص الذي يظهر في الخلية الواقعة يمين الخاصية Text للكائن txtDisplay.
· غيّر الخاصية Font لمربع النص txtDisplay إلى System واجعل حجم الخط مساوياً إلى 10.
تساوي القيمة الافتراضية للخاصية Alignment لمربع النص إلى 0-LeftJustify مما يعني أن النص في مربع النص يبدأ من اليسار. غيّر هذه الخاصية إلى 2-Center لأننا نريد للنص الظهور في وسط مربع النص.
يرفض فيجول بيسك وضع النص في مركز مربع النص Text Box، ما لم يتم إسناد القيمة True إلى الخاصية MultiLine لمربع النص. لهذا يجب تغيير الخاصية MultiLine إلى True إلى جانب تغيير الخاصية Alignment إلى 2-Center. (يؤدي إسناد القيمة True إلى الخاصية MultiLine إلى تمكين فيجول بيسك من إظهار أكثر من سطر واحد من مربع النص). إذاً بدّل الخاصية MultiLine لمربع النص txtDisplay إلى True.
احفظ العمل:
· اختر Save Project من القائمة File لفيجول بيسك.
ملاحظة
حسب ما ذكرنا سابقاً، من الهام جداً حفظ العمل المنجز من وقت لآخر. طريقة أولى لحفظ العمل تتمثل باختيار Save Project من القائمة File لفيجول بيسك. لكن هنالك طريقة أسهل بكثير لحفظ العمل. ألقِ نظرة على الشكل 1-23، يظهر هذا الشكل شريط أدوات لغة فيجول بيسك. (إذا لم يكن شريط الأدوات ظاهراً، اذهب إلى القائمة View واختر Toolbars ثم انقر على العنصر Standard الذي يظهر في القائمة المنبثقة). نعود إلى الشكل 1-23. يوجد على شريط الأدوات رمز يظهر كقرص مرن، إذا وضعت مؤشر الفأرة (دون النقر على أحد أزرارها) فوق هذا الرمز، يظهر مستطيل أصفر يحمل الرسالة Save Project من القائمة File. أجل، لقد سهل مصممو فيجول بيسك كثيراً عملية حفظ المشروع، فنقرة واحدة من وقت لآخر تضمن لك السلامة.
هناك طريقة سريعة أخرى لحفظ آخر التعديلات التي أجريتها على النموذج النشط الحالي، اضغط فقط المفتاحين Ctrl+S سوياً، ليحفظ فيجول بيسك تعديلات النموذج الحالي فقط، وليس كامل ملفات المشروع.
الشكل 1-23 الرمز Save Project الواقع ضمن شريط أدوات لغة فيجول بيسك.
عملية بناء النماذج انطلاقاً من الرسوم التوضيحية والجداول
انتهى جزء التصميم المرئي الآن.
سنطالبك في كتابنا هذا ببناء عدد هائل من النماذج. لكن لن نستمر بهذه الطريقة في بناء النماذج، أي لن نبني النموذج خطوة بخطوة، بل سنـزودك بشكل النموذج المكتمل (كما في الشكل 1-1)، كما سنعطيك جدولاً يدعى جدول خصائص النموذج. يحوي جدول خصائص النموذج كل الكائنات المحتواة في النموذج ويستعرض كل الخصائص التي تختلف عن الخصائص الافتراضية لهذه الكائنات.
عملك هو اللحاق بالجدول، سطراً سطراً وتغيير قيم الخصائص إلى القيم التي تظهر في الجدول. الجدول 1-1 هو جدول خصائص النموذج frmHello الذي أنهينا بناءه للتو.
الجدول 1-1. جدول خصائص النموذج frmHello.
الكائن الخاصية القيمة
Form Name FrmHello
BackColor Blue
Caption برنامج الترحيب
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
FontName System
FontSize 10
RightToLeft True
CommandButton Name cmdClear
Caption &مسح
FontName System
FontSize 10
RightToLeft True
CommandButton Name cmdHello
Caption إ&ظهار الترحيب
FontName System
FontSize 10
RightToLeft True
TextBox Name txtDisplay
Alignment 2-Center
FontName System
FontSize 10
MultiLine True
RightToLeft True
ربط الكائنات بنصوص برمجية
باعتبار أننا وضعنا الكائنات في النموذج وحددنا خصائصها، فقد انتهى جزء التصميم المرئي (البرمجة المرئية Visual Programming).
الآن، حان الوقت لكتابة النصوص البرمجية لهذه الكائنات.
تعتبر لغة فيجول بيسك لغة مقادة بالأحداث event-driven programming language. هذا يعني أن نص البرنامج ينفذ استجابة لحادثة ما. فمثلاً يؤدي نقر الزر خروج أثناء تنفيذ برنامج الترحيب إلى توليد الحادثة Click آلياً، وبالتالي ينفذ نص البرنامج المرافق لحادثة نقر الزر خروج آلياً أيضاً.
كذلك، تتولد الحادثة Click (حادثة النقر) أيضاً عند نقر الزر إظهار الترحيب، وينفذ نص البرنامج المرافق لحادثة نقر هذا الزر آلياً.
عملك هو كتابة النص المناسب وربطه بالكائن والحادثة. هل يبدو هذا الأمر معقداً؟ بالواقع إنه سهل جداً!، إذاً لنبدأ بربط بعض النص البرمجي بالحادثة Click للزر خروج.
ربط الزر خروج بنص برمجي
اتبع الخطوات التالية لربط نص برمجي بالزر cmdExit:
· انقر نقراً مزدوجاً على الزر cmdExit.
يستجيب فيجول بيسك بإظهار إطار نص البرنامج (سنكتب برنامجاً في هذا الإطار) المبين في الشكل 1-24.
الشكل 1-24 ربط الزر خروج بنص البرنامج المرافق، في إطار نص البرنامج Code Window.
يُسهّل فيجول بيسك إلى حد كبير التعرف على النص الظاهر حالياً في إطار نص البرنامج.
فكما يتبين من الشكل 1-24، يُظهر مربع السرد اليساري اسم الكائن cmdExit، ويُظهر مربع السرد اليميني اسم الحادثة Click.
كما يظهر من الشكل 1-24 أيضاً، فقد أضاف فيجول بيسك مسبقاً سطري نص يمثلان بداية ونهاية الإجراء الخاص بالكائن المحدد والحادثة المختارة، في إطار نص البرنامج:
Private Sub cmdExit_Click()

End Sub
سنكتب الآن نص البرنامج ضمن هذين السطرين.
السطران الأول والأخير من نص البرنامج
السطر الأول من النص (الذي كتبه عنك فيجول بيسك) يبدأ بالكلمتين Private Sub.
الكلمة Sub عبارة عن كلمة محجوزة في لغة فيجول بيسك، تدل على أن الإجراء Procedure يبدأ من هنا.
والإجراء Procedure عبارة عن نص برنامج مكرس لحادثة خاصة. اسم الإجراء في مثالنا هو cmdExit_Click().
السطر الأخير من النص، كُتب أيضاً من قبل لغة فيجول بيسك. وتشير العبارة End Sub لنهاية الإجراء.
اسم الإجراء
اسم الإجراء هو cmdExit_Click(). ما السبب الذي دفع فيجول بيسك إلى تعيين اسم الإجراء بنفسه؟. تسبب النقر المزدوج على الزر cmdExitبمعرفة فيجول بيسك أنك تحاول ربط ذلك الزر بنص برمجي، وبذلك حدد القسم الأول من اسم الإجراء وهو cmdExit.
يمثل القسم الثاني من اسم الإجراء نوع الحادثة الناجمة (الحادثة Click).
أيضاً ما الذي جعل فيجول بيسك يحدد هذا الاسم (Click) ؟!.
السبب طبعاً أنها تُمثل الحادثة التي ترغب بكتابة برنامج لها.
لاحظ أن القسمين الأول والثاني من اسم الإجراء يُفصلان عن بعضهما برمز الخط التحتي ( _ )، وبذلك يصبح اسم الإجراء كالتالي: cmdExit_Click().
ولاحظ أيضاً أن آخر رمزين في اسم الإجراء هما القوسين ().
نص برنامج الإجراء cmdExit_Click()
ما هو نص البرنامج الذي يتوجب عليك كتابته في الإجراء cmdExit_Click()؟. باعتبار أن هذا الإجراء يُنفذ عند نقر الزر خروج (إنهاء البرنامج)، فالنص الواجب عليك كتابته ضمن هذا الإجراء يجب أن يتسبب بإنهاء البرنامج. تُستخدم العبارة End لإنهاء البرنامج، وبالتالي فنص البرنامج اللازم كتابته ما هو إلا العبارة End فحسب.
· اكتب End في الإجراء cmdExit_Click(). يُفترض أن يبدو الإجراء بعد كتابة هذه العبارة بالشكل التالي:
Private Sub cmdExit_Click()
End
End Sub
هذا كل ما في الأمر، لقد انتهيت للتو من ربط الإجراءcmdExit_Click() بنص البرنامج المناسب.
تنفيذ برنامج الترحيب
رغم أنك لم تنته بعد من ربط باقي الكائنات بنصوصها البرمجية، لكن هذا لا يمنع من تنفيذ برنامج الترحيب ورؤية كيف يعمل نص البرنامج الذي ربطناه بالزر خروج.
· احفظ المشروع باختيار Save Project من القائمة File، أو انقر رمز
· Save Project (رمز القرص المرن) على شريط أدوات فيجول بيسك.
· اختر Start من القائمة Run لفيجول بيسك.
يستجيب فيجول بيسك بتنفيذ البرنامج. يظهر إطار هذا البرنامج بشكل يماثل ذلك المبين في الشكل 1-1.
تستطيع النقر على الزر إظهار الترحيب أو على الزر مسح، لكن لن يحدث شيء، والسبب طبعاً أننا لم نربط بعد هذين الزرين بأي نص برمجي.
· انقر الآن الزر خروج، فينفذ الإجراء cmdExit_Click() استجابة لحادثة النقر، وباعتبار أن نص هذا الإجراء يحوي العبارة End، فسيؤدي تنفيذه إلى إنهاء عمل برنامج الترحيب.
إضافة المزيد إلى نص الإجراء cmdExit_Click()
اتبع الخطوات التالية لربط الإجراء cmdExit_Click() بالمزيد من النص البرمجي:
· انقر نقراً مزدوجاً على الزر cmdExit_Click().
يستجيب فيجول بيسك بإظهار cmdExit_Click() جاهزاً للتعديل من قبلك.
· أضف العبارة Beep قبل العبارة End كما يلي:
Private Sub cmdExit_Click()
Beep
End
End Sub
· احفظ العمل المنجز.
· نفّذ برنامج الترحيب باختيار Start من القائمة Run لفيجول بيسك.
تتسبب العبارة Beep بإصدار رنين (صافرة) من قبل الحاسب الشخصي. وبالتالي يؤدي نقر الزر خروج إلى إصدار صوت صافرة، ثم إنهاء برنامج الترحيب.
· انقر الزر خروج وتحقق من أن البرنامج أصدر رنيناً، ثم أنهى نفسه.
ربط الزر إظهار الترحيب بنص البرنامج المناسب
اتبع الخطوات التالية لربط الزر إظهار الترحيب بنص برنامج:
· أظهر النموذج، ثم انقر نقراً مزدوجاً على الزر إظهار الترحيب، (افترضنا أنك ستُظهر النموذج باختيار Project Explorer من القائمة View، ثم نقر البند frmHello في إطار المشروع Project، ثم نقر الرمز View Object الذي يظهر كثاني رمز على اليسار عند قمة إطار المشروع).
يستجيب فيجول بيسك بعد النقر المزدوج على الزر إظهار الترحيب بإظهار الإجراء cmdHelloDisplay_Click() مع سطري البرنامج التاليين:
Private Sub cmdHelloDisplay_Click()
End Sub
يُنفذ الإجراء السابق عند نقر الزر إظهار الترحيب أثناء تنفيذ برنامج الترحيب.
يا ترى ما هو نص البرنامج الواجب ربطه بهذا الإجراء؟ يعتمد هذا على ما سيحصل عند نقر الزر إظهار الترحيب.
ففي مثالنا هذا يُطلب من برنامج الترحيب إظهار رسالة الترحيب مرحباً بكم في مربع النص.
· أدخل النص التالي ضمن الإجراء cmdExit_Click():
txtDisplay.Text = "مرحباً بكم"
يفترض أن يبدو الإجراء كما يلي عند الانتهاء:
Private Sub cmdHelloDisplay_Click()
txtDisplay.Text = "مرحباً بكم"
End Sub
يمثل txtDisplay اسم الكائن Text Box (مربع النص الذي سيُظهر الكلمتين مرحباً بكم داخله).
تسند العبارة التالية:
txtDisplay.Text = "مرحباً بكم"
القيمة مرحباً بكم إلى الخاصية Text لمربع النص txtDisplay. (تمثل قيمة الخاصية Text النص الذي سيظهر في مربع النص txtDisplay).
ملاحظة
يُمكن استخدام الصيغة التالية لإسناد قيمة جديدة إلى خاصية ما، ضمن نص برنامج:
ObjectName.Property = قيمة جديدة
فمثلاً، لتبديل الخاصية Text لمربع النص txtDisplay إلى القيمة مرحباً بكم استخدم العبارة التالية:
txtDisplay.Text = "مرحباً بكم"
انتبه لكتابة النقطة (.) بين اسم الكائن txtDisplay واسم الخاصية Text وبدون فراغات بينهما.
ربط الزر مسح بنص برنامج مناسب
اتبع الخطوات التالية لربط الزر مسح بنص برنامج الحادثة Click:
· أظهر النموذج، وانقر نقراً مزدوجاً على الزر مسح.
يستجيب فيجول بيسك للنقر المزدوج على الزر مسح، بإظهار إطار نص البرنامج Code Window عند الإجراء cmdClear_Click() وجاهزاً للتعديل.
يفترض أن يقوم هذا الإجراء بمسح محتويات مربع النص. أي بمعنى آخر يجب تحويل قيمة الخاصية Text لمربع النص، إلى سلسلة صفرية (فراغ "")، يمكن إنجاز ذلك بإضافة العبارة التالية إلى الإجراء cmdClear_Click():
txtDisplay.Text = ""
· اكتب العبارة التالية في الإجراء cmdClear_Click():
txtDisplay.Text = ""
يُفترض أن يبدو الإجراء لدى اكتماله كما يلي:
Private Sub cmdClear_Click()
txtDisplay.Text = ""
End Sub
· احفظ العمل المنجز باختيار Save Project من القائمة File لفيجول بيسك (أو انقر على رمز القرص المرن على شريط أدوات لغة فيجول بيسك).
تنفيذ برنامج الترحيب مرة ثانية
اكتمل برنامج الترحيب الآن. اتبع الخطوات التالية لتنفيذه:
· اختر Start من القائمة Run لفيجول بيسك أو اضغط المفتاح F5 لبدء البرنامج.
ملاحظة
إحدى الأسباب الرئيسية التي تجعل فيجول بيسك بهذا الشيوع حقيقة، أنك تستطيع تطوير برنامجك قليلاً ثم تنفيذه ورؤية نتائج عملية التطوير على أرض الواقع، ثم متابعة تطوير البرنامج بعض الشيء وتشغيل التطبيق لاختيار عملية التطوير . . . وهكذا دواليك.
ذكرنا، أنك تستطيع تنفيذ التطبيق المكتوب بلغة فيجول بيسك باختيار Start من القائمة Run لفيجول بيسك.
كما تلاحظ، تتطلب عملية تطوير التطبيق تكرار تنفيذه كثيراً، ولذلك راعى مصممو اللغة هذا الجانب، فوضعوا رمز التنفيذ على شريط أدوات لغة فيجول بيسك ويدعى هذا الرمز Start (انظر الشكل 1-25). ويكفي نقر الرمز Start على شريط الأدوات لتنفيذ التطبيق الراهن.
إذا كان شريط الأدوات غير ظاهر على سطح مكتب فيجول بيسك لسبب ما، اختر Toolbars من القائمة View لفيجول بيسك ثم اختر Standard من القائمة التي تظهر.
إذاً، تعتبر ميزة تنفيذ البرامج أثناء عملية التطوير، أمراً بالغ الأهمية، ففي لغات البرمجة الأخرى مثل Visual C++، يتوجب أولاً ترجمة ثم ربط البرنامج (Compile ثم Link) قبل التمكن من تنفيذه. وهذه العملية تأخذ وقتاً طويلاً نوعاً ما. يُسهل فيجول بيسك عملية تنفيذ التطبيق الذي يجري تطويره إلى حد بعيد، لكن قد يظهر خطأ ما في البرنامج ويتسبب بانهيار النظام كاملاً، مما يُجبرك على إعادة تشغيل Windows أو فيجول بيسك مرة أخرى. يعني هذا أن عدم حفظ العمل قد يتسبب بضياعه وسنضطر إلى بدء عملية التطوير من جديد.
لهذا كن حكيماً، واجعل عملية حفظ العمل قبل تنفيذه قانوناً تسير عليه. والأمر جداً بسيط، فكما ذكرنا يقع رمز حفظ المشروع Save Project على شريط الأدوات. ويكفي نقره لحفظ العمل عند المرحلة الراهنة. لهذا انقر أولاً على الرمز

Save Project ثم انقر بعد ذلك الرمز Start (انظر الشكل 1-25) لتنفيذ التطبيق. وبهذه الطريقة، فإن وقوع خطأ ما أثناء تنفيذ البرنامج، لن يتسبب بضياع المشروع أو العمل، وتستطيع إعادة تشغيل فيجول بيسك مجدداً، وفتح المشروع المخزن وتصحيح الخطأ ومعاودة تنفيذ التطبيق.

الشكل 1-25 رمز التنفيذ على شريط أدوات فيجول بيسك.
· انقر الزر إظهار الترحيب وأيضاً الزر مسح لإظهار ثم مسح الرسالة مرحباً بكم، في مربع النص. يجب أن يظهر إطار برنامج الترحيب كما في الشكل 1-2، بعد
· نقر الزر إظهار الترحيب. بينما سيظهر كما في الشكل 1-1 عند نقر الزر مسح.
· تستطيع استخدام المفاتيح ظAlt+ و سAlt+ للحصول على نفس الاستجابة عند نقر الزر إظهار الترحيب وعند نقر الزر مسح. (طبعاً، بسبب وجود خط تحت الحرف ظ في عنوان الزر إظهار الترحيب، وخط تحت الحرف س في عنوان الزر مسح).
· يمكن إنهاء البرنامج بنقر الزر خروج، أو بضغط المفتاحين خAlt+ على لوحة المفاتيح.
أحداث أخرى
يستخدم برنامج الترحيب الحادثة Click لأزرار الأوامر، (فمثلاً، تقع الحادثة Click لزر الأمر cmdExit عند نقر الزر خروج مما يتسبب بالتنفيذ الآلي للإجراء cmdExit_Click(). هنالك حوادث أخرى يمكن استخدامها في البرنامج. وكل حادثة تمتلك بدورها إجراءها الخاص.
الحادثة KeyDown
سنتعرف على الإجراء الذي يرافق الحادثة KeyDown، والتي تحصل عند ضغط مفتاح ما على لوحة المفاتيح.
· اتبع الخطوات التالية لرؤية الإجراء KeyDown للزر خروج.
· انقر نقراً مزدوجاً على الزر خروج.
يظهر فيجول بيسك في الحالة الافتراضية الإجراء المرافق للحادثة Click.
· باعتبار أننا لا نريد تعديل الإجراء المرافق للحادثة Click وإنما نريد تعديل إجراء الحادثة KeyDown، لهذا انقر على مربع السرد الذي يظهر في الجانب الأيمن عند قمة إطار النص.
يستجيب فيجول بيسك بسرد لائحة تحوي كل الحوادث المتاحة للكائن المدعو cmdExit (انظر الشكل 1-26).
· اختر البند KeyDown من اللائحة.
يستجيب فيجول بيسك بإظهار الإجراء cmdExit_KeyDown():
Private Sub cmdExit_KeyDown(KeyCode AS Integer,Shift As Integer)

End Sub
الشكل 1-26 إظهار الحوادث المتاحة للزر cmdExit.
لاحظ أن السطر الأول من الإجراء والذي يكتبه فيجول بيسك آلياً، يختلف قليلاً عن السطر الأول للحادثة Click فقوسي الإجراء cmdExit_Click()، لا يحويان شيئاً داخلهما. أما قوسي الإجراء cmdExit_ KeyDown() فيحويان قدراً من النص البرمجي. سنتعرف خلال الفصول القادمة على هذا الاختلاف بشكل أوضح.
أما عند هذه النقطة، فلا تُضف شيئاً إلى الإجراء cmdExit_ KeyDown() (مضينا في هذا المثال، لمجرد إطلاعك على أشكال أخرى من الحوادث التي ترافق كائن ما في فيجول بيسك).
إنشاء الملف التنفيذي للمشروع (Hello.exe)
نفذنا سابقاً برنامج الترحيب باختيار Start من القائمة Run. طبعاً يختلف الأمر عند الانتقال إلى الواقع العملي، فلا أحد يرضى أن يُشغل التطبيق الذي بحوزته بهذه الطريقة، بل قد لا يملك المستخدم الذي اقتنى التطبيق، لغة فيجول بيسك أصلاً.
يجب أن تكون قادراً إذاً على تحويل البرنامج إلى ملف تنفيذي، حتى نتمكن من توزيع التطبيق الذي طورناه.
فمثلاً يجب تحويل برنامج الترحيب إلى ملف تنفيذي Hello.exe:
· اختر Make Hello.exe File من القائمة File لفيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الحوار Make. (لا تنقر الزر OK في مربع الحوار في هذه اللحظة).
· استخدم مربع الحوار لحفظ الملف Hello.exe في الدليل C:\VB5Prg\Ch01.
· انقر الزر OK الآن.
يستجيب فيجول بيسك بحفظ الملف Hello.EXE في الدليل C:\VB5Prg\Ch01.
تستطيع الآن تنفيذ Hello.exe كأي برنامج آخر في Windows!، تستطيع مثلاً استخدام مستكشف Windows ثم النقر المزدوج على الملف Hello.exe.
ملف تنفيذي EXE صغير الحجم
ألقِ نظرة على الملف Hello.exe الموجود حالياً ضمن الدليل C:\VB5Prg\Ch01. كيف يتمكن ملف بحجم 8 كيلو بايت فقط من إنجاز كل الأشياء التي يستطيع Hello.exe إنجازها؟.
فكر بالأمر، ينجز البرنامج Hello.exe أموراً كثيرة، فيمكنك نقر الأزرار الثلاثة، ويسمح مثلاً بسحب إطار البرنامج، يمتلك البرنامج أيضاً مربع نص داخله، بمعنى آخر، يمتلك هذا البرنامج الصغير كل معالم البرامج القياسية في Windows. والسبب وراء صغر حجم الملف التنفيذي Hello.exe، أن البرنامج يفترض وجود الملف Msvbvm50.DLL في الدليل System. والدليل System موجود طبعاً ضمن دليل Windows.
فمثلاً ترى الدليل C:\Windows\System إذا كان نظام التشغيل المستخدم هو Windows95 أو في الدليل C:\WinNT\System32 عندما يكون نظام التشغيل المستخدم هو Windows NT. المهم بغض النظر عن نظام التشغيل المستخدم يحتاج البرنامج Hello.exe أن يكون الملف Msvbvm50.DLL موجوداً ضمن دليل النظام System حتى يعمل. تستطيع العودة إلى ذلك الدليل والتأكد من وجود الملف المذكور. لقد تم تثبيت هذا الملف عند تثبيت فيجول بيسك 5 على قرصك الصلب.
حجم الملف Msvbvm50.DLL يساوي 1.3 ميجا بايت تقريباً، طبعاً يعتبر كبيراً، لكن حال توفر هذا الملف يصبح بوسع المستخدمين تنفيذ برامج بالغة القوة كتبت بلغة فيجول بيسك 5.
النبأ السار أن هذه البرامج القوية صغيرة الحجم جداً. تستطيع أيضاً رؤية الملف Hello.vbw في الدليل الذي حفظنا فيه الملف Hello.exe. الملف Hello.vbw يستخدم من قبل فيجول بيسك، ولا يتوجب عليك تزويد المستخدمين بهذا الملف.
ملاحظة
يتوجب عليك تزويد البرامج التي توزعها بملفات DLL اللازمة لها. فمثلاً يجب أن يكون الملف Msvbvm50.DLL موجوداً ضمن الدليل System على الحاسب الذي ستنفذ فيه البرامج المطورة بلغة V.B.5.
الخلاصة
كتبنا في هذا الفصل أول برنامج لك بلغة Visual Basic فتعلمت الخطوتين اللازمتين لكتابة البرنامج، وهما خطوة البرمجة المرئية Visual Programming Step وخطوة كتابة نص البرنامج Code Programming Step. يضع المبرمج الكائنات Objects في النموذج ويسند خصائصها بالقيم المناسبة أثناء خطوة البرمجة المرئية.
أما فى خطة كتابة النص Code Programming، فيتم انتقال الإجراء المرافق لكائن ما باختيار الكائن والحادثة ثم يكتب نص البرنامج المناسب فى الإجراء. ينفذ جزء البرنامج المكتوب هذا زمن التنفيذ عند وقوع الحادثة.


الفصل الثاني
الخصائص وعناصر التحكم والكائنات



يركز هذا الفصل على عناصر تحكم لغة فيجول بيسك، مثل شريطي التمرير الأفقي والعمودي Scroll Bar، ومربعات النص Text Boxes، وأزرار الخيارات Option Button، وأزرار الأوامر Command Button. ستتعلم من هذا الفصل كيف تضع هذه العناصر داخل برامجك، وكيفية تغيير خصائصها، وكيفية ربط النصوص البرمجية بها، (أي ربطها ببرامج متعلقة بها).
تُقدم معظم البرامج، معلومات إلى المستخدم، وتتلقى منه معلومات أيضاً. تُدعى عملية تبادل المعلومات بين التطبيق وبين المستخدم، بواجهة المستخدم User Interface. تَستخدم جميع برامج الويندوز، عناصر التحكم Controls، لتزويد المستخدم بواجهة سهلة ومفهومة (هذا من أهم أسباب شيوع النظام ويندوز). يوضح هذا الفصل مدى سهولة بناء واجهة استخدام جذابة في لغة فيجول بيسك.
عنصر تحكم شريط التمرير
يستخدم شريط التمرير Scroll Bar بكثرة في برامج ويندوز. يمكّنك استخدام هذا العنصر، من اختيار قيمة معينة، بوضع مؤشّر شريط التمرير عند موقع محدد منه، بدلاً من كتابة القيمة.
ملاحظة
أطلقنا على شريط التمرير في الفصل الأول كلمة كائن Object، لكن اعتباراً من هذا الفصل سنشير إليه بمصطلح عنصر تحكم Control.
في معظم الأحوال، يعتبر الكائن هو نفسه عنصر تحكم، لكن ليس دائماً، فالنموذج Form هو كائن، لكنه ليس عنصر تحكم. نستطيع استخدام كلمة كائن للدلالة على عنصر تحكم، إذا كان هذا العنصر سيوضع في نموذج.
برنامج السرعة
يوضح برنامج السرعة، كيفية استخدام شريط التمرير للحصول على قيمة معينة من المستخدم.
يُفترض في برنامج السرعة إنجاز ما يلي:
يظهر الإطار المبين في الشكل 2-1 عند بدء تشغيل برنامج السرعة، يُفترض أن يوضع مؤشّر شريط التمرير عند مركز شريط التمرير (الموقع الافتراضي)، وأن تظهر الرسالة "50 كم / ساعة" (قيمة السرعة) ضمن مربع النص.
الشكل 2-1 نافذة برنامج السرعة.
ينبغي على مربع النص، إظهار التغير في السرعة عند تغيير موضع مؤشّر شريط التمرير. فمثلاً يجب إظهار القيمة صفر عندما يوضع المؤشّر عند أقصى اليمين، أما عند وضعه عند أقصى اليسار فيجب إظهار القيمة 100.
يؤدي نقر الزر خروج لإنهاء البرنامج.
التمثيل المرئي لبرنامج السرعة
يَستخدم برنامج السرعة عنصر تحكم شريط التمرير الأفقي. يبين الشكل 2-2 شكل عنصر التحكم هذا. طبعاً يختلف موضع هذا العنصر ضمن مربع الأدوات Toolbox تبعاً لاختلاف إصدار لغة فيجول بيسك المستخدم. ويؤدي وضع مؤشّر الفأرة فوق رمز شريط التمرير الأفقي، دون النقر عليه إلى ظهور مستطيل أصفر يحمل الرسالة HscrollBar داخله.
بهذه الطريقة، تتمكن من التحقق من وجود رمز شريط التمرير الأفقي في إطار مربع الأدوات.
نفّذ فيجول بيسك، ثم انقر الزر إلغاء الأمر في الإطار New Project في حال ظهوره لإغلاق هذا الإطار، ثم اختر البند New Project من قائمة File للغة فيجول بيسك.
يستجيب فيجول بيسك بإظهار الإطار New Project.
اختر الرمز Standard EXE من ضمن الإطار New Project، ثم انقر الزر موافق.
يستجيب فيجول بيسك بإنشاء مشروع جديد.
الشكل 2-2 رمز شريط التمرير الأفقي داخل إطار مربع الأدوات.
سنحفظ الآن المشروع الجديد الذي أنشأناه:
أنشئ الدليل C:\VB5Prg\Ch02.
تحقق من اختيار النموذج Form1، ثم اختر البند Save Form1 As من قائمة File.
يستجيب فيجول بيسك بإظهار مربع الحوار Save File As.
استخدم مربع الحوار Save File As لحفظ النموذج باسم Speed.Frm في الدليل C:\VB5Prg\Ch02 واختر البند Save Project As من قائمة File، ثم استخدم مربع الحوار Save Project As لحفظ المشروع باسم Speed.vbp في الدليل نفسه.
عدّل النموذج Form1 طبقاً للجدول 2-1.
يُفترض أن يبدو النموذج لدى اكتماله، كما في الشكل 2-3.
الشكل 2-3 النموذج frmSpeed في طور التصميم.

الجدول 2-1. جدول خصائص النموذج frmSpeed.
الكائن الخاصية القيمة
Form Name FrmSpeed
BackColor Light gray
Caption برنامج السرعة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Horizontal Scroll Bar Name hsbSpeed
Min 0
Max 100
RightToLeft True
TextBox Name txtSpeed
Alignment 2-Center
Font (اختر ما شئت)
BackColor Red
ForeColor White
Text 50 كم / ساعة
MultiLine True
RightToLeft True
ذكرنا في الفصل الأول، أن النقر المزدوج على رمز عنصر التحكم ضمن مربع الأدوات، يؤدي إلى وضع عنصر التحكم ذاك، ضمن النموذج الحالي.
يستجيب فيجول بيسك بوضع عنصر التحكم في وسط النموذج الحالي. تستطيع بعد ذلك نقله إلى مكان آخر عن طريق سحبه بمؤشّر الفأرة. كما تستطيع تكبيره أو تصغيره بسحب المقابض التي تظهر حوله.
للولوج إلى خصائص عنصر التحكم، تأكد من اختيار هذا العنصر على النموذج (أي توضّع المقابض حوله)، ثم اختر البند Properties Windows من قائمة View. أو تستطيع بدلاً من ذلك، النقر بالزر الأيمن للفأرة على العنصر، ثم اختيار البند Properties من القائمة الفرعية السريعة التي ظهرت.
يستجيب فيجول بيسك بإظهار إطار الخصائص Properties لعنصر التحكم المختار. تستطيع الآن تغيير خصائص هذا العنصر.
احفظ المشروع باختيار البند Save Project من قائمة File التابعة لفيجول بيسك.
كتابة نص برنامج السرعة
سنكتب الآن نص برنامج السرعة:
اكتب النص التالي ضمن الإجراء cmdExit_Cilck() التابع للنموذج frmSpeed:
Private Sub cmdExit_Click()
End
End Sub
يُنفذ نص البرنامج السابق آلياً، عند نقر الزر خروج، ويُنهي تنفيذ برنامج السرعة.
ملاحظة
لإدخال نص البرنامج للزر خروج، انقر نقراً مزدوجاً على الزر خروج في مرحلة التصميم، فيظهر إطار البرنامج للإجراء cmdExit_Cilck(). ويكون هذا الإجراء جاهزاً للتعديل من قبل المستخدم.
تأكد أن مربع السرد الواقع في الزاوية العليا اليسارية، من إطار البرنامج يحوي البند cmdExit، وأن المربع المجاور له يحوي البند Click.
احفظ المشروع باختيار البند Save Project من قائمة File التابعة لفيجول بيسك.
تنفيذ برنامج السرعة
لم ننته بعد من كتابة نصوص برنامج السرعة، لكن رغم ذلك، سننفذ برنامج السرعة لرؤية نتائج ما أنجزناه حتى الآن.
نفّذ برنامج السرعة (ضغط مفتاح F5 أو اختيار البند Start من قائمة Run).
يظهر إطار برنامج السرعة كما هو مبين في الشكل 2-4.
الشكل 2-4 إطار برنامج السرعة.
غيّر موضع مؤشّر شريط التمرير بواسطة الفأرة.
كما تلاحظ، لا يظهر أي شيء ضمن مربع النص، والسبب في ذلك طبعاً، هو أننا لم نكتب نص البرنامج اللازم لإظهار القيم الموافقة لتغيير مؤشّر شريط التمرير.
انقر الزر خروج لإنهاء البرنامج.
الخصائص Min و Max و Value لشريط التمرير
تشرح الفقرات التالية بعض خصائص شريط التمرير:
الخاصيتان Min و Max
يمثّل شريط التمرير مجموعة من القيم. تحدد الخاصية Min القيمة الدنيا، وتحدد الخاصية Max القيمة العليا. مثلاً، تأخذ الخاصية Min في الجدول 2-1 القيمة صفر، وتأخذ الخاصية Max القيمة 100، وهذا يعني أن شريط التمرير يمكن أن يعطي أية قيمة بين الصفر و 100.
الخاصية Value
تمثل الخاصية Value التابعة لشريط التمرير، القيمة الراهنة لهذا الشريط، وبالتالي فقد تكون أية قيمة صحيحة بين الرقم صفر والرقم 100 حسب مثالنا هذا. لم نعط الخاصية Value قيمة معينة أثناء مرحلة التصميم، وبالتالي ستستخدم القيمة الافتراضية (القيمة صفر) لهذه الخاصية، وعند تنفيذ البرنامج، يوضع مؤشّر شريط التمرير عند الموضع المرافق للخاصية Value (أي عند أقصى يمين شريط التمرير، وهو الموضع المرافق للقيمة صفر للخاصية Value).
الآن، وباعتبار أن السرعة الافتراضية يجب أن تكون 50، لهذا يجب إسناد القيمة 50 للخاصية Value التابعة لشريط التمرير:
أسند القيمة 50 للخاصية Value.
الآن، ستجد عند تنفيذ البرنامج، أن الموضع الافتراضي لمؤشّر شريط التمرير سيكون في وسطه (أي منتصف المسافة بين صفر و 100).
لاحظ أن الجدول 2-1 يطالبك بإسناد القيمة "50 كم / الساعة" للخاصية Text التابعة لمربع النص. فعند تشغيل البرنامج، ستجد أن مربع النص يُظهر القيمة الابتدائية "50 كم / الساعة" والمشابهة للموضع الراهن لمؤشّر شريط التمرير (Value = 50).
تركيز Focus لوحة المفاتيح
تستطيع ضغط المفتاح Tab من على لوحة المفاتيح، أثناء عمل البرنامج، لنقل التركيز من عنصر تحكم إلى آخر. وتستطيع تمييز عنصر التحكم الذي يمتلك التركيز بسهولة، لأن ويندوز يعطي دلالة على ذلك، (توضّع الإضاءة عنده، أو يظهر حول عنوانه مستطيل منقط .. الخ).
فمثلاً، يظهر مؤشّر وامض في مربع النص، إذا كان التركيز موضوعاً عنده، بينما يومض مؤشّر شريط التمرير عندما يكون التركيز موضوعاً عنده. كما يظهر مستطيل منقط حول عنوان الزر خروج (مثلاً) إذا كان هذا الزر يمتلك التركيز، وهكذا.
ما المقصود بأن عنصر تحكم ما، يمتلك التركيز ؟!. المقصود من ذلك، هو أنك تستطيع استخدام لوحة المفاتيح للتحكم به عند امتلاكه للتركيز. جرب مثلاً ما يلي لرؤية ظاهرة تركيز لوحة المفاتيح على أرض الواقع:
نفّذ برنامج السرعة. (لاحظ أن مؤشّر شريط التمرير يتوضع في الوسط وهذا طبعاً بسبب إسناد القيمة 50 للخاصية Value التابعة لشريط التمرير).
اضغط المفتاح Tab في لوحة المفاتيح، إلى أن يصل التركيز إلى شريط التمرير، (ستجد أن مؤشّر شريط التمرير يُومض).
يمتلك شريط التمرير الآن التركيز، استخدم مفتاحي الأسهم اليميني واليساري على لوحة المفاتيح لتحريك مؤشّر شريط التمرير. باعتبار أن شريط التمرير يمتلك تركيز لوحة المفاتيح فإن الضغط على مفتاحي الأسهم على لوحة المفاتيح يكافئ نقر زري السهمين اليساري واليميني لشريط التمرير. جرب ضغط المفاتيح Home و End و PgUp و PgDn وراقب النتائج.
اضغط المفتاح Tab حتى يصل التركيز إلى الزر خروج، ثم اضغط مفتاح Space أو مفتاح Enter. وهذا يكافئ نقر الزر خروج لإنهاء البرنامج.
لاحظ كم من العمليات تستطيع إنجازها بواسطة برنامج السرعة!. تستطيع تبديل موضع مؤشّر شريط التمرير، وتكبير أو تصغير إطار البرنامج (بسحب حواف الإطار)، ونقل إطار البرنامج بسحب شريط عنوانه، وإنجاز الكثير من مهام ويندوز القياسية الأخرى. الجميل في الموضوع، أنه لا يلزم كتابة أي نص برمجي لإنجاز ذلك. بل لعل ذلك من أهم محاسن كتابة برامج تحت بنية ويندوز.
فالمعالم القياسية لويندوز تكون مبرمجة أصلاً في برامجك، ولست بحاجة كمستخدم ويندوز (أو مستخدم لبرامجك)، الإلمام بكل المظاهر القياسية لويندوز حتى تتمكن من العمل بكفاءة وفق هذه البنية.
تحسين برنامج السرعة
سنحسّن برنامج السرعة الآن:
انقر نقرة مزدوجة على عنصر تحكم شريط التمرير ضمن النموذج لإظهار الإجراء hsbSpeed_Change(). تحقق بأنّ مربع السرد في الزاوية اليسرى العليا من إطار نص البرنامج يحمل العبارة النصية hsbSpeed، وأنّ مربع السرد المجاور له، يحمل العبارة النصية Change، وبالتالي، عند قراءتهما سوياً تنتج العبارة hsbSpeed_Change().
أدخل النص التالي ضمن الإجراء hsbSpeed_Change():
Private Sub hsbSpeed_Change()
txtSpeed.Text = Str(hsbSpeed.Value) + " كم / ساعة"
End Sub
ينفذ الإجراء hsbSpeed_Change() (حسب ما يتبدى من اسمه)، عند تغيير موضع مؤشّر شريط التمرير. وبالتالي تتغير الخاصية Value تلقائياً تبعاً لذلك التغيير. فمثلاً، تُصبح قيمة الخاصية Value مساوية الصفر، عند وضع مؤشّر شريط التمرير عند أقصى يمين الشريط، وذلك بسبب إسناد القيمة صفر إلى الخاصية Min.
ملاحظة
تنتقل بداية شريط التمرير من الجهة اليسرى إلى الجهة اليمنى، عند إسناد القيمة True للخاصية RightToLeft. لمزيد من المعلومات عن الخاصية RightToLeft اقرأ الفصل الثاني والعشرين، (إنشاء تطبيقات عربية السمة مع فيجول بيسك).
يتوجب على مربع النص إظهار قيمة الموضع الجديد لمؤشّر شريط التمرير، عند تغيير موقعه. أي بكلمة أخرى، يلزمنا إسناد قيمة الخاصية Value لشريط التمرير، إلى الخاصية Text لمربع النص، وهذا هو دور العبارة التالية:
txtSpeed.Text = Str(hsbSpeed.Value) + " كم / ساعة"
فمثلاً، إذا كانت قيمة الخاصية Value لشريط التمرير تساوي 20، فقيمة الخاصية Text لمربع النص ستساوي 20 كم / ساعة.
تتوقع الخاصية Text أن يُسند لها قيمة نصية (سلسلة كتابية)، أما الخاصية Value فهي عبارة عن قيمة عددية. مما يعني أنّه يجب استخدام التابع الوظيفي Str() لتحويل القيمة العددية للخاصية Value إلى سلسلة كتابية. يُكتب ضمن قوسي التابع الوظيفي Str()، القيمة العددية المطلوب تحويلها إلى سلسلة كتابية، فمثلاً، يُستخدم التابع Str(11) لتحويل العدد 11 إلى السلسلة الكتابية "11". كما يُستخدم التابع Str(12345) لتحويل العدد 12345 إلى السلسلة الكتابية "12345".
ملاحظة
عند تحويل القيمة الرقمية إلى قيمة نصية، فإنها تفقد قيمتها الرقمية، وتصبح كأي حرف آخر. طبعاً، يوجد تابع وظيفي معاكس للوظيفة Str() وهو التابع Val()، الذي يحول القيمة النصية ("1234") إلى قيمة عددية (1234).
في حالتنا هذه، يُطلب من الإجراء تحويل القيمة العددية hsbSpeed.Value إلى سلسلة كتابية، ولهذا استخدمنا العبارة التالية:
Str(hsbSpeed.Value)
وبالتالي، فإذا فرضنا مثلاً، أنّ الموضع الحالي لمؤشّر شريط التمرير يساوي 32 (hsbSpeed.Value = 32)، والعبارة التالية:
txtSpeed.Text = Str(hsbSpeed.Value) + " كم / ساعة"
تُسند للخاصية Text التابعة لمربع النص، القيمة التالية: 32 كم / ساعة
والآن لنشاهد نتائج ما كتبناه على أرض الواقع:
احفظ المشروع باختيار Save Project من القائمة File.
نفّذ برنامج السرعة.
انقل مؤشّر شريط التمرير، وستجد أنّ محتويات مربع النص تتغير تبعاً لموضع مؤشّر الشريط.
أَنهِ برنامج السرعة بنقر الزر خروج.
تغيير محتويات مربع النص مع سحب مؤشّر شريط التمرير
أنهينا برنامج السرعة تقريباً، ولكن بقيت مشكلة واحدة ينبغي حلها. وللتعرف على هذه المشكلة، اتبع الخطوات التالية:
نفّذ برنامج السرعة.
جرّب سحب مؤشّر شريط التمرير (دون إفلاته)، وستجد أنّ محتوى مربع النص لا يتغير أثناء عملية السحب! وإنما يتغير فقط بعد تحرير المؤشّر.
كم سيكون جميلاً لو يترافق تغير محتوى مربع النص مع حركة مؤشّر شريط التمرير.
يُنفذ الإجراء hsbSpeed_Scroll() آلياً، عند سحب مؤشّر شريط التمرير، لهذا:
انقر نقرة مزدوجة على عنصر تحكم شريط التمرير ضمن النموذج، لإظهار الإجراء hsbSpeed_Scroll() في مربع السرد الموجود في الزاوية اليسرى والعليا من إطار نص البرنامج ووجود عبارة النص Scroll في مربع السرد المجاور له.
أدخل النص التالي في الإجراء hsbSpeed_Scroll():
Private Sub hsbSpeed_Scroll()
hsbSpeed_Change
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
النص الذي أدخلناه في الإجراء hsbSpeed_Scroll() هو التالي:
hsbSpeed.Change
يتسبب نص الإجراء هذا، بتنفيذ الإجراء hsbSpeed_Change()، الذي كتبناه مسبقاً، مما يعني أنّ نص الإجراء hsbSpeed_Change() سينفذ عند سحب مؤشّر شريط التمرير، الذي يعمل على إسناد الموقع الحالي لشريط التمرير إلى الخاصية Text لمربع النص، دعنا نشاهد بأنفسنا أثر ما كتبناه:
نفّذ برنامج السرعة.
اسحب مؤشّر شريط التمرير، وتحقق أن محتويات مربع النص، تتغير تبعاً لسحب مؤشّر شريط التمرير.
انقر الزر خروج لإنهاء برنامج السرعة.
ملاحظة
ينفذ الإجراء hsbSpeed_Change() من ضمن الإجراء hsbSpeed_Scroll() كما يلي:
لاحظ، عدم استخدام الأقواس بعد الكلمة hsbSpeed_Change، أي عند استدعاء الإجراء hsbSpeed_Change().
سيؤدي استخدام القوسين بعد اسم الإجراء في مثل هذه الحالة إلى ظهور رسالة خطأ. وبالواقع يُظهر فيجول بيسك جزء البرنامج الذي يحمل الخطأ بلون أحمر، وهي دلالة مرئية على وجود خطأ ضمن نص البرنامج.
كلمة أخيرة حول برنامج السرعة
يوضح برنامج السرعة، كيف تتمكن من تشكيل واجهة مستخدم محكمة، لإدخال الأعداد.
فبدلاً من إجبار المستخدم على إدخال الأعداد بين صفر و 100 يدوياً، قدمنا للمستخدم شريط تمرير، يمكّن المستخدم من إعطاء أي قيمة صحيحة ضمن المجال المسموح باستخدام شريط التمرير هذا، والحصول على تغذية عكسية (أو تغذية راجعة Feedback وهي الاستجابة الناتجة عن مربع النص) عن مجال الأرقام المسموح بإدخالها.
برنامج الخيارات
يوضّح هذا البرنامج كيف يمكنك كتابة برامج تسمح للمستخدم بانتقاء خيار ما Options.
التمثيل المرئي لبرنامج الخيارات
يستخدم برنامج الخيارات عنصر تحكم زر الخيار Options Button. انظر الشكل 2 - 5 لرؤية شكل وموقع عنصر التحكم هذا ضمن مربع الأدوات.
علماً بأن الموقع يتغير حسب الإصدار المستخدم، يؤدي وضع مؤشّر الفأرة فوق أي عنصر تحكم ضمن مربع الأدوات إلى ظهور مستطيل أصغر يحمل بداخله اسم ذلك العنصر (مثلاً Options Button في حالتنا هذه).
الشكل 2-5 رمز زر الخيار Options ضمن إطار مربع الأدوات.
أنشئ مشروعاً جديداً باختيار New Project من القائمة File لفيجول بيسك، ثم اختر الرمز Standard EXE وانقر الزر فتح ضمن الإطار New Project.
تحقق بأن إطار النموذج Form1 هو الإطار الراهن (أي أنه تم اختياره، أو بكلمة أخرى، الإضاءة متوضعة لديه). ثم اختر Save Form1 As من القائمة File لفيجول بيسك. استخدم الآن مربع الحوار Save File As لحفظ الملف بالاسم Options.Frm في الدليل C:\VB5Prg\Ch02.
اختر الآن Save Project As من القائمة File لفيجول بيسك، واستخدم مربع الحوار Save Project لحفظ المشروع بالاسم Options.Vbp في الدليل C:\VB5Prg\Ch02.
أنشئ النموذج frmOptions طبقاً للجدول 2-2.
يفترض أن يبدو النموذج لدى اكتماله كذاك المبين في الشكل 2-6.
الشكل 2-6 النموذج frmOptions في طور التصميم.
الجدول 2-2. جدول خصائص النموذج frmOptions.
الكائن الخاصية القيمة
Form Name frmOptions
BackColor Red
Caption برنامج الخيارات
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Check Box Name chkSound
BackColor Red
Caption أ&صوات
Font (اختر ما شئت)
ForeColor White
RightToLeft True
Check Box Name chkMouse
BackColor Red
Caption ال&فأرة
Font (اختر ما شئت)
ForeColor White
RightToLeft True

الكائن الخاصية القيمة
Check Box Name chkColors
BackColor Red
Caption ال&ألوان
Font (اختر ما شئت)
ForeColor White
RightToLeft True
Option Button Name optLevel1
BackColor Red
Caption المستوى &1
Font (اختر ما شئت)
ForeColor White
RightToLeft True
Option Button Name optLevel2
BackColor Red
Caption المستوى &2
Font (اختر ما شئت)
ForeColor White
RightToLeft True
Option Button Name optLevel3
BackColor Red
Caption المستوى &3
Font (اختر ما شئت)
ForeColor White
RightToLeft True
Label Name lblChoice
Alignment 2-Center
BorderStyle 1-Fixed Single
Font (اختر ما شئت)
RightToLeft True
ملاحظة
ستضطر غالباً إلى زيادة ارتفاع النموذج frmOptions عند بنائه طبقاً للجدول 2-2 وذلك حتى تتسع كل العناصر فيه. ولزيادة الارتفاع اسحب الحافة السفلى للإطار باتجاه الأسفل.
قسم التصاريح العامة General Declarations للنموذج
سنُدخل في هذا القسم جزءاً من برنامج، علماً بأنّ هذا القسم عبارة عن منطقة ضمن إطار نص البرنامج يكتب فيها شتى العبارات العامة.
تعتبر العبارة Option Explicit مثالاً على عبارة عامة. سنتناول المعنى الدقيق لهذه العبارة لاحقاً في هذا الفصل. أما الآن فيكفينا تعلم كيفية تناول قسم التصاريح العامة، وكيفية كتابة نص برمجي داخله.
اتبع الخطوات التالية:
انقر نقراً مزدوجاً على أي منطقة خالية من النموذج frmOptions لإظهار إطار نص البرنامج (Code Window).
يستجيب فيجول بيسك بإظهار إطار نص البرنامج.
انقر على رمز السهم النازل لمربع السرد الموجود في الزاوية اليسرى العليا من إطار نص البرنامج، ثم اختر البند (General) من القائمة.
انقر رمز السهم النازل لمربع السرد المجاور للمربع السرد السابق، والمتوضع عند الزاوية العليا اليمنى من إطار نص البرنامج، ثم اختر البند (Declarations) منه.
يُظهر إطار نص البرنامج الآن قسم التصاريح العامة General Declarations، حسب ما يوضحه الشكل 2-7.
ستُلاحظ النص التالي في الشكل 2-7:
Private Sub Form_Load()

End Sub
حسب ما هو واضح في الشكل 2-7، يقع قسم التصاريح العامة فوق الإجراء Form_Load()، وقد تجد عبارات مكتوبة مسبقاً في هذا القسم، مثلاً:
Option Explicit
الشكل 2-7 إظهار قسم التصاريح العامة General Declarations لإطار نص البرنامج Code Window.
تستطيع الآن نقر قسم التصاريح العامة، وكتابة أي نص برنامج إضافي تريد. فمثلاً إذا لم تشاهد العبارة Option Explicit في هذا القسم، فاكتب العبارة التالية:
Option Explicit
ربط حادثة Click للزر خروج بنص البرنامج المناسب
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmOptions:
Private Sub cmdExit_Click()
End
End Sub
يُنفذ جزء البرنامج الذي أدخلته، آلياً عند نقر الزر خروج. علماً بأنّ جزء البرنامج هذا يُنهي عمل برنامج الخيارات.
تنفيذ برنامج الخيارات
رغم أننا لم ننته بعد من تصميم برنامج الخيارات لكن دعنا ننفذه:
نَفّذ برنامج الخيارات.
انقر زر الخيار المستوى1.
يستجيب البرنامج، باختيار زر الخيار المستوى1، (تظهر دائرة مصمتة ضمن زر الخيار المستوى1).
انقر زر الخيار المستوى2.
يستجيب البرنامج بإلغاء اختيار زر الخيار المستوى1 (إزالة الدائرة المصمتة من زر الخيار المستوى1)، واختيار زر الخيار المستوى2 بدلاً عنه (وضع دائرة مصمتة داخله).
انقر زر الخيار المستوى3.
يستجيب البرنامج بإلغاء اختيار الزر المستوى2 ويختار بدلاً منه الزر المستوى3.
إذاً يسمح فقط باختيار زر خيار واحد في نفس الوقت. تستخدم أزرار الخيارات ضمن البرامج عندما يرغب المستخدم باختيار خيار واحد فقط من أجل عدة خيارات. (لاحظ أنّ بعض كتب ويندوز، تُطلق على هذا الزر اسم الزر الراديوي Radio Button، تشبيهاً له بأزرار الراديو التي لا يسمح بضغط أكثر من زر واحد في نفس الوقت).
انقر خانة الاختيار أصوات.
يستجيب البرنامج بوضع علامة اختيار في خانة الاختيار أصوات.
انقر خانات الاختيار الأخرى.
كما تشاهد، يُسمح باختيار أكثر من خانة اختيار واحدة في نفس الوقت. استخدم خانات الاختيار، عندما ترغب في أن يتمكن المستخدم من اختيار عدة وضعيات في نفس الوقت. فمثلاً. قد يختار المستخدم إذا كان البرنامج عبارة عن لعبة!، اللعب مع صوت أو بدونه، وبفأرة أو بدونها، وبألوان أو بدون ألوان.
كما يستطيع المستخدم اللعب وفق مستوى أول أو ثاني أو ثالث، لكن لا حكمة من وراء اللعب بثلاثة مستويات مثلاً دفعة واحدة (عملياً، لا يمكن اللعب بثلاث مستويات في نفس الوقت، حسب المثال).
لإلغاء اختيار خانة الاختيار، انقر مجدداً عليه، فتزول علامة الاختيار من داخله.
أَنهِ البرنامج بنقر الزر خروج.
التحقق من أزرار الاختيار وخانات الاختيار التي يتم اختيارها
سنكتب الآن نصاً يتحقق من أزرار الخيار وخانات الاختيار التي يتم اختيارها.
أدخل النص التالي ضمن الإجراء chkColors_Click() للنموذج frmOptions:
Private Sub chkColors_Click()
UpdateLabel
End Sub
أدخل النص التالي ضمن الإجراء chkMouse_Click():
Private Sub chkMouse_Click()
UpdateLabel
End Sub
أدخل النص التالي ضمن الإجراء chkSound_Click():
Private Sub chkSound_Click()
UpdateLabel
End Sub
أدخل النص التالي ضمن الإجراء optLevel1_Click():
Private Sub optLevel1_Click()
UpdateLabel
End Sub
أدخل النص التالي ضمن الإجراء optLevel2_Click():
Private Sub optLevel2_Click()
UpdateLabel
End Sub
أدخل النص التالي ضمن الإجراء optLevel3_Click():
Private Sub OptLevel3_Click()
UpdateLabel
End Sub
ما الذي فعلناه خلال الخطوات السابقة هذه ؟! لقد كتبنا العبارة التالية:
UpdateLabel
في جميع الإجراءات السابقة. يقصد بالعبارة UpdateLabel اسم إجراء جديد، وسنباشر بعد قليل بكتابته. يُنفذ هذا الإجراء آلياً فور اختيار أي من أزرار الخيار أو خانات الاختيار في هذا المثال:
اتبع الآن الخطوات التالية لإضافة الإجراء UpdateLabel إلى النموذج:
انقر نقراً مزدوجاً في أي منطقة خالية من النموذج.
يستجيب فيجول بيسك بإظهار إطار نص البرنامج (Code Window).
اختر Add Procedure من القائمة Tool لفيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الحوار Add Procedure.
أدخل UpdateLabel في الحقل Name من مربع الحوار Add Procedure. (لأن UpdateLabel هو اسم الإجراء الجديد الذي سنضيفه). تحقق الآن بأن أزرار الخيارات في مربع الحوار Add Procedure مطابقة للشكل 2-8.
الشكل 2-8 إضافة الإجراء الجديد UpdateLabel.
انقر الزر OK في مربع الحوار Add Procedure.
يستجيب فيجول بيسك بإظهار إطار نص البرنامج عند الإجراء UpdateLabel جاهزاً للتعديل.
ملاحظة
لقد أضاف فيجول بيسك الإجراء UpdateLabel في المنطقة العامة General Area من النموذج frmOptions. ونستطيع التحقق من ذلك كما يلي:
- ضع قراءة مربع السرد الواقع أعلى يسار إطار نص البرنامج على General.
- ضع قراءة مربع السرد الواقع أعلى يمين إطار نص البرنامج علىDeclarations.
إذا تفقدت محتوى مربع السرد اليميني فستجد بندين فيه: وهما Declarations وUpdateLabel. يوجد لدينا في قسم التصاريح العامة General Declarations العبارة Option Explicit.
الإجراءات التي تضاف إلى النموذج (مثالنا الإجراء UpdateLabel)، تضاف إلى المنطقة العامة General Area.
من الهام طبعاً معرفة أين تضاف الإجراءات للرجوع إليها لاحقاً بغية قراءتها أو تعديلها.
إذاً، تضاف الإجراءات في المنطقة العامة من النموذج. وللوصول إلى إجراء ما، ضع قراءة مربع السرد الواقع أعلى يسار إطار نص البرنامج على General ثم ضع قراءة مربع السرد اليميني المجاور على اسم الإجراء الذي تريد تعديله أو قراءته.
يكتب فيجول بيسك نيابة عنك، السطرين الأول والأخير من الإجراء، ويبقى عليك كتابة نص الإجراء المناسب:
أدخل النص التالي ضمن الإجراء UpdateLabel:
Public Sub UpdateLabel()
Dim Info
Dim LFCR
LFCR = Chr(13) + Chr(10)
' الصوت
If chkSound.Value = 1 Then
Info = "الصوت : تشغيل"
Else
Info = "الصوت : إيقاف"
End If
' الفأرة
If chkMouse.Value = 1 Then
Info = Info + LFCR + "الفأرة : تشغيل"
Else
Info = Info + LFCR + "الفأرة : إيقاف"
f' الألوان
If chkColors.Value = 1 Then
Info = Info + LFCR + "الألوان : تشغيل"
Else
Info = Info + LFCR + "الألوان : إيقاف"
End If
' المستوى 1
If optLevel1.Value = True Then
Info = Info + LFCR + "المستوى : 1"
End If
'
If optLevel2.Value = True Then
Info = Info + LFCR + "المستوى : 2"
End If
If optLevel3.Value = True Then
Info = Info + LFCR + "المستوى : 3"
End If

lblChoice.Caption = Info
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ برنامج الخيارات
دعنا نُنفّذ البرنامج قبل المضي في دراسة نص الإجراء UpdateLabel:
نفّذ برنامج الخيارات.
انقر خانات الاختيار وأزرار الخيار المختلفة.
يستجيب برنامج الخيارات، بإظهار حالة خانات الاختيار وأزرار الخيارات ضمن اللافتة lblCHoice (انظر الشكل 2-9).
أَنهِ برنامج الخيارات بنقر الزر خروج.
الشكل 2-9 إطار برنامج الخيارات مع حالة التوضعات الحالية لكل من أزرار الخيارات وخانات الاختيار.
كيف يعمل برنامج الخيارات
يُنفّذ برنامج الخيارات، الإجراء UpdateLabel عند نقر أحد أزرار الخيارات أو خانات الاختيار.
نص برنامج الإجراء chkColors_Click() للنموذج frmOptions
يُنفّذ هذا الإجراء آلياً، عند نقر خانة الاختيارchkColors:
Private Sub chkColors_Click()
UpdateLabel
End Sub
ينفذ بعد ذلك نص الإجراء UpdateLabel والذي سنشرحه بعد قليل.
بطريقة مشابهة، يؤدي نقر أي زر من أزرار الخيارات أو خانات الاختيار الأخرى إلى تنفيذ الإجراء المرافق لذلك العنصر (زر خيار أو خانة اختيار)، وبالتالي تنفيذ الإجراء UpdateLabel.
نص برنامج الإجراء UpdateLabel
إذاً، ينفذ هذا الإجراء حسب ما ذكرنا، عند اختيار أي من أزرار الخيارات أو خانات الاختيار في هذا المثال.
هذا الإجراء ليس إجراء حادثة خاصة بأحد كائنات فيجول بيسك، أي لا ينفذ تلقائياً عند وقوع حادثة ما، وإنما هو إجراء أنشأناه بأنفسنا باستخدام مربع الحوار Add Procedure كما مرّ معنا سابقاً.
من الهام التمييز بين إجراءات مثل cmdExit_Click() (إجراءات مرتبطة بحادثة ما)، وبين إجراءات مثل UpdateLabel، فالإجراء cmdExit_Click() ينفذ آلياً عند وقوع حادثته، ولا حاجة لكتابة أي نص برمجي للتسبب بعملية تنفيذه. ما هو السبب؟!. السبب أنّ فيجول بيسك يعمل!، ففي اللحظة التي يتم فيها نقر الزر خروج. تقع حادثة النقر Click، وبالتالي ينفذ الإجراء cmdExit_Click().
لا ينفذ الإجراء UpdateLabel آلياً، بل يجب على برنامجك أن يستدعيه للتنفيذ، ويتم ذلك بذكر اسمه، وهو السبب الذي دفعنا إلى كتابة العبارة pdateLabel في ستة مواقع، فالعبارة:
UpdateLabel
تتسبب بتنفيذ الإجراء UpdateLabel. مما يعني أنّ هذا الإجراء سينفذ عند نقر أي من أزرار الخيار أو خانات الاختيار في هذا المثال.
التصريح عن المتحول Info
تصرح أول عبارة كتبناها في الإجراء UpdateLabel عن المتحول Info بالشكل التالي:
Dim Info
تعتبر Dim تعليمة فيجول بيسك، وتدل أن الكلمة التي تليها (Info في مثالنا هذا)، هي اسم لمتحول سوف نستخدمه لاحقاً في الإجراء. يُستخدم المتحول Info كمتحول نصي، يقوم بتخزين سلسلة من الأحرف الكتابية أثناء تنفيذ الإجراء UpdateLabel.
تستطيع التصريح عن هذا المتحول بالطريقة التالية أيضاً:
Dim Info As String
لحسن الحظ، يعتبر فيجول بيسك متساهلاً من هذه الناحية، ولا يُجبرك على التصريح عن نوع المتحول، بل يفترض نوعه حسب طريقة استخدامه.
يعرف من لديه شيئاً من الخبرة في لغات البرمجة الأخرى، أنّ بعض لغات البرمجة لا تتطلب من المستخدم التصريح عن المتحولات، لكن تبقى عادةُ التصريح عن المتحولات عادة حسنة، ولمعرفة السبب افترض أنّ الإجراء يحوي على الحسابات التالية:
Time = 10
Velocity = 50
Distance = Velocity * Time
lblDistance.Caption = "المسافة = " + Str(Distance)
تُسند العبارات الأربعة السابقة، القيمة 10 إلى المتحول Time، والقيمة 50 إلى المتحول Velocity، ثم تحسب حاصل ضرب هذين المتحولين وتظهر المسافة Distance، بإسناد قيمة المسافة Distance إلى الخاصية Caption للافتة lblDistance.
لنفترض الآن، أنك كتبت أحد المتحولات بشكل خاطئ، (نسيت مثلاً كتابة الحرف a بعد الحرف t في كلمة Distance) كالتالي:
lblDistance.Caption = "المسافة = " + Str(Distnce)
يَعتبر فيجول بيسك أنّ Distnce (المتحول المكتوب بشكل خاطئ)، هو متحول جديد مختلف عن المتحول الأساسي Distance، ويُسند له آلياً القيمة صفر، وبالتالي تُظهر اللافتة lblDistance الجملة التالية:
المسافة = 0
وهذا بالطبع خطأ جسيم، قد تهدر كثيراً من الوقت لاكتشافه. تستطيع تلافي حدوث أمثال هذه الأخطاء، بأن تدعو فيجول بيسك إلى التذمر عند استخدام متحول في فيجول بيسك بدون التصريح عنه مسبقاً. وبالتالي، في مثالنا هذا يجب أن تؤول العبارات السابقة إلى ما يلي:
Dim Time
Dim Velocity
Dim Distance

Time = 10
Velocity = 50
Distance = Velocity * Time
lblDistance.Caption = "المسافة = " + Str(Distnce)
إذا تم إعداد فيجول بيسك، بحيث يتذمر لدى مصادفته متحول غير مصرح عنه ضمن نص البرنامج، فإنه سوف يعطيك رسالة خطأ أثناء تنفيذ البرنامج ويخبرك بأن المتحول غير معروف لديه. فمثلاً يضيء فيجول بيسك المتحول Distnce في حالتنا هذه، ويخبرك بأن فيه شيئاً ما خاطئ.
أما كيف يتم إعداد فيجول بيسك للتذمر عند مصادفة متحولات غير مصرح عنها في نص برنامج ؟! فيتم ذلك بوضع العبارة التالية:
Option Explicit
ضمن قسم التصاريح العامة General Declarations، وهو السبب الذي دفعنا إلى وضع العبارة Option Explicit في قسم التصاريح العامة عبر الأمثلة السابقة.
ملاحظة
ضع العبارة Option Explicit دائماً ضمن قسم التصاريح العامة للنموذج. فبهذه الطريقة تخبر فيجول بيسك بعدم قبول المتحولات غير المصرح عنها وتوفر على نفسك ساعات طويلة من تنقيح الأخطاء. لنتكلم بعمومية أكثر، يؤدي تجاهل العبارة Option Explicit إلى إنفاق ساعات طويلة في تنقيح أخطاء قد تكون بسيطة ناتجة من أخطاء في التهجي، لهذا كن حكيماً ودع فيجول بيسك يجد عنك المتحولات التي كتبتها بشكل خاطئ.
التصريح عن المتحول LFCR
صرحنا أيضاً عن المتحول LFCR ضمن الإجراء UpdateLabel:
Dim LFCR
ثم أسندنا إلى المتحول LFCR ما يلي:
LFCR = Chr(13) + Chr(10)
يمثل الرمز Chr(13) رمز المفتاح Enter على لوحة المفاتيح، كما أنّ الرمز Chr(10) هو رمز التغذية السطرية (أي ينقل مؤشر الكتابة إلى سطر جديد). وكما سنرى، تُظهر اللافتة lblChoice سلسلة طويلة تنتشر على عدة أسطر، وذلك بالاستعانة بالمتحول LFCR.
التحقق من قيمة الخاصية Value
يأتي بعد التصريح عن المتحولات في الإجراء UpdateLabel كتلة الشرط If .Else.End:


'الصوت
If chkSound.Value = 1 Then
Info = "الصوت : تشغيل"
Else
Info = "الصوت : إيقاف"
End If
تستطيع في فيجول بيسك، إضافة تعليقات ضمن نص البرنامج، باستخدام رمز الفاصلة العلوية ( ' ) أو الكلمة Rem. فمثلاً السطر التالي:
'الصوت
يطابق السطر:
Rem الصوت
يَستخدم هذا الكتاب الفاصلة العلوية للدلالة على أسطر التعليقات.
كما يمكن إضافة التعليقات في أسطر البرنامج، كما يلي:
MyVariable = 1 ' تهيئة المتحول
تعتبر عادة وضع التعليقات ضمن نص البرنامج عادة حسنة، لأنها تسهل قراءة وتنقيح البرامج. تستطيع كتابة أي شيء تريده بعد رمز الفاصلة العلوية ( ' )، يتجاهل فيجول بيسك كل الرموز التي تلي هذا الرمز أي ( ' ).
يتحقق الإجراء UpdateLabel من أن قيمة الخاصية Value لخانة الاختيار chkSound تساوي 1. فإذا كانت الخاصية Value تساوي واحد، فهذا يعني أنّ العبارات بين السطر If والسطر Else سوف تُنفذ، وفي هذه الحالة لدينا عبارة واحدة فقط بين If و Else وهي العبارة:
Info = "الصوت : تشغيل"
حيث تنفذ هذه العبارة عندما Value تساوي الواحد. تسند هذه العبارة السلسلة "الصوت : تشغيل" إلى المتحول Info. لاحظ أنه يجب ذكر كلمة Then ضمن العبارة If.
إذا كانت قيمة الخاصية Value لخانة الاختيار الصوت تساوي الواحد، فهذا يعني أنه توجد علامة اختيار في خانة الاختيار chkSound؛ وبالتالي سوف تساوي قيمة المتحول Info إلى:
"الصوت : تشغيل"
تنفذ العبارات الموجودة بين Else و End If، إذا كانت قيمة الخاصية Value لخانة الاختيار chkSound لا تساوي الواحد. فعند عدم وجود علامة اختيار في خانة الاختيار تكون قيمة الخاصية Value لخانة الاختيار مساوية الصفر، وبالتالي تنفذ العبارة الواقعة بينElse و End If، وتسند هذه العبارة إلى المتحول Info الجملة التالية:
"الصوت : إيقاف"
إذاً لنلخص ما سبق، يُسنَد إلى المتحول Info إما الجملة:
"الصوت : تشغيل"
أو:
"الصوت : إيقاف"
بطريقة مشابهة، تتحقق العبارة If.Else.End If بأن قيمة الخاصية Valueلخانة الاختيار chkMouse تساوي الواحد:
' الفأرة
If chkMouse.Value = 1 Then
Info = Info + LFCR + "الفأرة : تشغيل"
Else
Info = Info + LFCR + "الفأرة : إيقاف"
End If
فمثلاً، إذا كانت خانة الاختيار chkSound تحوي علامة اختيار داخلها، وكانت خانة الاختيار chkMouse لا تحوي علامة اختيار، فسوف تتسبب عبارتا If.Else.End If الأوليتين من الإجراء UpdateLabel، بإسناد السلسلة التالية إلى المتحول Info:
"الصوت : تشغيل" + LFCR + "الفأرة : إيقاف"
وسوف تظهر هذه السلسلة لاحقاً على سطرين:
الصوت : تشغيل
الفأرة : إيقاف
وذلك بسبب إضافة LFCR بين السلسلتين.
تتحقق عبارة If.Else.End If التالية ضمن الإجراء UpdateLabel بأن قيمة الخاصية Value لخانة الاختيار chkColorsتساوي الواحد، وتعدّل المتحول Info تبعاً لذلك:
' الألوان
If chkColors.Value = 1 Then
Info = Info + LFCR + "الألوان : تشغيل"
Else
Info = Info + LFCR + "الألوان : إيقاف"
End If
تتحقق عبارة If.End.If التالية في الإجراء UpdateLabel بأن الخاصيةValue لزر الخيار optLevel1 تساوي قيمة الثابت True:
If optLevel1.Value = True Then
Info = Info + LFCR + "المستوى : 1"
End If
تحدد الخاصية Value أيضاً حالة عنصر التحكم هذا، فإذا كانت قيمة الخاصية Value تساوي True، فهذا معناه أنه تم اختيار زر الخيار، ويتم إعداد المتحول Info تبعاً لذلك. أما إذا كانت الخاصية Value لزر الخيار optLevel1 لا تساوي True فهذا يعني أنه لم يتم انتقاء زر الخيار هذا.
ملاحظة
الخاصية Value لخانة الاختيار قد تساوي 0 أو 1 أو 2. فإذا كانت تساوي الواحد، فهذا معناه وجود علامة اختيار بداخله. أما إذا كانت تساوي صفر، فهذا يعني عدم وجود علامة اختيار، بينما إذا كانت Value لمربع اختيار تساوي 2، فهذا يعني حالة بين الاثنين، ويظهر بشكل رمادي أو باهت.

ملاحظة
الخاصية Value لزر خيار ما، قد تساوي True أو False. فإذا كانت تساوي True، فهذا معناه وجود نقطة داخل زر الخيار. أما إذا كانت تساوي False فهذا يعني عدم وجود نقطة داخله. وبالتالي عدم اختياره.
تعدّل عبارتا If.End.If التاليتين المتحولInfo تبعاً لقيمة الخاصيةValue لكل من زري الخيار optLevel2 و optLevel3:
If optLevel2.Value = True Then

Info = Info + LFCR + "المستوى : 2"
End If
If optLevel3.Value = True Then
Info = Info + LFCR + "المستوى : 3"
End If
تسند آخر عبارة في الإجراء UpdateLabel محتوى المتحول Info إلى الخاصية Caption للافتة lblChoice:
lblChoice.Caption = Info
تظهر هذه العبارة محتوى المتحول Info داخل اللافتة lblChoice، كما يظهره الشكل2-9.
ماذا لدينا أيضاً ؟!
لا بد أنك أدركت حتى الآن، أنّ البرمجة بلغة فيجول بيسك ترتكز على فهم معنى كل عنصر من عناصر التحكم داخل مربع الأدوات، ومعنى ووظيفة ذلك العنصر. فنفس الخاصية Property، تحمل معاني مختلفة لعناصر التحكم المختلفة.
فمثلاً الخاصية Caption(العنوان) للنموذج، تحوي النص الذي يظهر في شريط عنوان النموذج، أما الخاصية Caption لعنصر التحكم Label (لافتة)، فتحوي النص الذي سيظهر في اللافتة. كذلك الخاصية Value لخانة اختيار، تُشير إلى وجود أو عدم وجود علامة اختيار فيه. والخاصية Value لزر الخيار، تشير إلى وجود أو عدم وجود دائرة مصمتة فيه. وأما الخاصية Value لشريط تمرير، فتشير إلى الموضع الحالي لمؤشّر شريط التمرير.
يحوي مربع الأدوات على رموز عناصر التحكم، ويمتلك كل عنصر تحكم، مجموعته الخاصة من الخصائص Properties. تعتبر بعض عناصر التحكم Controls، عناصر تحكم ويندوز قياسية، مثال ذلك، شريطي التمرير الأفقي والعمودي، ومربعات النص، واللافتات، وخانات الاختيار، وأزرار الخيار، وأزرار الأوامر.
يمكن إضافة رموز أخرى إلى مربع الأدوات في فيجول بيسك، ثم وضع عناصر التحكم التي تمثلها هذه الرموز في النموذج. تدعى الرموز الإضافية لعناصر التحكم هذه بالاسم ActiveX Controls، وتعرف أيضاً باسم عناصر التحكم OCX. سنتعرف بشكل أوسع على هذه العناصر عبر فصول الكتاب.
لا تُعتبر لغة فيجول بيسك لغة برمجة صعبة التعلم، ولكن هنالك الكثير مما يجب تعلمه. ومفتاح التعلم الناجح هو التمرن والتجريب. والمفترض بعد كتابة برامج هذا الكتاب أن تصبح قادراً على تدريس اللغة. فحاول أن تكتب البرامج، وأن تفهم نصوصها، وكذلك جرّب تغيير خصائص عنصر التحكم أثناء طور التصميم، (أي أثناء مرحلة بناء النموذج - مرحلة التمثيل المرئي للبرنامج)، ومرحلة التنفيذ.
يعني تغيير الخصائص أثناء مرحلة التنفيذ، تغيير قيمة الخاصية داخل نص البرنامج. فمثلاً، تسند العبارة الأخيرة في الإجراء UpdateLabel المتحول Info أثناء مرحلة التنفيذ إلى الخاصية Caption للافتة lblCHoice:
lblChoice.Caption = Info
بينما بالمقابل، أسند العنوان برنامج الخيارات إلى الخاصية Caption للنموذج خلال مرحلة التصميم Design Time.
تتقبل بعض الخصائص تغيير قيمتها، خلال أي من الطورين، طور التصميم، أو طور التنفيذ. بينما تقبل بعض الخصائص تغيير قيمتها فقط أثناء مرحلة التنفيذ، (أي من خلال نص البرنامج فقط). فمثلاً تقبل الخاصية Caption لعنصر التحكم Label تغيير قيمتها خلال كلا الطورين: التصميم والتنفيذ.
ستتعرف في هذا الكتاب على خصائص لا يمكن إسنادها أو تغييرها، إلا من خلال طور زمن التنفيذ.
اصطلاحات التسمية المستخدمة في هذا الكتاب
تُسمى عناصر التحكم عبر هذا الكتاب، وفق الجدول 2-3. فتبدأ أسماء أزرار الأوامر مثلاً، بالرموز cmd (كما في cmdMyButton)، وتبدأ أسماء مربعات النص بالرموز txt (كما في txtMyTextBook).
الجدول 2-3. اصطلاحات التسمية لعناصر تحكم فيجول بيسك Controls.
نوع عنصر التحكم البادئة مثال
Check box chk chkReadOnly
Combo box cbo cboEnglish
Command button cmd cmdExit
Common dialog dlg dlgFileOpen
Communications com comFax
Data control dat datBiblio
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Form frm frmEntry
Frame fra fraLanguage
Grid grd grdPrices
Horizontal scroll bar hsb hsbVolume
Image img imgIcon
Label lbl lblHelpMessage
Line lin linVertical
List box lst lstPolicyCodes
MCI mci mciVideo
MDI child form mdi mdiNote
Menu mnu mnuFileOpen
Picture pic picVGA
Shape shp shpCircle
Text box txt txtLastName
Timer tmr tmrAlarm
UpDown upd updDirection
Vertical scroll bar vsb vsbRate
لا تعتبر تسمية الخاصية Name لعناصر التحكم وفق الجدول 2-3 من متطلبات فيجول بيسك. فمثلاً، كنا قد أطلقنا التسمية lblChoice على عنصر التحكم Label الذي يظهر معلومات حول خيار المستخدم. نستطيع إسناد القيمة Choice للخاصية Name لعنصر التحكم بدلاً من lblChoice، وبالتالي ستصبح آخر عبارة في الإجراء UpdateLabel كما يلي:
Choice.Caption = Info
بدلاً من:
lblChoice.Caption = Info
لاحظ أنّ تسمية عناصر التحكم وفق الجدول 2-3 تسهل قراءة البرنامج. فإذا نظرت مثلاً إلى العبارة:
Choice.Caption = Info
لن تكون أنت أو غيرك قادراً على التنبؤ بأنChoice عبارة عن عنصر تحكم Label. بل قد يعتقد من يقرأ هذه العبارة أنها تعديل لعنوان النموذج المسمى Choice. بينما تأمل العبارة:
lblChoice.Caption = Info
سيدرك من يقرأ هذه العبارة أنّ lblChoice هو اسم لافتة، وهذا بسبب وضع الأحرف lbl. وهكذا يصبح معنى العبارة "أسند قيمة المتحول Info إلى الخاصية Captionللافتة".
العبارات التي قد لا تتسع على سطر واحد في هذا الكتاب
العبارة يمكن إدخالها بحيث تمتد على أكثر من سطر واحد، فمثلاً العبارة:
MyVariable = 1 + 2 + 3
يمكن كتابتها بهذه الطريقة:
MyVariable = 1 + _
2 + 3
أو بهذه الطريقة:
MyVariable = 1 _
+ 2 _
+ 3
إذاً، نستطيع في فيجول بيسك استئناف كتابة العبارة على السطر التالي وذلك بترك فراغ في نهاية السطر، يليه الرمز (_) Underscore.
ملاحظة
لا تستطيع كتابة العبارة الواحدة على أسطر وأنت في منتصف سلسلة، فمثلاً العبارة التالية:
lblMyLabel.Caption = "This is my string "
لا يمكن كتابتها كالتالي:

lblMyLabel.Caption = "This is _
my string "
إذا كان لا بُد، فاكتبها كالتالي:
lblMyLabel.Caption = "This is _
& "my string "
الخلاصة
قفزنا مع هذا الفصل إلى الماء!. أجل لقد بدأنا فعلياً ببناء برامج ويندوز حقيقية تتضمن شريط تمرير ومربع نص ولافته وزر أمر وخانات أختيار وأزرار خيارات. فتعلمنا كيف نضع عناصر التحكم هذه فى برامج لغة فيجول بيسك، وكيفية تحديد قيمة الخاصية Value لهذه العناصر وكيف نضيف نص برنامج إلى الإجراءات المرافقة لعناصر االتحكم هذه. كما تعلمنا من هذا الفصل أيضاً ككيف نضيف إجراء إلى النموذج (عندما أضفنا الإجراء Update Label إلى النموذج FrmOpptioon).

الفصل الثالث
كتل البناء البرمجية



يركز هذا الفصل على كتل البناء البرمجية، فلغة فيجول بيسك كحال اللغات الأخرى، تستخدم كتل بناء برمجية: مثل الإجراءات Procedures، والتوابع الوظيفية Functions، وعبارات الشرط If End If، وعبارات الحلقات، والمتحولات، وغير ذلك من مفاهيم البرمجة الهامة الأخرى.
برنامج ضرب عددين
يوضح هذا البرنامج كيف تستخدم الإجراءات والتوابع الوظيفية ضمن البرامج المطوّرة في لغة فيجول بيسك.
التمثيل المرئي لبرنامج ضرب عددين
سننجز الآن التمثيل المرئي لبرنامج ضرب عددين:
أنشئ الدليل C:\VB5Prg\Ch03، سنستخدم هذا الدليل لحفظ العمل المنجز.
افتح مشروعاً جديداً من نوع Standard EXE، واحفظ نموذج المشروع بالاسم Multiply.frm في الدليل C:\VB5Prg\Ch03، واحفظ ملف المشروع بالاسم Multiply.Vbp في ذات الدليل.
أنشئ النموذج frmMultiply طبقاً للجدول 3-1.
يفترض أن يظهر النموذج لدى اكتماله كما في الشكل 3-1.
الجدول 3-1. جدول خصائص النموذج frmMultiply.
الكائن الخاصية القيمة
Form Name frmMultiply
Caption برنامج ضرب عددين
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdCalculate
Caption اح&سب النتيجة
RightToLeft True
Text Box Name txtResult
Text (اجعله فارغاً)
RightToLeft True
Label Name lblResult
Caption النتيجة:
RightToLeft True

الشكل 3-1 النموذج frmMultiply بعد انتهاء تصميمه.
إدخال نص برنامج ضرب عددين
سندخل الآن، نص برنامج ضرب عددين:
انقر نقراً مزدوجاً على النموذج frmMultiply، لإظهار إطار نص البرنامج. توجد لائحتين عند قمة إطار نص البرنامج. دع اللائحة اليسارية تشير إلى General، واليمينية إلى Declarations، (وبالتالي فإن مجموع قراءة اللائحتين، سيشير إلى General Declarations، أي قسم التصاريح العامة).
اكتب العبارة التالية ضمن قسم التصاريح العامة General Declarations للنموذج frmMultiply:
'يجب التصريح عن كل المتحولات
Option Explicit
يجب من الآن فصاعداً، التصريح عن المتحول قبل استخدامه في البرنامج.
أدخل النص التالي ضمن الإجراء cmdCalculate_Click() للنموذج frmMultiply:
Private Sub cmdCalculate_Click()
Multiply 2, 3
End Sub
يُنفذ النص الذي أدخلته ضمن الإجراء cmdCalculate_Click() آلياً، عند نقر الزر احسب النتيجة. يُنفذ نص البرنامج هذا، الإجراء المدعو Multiply، سنتعلم بعد قليل كيف نضيف الإجراء Multiply إلى برنامجنا.
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmMultiply:
Private Sub cmdExit_Click()
End
End Sub
ستضيف إجراء جديداً الآن، إلى النموذج frmMultiply، وسنطلق على هذا الإجراء التسمية Multiply. إليك طريقة إنجاز ذلك:
انقر نقراً مزدوجاً على النموذج frmMultiply لإظهار إطار نص البرنامج.
انقر Add Procedureمن القائمة Tools للغة فيجول بيسك.
يستجيب فيجول بيسك بإظهار مربع الحوار Add Procedure.
أدخل Multiply في مربع النص Name ضمن مربع الحوار Add Procedure.
ضع علامة بجانب Sub ضمن الحقل Type. (لأنا نوع الإجراء هو روتين فرعي).
ضع علامة بجانب Public ضمن الحقل Scope. (لأن نريد أن يكون مجال الإجراء، مرئياً لجميع وحدات المشروع).
يبين الشكل 3-2 كيف يبدو مربع الحوار Add Procedureالآن.
الشكل 3-2 إضافة الإجراء المدعو Multiply.
انقر الزر OK لإغلاق مربع الحوار Add Procedure.
يستجيب فيجول بيسك بإضافة الإجراء Multiply() إلى المنطقة العامة من النموذج frmMultiply، ويظهر نص الإجراء Multiply بالشكل التالي:
Public Sub Multiply()
End Sub
سنحتاج إلى تعديل السطر الأول من الإجراء Multiply() ليصبح الإجراء بعدها كالتالي:
Public Sub Multiply(X As Integer, Y As Integer)
End Sub
لأننا سنمرر للإجراء Multiply، وسيطين يمثلان العددين المطلوب معرفة ناتج ضربهما.
أدخل الآن النص التالي ضمن الإجراء Multiply:

Public Sub Multiply(X As Integer, Y As Integer)
Dim Z
Z = X * Y
txtResult.Text = Str(Z)
End Sub
اختر البند Save Project من القائمة File لفيجول بيسك لتحفظ عملك.
تنفيذ برنامج ضرب عددين
نفّذ برنامج ضرب عددين، وانقر الزر احسب النتيجة.
يستجيب البرنامج بإظهار الرقم 6 ضمن مربع النص. (يحسب الإجراء ناتج ضرب 2 مع 3، ويظهر الناتج ضمن مربع النص، عند نقر الزر احسب النتيجة).
كيف يعمل برنامج ضرب عددين
يُنفذ برنامج ضرب عددين، الإجراء Multiply() لحساب حاصل ضرب عددين.
نص الإجراء cmdCalculate_Click()
ينفذ هذا الإجراء عند نقر الزر احسب النتيجة. تَستدعي العبارة الوحيدة الموجودة ضمنه الإجراء Multiply() مع وسيطين هما العددين 2 و 3:
Private Sub cmdCalculate_Click()
Multiply 2, 3
End Sub
يحتاج الإجراء لمعرفة العددين اللذين سيحسب حاصل ضربهما، ولهذا قدمنا له العددين 2 و3 كوسيطين له.
نص الإجراء Multiply()
يمتلك الإجراء Multiply() وسيطين:
يدعى الوسيط الأول X، ويصرح عنه بأنه من نوع صحيح Integer، والوسيط الثانيY من
النوع صحيح Integerأيضاً:

Public Sub Multiply(X As Integer, Y As Integer)
Dim Z
Z = X * Y
txtResult.Text = Str(Z)
End Sub
يُصرح الإجراء Multiply() عن متحول يدعى Z ويُسند إليه ناتج حاصل ضرب X مع Y.
ثم يستخدم الإجراء، المتحول Z بعدها، لإسناد قيمة Z إلى الخاصية Text لمربع النص txtResult. وهذا طبعاً بعد تحويل قيمة Z إلى ثابت كتابي بواسطة التابع الوظيفي Str().
يمكن التصريح عن إجراء ما، في فيجول بيسك، دون استخدام أي وسائط، فيكون القوسان بعد اسم الإجراء فارغتان، وبالتالي لا يلزم تحديد وسائط عند استدعاء الإجراء، فمثلاً لدينا الإجراء:
Public Sub Updatelabel()
يُستدعى هذا الإجراء بالطريقة التالية:
UpdateLabel
أي يكفي ذكر اسمه.
بينما استخدمنا في مثالنا الحالي، هذه العبارة:
Multiply 2,3
لاستدعاء (تنفيذ) الإجراءات في لغة فيجول بيسك، فمثلاً نستطيع إعادة كتابة الإجراءات cmdCalculate_Click() بالشكل التالي:
Private Sub cmdCalculate_Click()
Call Multiply (2,3)
End Sub

ملاحظة
يجب استخدام الأقواس للإحاطة بوسائط الإجراء، عند استدعائه بواسطة العبارة Call. لا تهم الطريقة التي تُستدعى بها الإجراء، ولهذا يمكنك اختيار الطريقة التي تناسبك. لدى إضافة الإجراء Multiply() اخترنا النطاق Scope بأنه من نوع Public (انظر الشكل 3-2). ولهذا صرح فيجول بيسك عن الإجراء Multiply بأنه من النوع العام Public:
Public Sub Multiply()
لو اخترنا النطاق Private بدلاً من Public، لكان شكل التصريح كما يلي:
Private Sub Multiply()
الفرق بين التصريحين، أن الإجراء في حالة Public يكون عاماً، ويمكن استخدامه من قبل أي إجراء آخر في أي موقع من ملفات المشروع، فحسب ما سيتوضح لك عبر الكتاب يمكن للبرنامج الواحد أن يتألف من عدة ملفات (ربما عدة نماذج) وبالتالي، فعند التصريح عن إجراء بأنه Public، فإنّ بمقدور كل ملفات البرنامج استخدامه.
أما عند استخدام Private، فتنعكس الآية، إذ لا يمكن استخدام الإجراء إلا من قبل الإجراءات الموجودة ضمن نفس الملف. وفي حالتنا هذه يمكن لإجراءات النموذج frmMultiply فقط استخدام الإجراء Multiply().
استخدام تابع وظيفي داخل برنامج ضرب عددين
يُطلق على الإجراء Multiply() عبارة إجراء Procedure، لأنه لا يعيد أي قيمة. وهو يشبه التابع الوظيفي أي Function، باستثناء أنه يعيد قيمة بعد استدعائه.
سنكتب الآن نص برنامج يوضح كيفية استخدام التابع الوظيفي. أولاً، احذف الإجراء Multiply() من برنامج ضرب عددين باتباع ما يلي:
أظهر إطار نص البرنامج بالنقر المزدوج على منطقة خالية في النموذج frmMultiply.
حدد موقع الإجراء Multiply() في إطار نص البرنامج، ستعثر على هذا الإجراء ضمن المنطقة General Declarations، والتي تستطيع الانتقال إليها بوضع اللائحة اليسارية الموجودة عند قمة إطار نص البرنامج على General ووضع اللائحة المجاورة لها على Multiply.
ضع إضاءة فوق كامل الإجراء. بما في ذلك عنوانه وآخر سطر فيه، (ضع المؤشر عند أول حرف في الإجراء، ثم اضغط Ctrl+A).
اضغط المفتاح Delete على لوحة المفاتيح.
هذا كل شيء بالنسبة لحذف الإجراء Multiply.
اتبع الآن الخطوات التالية لإضافة تابع وظيفي جديد إلى البرنامج Multiply():
أظهر إطار نص برنامج النموذج frmMultiply.
اختر Add Procedure من القائمة Tools.
يستجيب فيجول بيسك بإظهار مربع الحوار Add Procedure.
أدخل الاسم Multiply ضمن مربع النص Name.
اختر Function ضمن الحقل Type.
اختر Public ضمن الحقل Scope.
يفترض أن يبدو مربع الحوار Add Procedure الآن كما في الشكل 3-3.
الشكل 3-3 مربع الحوار Add Procedure وإضافة التابع الوظيفي Multiply().
انقر الزر Ok لإغلاق مربع الحوار Add Procedure.
يستجيب فيجول بيسك بإضافة التابع الوظيفي Multiply() إلى قسم التصاريح العامة General Declarations للنموذج frmMultiply ويظهر إطار نص البرنامج مع التابع الوظيفي Multiply() جاهزاً للتعديل:
Public Function Multiply()
End Function
غير السطر الأول لهذا التابع بحيث يغدو كالتالي:
Public Function Multiply(X As Integer, Y As Integer)
End Function
والآن يمتلك التابع الوظيفي Multiply() وسيطين (كلاهما من نوع صحيح Integer):
أضف النص التالي إلى التابع الوظيفي Multiply():
Public Function Multiply(X As Integer, Y As Integer)
Dim Z
Z = X * Y
Multiply = Z
End Function
غيّر نص الإجراء cmdCalculate_Click() ليصبح كما يلي:
Private Sub cmdCalculate_Click()
txtResult.Text = Str(Multiply(2,3))
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
نفّذ برنامج ضرب عددين.
انقر الزر احسب النتيجة.
يتصرف البرنامج كما ترى بذات الطريقة السابقة (في حالة الإجراء Multiply()).
أنهِ البرنامج بنقر الزر خروج.
نص التابع الوظيفي Multiply()
يصرح ضمن هذا التابع عن متحول يدعىZ ويسند إليه ناتج حاصل ضرب الوسيطينX وY:
Public Function Multiply(X As Integer, Y As Integer)
Dim Z
Z = X * Y
Multiply = Z
End Function
تُسند آخر عبارة في التابع الوظيفي Multiply() قيمة المتحول Z إلى المتحول Multiply:
Multiply = Z
يمثل المتحول Multiply القيمة المعادة من التابع الوظيفي. لنوضح أكثر، التابع الوظيفي اسمه Multiply، ويستعمل اسم التابع الوظيفي ليحتوي على القيمة المعادة، ولهذا لا بد من إسناد القيمة التي سيعيدها التابع الوظيفي إلى متحول (يدعى Multiply) ويحمل اسم ذلك التابع.
Multiply = Z
يستطيع كل من يستدعي التابع الوظيفي Multiply() استخدام القيمة المعادة منه حسب ما توضحه الفقرة التالية:
نص الإجراء cmdCalculate_Click()
يُسنِد نص الإجراء القيمة المعادة من التابع الوظيفي Multiply() إلى الخاصية Text لمربع النص txtResult:
Private Sub cmdCalculate_Click()
txtResult.Text = Str(Multiply(2,3))
End Sub
كما تلاحظ، يعتبر استخدام تابع وظيفي أكثر تعقيداً بعض الشيء من استخدام الإجراءات. لكنك ستتعود على استخدام التوابع الوظيفية، وستتمكن من تقدير أهميتها، لأنها تساعد بسهولة على قراءة وتوضيح عمل البرامج. لنأخذ العبارات التالية على سبيل المثال:
TtxResult.Text = Str(Multiply(2,3))
تقول هذه العبارة ما يلي: " نفّذ التابع الوظيفي Multiply() مع وسيطين هما 2 و3، وتحويل القيمة المعادة من Multiply إلى سلسلة نصية (باستخدام التابع الوظيفي Str())، وإسناد السلسلة الناتجة إلى الخاصية Text لمربع النص". ولهذا، فسوف يحوي مربع النص txtResult على السلسلة "6" داخله (أي 2×3 = 6).
الإجراءات والتوابع الوظيفية والطرائق
حسب ما تقدم في هذا الفصل، فإن الفرق بين الإجراء والتابع الوظيفي أن الإجراء لا يعيد قيمة على عكس التابع الوظيفي. ستصادف عبر الفصول القادمة مصطلحاً جديداً وهو المصطلح Method (طريقة). تعمل الطريقة بشكل مشابه لعمل الإجراءات والتوابع الوظيفية. وعلى العموم. تنجز الطريقة method نوعاً ما من الوظائفية على كائن خاص ما. فمثلاً تمحو العبارة التالية محتويات النموذج الرسومية، والمدعو frmMyForm:
frmMyForm.Cls
لاحظ أن اسم الطريقة في العبارة السابقة هو Cls. يمكن أن تبدو الطرائق Methods من وجهة نظر المستخدم كالإجراءات والتوابع الوظيفية ولكن بصيغة غريبة. سنتمرن عبر فصول هذا الكتاب على استخدام الطرائق.
عبارات اتخاذ القرار
تصف الفقرات القادمة كتل البناء البرمجية الأساسية التي تتوافر في لغة فيجول بيسك. ويتولى ما تبقى من الفصل شرح كيفية كتابة برامج تستخدم هذه الكتل.
الإشارة إلى عناصر التحكم في نص البرنامج
كما لاحظنا حتى الآن، يمكننا الإشارة إلى خاصية عنصر تحكم ما، بكتابة اسم عنصر التحكم البرمجي، ثم نقطة (.) ثم اسم الخاصية. فمثلاً، توضح العبارة التالية كيف تشير إلى الخاصية Text لعنصر التحكم txtResult:
txtResult.Text
كما يمكنك الإشارة أيضاً إلى الخاصية، بإضافة اسم النموذج الذي يتوضع عنصر التحكم فيه. فمثلاً، تشير العبارة التالية إلى الخاصية Text لمربع النص txtResult ضمن النموذج frmMultiply:
frmMultiply.txtResult.Text
تستطيع في معظم الأحوال تجاهل اسم النموذج الحالي، (لتوفير جهد عملية الإدخال)، وعموماً إذا احتوى البرنامج على أكثر من نموذج، فمن الممكن تحديد اسم النموذج، وسنشاهد أمثلة عبر كتابنا على حالات يتوجب ذكر اسم النموذج فيها.
العبارة If
تعرفنا على كتلة عبارات If.End If في الفصل الثاني. وفي كتلة If.End If اللاحقة، تنفذ العبارات الواقعة بين السطر If والسطر If.End فقط إذا كانت قيمة المتحول A تساوي1:

If A = 1 Then
'ستنفذ العبارات الموجودة هنا
'A = 1 إذا كانت قيمة المتحول
End If
تُوضح العبارات التالية شكل عبارات If .Else.End If:

If A = 1 Then
'ستنفذ العبارات الموجودة هنا
'A = 1 إذا كانت قيمة المتحول
Else
'ستنفذ العبارات الموجودة هنا
'A <> 1 إذا كانت قيمة المتحول
End If
العبارة Select Case
يكون استخدام Select Case أحياناً أكثر ملاءمة للاستخدام من If.Else.End If. توضح كتلة العبارات التالية كيف تعمل Select Case:

Select Case A
Case 0
'ستنفذ العبارات الموجودة هنا
'A = 0 إذا كانت قيمة المتحول
Case 1
'ستنفذ العبارات الموجودة هنا
'A = 1 إذا كانت قيمة المتحول
Case 2
'ستنفذ العبارات الموجودة هنا
'A = 2 إذا كانت قيمة المتحول
End Select
كما ترى، تعمل Select.Case بطريقة مشابهة لعمل عبارة If.
طريقة Do While.Loop
تُستخدم العبارة Do.Loop لتنفيذ العبارات ضمنها، مادام الشرط المحدد محققاً. مثال، تعد حلقة Do.Loop التالية من 1 وحتى 1000:
Dim Counter
Counter=1
Do While Counter < 1001

Counter = Counter + 1
Loop
يتم تجهيز المتحول Counter بإسناد القيمة الابتدائية 1إليه، ثم تبدأ بعدها حلقة
Do While.Loop.
يتحقق السطر الأول من أن قيمة Counter أصغر من 1001. فإذا كان الأمر كذلك، تنفذ العبارات الواقعة بين السطر Do While والسطر Loop. وفي مثالنا هذا، توجد عبارة واحدة بين هذين السطرين:
Counter = Counter +1
والتي تزيد قيمة العداد Counter بمقدار 1.
يعود البرنامج بعد ذلك إلى السطر Do While ويتحقق من قيمة العداد Counter، والتي تساوي الآن إلى 2.
ولهذا فسوف يعاد تنفيذ العبارة الواقعة بين السطر Do While والسطر Loop. تستمر المعالجة حتى تصبح قيمة Counter مساوية إلى 1001، وعندها يختل الشرط، ويستأنف تنفيذ البرنامج بدأً من العبارة التي تلي السطر Loop.
طريقة Do.Loop While
العبارات ضمن الحلقة Do While.Loop الموصوفة في الفقرة السابقة قد تنفذ أو لا تنفذ، تبعاً لتحقيق الشرط. فمثلاً العبارات في حلقة Do While.Loop التالية لن تنفذ أبداً:
Dim Counter
Counter = 2000
Do While Counter < 1001
Counter = Counter + 1
Loop
فعندما يتحقق البرنامج من السطر Do While فإنه سيكتشف أن Counter تساوي 2000، ولهذا فلن تنفذ العبارة الواقعة بين السطر Do While والسطر Loop.
يتطلب البرنامج أحياناً الدخول ضمن الحلقة لمرة واحدة على الأقل دون تحقيق أي شرط.
تُستخدم الحلقة Do.Loop While في مثل هذه الحالة:
Dim Counter
Counter = 2000
Do
txtUserArea.Text = Str(Counter)
Counter = Counter + 1
Loop While Counter < 1001
ينفذ البرنامج العبارات الواقعة بين السطر Do والسطر Loop While مهما تكن الأحوال. وبعد ذلك يحدد البرنامج إذا كان الشرط محققاً (أي Counter أصغر من 1001)، يعيد البرنامج تكرار تنفيذ الحلقة إذا تحقق الشرط، وبالتالي يعيد تنفيذ العبارات الواقعة بين السطر Do والسطر Loop While.
أما إذا اختل الشرط (أي Counter ليس أصغر من 1001) فعندها يستأنف التنفيذ من العبارة التي تأتي مباشرة بعد السطر Loop While. تعد الطريقة Do.Loop While التالية من 50 إلى 300:
Dim Counter
Counter = 50
Do
Counter = Counter + 1
Loop While Counter < 301
الطريقة For.Next
تُعَدُّ الطريقة For.Next وسيلة أخرى لصنع الحلقات في لغة فيجول بيسك. مثلاً، تَعُّدُ الحلقة التالية من 1 و حتى 100:
Dim7 I
For I = 1 to 100 Step 1
txtMyTextArea.Text = Str(I)
Next
أما للتعداد من 1وحتى 100 وبخطوة (زيادة في كل مرة) قدرها 2، فتستطيع استخدام الحلقة For.Next التالية:
Dim I
For I = 1 to 100 Step 2
txtMyTextArea.Text = Str(I)
Next
تعد هذه الحلقة بالشكل التالي: 1،2،3،5، ... 99.
تساوي قيمة Step في الحالة الافتراضية (أي عند تجاهل كتابتها) إلى 1، وبالتالي فالحلقتين التاليتين متماثلتين:
Dim I
For I = 1 to 100 Step 1
txtMyTextArea.Text = Str(I)
Next
و الحلقة:
Dim I
For I = 1 to 100
txtMyTextArea.Text = Str(I)
Next
العبارة Exit For
تستطيع الخروج من الحلقة For.Next باستخدام عبارة Exit For كما يلي:
Dim I
For I = 1 to 1000
txtResult.Text = Str(I)
If I = 500 Then
Exit For
End If
Next
يعد جزء البرنامج هذا بدءاً من الواحد وبزيادة قدرها 1 للمتحول Z مع كل تكرار للحلقة.
يتحقق شرط عبارة If الداخلية عندما تصبح قيمة I مساوية إلى 500 (If I = 500) ونتيجة ذلك تنفذ العبارة Exit For التي تنهي بدورها تنفيذ الحلقة For.Next، قبل انتهاء الحلقة.
أي بكلمة أخرى، تتسبب عبارة If بإنهاء الحلقة عند I = 500 (بينما يفترض أن تنتهي الحلقة بدون عبارة If الداخلية عندما تصبح قيمة I مساوية إلى 1000).
العبارة Exit DO
تنتهي الحلقة Do While.Loop باستخدام Exit DO:
Dim I
I = 1
Do While I < 10001
txtResult.Text = Str(I)
I = I + 2
If I > 500 Then
Exit Do
End If
Loop
تعد الحلقة السابقة بدءاً من الواحد وبزيادة قدرها 2. وينهى تنفيذ الحلقة عندما تصبح قيمة I أكبر من 500.
الحلقة اللامنتهية
قد تقع أحياناً في خطأ يشبه ذلك المبين في الحلقة التالية:


Dim I
I = 1
Do While I < 10001
txtResult.Text = Str(I)
If I > 500 Then
Exit Do
End If
Loop
كما تلاحظ، نسينا كتابة العبارة التالية:
I = I + 2

تبقى قيمة Counter ثابتة في الحلقة Do While.Loop السابقة (I=1)، وهذا بسبب نسيان زيادة قيمته. يبقى البرنامج في هذه الحالة ضمن الحلقة إلى اللانهاية، لأن قيمة I دوماً أصغر من 1001 ولكن تكون أبداً أكبر من 500. بل في الواقع تساوي 1 على الدوام.
العبارة With
تمكّنك العبارة With من إسناد القيم إلى عدة خصائص لكائن ما، دون كتابة اسم الكائن لكل خاصية (أي دفعة واحدة).
خذ مثلاً العبارة With التالية التي تسند مجموعة من خصائص عنصر التحكم cmdMyButton:
With cmdMyButton
.Height = 300 .ClientWidth = 4725
.Caption = "&My Button"
End With
تلعب عبارة With نفس دور العبارات التالية:
cmdMyButton.Height = 300cmdMyButton.Width = 4725
cmdMyButton.Caption = "&My Button"
توفر عبارة With كما نلاحظ وقت الإدخال (زمن كتابة نص البرنامج). فبدلاً من كتابة اسم عنصر التحكم مع كل خاصية. يكفي كتابة اسم عنصر التحكم لمرة واحدة فقط على سطر العبارة With.
برنامج جمع الأعداد
سنصمم الآن برنامجاً يدعى برنامج جمع الأعداد.
يسمح برنامج جمع الأعداد، للمستخدم باختيار رقم ثم يجمع كل الأرقام الصحيحة من 1 وحتى ذلك الرقم. فمثلاً، يُجري برنامج جمع الأعداد، عملية الجمع التالية: عند اختيار الرقم 5:
1 + 2 + 3 + 4 + 5 = 15
ويظهر الناتج.
التمثيل المرئي لبرنامج جمع الأعداد
سننجز الآن التصميم المرئي لبرنامج جمع الأعداد:
افتح مشروعاً جديداً من نوع Standard EXE، واحفظ النموذج باسم Sum.frm في الدليل C:\VB5Prg\Ch03 واحفظ المشروع بالاسم Sum.Vbp في ذات الدليل.
أنشئ النموذج frmSum طبقاً للجدول 3-2.
يفترض أن يظهر النموذج المكتمل، كما في الشكل 3-4.
الجدول 3-2. جدول خصائص النموذج frmSum.
الكائن الخاصية القيمة
Form Name frmSum
Caption برنامج جمع الأعداد
RightToLeft True
CommandButton Name cmdExit
Caption &خروج

الكائن الخاصية القيمة
RightToLeft True
CommandButton Name cmdSumIt
Caption ا&جمع
RightToLeft True
Text Box Name txtResult
Text (اجعله فارغاً)
Alignment 2-Center
MultiLine True
Enabled False
RightToLeft True
Label Name lblResult
Caption الرقم المختار: 1
RightToLeft True
Vertical Scroll Bar Name vsbNum
Min 1
Max 500
Value 1



الشكل 3-4 النموذج frmSum.
أسندت القيمة False إلى الخاصية Enabled لمربع النص txtResult لمنع المستخدم من الكتابة داخل مربع النص أو تعديله.
إدخال نص برنامج جمع الأعداد
سنكتب الآن نص برنامج جمع الأعداد:
تحقق بأن العبارة Option Explicit موجودة ضمن قسم التصاريح العامة General Declaration:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmSum:
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء cmdSumIt_Click() للنموذج frmSum:
Private Sub cmdSumIt_Click()
Dim I
Dim R
For I = 1 To vsbNum.Value Step 1
R = R + I
Next
txtResult.Text = Str(R)
End Sub
أدخل النص التالي ضمن الإجراء vsbNum_Change():
Private Sub vsbNum_Change()
lblNum = "الرقم المختار: " + Str(vsbNum.Value)
End Sub
أدخل النص التالي ضمن الإجراء vsbNum_Scroll():
Private Sub vsbNum_Scroll()
vsbNum_Change
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ برنامج جمع الأعداد
نفّذ برنامج جمع الأعداد.
اختر رقماً بالنقر على رمزي الأسهم لشريط التمرير العمودي أو بسحب مؤشر شريط التمرير.
يستجيب البرنامج بإظهار الرقم الذي اخترته.
انقر الزر اجمع.
يستجيب البرنامج بإظهار ناتج الجمع في مربع النص (انظر الشكل 3-5).
الشكل 3-5 برنامج جمع الأعداد.
فمثلاً، يظهر البرنامج الرقم 15 عند اختيار الرقم 5 بواسطة شريط التمرير العمودي ثم النقر على الزر اجمع (أي 1 + 2 + 3 + 4 +5 = 15).
أنهِ البرنامج بنقر الزر خروج.
كيف يعمل برنامج جمع الأعداد
يستخدم البرنامج حلقة For.Next لإنجاز عملية الجمع.
نص الإجراء cmdSumIt_Click()
ينفذ الإجراء cmdSumIt_Click() عند نقر الزر اجمع:
Private Sub cmdSumIt_Click()
Dim I
Dim R
For I = 1 To vsbNum.Value Step 1
R = R + I
Next
txtResult.Text = Str(R)
End Sub
يُصرح الإجراء عن متحولين، وهما I و R، وتحسب الحلقة For.Next المجموع:
1 + 2+ 3+ . . . + vsbNum.Value
تساوي القيمة الابتدائية للمتحول R إلى صفر، لأن لغة فيجول بيسك، تُسند القيمة الابتدائية صفر إلى المتحولات آلياً، عند التصريح عنها لأول مرة. لكن يفضل بعض المبرمجين استخدام عبارة زائدة، مثل:
R = 0
قبل عبارة For وذلك زيادة في الإيضاح.
تُحدِّث آخر عبارة في الإجراء، الخاصية Text لمربع النص بمحتويات المتحول R.
نص الإجراء vsbNum_Change()
يُنفذ هذا الإجراء عند تغيير موضع مؤشر شريط التمرير:
Private Sub vsbNum_Change()
lblNum = "الرقم المختار: " + Str(vsbNum.Value)
End Sub
يُحدِّث الإجراء vsbNum_Change() بإسناد الخاصية Value لشريط التمرير، إلى الخاصية Caption للافتة lblNum، وذلك لتمكين المستخدم من أخذ قراءة الوضعية الحالية لشريط التمرير.
لاحظ أن العبارة:
lblNum = "الرقم المختار: " + Str(vsbNum.Value)
هي ذات العبارة:
lblNum.Caption = "الرقم المختار: " + Str(vsbNum.Value)
فعند إسناد قيمة إلى عنصر تحكم من نوع لافتة Label بدون ذكر اسم الخاصية، يَفترض فيجول بيسك أنك ترغب بإسناد القيمة إلى الخاصية Caption للافتة، لأن الخاصية Caption هي الخاصية الافتراضية لهذا العنصر (اللافتة).
نمتلك عناصر التحكم الأخرى كحال عنصر اللافتة خصائص افتراضية، فمثلاً الخاصية الافتراضية لعنصر التحكم Text Box (مربع نص) هي الخاصية Text، وهكذا فالعبارة:
txtMyTextBox.Text = " Hello "
هي نفس العبارة
txtMyTextBox = " Hello "

ملاحظة
تعوّد دائماً على عدم استخدام الخاصية الافتراضية (إلا بشرط ستعرفه في آخر هذه الملاحظة)، لأنك أحياناً قد تخطئ في كتابة اسم الكائن، الذي لم تسند له الخاصية الافتراضية، ليعتبره فيجول بيسك حينها متحولاً عادياً. مثلاً، افترض وجود مربع نص لديك باسم txtMyText، وأنك تريد إظهار نص معين فيه، (باستخدام ميزة الخاصية الافتراضية)، عندها ستكتب العبارة التالية:
txtMyText = "مرحباً"
ولكنك بدلاً من كتابة العبارة السابقة، كتبت ما يلي خطأً:
txtMText = "مرحباً"
عندها سيعتبر فيجول بيسك أن txtMText عبارة عن متحول عادي، وسيسند له القيمة "مرحباً"، التي لن تظهر في مربع النص txtMyText.
أما إذا كتبت ما يلي:
txtMText.Text = "مرحباً"
عندها سينبهك فيجول بيسك أن txtMText ليس عنصر تحكم، ولا يملك الخاصية Text.
تستطيع حل المشكلة السابقة، بكتابة العبارة Option Explicit في قسم التصاريح العامة، التي تنبهك أن txtMText غير مصرح عنه.
لاحظ مدى أهمية العبارة Option Explicit في برنامجك، وكيف تحل لك الكثير من أخطاء الإدخال، لذلك تعود دائماً على استخدامها.
نص الإجراء vsbNum_Scroll()
ينفذ هذا الإجراء عندما يسحب المستخدم مؤشر شريط التمرير:
Private Sub vsbNum_Scroll()
vsbNum_Change
End Sub
ينفذ هذا الإجراء vsbNum_Change()، وهكذا يؤدي تحريك مؤشر شريط التمرير، إلى تنفيذ الإجراء vsbNum_Change() والذي يحدِّث بدوره اللافتة بقيمة الخاصية Value لشريط التمرير.
برنامج المؤقِّت
يوضح برنامج المؤقِّت، كيفية استخدام عنصر التحكم Timer.
التمثيل المرئي لبرنامج المؤقِّت
يوضح الشكل 3-6 كيف يبدو عنصر التحكم Timer. ضع مؤشر الفأرة فوق هذا العنصر ليظهر مستطيل أصفر مع الرسالة النصية Timer داخله، وبهذه الطريقة تتأكد من سلامة اختيار العنصر.
لاحظ أن مواقع الرموز ضمن مربع الأدوات قد تختلف عن الموجودة لديك بعض الشيء.
الشكل 3-6 رمز عنصر تحكم الميقاتية Timer داخل إطار مربع الأدوات.
أنشئ مشروعاً جديداً من نوع Standard EXE، واحفظ نموذج المشروع بالاسم Timer.frm في الدليل C:\VB5Prg\Ch03 واحفظ ملف المشروع بالاسم Timer.Vbp في ذات الدليل.
أنشئ النموذج frmTimer طبقاً للجدول 3-3.
يفترض أن يبدو النموذج عند الكتابة، كما في الشكل 3-7.
الجدول 3-3. جدول خصائص النموذج frmTimer.
الكائن الخاصية القيمة
Form Name frmTimer
Caption برنامج المؤقت
RightToLeft True

CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Timer Name tmrTimer
Enabled True
Interval 2000
الشكل 3-7 النموذج frmTimer.
إدخال نص برنامج المؤقِّت
سنكتب الآن نص برنامج المؤقِّت:
تحقق بأن العبارة Option Explicit موجودة ضمن قسم التصاريح العامة frmTimer:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmTimer:
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء trmTimer_Timer() للنموذج frmTimer:
Private Sub trmTimer_Timer()
Beep
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ برنامج المؤقِّت
نفّذ برنامج المؤقِّت.
يطلق برنامج المؤقِّت، صوتاً كل ثانيتين (2000 ملي ثانية)، ولا يظهر عنصر التحكم Timer أثناء تنفيذ البرنامج، لكن يظهر فقط أثناء مرحلة التصميم. ستتعرف عبر الكتاب على بعض عناصر التحكم الأخرى التي لا تشاهد أثناء زمن التنفيذ.
انقر الزر خروج لإنهاء البرنامج.
كيف يعمل برنامج المؤقِّت
يستخدم البرنامج عنصر التحكم Timer. والبرنامج ينفذ الإجراء tmrTimer_Timer() آلياً كل 2000 ميلي ثانية (كل ثانيتين).
نص الإجراء tmrTimer_Timer()
تم إسناد القيمة 2000إلى الخاصية Interval للميقاتية tmrTimer أثناء مرحلة التصميم، مما يتسبب بتنفيذ الإجراء tmrTimer_Timer() آلياً كل 2000 ميلي ثانية (ثانيتين).
Private Sub trmTimer_Timer()
Beep
End Sub
وهكذا، يعيد الحاسب صوت الرنين كل ثانيتين.
وباعتبار أن رمز الميقاتية Timer لا يظهر عند التنفيذ، وبالتالي فإن موقعه ضمن النموذج ليس هاماً، أي ضعه في أي مكان شئت، بشرط مشاهدته.
تحسين برنامج المؤقِّت
سنحسن الآن برنامج المؤقِّت:
أضف زر آخر Command Button، إلى النموذج frmTimer، حسب الشكل 3-8. يفترض أن يحمل زر الأمر هذا الخصائص التالية:
Name: cmdEnableDisable
Caption: &تفعيل
الشكل 3-8 إضافة الزر تفعيل إلى النموذج frmTimer.
عدِّل قسم التصاريح العامة General Declarations في النموذج frmTimer بحيث يغدو كالتالي:
'يجب التصريح عن كل المتحولات
Option Explicit
'gKeepTrack التصريح عن المتحول
Dim gKeepTrack
يبين الشكل 3-9 قسم التصاريح العامة General Declarations للنموذج frmTimer.
تستطيع زيادة أو تكبير قسم التصاريح العامة بنقر بداية السطر Option Explicit ثم ضغط المفتاح Enter على لوحة المفاتيح عدة مرات. تتمكن بهذه الطريقة من إضافة عدة أسطر خالية إلى هذا القسم، تستطيع بعد إضافة الأسطر كتابة نص البرنامج المناسب فيها.
الشكل 3-9 قسم التصاريح العامة للنموذج frmTimer.
عدِّل الإجراء tmrTimer_Timer().
Private Sub Timer_Timer()
'gKeepTrack أصدر رنينا إذا كانت قيمة المتحول
'تساوي الواحد
If gKeepTrack = 1 Then
Beep
End If
أضف النص التالي إلى الإجراء cmdEnableDisable:
Private Sub cmdEnableDisable_Click()
If gKeepTrack = 1 Then
gKeepTrack = 0
cmdEnableDisable.Caption = "&تفعيل"
Else
gKeepTrack = 1
cmdEnableDisable.Caption = "&تعطيل"
End If
End Sub
احفظ المشروع بالطريقة المعتادة.
تنفيذ برنامج المؤقِّت
نفّذ برنامج المؤقِّت. (اضغط المفتاح F5)
لا يصدر البرنامج صوتاً كل ثانيتين.
انقر الزر تفعيل، لتمكين عملية إصدار الصوت.
يتبدل عنوان الزر تفعيل إلى تعطيل، ويطلق البرنامج صوت رنين Beep كل ثانيتين (انظر الشكل 3-10).
الشكل 3-10 الزر cmdEnableDisable وهو يحمل الآن العنوان تعطيل.
انقر الزر تعطيل.
يعود عنوان الزر إلى تفعيل، ويتوقف البرنامج عن إصدار الصوت Beep.
كرر عملية النقر على الزر عدة مرات، وبعد انتهائك غادر البرنامج بنقر زر خروج.
نص قسم التصاريح العامة للنموذج frmTimer
يتضمن هذا القسم التصريح التالي عن المتحول gKeepTrack:
'gKeepTrack التصريح عن المتحول
Dim gKeepTrack
السؤال المطروح الآن. ما هو السبب وراء التصريح عن المتحول gKeepTrack هنا ؟!.
يفيد التصريح عن المتحولات ضمن هذا القسم إلى جعله مرئياً لكل إجراءات النموذج frmTimer. فمثلاً، لو صرحنا عن المتحول gKeepTrack ضمن الإجراء
tmrTimer_Timer() بدلاً من التصريح عنه ضمن قسم التصاريح العامة، فمن الممكن استخدام هذا المتحول ضمن الإجراء tmrTimer_Timer() فقط، ولا يمكن للإجراءات الأخرى الوصول إليه ومعرفة قيمته. ولكن التصريح عنه ضمن قسم التصاريح العامة General Declarations يجعله بمتناول كل الإجراءات والتوابع الوظيفية الموجودة في النموذج frmTimer.
ملاحظة
يدل الحرف الأول من المتحول gKeepTrack هو g، على أن هذا المتحول مصرح عنه في قسم التصاريح العامة General Declarations.
ولا يعتبر استخدام هذا الحرف إلزاميا أو من متطلبات لغة فيجول بيسك، إلا أنه أسلوب جيد برمجياً. لهذا سنستخدم الحرف g عبر هذا الكتاب عند التصريح عن المتحولات ضمن قسم التصاريح العامة.
نص الإجراء tmrTimer_Timer()
ينفذ هذا الإجراء كل ثانيتين وذلك بسبب إسناد القيمة 2000 إلى الخاصيةInterval لعنصر التحكم trmTimer:
Private Sub tmeTimer_Timer()
'gKeepTrack إذا كانت قيمة المتحول
'تساوي الواحد
If gKeepTrack = 1 Then
Beep
End If
End Sub
تنفذ العبارة Beep إذا تحقق الشرط If. أي إذا كانت قيمة gKeepTrack تساوي الواحد. لاحظ أننا لم نصرح عن gKeepTrack داخل هذا الإجراء، لكن الإجراء يتمكن من التعرف على المتحول بسبب التصريح عنه ضمن قسم التصاريح العامة كما اتفقنا.
كما ذكرنا أيضاً أن فيجول بيسك يعطي المتحولات القيمة الابتدائية "صفر"، لحظة التصريح عنها، (وبالتالي لا يكون الشرط If هذا محققاً منذ بدء تشغيل البرنامج ولهذا لا يصدر صوتاً كل ثانيتين).
نص الإجراء cmdEnableDisable_Click()
ينفذ هذا الإجراء عند نقر الزر cmdEnableDisable:
Private Sub cmdEnableDisable_Click()
If gKeepTrack = 1 Then
gKeepTrack = 0
cmdEnableDisable.Caption = "&تفعيل"
Else
gKeepTrack = 1
cmdEnableDisable.Caption = "&تعطيل"
End If
End Sub
تنفذ العبارات الواردة ضمن السطرين If و Else إذا كانت قيمة gKeepTrack تساوي "الواحد"، فتصبح قيمة gKeepTrack مساوية الصفر وتبدل الخاصية Caption إلى &تفعيل.
أما إذا كانت قيمة gKeepTrack مساوية للصفر، فستنفذ العبارات الواقعة بين السطر Else و End If، وتصبح قيمة gKeepTrack مساوية إلى "الواحد" وتبدل الخاصية Captionإلى &تعطيل.
أيضاً، يتعرف الإجراء cmdEnableDisable_Click() على المتحول gKeepTrack وهذا بسبب التصريح عنه ضمن قسم التصاريح العامة.
تعديل برنامج المؤقِّت ثانية
كان الغرض من استخدام المتحول gKeepTrack إيضاح أن المتحول الذي يصرح عنه ضمن القسم General Declarations يصبح مرئياً لكل إجراءات النموذج. تستطيع عموماً كتابة برنامج المؤقِّت بدون استخدام المتحول gKeepTrack. استخدم الخطوات التالية لرؤية كيفية إنجاز ذلك:
احذف التصريح عن gKeepTrack من قسم التصاريح العامة للنموذج frmTimer، وبالتالي يجب أن يظهر هذا القسم كما يلي:
' يجب التصريح عن كل المتحولات
Option Explicit
كنا قد طلبنا منك إسناد القيمة True إلى الخاصية Enabled لعنصر التحكم tmrTimer.
غيّر وضعية الخاصية Enabled إلى False. يؤدي هذا العمل إلى إيقاف تنفيذ الإجراء tmrTimer_Timer().
غيّر الإجراء cmdEnableDisable بحيث يغدو كالتالي:
Private Sub cmdEnableDisable_Click()
If tmrTimer.Enabled = True Then
tmrTimer.Enabled = False
cmdEnableDisable.Caption = "&تفعيل"
Else
tmrTimer.Enabled = True
cmdEnableDisable.Caption = "&تعطيل"
End If
End Sub
غيّر الإجراء tmrTimer_Timer() بحيث يصبح كالتالي:
Private Sub trmTimer_Timer()
Beep
End Sub
احفظ المشروع.
تنفيذ برنامج المؤقِّت
نفّذ برنامج المؤقِّت وتحقق بأنه يعمل بنفس طريقة استخدام المتحول gKeepTrack.
أَنهِ البرنامج بنقر الزر خروج.
نص الإجراء tmrTimer_Timer()
ينفذ هذا الإجراء كل 2000 ميلي ثانية (أي كل 2 ثانية) إذا كانت قيمة الخاصية Enabled تساوي True. (طبعاً الفاصل الزمني يساوي 2000 ميلي ثانية، لأننا أسندنا القيمة 2000 إلى الخاصية Interval أثناء طور التصميم).
لن ينفذ الإجراء tmrTimer_Timer() عند بدء تشغيل البرنامج، وهذا لأننا أسندنا القيمة False إلى الخاصية Enabled، بينما إذا كانت قيمة Enabled تساوي القيمة True فسوف ينفذ الإجراء، ويصدر الحاسب صوتاً Beep كل ثانيتين.
Private Sub trmTimer_Timer()
Beep
End Sub
نص الإجراء cmdEnableDisable_Click()
ينفذ هذا الإجراء عندما ننقر الزر cmdEnableDisable:
Private Sub cmdEnableDisable_Click()
If tmrTimer.Enabled = True Then
tmrTimer.Enabled = False
cmdEnableDisable.Caption = "&تفعيل"
Else
tmrTimer.Enabled = True
cmdEnableDisable.Caption = "&تعطيل"
End If
End Sub
تتحقق العبارة If من قيمة الخاصية Enabled للعنصر Timer ؛ فإذا كانت القيمة تساوي True، فسوف تُنفذ العبارات الواقعة بين السطرين If و Else، فتصبح قيمة الخاصية Enabled مساوية إلى False وتتغير الخاصيةCaption للزر cmdEnableDisable إلى تفعيل.
وعلى العكس، تُنفذ العبارات الواقعة بين السطرين Else و End If إذا كانت قيمة الخاصية Enabled تساوي False، فتصبح قيمتها True وتغير الخاصية Caption للزر cmdEnable Disable إلى تعطيل.
تستخدم الكثير من البرامج، تقنية تغيير عنوان الزر (الخاصية Caption)، تبعاً للحالة الراهنة للبرنامج.
ملاحظة
يستخدم برنامج المؤقِّت زراً واحداً (الزر cmdEnableDisable)، لإنجاز مهمتي تفعيل وتعطيل (Enable و Disable) عنصر تحكم الميقاتية.
تصبح الخاصية Caption للزر مساوية إلى تعطيل، عند تفعيل الميقاتية Timer (وبهذا، يستطيع المستخدم نقر الزر، لتعطيل الميقاتية).
تصبح الخاصية Caption للزر مساوية إلى تفعيل، عند تعطيل الميقاتية (ويستطيع المستخدم نقر الزر، لتفعيل الميقاتية).
يُفضل تقليل عدد عناصر التحكم في نموذج البرنامج، قدر الإمكان، واستخدام خاصيتي التفعيل والتعطيل Enable و Disable، وذلك حتى لا نشوش المستخدم. ففي برنامجنا هذا، تمكنا بواسطة زر واحد من إنجاز مهمتين (تفعيل/تعطيل).
طبعاً، لا يعني هذا توحيد الأزرار ذات الأدوار المختلفة كلياً. فمثلاً، يجب أن لا نوحّد عمل الزر خروج والزر تفعيل/تعطيل.

الخلاصة
ناقش هذا الفصل، عبارات اتخاذ القرار في لغة فيجول بيسك وكذلك عبارات الحلقات. تعتبر هذه العبارات أحجار البناء الأساسية للغة البرمجة فيجول بيسك.
كما ركز هذا الفصل على عنصر التحكم Timer (الميقاتيه) ومفهوم مرئية المتحولات وكذلك على التوابع الوظيفية والإجراءات والطرائق.
الفصل الرابع
الفــأرة



سنتعلم في هذا الفصل كيفية اكتشاف واستخدام الحوادث التي تنجم عن استخدام الفأرة، والتعامل مع النقر على أحد أزرارها أو مع الدمج بين النقر على أحد أزرارها والضغط على لوحة المفاتيح. كما سنتعلم أيضاً ما يتعلق بسحب وإسقاط الكائنات بواسطة الفأرة.
برنامج التحريك
يوضح برنامج التحريك كيفية تصميم برامج تمكن المستخدم من تحريك الكائنات بواسطة الفأرة ضمن إطار البرنامج.
التمثيل المرئي لبرنامج التحريك
سنبدأ بطور التمثيل المرئي للبرنامج:
أنشئ الدليل C:\VB5Prg\Ch04، سنستخدم هذا الدليل لحفظ العمل المنجز فيه.
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم Move.Frm في الدليل C:\VB5Prg\Ch04، واحفظ ملف المشروع بالاسم Move.Vbp في نفس الدليل.
أنشئ النموذج frmMove لبرنامج التحريك طبقاً للجدول 4-1.
يفترض أن يبدو النموذج عند اكتماله كما في الشكل 4-1.

الشكل 4-1 النموذج frmMove في مرحلة التصميم.

يبين الشكل 4-2 رمز عنصر التحكم المدعو Image، ولقراءة اسم عنصر التحكم Image ضع مؤشر الفأرة فوق رمزه بدون النقر عليه، فيظهر إطار صغير أصفر يحمل النص Image داخله.

الشكل 4-2 رمز عنصر التحكم Image في إطار مربع الأدوات.

الجدول 4-1. جدول خصائص برنامج التحريك.
الكائن الخاصية القيمة
Form Name frmMove
Caption برنامج التحريك
RightToLeft True
BackColor Yellow
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Option Button Name optCub
Caption &كأس
BackColor Yellow
Value True
RightToLeft True
Option Button Name optClub
Caption &ورقة
BackColor Yellow
RightToLeft True
Option Button Name optBell
Caption &جرس
BackColor Yellow
RightToLeft True
Image Name imgCup
Picture Cup.Bmp
Image Name imgClub
Picture Club.Bmp
Image Name imgBell
Picture Bell.Bmp
يطالبك الجدول 4-1 بوضع ثلاثة عناصر تحكم من نوع Image في النموذج frmMove. تذكر ما يلي لدى استخدام الجدول 4-1:
لديك حرية تحديد خصائص الخط Font لعناصر التحكم التي تضعها في النموذج.
يطالبك الجدول بإسناد ملفات متنوعة من نوع BMP إلى الخصائص Pictures لعناصر التحكم Image. المشكلة أن هذه الملفات قد تكون متوفرة أو غير متوفرة لديك تبعاً لإصدار فيجول بيسك الذي تستخدمه. وهذه الملفات ستجدها في أحد الأدلة الفرعية تحت الدليل الذي تم تنصيب فيجول بيسك فيه. بل ستجدها غالباً تحت الدليل \Bitmaps. فإذا لم تتمكن من العثور عليها، (بسبب أن رزمة فيجول بيسك التي تستخدمها لا توفرها). فبإمكانك استخدام ملفات BMP من أي مصدر آخر. تستطيع مثلاً استخدام برنامج الرسام Paintالذي يأتي مع ويندوز لرسم صور خاصة بك وحفظها كملف من نوع BMP.
إدخال نص برنامج التحريك
سندخل الآن نص برنامج التحريك. ونبدأ كما قمنا بقسم التصاريح العامة General Delarations:
تحقق من أن قسم التصاريح العامة General Delarations للنموذج frmMove يحوي العبارة التالية:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_MouseDown():
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If optBell.Value = True Then
imgBell.Move X, Y
ElseIf optClub.Value = True Then
imgClub.Move X, Y
Else
imgCup.Move X, Y
End If
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_Click():
Private Sub cmdExit_Click()
End
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ برنامج التحريك
قبل أن نباشر بشرح نص البرنامج الذي كتبناه، دعنا نرى كيف يعمل أولاً:
نفذ برنامج التحريك.
حسب ما يظهره الشكل 4-3، يظهر البرنامج ثلاث صور، وثلاثة أزرار خيارات معنونة كالتالي كأس و ورقة و جرس.
يؤدي نقر زر الفأرة على نافذة البرنامج، إلى انتقال أحد الصور إلى الموقع الذي تم النقر بالفأرة عنده. تحدَد الصورة المطلوب تحريكها باختيار أحد أزرار الخيارات الثلاثة.
لنفترض مثلاً، أن الخيار يقع عند زر الخيار الجرس، يؤدي النقر بالفأرة في أي مكان نافذة البرنامج، إلى انتقال صورة الجرس إلى ذلك المكان (الشكل 4-3).
أنه البرنامج بنقر الزر خروج.
الشكل 4-3 برنامج التحريك بعد تحريك الجرس.
كيف يعمل برنامج التحريك
ستصادف لدى مناقشتنا برنامج التحريك، مصطلح إحداثيات النموذج Form Coordinates. لهذا ستبدأ مناقشتنا لبرنامج التحريك بعد هذا الموضوع.
إحداثيات النموذج Form Coordinates
يمكن تحديد إحداثيات نموذج وفق عدة وحدات قياس بواسطة الخاصية ScaleMode. علماً بأن فيجول بيسك يستخدم وحدة قياس تدعى twip، في الحالة الافتراضية (يوجد 1440 twips في البوصة الواحدة، 1 inch = 1440 twips).
ملاحظة
يمكن إسناد أي من الوحدات التالية إلى الخاصية ScaleMode:
- Twips كل بوصة واحدة تساوي 1440 twips.
- Points كل بوصة واحدة تساوي 72 Points (أي 72 نقطة).
- Pixels يتحدد عدد النقاط الضوئية في كل بوصة تبعاً لدقة تحديد الشاشة Resolution.
- Character يعرف الرّمز Character كمستطيل بعرض 128 Twips وارتفاع 240 twips.
- Inches بوصة.
- Millimeters ميليمترات.
- Centimeters سنتمترات.
يتحدد قيمة مبدأ نظام إحداثيات النموذج بالخاصيتين ScaleTop و ScaleLeft للنموذج. علماً بأن القيمة الافتراضية لهاتين الخاصيتين هي صفر. مما يعني أن الزاوية العليا اليسارية، لمنطقة النموذج تمثل مبدأ الإحداثيات وتتحدد بالإحداثيين (0.0). ويقصد بمنطقة النموذج المنطقة القابلة للاستخدام والتي لا تتضمن الحواف ولا شريط العنوان. (المنطقة التي يمكن وضع عناصر التحكم عليها).
إذاً باختصار، الخاصية ScaleTop للنموذج تساوي صفر، والخاصية ScaleLeft للنموذج تساوي صفر، والزاوية العليا اليسارية للنموذج، تقع عند الإحداثيين ( x = 0 و y = 0).
تزداد قيمة x كلما انتقلت باتجاه اليمين، وتزداد قيمة y كلما اتجهت إلى الأسفل (انظر الشكل 4-4).
الشكل 4-4 إحداثيات النموذج عندما ScaleTop = 0 و ScaleLeft = 0
النقطة A حسب الشكل 4-4، تقع عند الإحداثيين (x = 0 و y = 0). وتقع النقطة B عند الإحداثيين (x = 100 و y = 100)، وتقع C عند (x = 100 و y = 200)، بينما تقع D عند (x = 200 و y = 300).
ملاحظة
يتألف النموذج من شريط عنوان الإطار، وحواف الإطار، والمنطقة المُحَاطَة من شريط العنوان والحواف، والتي تدعى منطقة النموذج.
نص الإجراء cmdExit_Click()
ينفذ هذا الإجراء عند نقر الزر خروج. تتسبب عبارة End الموجودة ضمن الإجراء بإنهاء الإجراء:
Private Sub cmdExit_Click()
End
End Sub
نص الإجراء Form_MouseDown()
يمكن للفأرة أن تمتلك من زر واحد، وحتى ثلاثة أزرار. يؤدي الضغط على أي من أزرار الفأرة إلى الأسفل، ضمن منطقة النموذج، إلى تنفيذ الإجراء Form_MouseDown() آلياً.
ملاحظة
يقصد بضغط أزرار الفأرة، الضغط عليها إلى الأسفل Down، أما نقر Clicking الفأرة، فيقصد به ضغط أحد الأزرار ثم تحريره. ينفذ الإجراء Form_MouseDown() عند ضغط أحد أزرار الفأرة، (عندما تكون مشيرة الفأرة ضمن منطقة العمل للنموذج). وهكذا فالإجراء ينفذ، حتى قبل تحرير زر الفأرة.
لا ينفذ هذا الإجراء عند ضغط أحد أزرار الفأرة، فوق شريط عنوان النموذج، باعتبار أن منطقة النموذج لا تشمل شريط العنوان ولا الحواف Border. ينفذ الإجراء فقط عند نقر (أو ضغط) زر الفأرة في منطقة خالية (من عناصر التحكم) ضمن منطقة النموذج. فالإجراء Form_MouseDown() مثلاً، لا ينفذ عند ضغط زر الفأرة فوق الزر خروج، أو فوق أحد أزرار الخيارات.
وسائط الإجراء Form_MouseDown()
يمتلك الإجراء أربعة وسائط: Button و Shift و X و Y تحتوي هذه الوسائط على معلومات عن حالة الفأرة أثناء النقر عليها:
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If optBell.Value = True Then
imgBell.Move X, Y
ElseIf optClub.Value = True Then
imgClub.Move X, Y
Else
imgCup.Move X, Y
End If
End Sub
ستجد أن السطر الأول من الإجراء Form_MouseDown() يمتد على سطر واحد في نافذة نص البرنامج، بدلاً من سطرين، كما هي الحال هنا، وذلك طبعاً لأن عرض صفحة الكتاب لا يتسع لكامل السطر.
الوسيط الأول من الإجراء Form_MouseDown() عبارة عن متحول صحيح Integer يدعى Button. تُساعد قيمة هذا الوسيط، بتحديد الزر المضغوط (الأيسر، الأوسط، الأيمن). لا يكترث برنامج التحريك لهذا الوسيط لأنه لا يهتم من هو الزر المضغوط.
الوسيط الثاني من الإجراء أيضاً من النوع الصحيح ويدعى Shift، تشير قيمة هذا الوسيط، إلى حالة مفاتيح التحكم Shift و Ctrl و Alt لحظة ضغط أحد أزرار الفأرة. لعل أفضل اسم لهذا الوسيط هو ShiftCtrlAlt، لكن لا بد من العمل مع الاسم الذي فرضه مصممو فيجول بيسك. لا يكترث برنامج التحريك أيضاً لهذا الوسيط (لا يستخدمه). لأنه لا يبدي أي تصرف خاص تجاه الضغط على أحد هذه المفاتيح أثناء النقر على الفأرة.
الوسيطان الثالث والرابع هما X و Y، ويشيران إلى إحداثيي مؤشر الفأرة لحظة الضغط على زر الفأرة. طبعاً الإحداثيات تؤخذ بدلالة النموذج، لأن الإجراء ينفذ فقط عندما يكون مؤشر الفأرة ضمن منطقة النموذج. لنفترض مثلاً أن الخاصية ScaleMode للنموذج frmMove على الوضعية Twips، وأن قيمة كل من ScaleTop و ScaleLeft تساوي الصفر. إذا أعطى الإجراء Form_MouseDown() تقريراً بأن x = 0 و y = 0 عند النقر على الفأرة في منطقة النموذج فهذا معناه أن الضغط على الفأرة كان عند الزاوية العليا اليسارية. أما إذا كانت x = 10 و y = 20 فهذا يعني أن الضغط كان على بعد 10 twips من يسار النموذج و20 twips تحت قمة النموذج، وهكذا.
عبارة If.Else الواردة ضمن الإجراء Form_MouseDown()
تسهم عبارة If.Else ضمن الإجراء، بتحديد زر الخيار الذي انتقاه المستخدم. فمثلاً إذا كان زر الخيار الحالي هو الزر جرس فسوف يتحقق أول جزء من الشرط:
If optBell.Value = True Then
وستنفذ العبارة التالية:
imgBell.Move X, Y
التي تستخدم طريقة Move لنقل الصورة إلى الإحداثيين x و y.
طبعاً x و y هما إحداثيي مؤشر الفأرة عندما تم الضغط على زر الفأرة. إذاً باختصار، ستنقل صورة الجرس إلى النقطة ذات الإحداثيين x و y. (تصور أن عنصر التحكم Image محاط بمستطيل، تنقل الطريقة Move عنصر التحكم Image (والصورة المرافقة) بحيث تتوضع الزاوية العليا اليسارية للمستطيل عند الإحداثيين x و y بعد التحريك).
الطريقة Move
تستخدم طريقة Move لتحريك الكائنات المختلفة، مثل النماذج وعناصر التحكم.
استخدمنا العبارة imgCup.Move x,y مثلاً لنقل الكائن المدعو imgCup من موقعه الراهن إلى الموقع الجديد المحدد بالإحداثيين x و y:
imgCub.Move X, Y

ملاحظة
بعد تنفيذ العبارة التالية:
imgCup.Move x,y
يتحدد الموقع الجديد للزاوية العليا اليسارية للصورة بالإحداثيين x و y.
يؤدي استخدام العبارة التالية إلى توضع مركز الصورة عند الإحداثيين x و y:
imgCup.Move (X - imgCup.Width / 2),(Y - imgCup.Hight / 2)
معلومة هامة عن أزرار الخيارات Option Buttons
أنهينا برنامج التحريك. لكن بقيت نقطة واحدة بخصوص أزرار الخيارات Option Buttons لا بد لك من الإطلاع عليها.
يمكن اختيار زر واحد من أزرار الخيارات التي تنتمي إلى مجموعة واحدة.
ففي مثالنا لدينا ثلاثة أزرار خيارات Option Buttons، ولكن يمكن اختيار واحد فقط من الأزرار الثلاثة، فنستطيع اختيار الجرس أو الكأس أو الورقة ولكن لا تستطيع اختيار الجرس والكأس سوية.
قد تحتاج إلى استخدام أكثر من مجموعة أزرار خيارات واحدة ضمن نفس النموذج. تستطيع إضافة مجموعة ثانية من أزرار الخيارات إلى النموذج وفق ما يلي:

انقر نقرة مزدوجة على عنصر التحكم Frame في إطار مربع الأدوات (انظر الشكل 4-5 لمشاهدة شكل عنصر التحكم Frame ضمن مربع الأدوات). يؤدي وضع مؤشر الفأرة فوق أي عنصر تحكم ضمن مربع أدوات بدون ضغط أحد أزرار الفأرة، إلى ظهور مستطيل أصفر يحمل اسم عنصر التحكم المرافق. وبهذه الطريقة تستطيع التأكد من اسم عنصر التحكم الصحيح.
يستجيب فيجول بيسك بوضع عنصر التحكم Frame في النموذج frmMove.
الشكل 4-5 رمز عنصر التحكم Frame ضمن إطار مربع الأدوات.

الشكل 4-6 النموذج frmMove بعد إضافة عنصر التحكم Frame إليه (طور التصميم).
انقر نقرة مزدوجة على رمز عنصر التحكم Frame مجدداً ضمن إطار مربع الأدوات.
يستجيب فيجول بيسك بوضع عنصر تحكم Frame آخر في النموذج frmMove.
انقل وكبر عنصر التحكم Frame الثاني الذي وضعناه للتو في النموذج frmMove.
يفترض أن يبدو النموذج الآن حسب ما هو مبين في الشكل 4-7.
الشكل 4-7 النموذج frmMove بعد إضافة عنصري تحكم Frame إليه.
ضع الآن زري خيار في أول إطار Frame أضفناه إلى النموذج:
انقر (لا تنقر نقرة مزدوجة) على رمز زر الخيار في إطار مربع الأدوات.
ضع مؤشر الفأرة ضمن عنصر التحكم Frame الأول واسحب الفأرة.
يستجيب فيجول بيسك بوضع زر خيار في عنصر التحكم Frame.
يفترض أن يبدو النموذج الآن كما في الشكل 4-8.
الشكل 4-8 النموذج frmMove بعد إضافة زر خيار إلى عنصر التحكم Frame الأول.
كرر خطوات إضافة زر خيار إلى الإطارين. تذكر عدم النقر المزدوج على رمز زر الخيار في إطار مربع الأدوات. ضع زر خيار ثاني في الإطار الأول، وضع ثلاثة أزرار خيارات في الإطار الثاني.
يفترض أن يبدو النموذج كما في الشكل 4-9.
الشكل 4-9 النموذج frmMove بعد إضافة مجموعتي أزرار خيارات إليه ضمن الإطارين.
احفظ المشروع باختيار Save Project من القائمة File.
نفّذ برنامج التحريك.
النقطة الجديرة بالملاحظة أن النموذج frmMove يمتلك الآن ثلاثة مجموعات مستقلة من أزرار الخيارات Option Button. ولا يؤثر اختيار زر من مجموعة أولى على أي من المجموعات المتبقية، فاختيار كأس مثلاً لا يؤثر على المجموعتين الأخريتين. كذلك اختيار Option1 و Option3لا يؤثر على المجموعة الأولى. تستطيع التحقق من ذلك وفق ما يلي:
انتق Option1 و Option3وكأس ثم انظر إلى الشكل 4-10.
الشكل 4-10 اختيار أزرار خيارات من ثلاث مجموعات مستقلة.
بدّل الآن الخيارات في كل مجموعة من مجموعات أزرار الخيارات وراقب النتائج ؟
أنهِ البرنامج الآن بنقر الزر خروج.
انتهينا الآن من التمرن على برنامج التحريك. تستطيع إن شئت حذف الإطارين Frame1 و Frame2 وأزرار الخيارات Option1 وOption2 وOption3 وOption4 وOption5.
ولحذف أي من عناصر التحكم هذه، اختر العنصر بنقره مرة واحدة ثم ضغط المفتاح Delete على لوحة المفاتيح. وتستطيع إن شئت حذف كل زر من أزرار الخيارات ضمن الإطار ثم حذف الإطار، أو تستطيع حذف الإطار برمته مما سيتسبب بحذف كل عناصر التحكم الموجودة فيه.
برنامج الرسم
يوضح برنامج الرسم، كيف يمكن لبرنامج ما، استخدام حوادث الفأرة لإنشاء برنامج رسم بسيط.
التمثيل المرئي لبرنامج الرسم
سنبدأ كالعادة بطور التمثيل المرئي للبرنامج:
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم Draw.Frm في الدليل C:\VB5Prg\Ch04، واحفظ ملف المشروع بالاسم Draw.Vbp في نفس الدليل.
أنشئ النموذج frmDraw لبرنامج الرسم طبقاً للجدول 4 -2.
يفترض أن يبدو النموذج عند اكتماله كما في الشكل 4 -11.
الشكل 4 -11 النموذج frmDraw (طور التصميم).
الجدول 4-2. جدول خصائص النموذج frmDraw.
الكائن الخاصية القيمة
Form Name FrmDraw
Caption برنامج الرسم
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
إدخال نص برنامج الرسم
تحقق من وجود العبارة Option Explicit ضمن قسم التصاريح العامة.
Option Explicit
أدخل النص التالي ضمن الإجراء Form_MouseDown():
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer,X As Single, Y As Single)
frmDraw.CurrentX = X
frmDraw.CurrentY = Y
End Sub
أدخل النص التالي ضمن الإجراء Form_MouseMove():
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer,X As Single, Y As Single)
If Button = 1 Then
Line (frmDraw.CurrentX, frmDraw.CurrentY)- _
(X, Y), QBColor(0)
End If
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub
احفظ العمل المنجز باختيار Save Project من القائمة File.
تنفيذ برنامج الرسم
نفّذ برنامج الرسم.
يظهر الإطار الفارغ المبين في الشكل 4-12.
اضغط زر الفأرة وحركها أثناء ذلك. لترسم خطوط تبعاً لحركة الفأرة.
يسبب تحرير زر الفأرة بإيقاف الرسم. باختصار يمكنك الرسم بنفس الطريقة المتبعة في برنامج الرسام Paint الذي يأتي مع ويندوز. يبين الشكل 4-13شكلاً يمكن رسمه ببرنامجنا هذا.
الشكل 4-12 إظهار برنامج الرسم حال تشغيل البرنامج.
الشكل 4-13 الرسم بواسطة برنامج الرسم.
كما يوضح الشكل 4-14 كيف تستطيع الكتابة بواسطة برنامج الرسم.
الشكل 4-14 الكتابة بواسطة برنامج الرسم.
أنهِ البرنامج بعد انتهائك من الرسم بنقر الزر خروج.
كيف يعمل برنامج الرسم
يستخدم برنامج الرسم مضمونين متعلقين بالرسوم في فيجول بيسك: طريقة Line والخاصيتين CurrentX و CurrentY. ولفهم برنامج الرسم يلزمنا أولاً فهم هذين المضمونين.
الطريقة Line
تستخدم طريقة Line لرسم خط مستقيم، من نقطة إلى نقطة، ضمن نموذج. فمثلاً، تستخدم العبارة التالية:
Line (2000, 1500) - (5000, 6000)
لرسم خط من x =2000 ، y =1500 إلى x =5000 ، y =6000.
يبين الشكل 4-15 الخط المرسوم نتيجة تنفيذ هذه العبارة. يبدأ الخط على بعد
2000 twips من الجانب الأيسر للنموذج و 1500 twipsمن قمة النموذج (أي من النقطة A في الشكل 4-15)، وينتهي على بعد 5000 twipsمن الجانب الأيسر للنموذج 6000 twips من قمة النموذج (النقطة B في الشكل 4-15).
الشكل 5-14 رسم خط بواسطة الطريقة Line.
يمكن استخدام التابع الوظيفي QBColor() لتحديد اللون الذي سيرسم الخط به. يبين الجدول 4-3 الأرقام التي يستخدمها QBColor().

الجدول 4-3. الأرقام المستخدمة في التابع الوظيفي QBColor().
Number Color
0 Black
1 Blue
2 Green
3 Cyan
4 Red
5 Magenta
6 Yellow
7 White
8 Gray
9 Light Blue
10 Light Green
11 Light cyan
12 Light Red
13 Light Magenta
14 Light Yellow
15 Bright White
فمثلاً لرسم نفس الخط المبين بالشكل 4-15 بلون أسود، استخدم العبارة:
Line (2000, 1500) - (5000, 6000),QBColor(0)
ولرسم نفس الخط بلون أحمر، استخدم العبارة التالية:
Line (2000, 1500) - (5000, 6000),QBColor(4)
الخاصيتين CurrentX و CurrentY للنموذج
لن تجد لدى تفحصك خصائص النموذج، الخاصتين CurrentX و CurrentY لأن فيجول بيسك لا يمكّنك من إسناد قيمة إليهما في مرحلة التصميم. فقيمة هاتين الخاصتين يمكن تغييرها فقط أثناء زمن التنفيذ (أي ضمن نص البرنامج).
تُحَدَّثُ قيمة الخاصتين CurrentX و CurrentYآلياً من قبل البرنامج بعد استخدام شتى الطرق الرسومية. فمثلاً، يسند البرنامج بعد رسم خط بطريقة Line إحداثيات نقطة نهاية الخط إلى الخاصتين CurrentX و CurrentY. وهكذا فبعد تنفيذ العبارة التالية:
Line (2000, 1500) - (5000, 6000),QBColor(0)
تصبح قيمة CurrentX تساوي5000 وقيمة CurrentY تساوي 6000.
نص الإجراء Form_MouseDown()
ينفذ الإجراء Form_MouseDown() آلياً، عند ضغط زر الفأرة ضمن منطقة النموذج:
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
frmDraw.CurrentX = X
frmDraw.CurrentY = Y
End Sub
يسند هذا الإجراء الوسيطين X وY إلى الخاصتين CurrentX و CurrentY للنموذج frmDraw على التوالي. وهكذا فبعد ضغط زر الفأرة، يشير الإحداثيان CurrentX و CurrentY إلى المكان الذي ضُغط فيه زر الفأرة.
نص الإجراء Form_MouseMove()
ينفذ هذا الإجراء آلياً عند تحريك الفأرة ضمن منطقة النموذج. يحمل الوسيطان X و Y لهذا الإجراء نفس معنىX و Yفي الإجراء Form_MouseMove() (أي بمعنى أن XوY يمثلان إحداثيي مؤشر الفأرة).
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Line (frmDraw.CurrentX, frmDraw.CurrentY)- _
(X, Y), QBColor(0)
End If
End Sub
يختبر الإجراء قيمة Button للتحقق من أنه يجري الآن الضغط على الزر الأيسر للفأرة. فإذا كانت قيمة Button تساوي "1" فهذا معناه أنه يتم الضغط على الزر الأيسر للفأرة، وبالتالي تنفذ العبارة التالية:
Line (frmDraw.CurrentX, frmDraw.CurrentY)-(X,Y), QBColor(0)
ترسم هذه العبارة خطاً بلون أسود بدءاً من الموقع المحدد بالخاصتين CurrentX وCurrentY إلى الموقع الراهن للفأرة.
تذكر دائماً أن البرنامج يُحَدَّثُ قيمة الخاصتين CurrentX و CurrentYبعد تنفيذ طريقة Line آلياً بإحداثيات نقطة نهاية الخط. مما يعني أنّ التنفيذ التالي للإجراء
Form_MouseMove() سيتسبب برسم خط جديد بدءاً من نقطة نهاية الخط السابق.
ينفذ البرنامج الإجراء Form_MouseMove() عند تحريك الفأرة، ويرسم خطاً جديداً بدءاً من نهاية الخط السابق وحتى الموقع الحالي للفأرة في حال ضغط المستخدم على الزر الأيسر للفأرة.
لاحظ أن هذا الإجراء ينفذ مجدداً ومجدداً كلما حركت الفأرة. وإذا تم الضغط أثناء التحريك على زر الفأرة الأيسر فسيرسم خط مع كل تنفيذ للإجراء Form_MouseMove(). والخط يرسم بدءاً من نقطة نهاية الخط السابق وحتى الموقع الحالي لمؤشر الفأرة.
نص الإجراء cmdExit_Click()
Private Sub cmdExit_Click()
End
End Sub
الخاصية AutoRedraw
هناك خلل في برنامج الرسم. اتبع الخطوات التالية للتعرف على المشكلة:
نفّذ برنامج الرسم وارسم عدة خطوط بواسطته.
صغِّر إطار البرنامج. (انقر رمز إشارة الناقص الذي يظهر عند الزاوية العليا من الإطار لتصغير النافذة).
يستجيب برنامج الرسم بإظهار نفسه كرمز (Icons) على شريط مهام ويندوز.
استرجع إطار برنامج الرسم. (انقر رمز البرنامج الموجود حالياً على شريط مهام ويندوز Windows).
كما تشاهد، اختفت الخطوط التي رسمتها.
تظهر نفس المشكلة عند تغطية جزء من إطار برنامج الرسم بإطار آخر. تحل هذه المشكلة ببساطة، بإسناد القيمة True إلى الخاصية AutoRedraw للنموذج frmRedraw في طور التصميم.
أسند القيمة True إلى الخاصية AutoRedraw للنموذج frmRedraw.
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
يعيد فيجول بيسك رسم الإطار عندما تدعو الحاجة، عندما تكون قيمة الخاصية AutoRedraw تساوي True (حسب ما يتوضح من اسم الخاصية نفسها). لنشاهد ذلك على أرض الواقع.
نفّذ برنامج الرسم وارسم بضعة خطوط.
صغر إطار البرنامج. (بنقر رمز التصغير الموجود عند الزاوية العليا اليمنى من الإطار).
يستجيب البرنامج بإظهار نفسه كرمز على شريط مهام ويندوز.
استرجع إطار برنامج الرسم. (انقر رمز البرنامج الموجود الآن على شريط مهام ويندوز).
كما تشاهد، تظهر الخطوط التي كانت مرسومة.
إذاً تعلمنا أن إسناد قيمة True إلى الخاصية AutoRedraw يمّكن البرنامج من إعادة رسم محتويات الإطار عندما تدعو الحاجة إلى ذلك.
حاول ألا تستخدم هذه الخاصية، رغم أنها قد تبدو ملاءمة للاستخدام ضمن البرنامج. قد تستغرب!!. فهذه الخاصية تتسبب بانخفاض أداء البرنامج. سنتعلم طرائق أخرى من هذا الكتاب أكثر ملاءمة لإعادة إنعاش الإطار.
برنامج الفأرة الراسمة
ينبغي أن لا يُشغل البرنامج المكتوب بلغة فيجول بيسك نفسه على الدوام بتنفيذ الإجراء Form_MouseMove() عند تحريك الفأرة، لأن ذلك يمنعه من تنفيذ أي برنامج آخر أثناء تحريك الفأرة. يتفحص برنامجنا هذا حالة الفأرة خلال فترات زمنية ثابتة فقط مما يسمح له بتنفيذ المهام الأخرى عند تحريك الفأرة. فإذا اكتشف البرنامج أن الفأرة حركت منذ آخر اختبار، فسوف ينفذ الإجراء Form_MouseMove().
التمثيل المرئي لبرنامج الفأرة الراسمة
سنبدأ كعادتنا بطور التمثيل المرئي لنموذج البرنامج:
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم HowOften.Frm في الدليل C:\VB5Prg\Ch04، واحفظ ملف المشروع بالاسم HowOften.Vbp في نفس الدليل.
أنشئ النموذج frmHowOften طبقاً للجدول 4-4.
يفترض أن يبدو النموذج عند اكتماله كما في الشكل 4-16.

الشكل 4-16 النموذج frmHowOften (في طور التصميم).
الجدول 4-4. جدول خصائص النموذج frmHowOften.
الكائن الخاصية القيمة
Form Name frmHowOften
Caption برنامج الفأرة الراسمة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
إدخال نص برنامج الفأرة الراسمة
كالعادة، تحقق من وجود العبارة Option Explicit ضمن قسم التصاريح العامة General Declaration للنموذج frmHowOften. (أي اكتبها إذا لم تكن موجودة).
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_MouseMove():
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Circle (X, Y), 40
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub

ليست هناك تعليقات:

إرسال تعليق