محتويات الدرس الرابع :
1. ما هو الحدث ؟
2. كيف تستجيب للحدث ؟
3. نافذة البرمجة
4. الأحداث المشتركة
1. المتغيرات والمصفوفات والإجراءات
ما هو الحدث ؟
الحدث Event هو كل مايقوم به المستخدم من حركات بالفأرة كالنقر أو النقر المزدوج أو ما يقوم به من ضغط على لوحة المفاتيح .
كيف تستجيب للحدث ؟
عند وقوع الحدث هناك أمران : الأول ، هو الحدث نفسه كالنقر مثلاً والثاني هو الأداة التي وقع الحدث فوقها مثل زر الأوامر . يقوم "فيجول بيسيك" بإعداد إجراء حدث على كل أداة موجودة فوق النافذة ويكون الإجراء كما في الشكل التالي :
أي أن "فيجول بيسيك" يقوم بوضع إجراء فارغ لهذا الحدث ، وأنت تضع فيه التعليمات Code التي تريد أن تنفذها عند وقوع الحدث . لذلك يجب هنا أن تسأل نفسك : ماهي التعليمات في داخل إطار الإجراء . وبالتالي كلما نقر المستخدم هذا الزر أثناء تشغيل البرنامج ، فإن "فيجول بيسيك" يقوم بتنفيذ هذه التعليمات لاحظ كيف يربط "فيجول بيسيك" بين الأداة والحدث :
sub command1_click
فهو يضع كلمة sub وهي تحدد بدء الإجراء ثم يضع اسم الأداة ثم حرف (-)ثم اسم الحدث . وفي النهاية يضع عبارة end sub وهي تحدد نهاية الإجراء .
الأحداث الناتجة عن الفأرة
الحدث
معناه
متى يقع
Click
النقر
عند نقر المستخدم فوق الأداة أو النافذة ويمكن أن يقع أيضاً إذا ضغط المستخدم عصا المسافة على لوحة المفاتيح بينما التركيز على زر أوامر
DbClick
النقر المزدوج
عند نقر المستخدم نقراً مزدوجاً فوق الأداة أو النافذة
MouseMove
حركة الفأرة
عند تحريك المستخدم الفأرة فوق الأداة أو النافذة
MouseDown
زر الفأرة اسفل
عندما يقوم المستخدم بنقر زر الفأرة وقبل أن يحرره..أي أثناء عملية النقر
MouseUp
زر الفأرة ارتفع
بعد أن يقوم المستخدم بنقر زر الفأرة وتحريره . أي بعد عملية النقر .
Sub Command1_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)
End Sub
وهو هنا يعطيك متغيرات ، كل واحد منها يحمل معلومة معينة ، كما يلي :
المتغير Button :
الأحداث الأربعة السابقة تقع عند ضغط المستخدم بأي زر من أزرار الفأرة الثلاثة ويوضح لك المتغير Button أي زر منها قام المستخدم بضغطه ، وله ثلاثة احتمالات :
1. المستخدم ضغط الزر الأيسر
2. المستخدم ضغط الزر الأيمن
3. المستخدم ضغط الزر الأوسط
ولايمكن للمستخدم أن يضغط أكثر من زر في نفس الوقت . قإذا أردت أن تختبر إن كان المستخدم قد ضغط الزر الأيمن ، فإنك تكتب :
if button = 2 then …………..
فإذا كان المستخدم قد ضغط الزر الأيمن ، سيقوم "فيجول بيسيك" بتنفيذ الأمر التالي لكلمة then
التغير Shift :
يوفر لك معلومات عن حالة المفاتيح الثلاثة Ctrl و Shift و Alt أثناء ضغط زر الفأرة ، كما يلي :
1. المستخدم ضغط مفتاح shift
2. المستخدم ضغط مفتاح Ctrl
4 المستخدم ضغط مفتاح Alt
لاحظ أنه يمكن للمستخدم أن يضغط أكثر من مفتاح في نفس الوقت . في هذه الحالة يحتوي المتغير shift على مجموع المفاتيح التي ضغطها . فمثلاً إذا ضغط على مفتاحي ctrl و alt في نفس الوقت ، فإن المتغير shift سيحتوي على مجموعهما هو 6 لذلك إذا أردت أن تختر إن كان المستخدم ضغط مفتاح shift أثناء ضغطه لزر الفأرة ، فإنك تكتب :
if shift = 1 then
أو أردت أن تختبر إن كان قد ضغط مفتاحي alt و shift أثناء ضغطة لزر الفأرة
if shift = 5 then
المتغيران y,x :
يحددان موقع المشيرة داخل الأداة أثناء عملية ضغط زر الفأرة .
الأحداث الناتجة عن لوحة المفاتيح
هناك ثلاثة أحداث متعلقة بلوحة المفاتيح ، هي :
الحدث
معناه
متى يقع
Keypress
ضغط حرف
عندما يقوم المستخدم بضغط حرف من حروف آسكي فوف لوحة المفاتيح
KeyDown
المفتاح أسفل
عندما يقوم المستخدم بضغط أي حرف على حرف وقبل أن يحرره أي أثناء عملية الضغط
Keyup
المفتاح ارتفع
عندما يقوم المستخدم بضغط أي حرف على لوحة المفاتيح ثم يحرره أي بعد عملية الضغط
ويستخدم الحدث keypress عندما تريد أن تعرف الحرف الذي ضغطه المستخدم فوق لوحة المفاتيح
مثال :
Sub Form_KeyPress (keyascii As Integer)
Print keyascii
If keyascii = 81 Then
End
End If
End Sub
البرنامج الأول
1. المتغيرات
2. المصفوفات
3. الثوابت
المتغيرات
المتغير Variable هو اسم تستخدمه لحمل قيمة متغيرة . فمثلاً إذا أردت أن تسأل المستخدم عن اسمه ، فاسم المستخدم قيمة متغيرة لأنك لاتعرف ماهو . فممكن أن يكون "علي" أو "محمد" أو "عبدالمحسن" أو أي اسم آخر . لذلك نستخدم له متغير ، وليكن UserName$ في هذه الحالة يمكنك كتابة الأمر :
)"أدخل اسمك من فضلك"UserName$ = InputBox$ (
سيعرض "فيجول بيسيك" مربع حوار التالي :
ملاحظة : يستخدم امر inputbox$ لطلب معلومة من المستخدم.
شرح السطر السابق هو :
أن "فيجول بيسيك" يتيح للمستخدم أن يدخل اسمه في الخانة الموجودة في أسفل المربع .
وعندما ينتهي المستخدم من إدخال الاسم ، فإن "فيجول بيسيك" يضع هذا الاسم في المتغير username$ . ويبقى هذا المتغير يحمل هذه القيمة حتى تقوم بتغييرها.
ويمكنك استخدام القيمة التي يحملها المتغير كأن تضعها في متغير آخر ، مثل :
clientName$ = UserName$
فهنا سينسخ "فيجول بيسيك" القيمة الموجودة في المتغير username$ ويضعها في المتغير cilentname$ . ويمكن أن تضع هذه القيمة في أداة القائمة مثلاً :
list1.additem username$
ويمكنك تغيير القيمة التي يحملها المتغير بوضع قيمة جديدة داخله ، فيلغي "فيجول بيسيك" القيمة القديمة ويضع محلها القيمة الجديدة . مثلاً :
"عبدالرحمن مصلحusername$ = "
وهذا المتغير يُسمى متغير حرفي string variable لأنه يحتوي على مجموعة حروف . وتوجد كذلك متغيرات عددية وهي تستخدم لحمل الأعداد وليس الحروف . فمثلاً يمكنك أن تسأل المستخدم عن عمره وتضع القيمة التي يدخلها في متغير عددي :
)"أدخل عمرك ، من فضلك"userage = inputbox$ (
ويتميز المتغير العددي بإمكانية إجراء العمليات الحسابية مثل الطرح والضرب والقسمة عليه مثل برنامج الوحدات الذي قمتُ ببرمجته وشرحة
اختيار اسم المتغير
هناك شروط لاختيار اسم المتغير منها :
1. يجب ألا يزيد اسم عن 40 حرفاً
2. يجب أن يكون أول حرف منه حرفاً هجائياً
3. يجب ألا تستخدم كلمة من الكلمات المحجوزة reserved words كأسم للمتغير من الكلمات المحجوزة print و end ولكن يمكن أن تكون جزء من اسم اخر مثل PrintText
أنواع المتغيرات
نوع المتغير
معناه
مداه
Integer
عدد صحيح
من –32768 إلى 32767
Long
عدد صحيح
من –214748E إلى 21474
Single
عدد ذو فاصلة عشرية عائمة
-3.402823 إلى –1.40129
من 1.4012 إلى 3.4028
Double
عدد ذو فاصلة عشرية
-1.7976931 إلى –4.9406
من 4.94065 إلى 1.79769
Currency
=======
============
String
مجموعة من الحروف
من 0إلى 65.500 حرف تقريباً
Variant
بتاع كُـله
حرفي أو عددي
الإعلان عن المتغيرات
الإعلان عن المتغير أن تخبر "فيجول بيسيك" عن اسم المتغير ونوعه ، مثل :
Dim UserName As String
فهنا الأمر Dim يخبر "فيجول بيسيك" أننا نريد أن نعلن عن متغير ، وكلمة UserName كمتغير يحمل سلسلة حروف . في هذه الحالة ، يقوم "فيجول بيسيك" بحجز الذاكرة الضرورية لذلك المتغير وتهيئته .
لاحظ أن الإعلان عن المتغير ليس إجباري
الفائدة من الإعلان عن المتغيرات
عدم الإعلان عن المتغير قد يؤدي أحياناً إلى أخطاء خفية في برنامجك .فمثلاً انظر السطرين التاليين :
)"أدخل اسمك من فضلك"username$ = inputbox$ (
print usename$
سيقوم السطر الأول بالتنفيذ ويطلب المستخدم بالاسم ولكن لن يطبع اسم المتغير لإن الكلمة خطا (ناقصة حرف r ) ومع ذلك سوف يقوم"فيجول بيسيك" بتنفيذ البرنامج بدون أي مشاكل !!!
ولحل هذه المسألة ، يمكنك أن تخبر "فيجول بيسيك" أن يعرض رسالة خطا عند ورود أي متغيرات لم يسبق الإعلان عنها . وذلك عن طريق استخدام الأمر :
Option Explicit
ويتم الإعلان عن المتغيرات باستخدام أحد الأوامر التالية :
Dim ,Global ,Static
يجب الإلتزام بنوع المتغير
مثلا :
لا يجوز أن تعلن عن متغير عددي وتضع فيه قيمة حرفية
والعكس صحيح كذلك
مدى المتغيرات وعمرها :
المتغيرات العامة
المتغير العام هو المتغير الذي يمكنك أن تستخدمه من أي مكان في البرنامج ، أي أن مداه يشمل جميع البرنامج بجميع ملفاته ونوافذه .
ويبقى في الذاكرة طوال فترة عمل البرنامج ولا يحذف من الذاكرة إلا بعد انتهاء البرنامج .
ولكن يجب أن تضع الإعلان عن المتغير العام في ملف برمجة وليس في نافذة .
طريقة ادخال المتغيرات التي ترغب في جعلها متغيرات عامة هي
Global UserName As String
بعد هذا الإعلان ستتمكن من استخدام المتغير UserName من أي مكان داخل البرنامج وستجد أنه يحتفظ بقيمته طوال فترة عمل البرنامج .
المصفوفات
المصفوفة Array هي سلسلة من المتغيرات تحمل نفس الاسم ويتم التمييز بين المتغيرات داخل هذه المصفوفة باستخدام رقم المتغير داخلها .
يوفر استخدام المصفوفات وقتاً وجهداً كبيرين ، كما قد يؤدي إلى بساطة وصغر حجم البرنامج . لنفرض مثلاً أنك تريد أن تقرأ أسماء 50 موظفاً من ملف ، وأنك تريد أن تحتفظ بها في الذاكرة لتعديلها أو عرضها أو ترتيبها . فيكف تعمل ذلك ؟ إذا استخدمت متغيرات عادية ، ستضطر إلى الإعلان عن 50 متغيرا ثم تكرر أمر القراءة من الملف لكل واحد من هذه المتغيرات الخمسين ، ثم تضع ماقرأته في المتغير المناسب . وهذه مسألة شاقة بالطبع . كما أن ذلك سيؤدي إلى كبر حجم البرنامج دون داع . والحل المناسب لهذه المسألة هو أن تستخدم مصفوفة مكونة من 50 عنصراً وذلك بكتابة الأمر :
Dim EnpName(50) As String
هنا ، الاسم EmpName هو اسم المصفوفة ، والرقم (50) هو عدد العناصر داخلها ثم كلمة String تحدد نوع المتغيرات التي ستضعها في المصفوفة . كلمة as string اختيارية وإن لم تحددها سيكون نوع المتغيرات هو variant وبالتالي يمكن تخزين أي نوع فيه .
يمكنك قراءة أسماء الموظفين ووضعها في المصفوفة باستخدام تكرار For …Next
بالشكل التالي :
For counter = 0 to 49
Empname(counter) = inputbox$("أدخل اسم الموظف التالي")
Next counter
فهنا نستخدم تكرار for ..next (سوف نشرحها بالتفصيل في المحاضرات التالية)
لنطلب من المستخدم إدخال أسماء الموظفين . هذا التكرار يستمر خمسين مرة من صفر إلى 49 . لاحظ أن العد داخل المصفوفة يبدأ من صفر وليس من 1 . لذلك تبدأ المصفوفة من الرقم صفر وتستمر حتى 49 .
ويمكنك الإشارة إلى أي عنصر داخل المصفوفة بأن تذكر اسم المصفوفة ثم رقم العنصر داخلها .فمثلاً ، لتغير قيمة العنصر العاشر في المصفوفة ، فإنك تكتب :
"الدكتور منصور"empname(9) =
وإذا أردت قراءة القيمة الموجودة في المتغير رقم 20 داخل المصفوفة ووضعها في متغير آخر فإنك تكتب :
curname =empname(19)
لاحظ مرة أخرى أن الوضع الافتراضي للمصفوفات هو أن يبدأ العد داخلها من صفر . فإذا رغبت أن تجعل العد يبدأ العد من 1 ضع الأمر التالي :
option base 1
الثوابت
الثوابت تعني لها قيمة لاتتغير بعكس المتغير
مثلا بدلا من أن تضع قيمة معينة على كل البرنامج ضع ثابت لها في أول البرنامج ثم اكتب البرنامج على اساس الثابت بدلا من القيمة في كل البرنامج
مثال :
لنفرض أن لديك عشرين موظفاً تريد أن تطلب بياناتهم من المستخدم يمكنك أن تكتب عدد الموظفين وهو هنا 30 مباشرة في كل مرة تحتاج إلى ذلك مثل :
for counter = 1 to 30
…………………..
………………….
Next counter
لنفرض أنك كتبت أمراً مثل هذا في ستة أو سبعة مواضع داخل البرنامج ، ثم أردت بعد ذلك أن تغير عدد الموظفين من 30 إلى 60 . فماذا تفعل ؟ في هذه الحالة سوف تضطر إلى أن تبحث عن كل المواضع التي ذكرت فيها الرقم 30 وتغيره إلى 60 وإذا نسيت موضعاً سوف يؤدي ذلك إلى خلل في عمل البرنامج .
وكحل لتلك المسألة ، استخدم ثابتاً constant وضعة في بداية البرنامج أو الإجراء مرة واحدة وتضع فيه العدد الذي ترغب فيه ، مثل :
const NUM_OF_EMPLOYEES =30
وبعد ذلك تقوم في عملية التكرار بعمل التالي :
for counter = 1 to NUM_OF_EMPLOYEES
…………………..
………………….
Next counter
وبذلك يتحقق أمران : الأول أن الثابت NUM_OF_EMPLOYEES أسهل في تذكر معناه من الرقم 30 ، والثاني : انك لو أردت تغيير عدد الموظفين من 30 إلى 60 كما افترضنا من قبل ، فكل ماعليك القيام بة هو تغيير الثابت من القيمة القديمة إلى القيمة الجديدة .
وهناك فائدة أخرى أن "فيجول بيسيك"يستخدم نظاماً خاصا لتحديد درجات الألوان فإذا أردت أن تغير لون أداة إلى الأزرق أثناء تشغيل البرنامج ، فإنك تكتب :
LABEL1.BACKCOLOR = &HFF0000
فإن "فيجول بيسيك" يستخدم الرقم &HFF0000 للأزرق وغيرها من الألوان فكيف يمكنك أن تتذكر كل هذه الأرقام الغير مفهومة ؟
الحل : هو أن تضعها في ثوابت بالطريقة التالية :
const BLACK = &H0&
const RED = &HFF&
وبهذة الطريقة يمكنك أن تغير الألوان بطريقة مفهومة وسهلة الاستخدام
مثال :
LABEL1.BACKCOLOR = RED
مدى الثوابت :
مثل المتغيرات بالضبط فإذا كنت تريد أن تستعمل الثابت في كل النوافذ الموجودة في البرنامج فيجب أن تضع الثابت في ملف برمجة وتسبقه بكلمة Global
مثال :
Global const User_NAME = "ABSOFT2000"
أما إذا كنت تريد أن تستعمله في نافذة واحدة فضعه في داخل نافذة البرمجة الخاصة بتلك النافذة
الاجراءات
متى تحتاج إلى الاجراءات ؟
مع تزايد حجم البرنامج الذي تكتبه ، ستجد أن هناك أجزاءاً من البرنامج تحتاج إلى تنفيذها أكثر من مرة في أكثر من مكان. فمثلاً قد تحتاج أن تسأل المستخدم عن اسم ملف لحفظ البيانات فيه ثم تتأكد إن كان الاسم الذي ادخله المستخدم سليماً أم لا . فإن لم يكن سليماً تعاود الكرة وتسأله عن اسم صحيح ، وهكذا حتى يدخل اسماً صحيحا للملف أو يلغي الأمر . لنفرض أنك تحتاج إلى هذا الجزء في أكثر من مكان داخل برنامجك . فماذا تفعل ؟
يمكنك أن تكتب هذا الجزء مرة واحدة ثم تنسخه في كل مرة تحتاج إليه وتلصقه في المكان الجديد . لكن هذا يؤدي إلى أن يكبر البرنامج بدون داع . كما إنك إذا رغبت في تعديل هذا الجزء وتحسينه ، ستضطر إلى البحث عنه في كل مكان وضعته فيه وإجراء التحسينات عليه . وهذه مسألة شاقة . وقد تنسى تعديله في مكان مما يؤدي إلى وجود خلل في البرنامج .
الحل الأمثل هو أن تضع مجموعة الأوامر المتكررة في ( إجراء عام ) ثم تستدعي هذا الإجراء كلما احتجت له . وهذه هي فائدة الاجراءات
كيف تكتب الإجراء ؟
Object انقر نافذة البرنامج نقرا مزدوجا لكي تفتح لك نافذة البرمجة ثم إذهب إلى
واضغط السهم سوف ينسدل لك قائمة انقر منها (general)
وبعد ذلك سوف تجد نافذة البرمجة خالية اكتب فيها ما يلي :
اسم الاجراءsub
Sub Getfilename مثل :
ثم اضغط زر إدخال من لوحة المفاتيح يظهر لك مايلي :
Sub getfilename ( )
هنا تكتب الاوامر التي تريدها لهذا الاجراء
End sub
وعندما تريد أن تستدعي الاجراء ماعليك إلا أن تكتب اسمه فقط . البرنامج الثاني