تنفيذ برنامج الفأرة الراسمة
لنشاهد أثر ما كتبناه:
تنفيذ برنامج الفأرة الراسمة.
ضع مؤشر الفأرة في منطقة النموذج، ومن ثم حرك الفأرة.
يرسم الإجراء Form_MouseMove() مع تحريك الفأرة دوائر صغيرة عند الموقع الحالي للفأرة، وعموماً ستلاحظ أن الإجراء Form_MouseMove() لن ينفذ مع كل حركة للفأرة. (انظر الشكل 4-17).
يرسم الإجراء Form_MouseMove() قطاراً من الدوائر لدى تحريك الفأرة، وتزداد كثافة الدوائر المرسومة عند تحريك الفأرة ببطئ. ويقل عدد الدوائر المرسومة عند تحريك الفأرة بسرعة.
تذكر أن كل دائرة مرسومة هي دلالة على وقوع حادثة تحريك فأرة MouseMove. وبالتالي تنفيذ للإجراء Form_MouseMove().
الشكل 4-17 تحريك الفأرة في منطقة نموذج برنامج الفأرة الراسمة.
كيف يعمل برنامج الفأرة الراسمة
يستخدم برنامج الفأرة الراسمة الإجراء Form_MouseMove() لإنجاز العمل.
نص الإجراء Form_MouseMove()
ينفذ الإجراء Form_MouseMove() عندما يكتشف البرنامج أنه تم تحريك الفأرة بعد آخر عملية تحقق:
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Circle (X, Y), 40
End Sub
يرسم هذا الإجراء عند الموقع الحالي لمؤشر الفأرة باستخدام العبارة:
Circle (x, y) , 40
إلى رسم دائرة بقطر يساوي 40 وحدة قياس Unit (أي حسب وحدة القياس المستخدمة) وباعتبار أن الخاصية ScaleMode للنموذج تشير إلى Twip، فهذا يعني أن الطريقة Circle ستستخدم وحدة القياس Twip (القطر يقاس بالـ twips ويقاس مركز الإحداثيات بالـ twips).
نص الإجراء cmdExit_Click()
ينفذ هذا الإجراء عند نقر الزر خروج وينهي بدوره تنفيذ البرنامج:
Private Sub cmdExit_Click()
End
End Sub
برنامج أزرار الفأرة
سنكتب الآن برنامجاً يدعى برنامج أزرار الفأرة، يستخدم الوسيط Button لكل من الإجراءيين Form_MouseDown() و Form_MoveUp() لتحديد زر الفأرة الذي تم ضغطه أو تحريره.
التمثيل المرئي لبرنامج أزرار الفأرة
سنبني الآن نموذج برنامج أزرار الفأرة:
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم Button.Frm في الدليل C:\VB5Prg\Ch04 واحفظ ملف المشروع بالاسم Button.Vbp في نفس الدليل.
أنشئ النموذج frmButton طبقاً للجدول 4-5.
يفترض أن يبدو النموذج عند اكتماله كما في الشكل 4-18.
الشكل 4-18 النموذج frmButton (في طور التصميم).
الجدول 4-5. جدول خصائص النموذج frmButton.
الكائن الخاصية القيمة
Form Name frmButton
Caption برنامج أزرار الفأرة
BackColor White
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Text Box Name txtResult
Text (اجعله فارغاً)
Alignment 2-Center
MultiLine True
Enabled False
RightToLeft True
Label Name lblInstruction
Caption اضغط أحد أزرار الفأرة
Alignment 2-Center
BackColor White
RightToLeft True
Image Name imgMouse
Picture Mouse04.Ico
Stretch False
يطالبك الجدول 4-5 بإسناد اسم الملف Mouse04.Ico إلى الخاصية Picture لعنصر التحكم imgMouse. يقع هذا الملف في حال توفره ضمن الدليل الفرعي \Icons\Computer\ تحت الدليل الذي تم تنصيب لغة فيجول بيسك فيه. يمكنك طبعاً إسناد أي ملف آخر من نوع Ico إلى الخاصية Picture. ولا سيما إذا لم تجد الملف المذكور. فالغرض الوحيد من استخدام هذا الملف في برنامجنا أنه يتلاءم مع سياق العمل لأنه يمثل شكل الفأرة.
إدخال نص برنامج أزرار الفأرة
كالعادة، تحقق (أو أدخل) من وجود العبارة التالية: Option Explicit ضمن قسم التصاريح العامة General Declaration للنموذج frmButton:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_MouseDown():
Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
txtResult.Text = "زر الفأرة اليساري مضغوط الآن"
End If
If Button = 2 Then
txtResult.Text = "زر الفأرة اليميني مضغوط الآن"
End If
If Button = 4 Then
txtResult.Text = "زر الفأرة الوسطي مضغوط الآن"
End If
End Sub
أدخل النص التالي ضمن الإجراء Form_MouseUp():
Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
txtResult = ""
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ برنامج أزرار الفأرة
نفّذ برنامج أزرار الفأرة.
يظهر الإطار المبين في الشكل 4-19 عند بدء تشغيل برنامج أزرار الفأرة.
الشكل 4-19 إطار برنامج أزرار الفأرة.
يُظهر مربع النص اسم الزر المضغوط عند ضغط أحد أزرار الفأرة في منطقة خالية ضمن النموذج. يوضح الشكل 4-20 محتوى مربع النص نتيجة ضغط الزر الأيمن للفأرة. ويبين الشكل 4-21 محتوى مربع النص عند ضغط الزر الأيسر للفأرة. يُظهر برنامج أزرار الفأرة حالة زر الفأرة فقط عند الضغط على أحد أزرار الفأرة في منطقة خالية من النموذج.
الشكل 4-20 برنامج أزرار الفأرة عند الضغط على الزر الأيمن للفأرة.
الشكل 4-21 برنامج أزرار الفأرة عند الضغط على الزر الأيسر للفأرة.
ملاحظة
تدعى المنطقة غير المغطاة بعنصر تحكم فعال Enabled ضمن النموذج، بمنطقة خالية. فمثلاً الخاصية Enabled للافتة lblInstruction تساوي True، ولهذا لا تعتبر المنطقة التي تشغلها هذه اللافتة منطقة خالية.
ومن جهة أخرى، تساوي الخاصية Enabled لمربع النص txtResult إلى False وبالتالي فالمنطقة التي يشغلها مربع النص هذا عبارة عن منطقة خالية ضمن النموذج.
لا يؤدي النقر على اللافتة lblInstruction إلى تنفيذ الإجراء Form_MouseDown()، لأن منطقة هذه اللافتة كما اتفقنا لا تمثل منطقة خالية. وعلى العكس تعتبر منطقة مربع النص txtResult منطقة خالية ويؤدي النقر عليها إلى تنفيذ الإجراء Form_MouseDown().
لا يستجيب برنامج أزرار الفأرة عند النقر على الزر الأوسط للفأرة ما لم يتم تعريف الفأرة ضمن ويندوز بأنها ذات ثلاثة أزرار. (طبعاً في حال الفأرة ذات ثلاثة أزرار).
كيف يعمل برنامج أزرار الفأرة
يستجيب برنامج أزرار الفأرة لحادثة MouseDown (الضغط على زر فأرة) بتنفيذ الإجراء Form_MouseDown() ولحادثة تحرير الفأرة MouseUp بتنفيذ الإجراء Form_MouseDown().
نص الإجراء Form_MouseDown()
ينفذ هذا الإجراء تلقائياً بضغط أحد أزرار الفأرة في منطقة خالية ضمن النموذج. مهمة الإجراء تحديد الزر الذي تم ضغطه بفحص قيمة الوسيط Button.
عندما تكون قيمة الوسيط Button تساوي 1 فهذا معناه أنه تم الضغط على الزر الأيسر، وتعني القيمة 2 الضغط على الزر الأيمن، والقيمة 4 تشير إلى الضغط على الزر الأوسط:
Sub Form_MouseDown(Button As Integer,Shift As Integer,_
X As Single, Y As Single)
If Button = 1 Then
txtResult.Text = "زر الفأرة اليساري مضغوط الآن"
End If
If Button = 2 Then
txtResult.Text = "زر الفأرة اليميني مضغوط الآن"
End If
If Button = 4 Then
txtResult.Text = "زر الفأرة الوسطي مضغوط الآن"
End If
End Sub
نص الإجراء Form_MouseUp()
ينفذ هذا الإجراء تلقائياً عند تحرير زر الفأرة. يمحو نص هذا الإجراء محتويات مربع النص:
Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
txtResult = ""
End Sub
الوسيط Button في الإجراء Form_MouseMove()
يحدد الوسيط Button في إجراءات الفأرة الزر المضغوط لحظة وقوع الحادثة. وحسب ما ذكرنا فإن قيمة هذا الوسيط ضمن الإجراء Form_MouseDown() يمكن أن تساوي 1 أو 2 أو 4 ولا يمكن أن تتخذ أي قيمة أخرى مما يعني أنك لا تستطيع استخدام الحادثة MouseDown للتحقق من الضغط على أكثر من زر واحد.
أما بالنسبة للإجراء Form_MouseMove() فالأمر يختلف، إذ يمكن للوسيط Button أن يأخذ أي قيمة بين 0 و 7، مما يشمل كل الإمكانيات المحتملة لأزرار الفأرة الثلاث. فمثلاً، يساوي Button إلى 3 عند الضغط على الزرين الأيسر والأيمن والذي يكافئ الرقم الثنائي (00000011)، انظر الشكل 4-22.
الشكل 4-22 الوسيط Button للإجراء Form_MouseMove().
انظر الجدول التالي إذا لم تكن ملماً بالنظام الثنائي:
التدوين العشري Decimal Notation التدوين الثنائي Binary Notation
0 1 2 3 4 5 6 7 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111
فمثلاً عندما تكون قيمة Button تساوي صفر، فالقيمة الثنائية تساوي (00000000) وحسب الشكل 4-22، الضغط على كل أزرار الفأرة سوياً تكون القيمة الثنائية المرافقة هي (00000111)، وعندما تكون القيمة مساوية إلى 4 فهذا معناه الضغط على الزر الأوسط والقيمة الثنائية المرافقة (00000100).
برنامج أزرار الفأرة 2
يوضح برنامج أزرار الفأرة 2 كيفية استخدام الوسيط Button، في الإجراء Form_MouseMove().
التمثيل المرئي لبرنامج أزرار الفأرة 2
سنبدأ بطور التمثيل المرئي لبرنامج أزرار الفأرة 2:
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم Button2.Frm في الدليل C:\VB5Prg\Ch04، واحفظ ملف المشروع بالاسم Button.Vbp في نفس الدليل.
أنشئ نموذج البرنامج frmButton2 طبقاً للجدول 4-6.
الشكل 4 -23 النموذج 2frmButton في مرحلة التصميم.
الجدول 4-6. جدول خصائص النموذج frmButton2.
الكائن الخاصية القيمة
Form Name frmButton2
Caption برنامج أزرار الفأرة 2
BackColor White
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Check Box Name chkLeft
BackColor White
Caption يساري
Enabled False
Check Box Name chkMiddle
BackColor White
Caption وسطي
Enabled False
Check Box Name chkRight
الكائن الخاصية القيمة
BackColor White
Caption يميني
Enabled False
Image Name imgMouse
Picture Mouse04.Ico
Stretch False
Label Name lblInstruction
Caption اضغط أحد أزرار الفأرة ثم حركها
Alignment 2-Center
BackColor White
BorderStyle 1-Fixed Single
RightToLeft True
يطالبك الجدول 4-6 بإسناد اسم الملف Mouse04.Ico إلى الخاصية Picture لعنصر التحكم Image.فإذا لم يكن هذا الملف موجوداً أو لم يكن الدليل \Icons\Computer موجوداً لسبب ما، ضمن دليل لغة فيجول بيسك، تستطيع استخدام أي ملف آخر من نوع Ico.
يطالبك الجدول بإسناد القيمة False إلى الخاصية Stretch لعنصر التحكم Image. هذا يعني أن عنصر التحكم Image لن يوسِّع الصورة. فمثلاً إذا كانت الخاصية Picture لعنصر التحكم Image تشير إلى صورة بحجم Pixel 32x32، وكبرت بعدها حجم العنصر Image، فإن الصورة لن توسع ولن تغطي حجم عنصر التحكم Image. بل ستظهر الصورة بحجمها الأصلي فقط.
يسند الجدول القيمة False إلى الخاصية Enabled لكل مربع من مربعات الاختيار Check Boxes. مما يعني أن المستخدم لن يتمكن من اختيار هذه المربعات أو إلغاء اختيارها (أي حجبها) بالنقر بالفأرة عليها. وبدلاً من ذلك فإن نص البرنامج هو الذي سيختار أو يلغي اختيار مربعات التحكم بناءً على حالة أزرار الفأرة (وهو السبب وراء منع المستخدم من اختيار أو إلغاء هذه المربعات).
إدخال نص برنامج أزرار الفأرة 2
تحقق من وجود العبارة التالية ضمن قسم التصاريح العامة General Declaration:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_MouseMove():
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If (Button And 1) = 1 Then
chkLeft.Value = 1
Else
chkLeft.Value = 0
End If
If (Button And 2) = 2 Then
chkRight.Value = 1
Else
chkRight.Value = 0
End If
If (Button And 4) = 4 Then
chkMiddle.Value = 1
Else
chkMiddle.Value = 0
End If
End Sub
أدخل النص التالي ضمن الإجراء Form_MouseUp():
Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
chkLeft.Value = 0
End If
If Button = 2 Then
chkRight.Value = 0
End If
If Button = 4 Then
chkMiddle.Value = 0
End If
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج أزرار الفأرة 2
نفّذ برنامج أزرار الفأرة 2.
يبين الشكل 4-24 كيف يبدو إطار هذا البرنامج، لاحظ وجود ثلاثة مربعات اختيار:
يميني و وسطي و يساري.
الشكل 4-24 إطار برنامج أزرار الفأرة2.
يختار برنامج أزرار الفأرة 2 ويلغي مربعات الاختيار تبعاً لحالة أزرار الفأرة " أثناء تحريك الفأرة ". فمثلاً يختار البرنامج مربعي الاختيار يميني و يساري إذا ضغط المستخدم على زري الفأرة اليساري واليميني وحرك الفأرة، (انظر الشكل 4-25).
كيف يعمل برنامج أزرار الفأرة 2
يستخدم برنامج أزرار الفأرة 2 الوسيط Button2 للإجراء Form_MouseMove() لتحديد الزر أو مجموعة أزرار الفأرة التي ضغط عليها.
الشكل 4-25 برنامج أزرار الفأرة 2 عند الضغط على زري الفأرة اليساري واليميني (أثناء تحريكها).
نص الإجراء Form_MouseMove()
ينفذ الإجراء تلقائياً عند تحريك الفأرة ضمن منطقة نموذج البرنامج:
Private Sub Form_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If (Button And 1) = 1 Then
chkLeft.Value = 1
Else
chkLeft.Value = 0
End If
If (Button And 2) = 2 Then
chkRight.Value = 1
Else
chkRight.Value = 0
End If
If (Button And 4) = 4 Then
chkMiddle.Value = 1
Else
chkMiddle.Value = 0
End If
End Sub
يختار نص هذا الإجراء أو يلغي مربعات الاختيار تبعاً لقيمة الوسيط Button. تحدد أول عبارة lf في الإجراء إذا كان زر الفأرة الأيسر مضغوطاً وذلك بإجراء ضرب منطقي AND للوسيط Button مع القيمة 1.
فإذا كان ناتج حاصل الضرب يساوي 1 فهذا يعني أنه تم الضغط على الزر الأيسر، وبشكل مشابه إذا كان ناتج حاصل الضرب Button مع 2 منطقياً AND يساوي 2، فهذا معناه أنه تم الضغط على الزر الأيمن، وإذا كان ناتج الحاصل الضرب المنطقي AND لـ Button مع 4 يساوي 4 فهذا دلالة على أن الزر الأوسط مضغوط حالياً، لا تكترث لحاصل الضرب المنطقي AND إذا لم تكن على اطلاع به أو لست على علم بالنظام الثنائي، المهم أن تعرف ما يحدث عند الضغط على أزرار الفأرة أثناء تحريكها.
نص الإجراء Form_MouseUp()
ينفذ هذا الإجراء عند تحرير أي من أزرار الفأرة:
Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
chkLeft.Value = 0
End If
If Button = 2 Then
chkRight.Value = 0
End If
If Button = 4 Then
chkMiddle.Value = 0
End If
End Sub
يتحقق هذا الإجراء من الزر الذي حرر، ويلغي مربع الاختيار المرافق. فمثلاً تتحقق عبارة الشرط lf الأولى عند تحرير الزر الأيسر للفأرة ويلغى اختيار مربع الاختيار يساري.
ضغط المفاتيح Shift و Ctrl و Alt إلى جانب ضغط أزرار الفأرة
تمتلك الحوادث MouseDown و MouseUp وMouseMove القيمة الصحيحة Shift كثاني وسيط ضمن الإجراءات المرافقة لها، ويشير هذا الوسيط إلى المفتاح Shift و Ctrl و Alt المضغوط إلى جانب أزرار الفأرة.
يبين الشكل 4-26 كيف يشير الوسيط Shift إلى المفتاح المضغوط.
الشكل 4-26 الوسيط Shift.
حسب ما يوضحه الشكل 4-26. تمثل البتات bits الأدنى من الوسيط Shift حالة المفاتيح Shift و Ctrl و Alt أثناء الضغط على زر (أو أزرار) الفأرة.
يوضح الجدول 4-7 القيم الثمان المحتملة التي يمكن أن يمتلكها الوسيط Shift.
الجدول 4-7 القيم المحتملة للوسيط Shift.
القيمة الثنائية القيمة العشرية المفتاح Shift المفتاح Ctrl المفتاح Alt
00000000 0 لا لا لا
00000001 1 نعم لا لا
00000010 2 لا نعم لا
00000011 3 نعم نعم لا
00000100 4 لا لا نعم
00000101 5 نعم لا نعم
00000110 6 لا نعم نعم
00000111 7 نعم نعم نعم
فمثلاً، إذا كانت قيمة الوسيط Shift تساوي 6 في أحد الإجراءات Form_MouseDown أو Form_MouseUp و Form_MouseMove فهذا يعني ضغط المفتاحين Ctrl و Alt إلى جانب ضغط أحد أزرار الفأرة.
لا تنس أن الوسيط Button يمكن أن يأخذ القيم 1 و 2 و 4 فقط في الإجراء Form_MouseDown(). بعكس الوسيط Shift لنفس الإجراء والذي يمكن أن يأخذ أي قيمة ضمن الجدول 4-7.
برنامج السحب
تعلمنا حتى الآن كيفية استخدام حوادث الفأرة التي تقع عند ضغط زر الفأرة MouseDown، أو عند تحرير زر فأرة MouseUp. أو عند تحريك الفأرة MouseMove. سنتعلم الآن كيف تستخدم حوادث الفأرة لبناء آلية تسمح للمستخدم بسحب وإسقاط (إفلات) عناصر التحكم ضمن إطار البرنامج.
تعرف عملية السحب بأنها ضغط على الزر الأيسر للفأرة عندما يكون مؤشرها فوق عنصر تحكم، ثم تحريك الفأرة مع إبقاء الضغط على الزر. أما تحرير زر الفأرة بعد سحب العنصر فيدعى بالإفلات.
سنكتب الآن برنامج السحب، يوضح هذا البرنامج مدى سهولة إنجاز آلية السحب في البرنامج.
التمثيل المرئي لبرنامج السحب
سنشرع الآن بطور التمثيل المرئي لبرنامج السحب:
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسم Drag.Frm في الدليل C:\VB5Prg\Ch04 واحفظ ملف المشروع بالاسم Drag.Vbp في نفس الدليل.
أنشئ نموذج البرنامج طبقاً للجدول 4-8.
الشكل 4 -27 النموذج frmDrag (طور التصميم).
الجدول 4-8. جدول خصائص برنامج السحب.
الكائن الخاصية القيمة
Form Name frmDrag
Caption برنامج السحب
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdDragMe
Caption ا&سحب هذا الزر
DragMode 1-Automatic
RightToLeft True
نص برنامج السحب
تحقق من وجود العبارة Option Explicit ضمن قسم التصاريح العامة General Declaration للنموذج frmDrag:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج السحب
تسند القيمة 1-Automatic إلى الخاصية DragMode للزر اسحب هذا الزر. يسمح هذا للمستخدم بسحب الزر أثناء زمن التنفيذ.
اتبع الخطوات التالية لرؤية كيفية سحب الزر اسحب هذا الزر:
نفّذ برنامج السحب.
اضغط زر الفأرة الأيسر عندما يكون مؤشر الفأرة فوق الزر اسحب هذا الزر واستمر بالضغط على الزر مع تحريك الفأرة.
كما تشاهد، يظهر مستطيل بحجم الزر اسحب هذا الزر ويتبع حركة الفأرة.
جرب سحب الزر اسحب هذا الزر خارج النموذج.
يستجيب البرنامج بإظهار دائرة مع خط مائل داخلها (رمز عملية غير نظامية)، وهي دلالة بأنك تحاول سحب عنصر التحكم إلى منطقة ممنوعة.
يختفي المستطيل عند تحرير زر الفأرة (تدعى هذه العملية بالإفلات). لاحظ أن الزر اسحب هذا الزر يبقى في موقعه الأصلي.
انقر على الزر خروج لبرنامج السحب لإنهائه.
تحسين برنامج السحب
كما لاحظنا، بسبب إسناد 1-Automatic إلى الخاصية DragMode يظهر مستطيل بنفس حجم الزر اسحب هذا الزر، ويتحرك استجابة لحركة الفأرة. يمكنك هذا المستطيل من مشاهدة المكان الذي يجري سحب الزر إليه.
لنولد شكلاً مختلفاً عند سحب عنصر التحكم، باتباع الخطوات التالية:
أسند اسم الملف Drag1Pg.Ico إلى الخاصية DragIcon للزر اسحب هذا الزر (يفترض أن تجد الملف Drag1Pg.Ico في الدليل Icons\DragDrop\ تحت دليل لغة فيجول بيسك، ويمكنك استخدام أي ملف آخر من نوع *.Icoإذا لم تعثر على هذا الملف).
احفظ المشروع باختيار Save Project من القائمة File.
اتبع الخطوات التالية لرؤية تأثير تعديل الخاصية DragIcon:
نفّذ برنامج السحب.
اسحب الزر اسحب هذا الزر.
يستجيب البرنامج بإظهار الرمز Drag.Ico عند سحب الزر اسحب هذا الزر (انظر الشكل 4 -2.
والآن ستجد أن الرمز Drag1Pg.Ico سيتحرك تبعاً لحركة الفأرة بدلاً من المستطيل، قبل إجراء التعديل.
الشكل 4-28 الرمز Drag1Pg.Ico وهو يتحرك تبعاً لحركة الفأرة أثناء سحب الزر اسحب هذا الزر.
برنامج الإفلات
يوضح برنامج الإفلات مفهوم الإفلات (ويقصد به تحرير زر الفأرة بعد السحب) وكيف يستخدم في البرنامج.
التمثيل المرئي لبرنامج الإفلات
أنشئ مشروعاً جديداً من نوع Standard EXE.
احفظ نموذج المشروع بالاسمDrop.Frm في الدليل C:\VB5Prg\Ch04واحفظ ملف المشروع بالاسم Drop.Vbp في نفس الدليل.
أنشئ النموذج طبقاً للجدول 4-9.
يفترض أن يبدو الشكل المكتمل كما في الشكل 4-29.
الشكل 4 - 29 النموذج frmDrop في مرحلة التصميم.
الجدول 4-9. جدول خصائص برنامج الإفلات.
الكائن الخاصية القيمة
Form Name frmDrop
Caption برنامج الإسقاط
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Text Box Name txtInfo
Text (اجعله فارغاً)
Alignment 2-Center
MultiLine True
Enabled False
RightToLeft True
Image Name imgWater
Picture Water.Ico
DragMode 1-Automatic
Stretch 1-True
Tag Water image
يطالبك الجدول 4-9 بإسناد اسم الملف Water.Ico إلى الخاصية Picture لعنصر التحكم imgWater. تستطيع العثور على هذا الملف ضمن الدليل \Icons\Elements تحت دليل فيجول بيسك. استخدم أي ملف آخر من نوع Ico إذا لم تجد هذا الملف.
إدخال نص برنامج الإفلات
تحقق من وجود العبارة Option Explicit ضمن قسم التصاريح العامة General Declaration:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_DragOver():
Private Sub Form_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Dim sInfo As String
sInfo = "الآن يتم سحب "
sInfo = sInfo + Source.Tag
sInfo = sInfo + " فوق النموذج "
sInfo = sInfo + Str(State)
txtInfo.Text = sInfo
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_ Click():
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء Form_DragDrop():
Private Sub Form_DragDrop(Source As Control, _
X As Single, Y As Single)
'clear the text box.
txtInfo.Text = ""
'move the control
Source.Move X, Y
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_DragOver():
Private Sub cmdExit_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Dim sInfo
sInfo = "الآن يتم سحب "
sInfo = sInfo + Source.Tag
sInfo = sInfo + " فوق الزر خروج "
sInfo = sInfo + Str(State)
txtInfo.Text = sInfo
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج الإفلات
نفّذ برنامج الإفلات.
اسحب صورة صنبور المياه.
تظهر رسالة ضمن مربع النص أثناء سحب الصورة، تشير إلى حالة عملية السحب. يتسبب تحرير الفأرة بنقل الصورة إلى النقطة التي تم تحرير الفأرة فيها (نقطة الإفلات).
أنهِ البرنامج بالنقر على الزر خروج.
كيف يعمل برنامج الإفلات
يستخدم برنامج الإفلات الإجراءات Form_DragOver() و cmdExit_ DragOver() و Form_DragDrop().
نص الإجراء Form_DragOver()
ينفذ الإجراء Form_DragOver() عند سحب عنصر التحكم imgWater فوق النموذج. يمتلك هذا الإجراء أربعة وسائط Source و X و Y وStart:
Private Sub Form_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Dim sInfo As String
sInfo = "الآن يتم سحب "
sInfo = sInfo + Source.Tag
sInfo = sInfo + " فوق النموذج "
sInfo = sInfo + Str(State)
txtInfo.Text = sInfo
End Sub
يمثل الوسيط Source اسم عنصر التحكم الذي يجري سحبه. وبما أن عنصر التحكم الذي يتم سحبه يدعى imgWater، وبالتالي يسند imgWater آلياً إلى الوسيط Source.
يمثل الوسيطان x وy الإحداثيات الراهنة x,y لمؤشر الفأرة (منسوبة إلى نظام إحداثيات النموذج). يمتلك الوسيط State إحدى القيم 0 أو 1 أو 2:
تسحب الصورة من نقطة حرة إلى نقطة حرة أخرى ضمن النموذج، عندما تكون قيمة State تساوي 2.
تسحب الصورة من نقطة حرة ضمن النموذج إلى نقطة غير نظامية (مثلاً نقطة خارج النموذج)، عندما تكون قيمة State تساوي 1.
تسحب الصورة من نقطة غير نظامية إلى نقطة حرة ضمن النموذج، عندما تساوي قيمة State الصفر.
يجهز الإجراء Form_DragOver() سلسلة تدعى sInfo ويظهر السلسلة في مربع النص txtInfo:
Dim sInfo As String
sInfo = "الآن يتم سحب "
sInfo = sInfo + Source.Tag
sInfo = sInfo + " فوق النموذج "
sInfo = sInfo + Str(State)
txtInfo.Text = sInfo
فمثلاً يُسند إلى السلسلة ما يلي عند سحب الصورة من منطقة حرة ضمن النموذج إلى منطقة أخرى:
الآن يتم سحب Water Image فوق النموذج 2
استخدمنا العبارة التالية أثناء تجهيز السلسلة sInfo:
sInfo = sInfo + Source.Tag
كما أسندنا أثناء طور التصميم، إلى الخاصية Tag لعنصر الصورة imgWater، القيمة Water Image، لذلك فإن قيمة Source.Tag ستساوي Water Image.
الخاصية Tag
تستخدم الخاصية Tag غالباً كمنطقة تخزين للمعطيات. فمثلاً، تحوي الخاصية Tag للعنصر imgWater على سلسلة مهمتها التعريف بعنصر التحكم هذا. استخدمنا في الإجراء Form_DragOver() هذه السلسلة لتعريف العنصر المسحوب، طبعاً يمكن إسناد أي شيء آخر ترغب به (مثل MyWater) إلى الخاصية Tag.
نص الإجراء cmdExit_DragOver()
ينفذ هذا الإجراء عند سحب عنصر التحكم فوق الزر خروج، ولهذا يتشابه هذا الإجراء مع الإجراء Form_DragOver() باستثناء أن السلسلة sInfo تفيد بأن عنصر التحكم water يجري سحبه فوق الزر خروج.
Private Sub cmdExit_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Dim sInfo As String
sInfo = "الآن يتم سحب "
sInfo = sInfo + Source.Tag
sInfo = sInfo + " فوق الزر خروج "
sInfo = sInfo + Str(State)
txtInfo.Text = sInfo
End Sub
فمثلاً ستحوي السلسلة الرسالة التالية عند سحب عنصر التحكم Water فوق الزر خروج:
الآن يتم سحب Water Image فوق الزر خروج 0
قيمة State = 0 هنا، وذلك بسبب سحب العنصر imgWater من خارج الزر خروج إلى داخله. ومن وجهة نظر الزر خروج فإن أي نقطة خارجه هي نقطة غير نظامية.
نص الإجراء Form_DragDrop()
ينفذ هذا الإجراء عند إفلات عنصر التحكم ضمن النموذج. يجب إنجاز شيئين عند حدوث هذا: محو مربع النص، ونقل عنصر التحكم Water إلى نقطة الإفلات:
Private Sub Form_DragDrop(Source As Control, _
X As Single, Y As Single)
'clear the text box.
txtInfo.Text = ""
'move the control
Source.Move X, Y
End Sub
لهذا استخدمنا العبارتين التاليتين ضمن الإجراء:
txtInfo.Text = ""
Source.Move X, Y
ينقل عنصر التحكم imgWater إلى نقطة الإفلات باستخدام الطريقة Move. تتحدد نقطة الإفلات بالوسيطين X و Y لهذا الإجراء.
الخلاصة
تناول هذا الفصل حوادث الفأرة. فتعلمنا الحوادث MouseDown و MousMove وDragOver و DragDrop.
تقدم وسائط إجراءات هذه الحوادث معلومات عن حالة الفأرة زمن وقوع الحادثة. فالوسيط Button مثلاً يشير إلى زر الفأرة الذي تم النقر عليه والوسيط Shift يخبر أي مفتاح من المفاتيح Shift أو Ctrl أو Alt تم الضغط عليه إلى جانب الفأرة. كما يحدد الوسيطان X و Y موقع مؤشر الفأرة زمن وقوع الحادثة، وهكذا.
الفصل الخامس
إنشاء القوائم
يتركز اهتمام هذا الفصل، على آلية دمج القوائم في برامجك. وسوف تتعرف من خلاله على الطريقة التي يتم بها تصميم القائمة وكيفية ربطها مع البرنامج.
برنامج الألوان
سنبدأ الآن بكتابة برنامج يتضمن قائمة Menu، وسندعوه برنامج الألوان. يسمح لك برنامج الألوان باختيار لون من قائمة، وتلوين خلفية البرنامج باللون المنتقى. كما يسمح باختيار حجم إطار البرنامج من قائمة أخرى.
يلزمنا قبل البدء بكتابة برنامج الألوان، تحديد كيف ستبدو القائمة في البرنامج وما الذي يفترض أن تفعله:
الفصل السادس
مربعات الحوار
يوضح هذا الفصل كيفية دمج واستخدام مربعات الحوار في برنامجك، تستخدم مربعات الحوار لإظهار والحصول على المعلومات من المستخدم. توجد ثلاثة أنواع من مربعات الحوار في فيجول بيسك، وهذه الأنواع هي:
مربعات الحوار مسبقة التعريف Predefined Dialog Boxes أو (مربعات الحوار الجاهزة).
مربعات الحوار المخصصة Custom Dialog Boxes.
مربعات الحوار الشائعة Common Dialog Boxes.
مربعات الحوار مسبقة التعريف
حسب ما يتبدى من الاسم، فمربعات الحوار مسبقة التعريف، عبارة عن مربعات معرفة مسبقاً بواسطة فيجول بيسك. ولإظهار مربع مسبق التعريف، تستخدم عبارة ذات وسائط معينة تحدد كيف ومتى يتوجب إظهار المربع الحواري. يمكنك إظهار مربع حواري مسبق التعريف بواسطة ما يلي:
عبارة MsgBox والتابع MsgBox().
التابع الوظيفي InputBox().
برنامج الرسالة
يسمح استخدام العبارة MsgBox والتابع الوظيفي MsgBox() بإظهار الرسائل للمستخدم والحصول على استجابته (الاستجابة تكون إما نعم Yes أو لا No). يوضح برنامج الرسالة كيف تستخدم العبارة MsgBox والتابع الوظيفيMsgBox() في البرنامج.
التمثيل المرئي لبرنامج الرسالة
سنبدأ كعادتنا بالتمثيل المرئي لنموذج البرنامج:
أنشئ الدليل C:\VB5Prg\Ch06.
ابدأ مشروعاً من النوع التنفيذي القياسي Standard EXE.
احفظ نموذج المشروع بالاسم Message.Frm في الدليل C:\VB5Prg\Ch06، واحفظ ملف المشروع بالاسم Message.Vbp في الدليل ذاته.
أنشئ النموذج تبعاً للجدول 6-1.
يفترض أن يظهر النموذج المكتمل مثل المبين في الشكل 6-.
الشكل 6-1 النموذج frmMessage (طور التصميم).
الجدول 6-1. جدول خواص النموذج frmMessage.
الكائن الخاصية القيمة
Form Name FrmMessage
Caption برنامج الرسالة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdMessage
Caption إ&ظهار رسالة
RightToLeft True
إدخال نص برنامج الرسالة
سندخل الآن نص برنامج الرسالة:
تحقق أن قسم التصاريح العامة من النموذج frmMessage يحوي العبارة Option Explicit، أي:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdMessage_Click():
Private Sub cmdMessage_Click()
Dim Message As String
Dim Title As String
Dim ButtonsAndIcon As Long
'تحديد الرسالة التي ستظهر في المربع الحواري
Message = "هذا مثال على رسالة بسيطة"
'تحديد نوع الأزرار المفترض ظهورها والصورة أيضا
ButtonsAndIcon = vbOKOnly + vbExclamation + _
vbMsgBoxRight + vbMsgBoxRtlReading
'تحديد العنوان
Title = "عنوان المربع الحواري"
'إظهار المربع الحواري
MsgBox Message, ButtonsAndIcon, Title
End Sub
أدخل النص التالي ضمن الإجراء cmdExit _Click():
Private Sub cmdExit_Click()
Dim Message As String
Dim Title As String
Dim ButtonsAndIcon As Long
Dim Response As String
'تحديد الرسالة التي ستظهر في المربع الحواري
Message = "هل أنت متأكد بأنك تريد الخروج؟"
'تحديد نوع الأزرار المفترض ظهورها والصورة أيضا
ButtonsAndIcon = vbYesNo + vbQuestion + _
vbMsgBoxRight + vbMsgBoxRtlReading
'تحديد العنوان
Title = "برنامج الرسالة"
'إظهار المربع الحواري وانتظار رد المستخدم
Response = MsgBox(Message, ButtonsAndIcon, Title)
'تقييم استجابة المستخدم
If Response = vbYes Then
End
End If
End Sub
اختر البند Save Project من القائمة File لفيجول بيسك لحفظ عملك.
تنفيذ برنامج الرسالة
دعنا ننفذ برنامج الرسالة، ونرى نتيجة ما كتبناه على أرض الواقع.
نفّذ برنامج الرسالة.
لاحظ الظاهرة التالية أثناء تنفيذ البرنامج: يظهر مربع حوار مع رسالة عندما تضغط على الزر عرض رسالة، كما يحمل المربع الزر موافق ورمز إشارة التعجب Exclamation Icon، انظر الشكل 6-2. مجال هذا المربع الحواري محدد (أو محصور) بمعنى أن البرنامج لا يستطيع استئناف التنفيذ ما لم تغلق مربع الحوار هذا. فمثلاً جرب النقر بواسطة الفأرة على الزر خروج أثناء ظهور مربع الحوار هذا، وستجد أن البرنامج لن ينتهي (أي لم ينفذ الإجراء cmdExit_Click()).
انقر على الزر موافق في مربع الحوار.
يغلق مربع الحوار ذاته، استجابة لذلك.
انقر على الزر خروج.
يظهر نتيجة لذلك مربع حواري يحمل زراً يدعى نعم وآخر لا، ورمز إشارة الاستفهام (انظر الشكل 6-3). يطلب منك هذا المربع تثبيت رغبتك في الخروج. يؤدي الضغط على نعم إلى إنهاء البرنامج، أما الضغط على الزر لا فيؤدي إلى إغلاق المربع الحواري ولكن بدون انتهاء البرنامج. يعتبر مربع الحوار هذا أيضاً محدداً (مشروطاً Modal) بمعنى أنك لا تستطيع استئناف البرنامج ما لم تستجب لهذا المربع بالنقر على أحد الزرين نعم أو لا.
الشكل 6-2 مربع حوار مع الزر موافق وإشارة التعجب.
الشكل 6-3 مربع حوار مع الزرين نعم و لا و إشارة استفهام.
ملاحظة
تدعى مربعات الحوار التي تناولها مثالنا هذا، مربعات حوار محددة Modal Dialog Boxes. يمكن أثناء عرض مربع الحوار من هذا النوع (مثل مربع الرسالة) الانتقال إلى برامج ويندوز الأخرى، لكن ما لا يمكن هو، العودة إلى نافذة برنامج الرسالة دون إغلاق مربع الحوار هذا.
نوع آخر من مربعات الحوار المحددة، هو مربع حوار النظام المحدد، الذي لا يسمح لك بالرجوع إلى التطبيق، ولا يمكّنك من الانتقال إلى تطبيقات ويندوز أخرى. أي بمعنى آخر، لا تستطيع العمل خارج هذا المربع حتى تجيب عليه.
كيف يعمل برنامج الرسالة؟
يستخدم برنامج الرسالة العبارة MsgBox والتابع الوظيفي MsgBox() لإظهار مربعات حوار الرسائل.
إظهار مربع حوار بواسطة العبارة MsgBox
ينفذ الإجراء cmdMessage_Click() آلياً عند الضغط على الزر عرض رسالة. يستخدم البرنامج المكتوب داخل هذا الإجراء العبارة MsgBox لإظهار مربع حوار (مربع رسالة) يحمل زراً يدعى موافق ورمز لإشارة التعجب:
Private Sub cmdMessage_Click()
Dim Message As String
Dim Title As String
Dim ButtonsAndIcon As Long
'تحديد الرسالة التي ستظهر في المربع الحواري
Message = "هذا مثال على رسالة بسيطة"
'تحديد نوع الأزرار المفترض ظهورها والصورة أيضا
ButtonsAndIcon = vbOKOnly + vbExclamation + _
vbMsgBoxRight + vbMsgBoxRtlReading
'تحديد العنوان
Title = "عنوان المربع الحواري"
'إظهار المربع الحواري
MsgBox Message, ButtonsAndIcon, Title
End Sub
لاحظ أننا مررنا ثلاثة وسائط إلى العبارة MsgBox:
الرسالة المراد إظهارها (سلسة كتابية String).
الأزرار والرموز المراد ظهورها في مربع الرسالة (قيمة عددية).
عنوان مربع الحوار (سلسلة كتابية String).
يجهز الإجراء cmdMessage_Click() المتحولات الثلاثة اللازمة كوسائط في عبارة MsgBox قبل استخدام هذه العبارة. وأول متحول قام الإجراء بتكليفه كما رأينا هو المتحولMessage الذي يحمل الرسالة التي ستظهر في مربع الحوار:
Message = "هذا مثال على رسالة بسيطة"
يستخدم المتحولMessage كأول وسيط في العبارة MsgBox.
المتحول الثاني عبارة عن متحول من النوع الصحيح Integer ويدعى ButtonsAndIcon. ويتم تكليفه بعدد يحدد نوع الأزرار وشكل الرموز التي ستظهر في مربع الرسالة، بالإضافة إلى الثابتين vbMsgBoxRight و vbMsgBoxRtlReading اللذين يقومان بتعريب مربع الرسالة:
ButtonsAndIcon = vbOKOnly + vbExclamation + _
vbMsgBoxRight + vbMsgBoxRtlReading
يُستخدم المتحول ButtonsAndIcon كثاني وسيط في العبارة MsgBox كما أنvbOKOnly و vbExclamatian عبارة عن ثابتين من ثوابت فيجول بيسك. يمثل الثابت vbOKOnly الزر موافق، بينما يمثل الثابت vbExclamatian رمز إشارة التعجب.
وإسناد مجموع الثابتين (vbOKOnly و vbExclamatian) إلى المتحول ButtonsAndIcon، يفرض على المربع الحواري أن يمتلك الزر موافق ورمز إشارة التعجب، حسب ما يوضحه الشــكل 6-2.
يعطي الجدولان 6-2 و 6-3 ثوابت الأزرار وثوابت الأيقونات التي يمكنك استخدامها من أجل الوسيط الثاني في عبارة MsgBox.
الجدول 6-2. ثوابت أزرار مربع حوار الرسالة.
اسم الثابت القيمة الأزرار التي ستظهر
vbOKOnly 0 موافق
vbOKCancel 1 موافق و إلغاء
vbAbortReryIgnore 2 إحباط و إعادة المحاولة و تجاهل
vbYesNoCancel 3 نعم و لا و إلغاء
vbYesNo 4 نعم و لا
vbRetryCancel 5 إعادة المحاولة و إلغاء
الجدول 6-3. ثوابت رموز مربع حوار الرسالة.
اسم الثابت القيمة الرمز التي ستظهر
vbCirtical 16 رمز الخطأ الحرج
vbQuestion 32
الفصل السابع
عناصر التحكم الرسومية
من بين المظاهر الهامة لاستخدام فيجول بيسك، أنه يسمح لك بسهولة، بإنشاء البرامج التي تحوي رسوماً. سنتعلم في هذا الفصل كيف نكتب برنامجاً يحتوي على عناصر تحكم رسومية.
تعريف وحدة القياس Twip
يمكننا إظهار شتى العناصر الرسومية في فيجول بيسك، مثل الخطوط، والدوائر، والصور النقطية Bitmap، وغير ذلك. ويلزمنا طبعاً تحديد أبعاد هذه العناصر (كطول الخط وقطر الدائرة).
باستطاعة فيجول بيسك استخدام وحدات عديدة، لتحديد مواقع وأبعاد العناصر الرسومية، لكن الوحدة الأكثر شيوعاً، تدعى Twip، وكل بوصة تساوي 1440 Twips.
الألوان Colors
يعتبر اللون من المزايا الهامة لعناصر التحكم الرسومية، تستطيع استخدام التابع الوظيفي RGB() والتابع الوظيفي QBColor() لتحديد لون عنصر التحكم.
تحديد الألوان بواسطة التابع الوظيفي RGB()
يمكّنك التابع الوظيفي RGB() من تحديد الألوان. حيث الأحرف RGB يقصد بها الألوان الرئيسية الثلاثة: الأحمر Red والأخضر Green والأزرق Blue، باعتبار أن كافة الألوان التي يمكن إظهارها على الشاشة، تتولد بالمزج بين هذه الألوان الرئيسية الثلاثة.
للتابع RGB() ثلاثة وسائط: تحدد قيمة الوسيط الأول مقدار اللون الأحمر في اللون النهائي، بينما يمثل الوسيط الثاني مقدار اللون الأخضر في اللون النهائي، وأخيراً، يمثل الوسيط الثالث مقدار اللون الأزرق في اللون النهائي، فمثلاً، نستخدم العبارة التالية لإرجاع اللون الأحمر:
BackColor = RGB(255,0,0)
القيمة العظمى لكل وسيط في التابع الوظيفي RGB تساوي 255، والقيمة الدنيا للوسيط تساوي الصفر، وهكذا تمثل العبارة RGB (255,0,0) اللون الأحمر، وتمثل العبارة RGB(0,255,0) اللون الأخضر، بينما تمثل العبارة RGB (0,0,255) اللون الأزرق.
استخدم العبارة التالية على سبيل المثال لتبديل الخاصية BackColor لنموذج يدعى frmMyForm إلى اللون الأزرق:
frmMyform.BackColor = RGB(0,0,255)
لتوليد اللون الأصفر مثلاً، استخدم العبارة RGB(255,255,0)، بينما تولد العبارة RGB(0,0,0) اللون الأسود طبعاً، أما اللون الأبيض فهو فتولده العبارة RGB(255,255,255).
تعتبر الخبرة والممارسة أفضل طريقة للتمكن من استخدام التابع RGB() على الوجه الأمثل.
تحديد الألوان بواسطة التابع الوظيفي QBColor()
يقدم التابع QBcolor() طريقة أخرى سهلة لتحديد اللون، ولهذا الناتج وسيط واحد فقط، يمكن تمثيله بقيمة صحيحة تمتد من الصفر وحتى 15، استخدم العبارة التالية على سبيل المثال لتبديل الخاصيةBackCalor لنموذج يدعى frmMyForm إلى اللون الرمادي:
frmMyForm.BackColor=QBColor(
يعطي الجدول 4-3 في الفصل الرابع، قائمة بالألوان الست عشرة المحتملة والقيم المرافقة لهذه الألوان.
يعتبر الناتج الوظيفي QBColor() أسهل استخداماً من سابقه RGB()، إلا أن عدد الألوان التي يقدمها أقل بكثير (16 لوناً فقط).
ملاحظة
قدّم فيجول بيسك التابع QBColor()، بغرض التوافق مع الألوان المستخدمة سابقاً في لغة Quick Basic،كما هو واضح من تسمية التابع نفسه.
عنصر تحكم رسم الخط
يُستخدم عنصر التحكم Line لرسم الخطوط، يوضح برنامج الخط القادم، كيف يُستخدم هذا العنصر في البرنامج.
التمثيل المرئي لبرنامج الخط
اتبع الخطوات التالية لبناء نموذج برنامج الخط:
أنشئ الدليل C:\VB5Prg\Ch07، سنستخدم هذا الدليل لحفظ العمل.
أنشئ مشروعاً جديداًStandard EXE باختيار New Project من القائمة File.
احفظ نموذج المشروع بالاسم Line.Frm في الدليل C:\VBb5Prg\Ch07، واحفظ ملف المشروع بالاسم Line.vbp في الدليل C:\VB5Prg\Ch07.
أنشئ نموذج برنامج الخط، حسب الجدول 7-1.
يبين الشكل 7-1 النموذج المكتمل.
الشكل 7-1 نموذج برنامج الخط.
جدول 7-1. جدول خصائص النموذج frmLine.
الكائن الخاصية القيمة
Form Name frmLine
Caption برنامج الخط
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdStart
Caption ابدأ
RightToLeft True
Line Name linLine
X1 2760
X2 3960
Y1 1800
Y2 2280
ضع مؤشر الفأرة (بدون نقر) فوق رمز عنصر تحكم الخط، فيظهر مستطيل أصفر يحمل الرسالة Line داخله.
إدخال نص برنامج الخط
سنُدخل الآن نص برنامج الخط:
تحقق أن قسم التصاريح العامة للنموذج frmLine يحوي العبارة Option Explicit بداخله:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي في الإجراء cmdExit_Click():
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي في الإجراء cmdStart_Click():
Private Sub cmdStart_Click()
'وضع قيم عشوائية لاحداثيات
'بداية ونهاية الخط
linLine.X1 = Int(frmLine.Width * Rnd)
linLine.Y1 = Int(frmLine.Height * Rnd)
linLine.X2 = Int(frmLine.Width * Rnd)
linLine.Y2 = Int(frmLine.Height * Rnd)
End Sub
احفظ المشروع، باختيار Save Project من القائمة File.
تنفيذ برنامج الخط
دعنا نشاهد ما كتبناه قيد التنفيذ:
نفّذ برنامج الخط.
انقر زر ابدأ عدة مرات، ولاحظ أن الخط يغيّر طوله وموقعه مع كل نقرة.
بسبب إسناد العنوان &Start إلى الزر ابدأ في الخاصية Caption يمكنك ضغطAlt+S على لوحة المفاتيح بدلاً من النقر بواسطة الفأرة على الزر ابدأ في كل مرة.
كيف يعمل برنامج الخط
يستخدم برنامج الخط الإجراءcmdStart_Click() لإظهار عنصر التحكم Line في مواقع مختلفة كلما نقر المستخدم على الزر ابدأ.
نص الإجراء cmdStart_Click()
ينفذ هذا الإجراء كلما تم نقر الزر Start (أو الضغط على Alt+S):
Private Sub cmdStart_Click()
'وضع قيم عشوائية لاحداثيات
'بداية ونهاية الخط
linLine.X1 = Int(frmLine.Width * Rnd)
linLine.Y1 = Int(frmLine.Height * Rnd)
linLine.X2 = Int(frmLine.Width * Rnd)
linLine.Y2 = Int(frmLine.Height * Rnd)
End Sub
يُرجِع التابع الوظيفي Rnd() عدداً عشوائياً بين الصفر والواحد وتُمثِل الخاصية Width عرض النموذج frmLine، وهكذا ينتج عن حاصل جداء عرض النموذج برقم بين الصفر والواحد، ينتج عدد يقع بين الصفر وعرض النموذج:
frmLine.Width*Rnd
فإذا أعاد التابع Rnd القيمة صفر، فسيساوي ناتج الجداء الصفر أيضاً، أما إذا أرجع القيمة واحد، فسيساوي الجداء عرض النموذج الكامل، وإذا أعاد التابع Rnd القيمة 0.75 مثلاً، فستساوي النتيجة (3/4) من عرض النموذج.
يحول التابع الوظيفي Int() وسيطه إلى قيمة صحيحة، فمثلاً، تعود العبارة Int(3.5) القيمة 3، وتعود العبارة Int(7.999) القيمة 7. وهكذا فإن ناتج العبارة Int(frmLine.Width * Rnd) يعود بعدد صحيح، يقع بين الصفر وعرض النموذج.
يتم إسناد قيمة صحيحة للخاصية X1 لعنصر التحكم Line، بواسطة العبارة الأولى من الإجراء cmdStart_click(). والقيمة الصحيحة تقع بين الصفر وعرض النموذج:
linLine.X1=Int(frmLine.Width * Rnd)
تُمثل الخاصية X1 لعنصر التحكم Line، الإحداثي الأفقي لنقطة بداية الخط، بنظام إحداثيات يعود إلى النموذج (باعتبار أن الخط سيُرسم على نموذج)، يُعرّف نظام الإحداثيات الافتراضي لفيجول بيسك، الإحداثيين X1=0 و Y1=0، باعتبارها الزاوية اليسارية العلوية للنموذج.
أسندت العبارة التالية من الإجراء cmdStart_Click() للخاصية Y1 لعنصر التحكم Line بقيمة صحيحة، والقيمة الصحيحة هذه تقع بين الصفر وارتفاع النموذج:
linLine.Y1=Int(frmLine.Height * Rnd)
تمثل الخاصية Y1 لعنصر التحكم Line الإحداثي العمودي لنقطة بداية الخط.
يتم إسناد قيمة صحيحة إلى الخاصية Y2 وX2 من عنصر التحكم، بواسطة العبارتان الأخيرتان في الإجراء cmdStart_Click() وتمثلان إحداثي نقطة نهاية الخط:
linLine.X2=Int(frmLine.Width * Rnd)
linLine.X2=Int(frmLine.Height * Rnd)
يتحرك الخط عند نقر الزر ابدأ إلى مواقع جديدة، اعتماداً على الأرقام العشوائية المتولدة عن توابع Rnd.
أي بكلمة أخرى، يتسبب نقر الزر ابدأ بوضع الخط في مواقع عشوائية في نافذة البرنامج.
المزيد من خصائص عنصر تحكم الخط
سنتمرن على مزيد من خصائص العنصر Line أثناء مرحلة التصميم:
اختر عنصر التحكم Line أثناء مرحلة التصميم (أي انقل التركيز إليه بنقره بواسطة الفأرة).
غيّر الخاصية BorderColor لهذا العنصر إلى اللون الأحمر Red.
يستجيب فيجول بيسك بتبديل لون الخط إلى اللون الأحمر.
غيّر الخاصية BorderWidth لهذا العنصر إلى 10.
يستجيب فيجول بيسك بتبديل عرض الخط إلى 10 Twips.
احفظ المشروع باختيارSave Project من القائمة File.
نفّذ برنامج الخط، وانقر الزر ابدأ عدة مرات، يُظهر برنامج الخط الآن، عنصر التحكم Line كخط أحمر بعرض 10 Twips (انظر الشكل 7-2).
الشكل 7-2 عنصر التحكم Line كخط أحمر بعرض 10 Twips.
تستطيع أيضاً تبديل لون الخط وعرض الخط أثناء مرحلة التنفيذ.
أدخل العبارتين التاليتين في بداية الإجراء cmdStart_Click():
linLine.BorderColor = RGB(Int(255 * Rnd), _
Int(255 * Rnd), _
Int(255 * Rnd))
linLine.BorderWidth = Int(100 * Rnd) + 1
يتم إسناد قيمة جديدة إلى الخاصية BorderColor بواسطة العبارة الأولى. وهذه القيمة الجديدة هي القيمة المعادة من التابع الوظيفي RGB() حيث كل وسيط من وسائطه الثلاثة، ينتج عن رقم عشوائي بين الصفر و255، وهكذا فالقيمة المعادة من التابع RGB() تمثل لوناً عشوائياً.
يتم إسناد قيمة جديدة إلى الخاصية BorderWidth بواسطة العبارة الثانية. القيمة الجديدة هذه عبارة عن رقم عشوائي يقع بين صفر و100، مع إضافة واحد للنتيجة. أي ((0÷100) +1).
مما يعني أنه يتم إسناد قيمة جديدة بين 1 Twips و 10 Twips إلى خاصية عرض الخط. لاحظ أننا أضفنا واحد إلى العبارة Int(100 * Rnd)، لأن أقل قيمة مقبولة للخاصية BorderWidth لا يجوز أن تساوي الصفر.
نفّذ برنامج الخط.
يتبدل لون وعرض الخط مع كل نقرة للزر ابدأ. انتبه إلى أنك لن تشاهد الخط أحياناً، عندما يكون اللون العشوائي الناتج، نفس لون أرضية النموذج.
عنصر تحكم رسم الأشكال
يُستخدم عنصر التحكم هذا، لرسم أشكال عديدة: كالمستطيل والمربع والمستطيل ذو الزوايا المدورة والمربع ذو الزوايا المدورة والدائرة والقطوع الناقصة.
يوضح برنامج الأشكال كيفية إظهار هذه الأشكال على اختلاف أنواعها.
التمثيل المرئي لبرنامج الأشكال
اتبع الخطوات التالية لبناء نموذج برنامج الأشكال:
أنشئ مشروعاً جديداً من النوع التنفيذي القياسي Standard EXE.
احفظ نموذج المشروع بالاسم Shape.Frm في ذات الدليل C:\VB5Prg\Ch07، واحفظ ملف المشروع في ذات الدليل بالاسم Shape.vbp.
أنشئ نموذج برنامج الأشكال تبعاً للجدول 7-2
يظهر النموذج كما في الشكل 7-3.
الشكل 7-3 النموذج frmShape.
الجدول7-2. جدول خصائص برنامج الأشكال.
الكائن الخاصية القيمة
Form Name frmShape
Caption برنامج الأشكال
RightToLeft True
Horizontal Scroll Bar Name hsbWidth
Min 1
Max 10
Value 1
RightToLeft True
CommandButton Name cmdRndRect
Caption مستطيل بزاوية مستديرة
RightToLeft True
CommandButton Name cmdRndSqr
Caption مربع بزاوية مستديرة
RightToLeft True
CommandButton Name cmdCircle
Caption دائرة
RightToLeft True
CommandButton Name cmdOval
Caption قطع ناقص
RightToLeft True
CommandButton Name cmdSquare
Caption مربع
RightToLeft True
CommandButton Name cmdRectangle
الكائن الخاصية القيمة
Caption مستطيل
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Label Name lblInfo
Caption تغيير العرض
RightToLeft True
Shape Name shpAllShapes
إدخال نص برنامج الأشكال
سندخل الآن نص برنامج الأشكال:
تحقق أن قسم التصاريح العامة يحوي العبارة Option Explicit أي:
' يجب التصريح عن كل المتغيرات
Option Explicit
أدخل النص التالي داخل الإجراء cmdExit_Click():
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي داخل الإجراء cmdCircle_Click():
Private Sub cmdCircle_Click()
' تغيير الشكل إلى دائرة
shpAllShapes.Shape = vbShapeCircle
End Sub
أدخل النص التالي داخل الإجراء cmdRectangle_Click():
Private Sub cmdRectangle_Click()
' تغيير الشكل إلى مستطيل
shpAllShapes.Shape = vbShapeRectangle
End Sub
أدخل النص التالي داخل الإجراء cmdOval_Click():
Private Sub cmdOval_Click()
' تغيير الشكل إلى قطع ناقص
shpAllShapes.Shape = vbShapeOval
End Sub
أدخل النص التالي داخل الإجراء cmdRndRect_Click():
Private Sub cmdRndRect_Click()
' تغيير الشكل إلى مستطيل بزوايا مستديرة
shpAllShapes.Shape = vbShapeRoundedRectangle
End Sub
أدخل النص التالي داخل الإجراء cmdRndSqr_Click():
Private Sub cmdRndSqr_Click()
' تغيير الشكل إلى مربع بزوايا مستديرة
shpAllShapes.Shape = vbShapeRoundedSquare
End Sub
أدخل النص التالي داخل الإجراء cmdSquare_Click():
Private Sub cmdSquare_Click()
' تغيير الشكل إلى مربع
shpAllShapes.Shape = vbShapeSquare
End Sub
أدخل النص التالي داخل الإجراء hsbWidth_Scroll():
Private Sub hsbWidth_Scroll()
'تغيير عرض حدود الشكل حسب قيمة شريط الازاحة
shpAllShapes.BorderWidth = hsbWidth
End Sub
أدخل النص التالي داخل الإجراء hsbWidth_Scroll():
Private Sub hsbWidth_Scroll()
'تغيير عرض حدود الشكل حسب قيمة شريط الازاحة
shpAllShapes.BorderWidth = hsbWidth
End Sub
احفظ المشروع، باختيار البند Save Project من قائمة File.
تنفيذ برنامج الأشكال
يظهر برنامج الأشكال كما في الشكل 7-3، عند تنفيذ البرنامج، يتغير الشكل الظاهر تبعاً للزر الذي يتم النقر عليه من قبل المستخدم، فمثلاً يؤدي نقر الزر دائرة إلى تحويل الشكل إلى دائرة.
يتغير عرض حدود الشكل، عند تغير موضع شريط التمرير الأفقي، يوضح الشكل 7-4 برنامج الأشكال، بعد نقر الزر دائرة، وتغيير موقع مؤشر شريط التمرير.
كيف يعمل برنامج الأشكال
يغيّر نص برنامج الأشكال، الشكل الذي سيظهره عنصر تحكم الأشكال، بالإضافة إلى عرض حدوده، أطلقنا على العنصر التسمية shpAllshapes.
نص الإجراء cmdRectangle_click()
يُنفذ الإجراء cmdRectangle_click() عند نقر الزر مستطيل. تسند العبارة الوحيدة في هذا الإجراء القيمة صفر للخاصية Shape التابعة لعنصر تحكم الأشكال، (والذي سميناه shpAllShapes) وهي المسؤولة عن تحويل الشكل إلى مستطيل:
ShpAllShapes=0
وبنفس الطريقة، يُنفذ الإجراءcmdSquare_click() عند نقر الزر مربع، ويتم إسناد القيمة واحد إلى الخاصية Shape بواسطة العبارة الوحيدة في هذا الإجراء، وهي المسؤولة عن تحويل الشكل إلى مربع. يُدرج الجدول 7-3 القيم المقبولة للخاصية Shap مع مدلولها.
الشكل 7-4 تبديل الشكل إلى دائرة.
جدول 7-3. القيم الممكنة للخاصية Shape.
القيمة نوع الشكل
0 مستطيل
1 مربع
2 قطع ناقص
3 دائرة
4 مستطيل بزوايا مستديرة
5 مربع بزوايا مستديرة
نص الإجراء hsbWidth_Change()
يُنفذ هذا الإجراء عند تبديل موقع مؤشر شريط التمرير، وحسب ما يتبين من جدول خصائص برنامج الأشكال، فإن القيمة الصغرى لهذا الشريط (الخاصية Min) تساوي 1، والخاصية Max تساوي 10، وهي القيمة العظمى، مما يعني أنك تستطيع تغيير الخاصية Value (قيمة مؤشر شريط التمرير) بين الواحد والعشرة.
تُسند هذه القيمة إلى الخاصيةBorderWidth للعنصر shpAllShapes كما يلي:
ShpAllShapes.BorderWidth= hsbWidth.value
وهكذا يتبدل عرض حدود العنصرshpAllShapes تبعاً لموقع مؤشر شريط التمرير.
خصائص أخرى لعنصر التحكم Shape
يقدم برنامج الأشكال خاصيتين فقط من خصائص عنصر التحكم Shape، يمكن التمرن على الخواص الأخرى لهذا العنصر بوضع شكل ما (Shape) في نموذج، ثم تبديل خصائصه.
اتبع الخطوات التالية كإرشادات:
ضع عنصر تحكم Shape في نموذج.
يستجيب فيجول بيسك بإظهار الشكل كمستطيل افتراضي.
غير الخاصية Shape إلى دائرة. (القيمة 3).
يستجيب فيجول بيسك بتبديل الشكل من المستطيل إلى دائرة.
غيّر الخاصية FillColor إلى اللون الأحمر Red.
لا يملأ فيجول بيسك الدائرة بلون أحمر، لأن الخاصية FillStyle للشكل تساوي Transparent (أي شفاف).
غيّر الخاصية FillStyle إلى Solid (مصمت).
يستجيب فيجول بيسك بملىء الدائرة بلون أحمر.
الصور
يُعتبر عنصرا التحكم Line و Shape، قادرين على رسم الأشكال الهندسية البسيطة كالخطوط والمربعات والدوائر ….الخ. لإظهار الأشكال الأكثر تعقيداً، يلزمك استخدام ملف صورة معين.
يمكن وضع ملفات الصور، على نموذج ما باستخدام عنصر تحكم الرسمة Image، أو عنصر تحكم الصورة Picture.
تُستخدم الخاصية Picture لكلا عنصري التحكم المذكورين لهذا الغرض. فإذا أردت وضع ملف صورة في كائن (Object) سيتوجب عليك تغيير الخاصية Picture لهذا الكائن.
فمثلاً لوضع ملف صورة في عنصر تحكم Image، حدد اسم الملف المقصود في الخاصية Picture لعنصر التحكم Image.
تستطيع تشكيل ملف صورة بواسطة برنامج رسم خاص، وأبسط مثال على برامج الرسم، برنامج الرسام Paint، يمكن استخدام الرسام لتشكيل الصورة، ثم حفظها في ملف بالامتداد BMP، أو يمكن الحصول على صور احترافية جاهزة، يطلق على الصور الجاهزة مصطلح Clip Art.
وضع الصور على نموذج أثناء مرحلة التصميم
تستطيع وضع الصور على نموذج ما، خلال كلا المرحلتين:
مرحلة التصميم (مرحلة التمثيل المرئي).
مرحلة التنفيذ (مرحلة كتابة البرنامج).
اتبع الخطوات التالية لتشكيل صورة بواسطة برنامج الرسام:
شغل برنامج الرسام.
اختر البند سمات(Attributes) من قائمة صورة للرسام.
يستجيب برنامج الرسام بإظهار مربع الحوار "سمات".
اختر واحدة البوصة.
ضع العرض على 3.
ضع الارتفاع على 3.
انقر زر موافق لمربع الحوار سمات.
يستجيب برنامج الرسام بإظهار صورة خالية بارتفاع ثلاث بوصات وعرض ثلاث بوصات.
استخدم أدوات الرسام لرسم صورة ما.
احفظ العمل المنجز في الملف MyPic.bmp في الدليل C:\VB5Prg\Ch07.
لدينا الآن ملف صورة امتداده bmp ويمكن وضعه على النموذج:
أنشئ مشروعاً جديداً قياسياً Standard EXE.
يستجيب فيجول بيسك بإظهار نموذج يدعى Form1.Frm.
حدد الملفMyPic.bmp في الخاصيةPicture للنموذج Form1.
تظهر الصورة التي رسمتها للتو، على خلفية النموذج (انظر الشكل 7-5).
الشكل 7-5 وضع صورة تم تشكيلها بواسطة برنامج الرسام على النموذج.
تظهر الصورة على النموذج (كما يظهر من الشكل 7-5)، بدءاً من الإحداثيتينX=0 وY=0 للنموذج، (أي عند الزاوية اليسرى العليا). ولا تستطيع مد أو تقليص الصورة التي وضعتها على النموذج، فالصورة تمتلك نفس الأبعاد المحددة في مربع الحوار سمات لبرنامج الرسام.
تخدّم الصورة الموضوعة على النموذج، كخلفية. ولجعل هذه الصورة تلتحم مع الأرضية، قم بما يلي:
اختر اللون الأبيض للخاصية BackColor للنموذجForm1، على فرض أن خلفية الصورةMyPic.bmp ملونة باللون الأبيض أيضاً، وبهذه الطريقة تلتحم الصورة مع النموذج بشكل تام.
اسحب حواف النموذج بحيث تظهر كامل الصورة في النموذج Form1، تستطيع وضع أزرار أوامر، أو عناصر تحكم أخرى مباشرةً فوق الصورة.
يبين الشكل 7-6 النموذجForm 1 مع عدة أزرار أوامر موضوعة على النموذج.
الشكل 7-6 وضع أزرار أوامر على الصورة الخلفية للنموذج.
الآن وقد صار للنموذج صورة خلفية، قد ترغب بمنع المستخدم من تكبير أو تصغير النموذج (لأن الصورة لن تكبر أو تصغر مع النموذج).
ضع الخاصية BorderStyle للنموذج Form1 على 1-FixedSingle.
نفّذ البرنامج.
حسب ما يبينه الشكل 7-7 يمتلك إطار البرنامج صورة أرضية، (ولا يستطيع المستخدم تكبير أو تصغير الإطار، بسبب إسناد القيمة FixedSingle للخاصية BorderStyle للنموذج Form1.
اخرج من البرنامج (لا نطالبك بحفظ المشروع فالسبب الوحيد الذي دفعنا لإنشاء هذا المشروع، تمكينك من مشاهدة عمل الخاصية Picture للنموذج على أرض الواقع).
الشكل 7-7 النموذج مع إسناد القيمة 1-FixedSingle للخاصية BorderStyle.
ملاحظة
يمكن الحصول على صورة سريعة، بحفظ محتويات الشاشة في ملف صورة كالتالي:
- في أي وقت تريد حفظ الشاشة الحالية، اضغط المفتاح Print Screen على لوحة المفاتيح.
(سوف تجد هذا المفتاح أعلى يمين لوحة المفاتيح تقريباً).
- شغّل برنامج الرسام من خلال القائمة ابدأ - البرامج - البرامج الملحقة - الرسام.
- من قائمة برنامج الرسام، اختر البند تحرير ثم البند لصق.
- إذا سألك برنامج الرسام: .. هل تريد تكبير الصورة النقطية؟ جاوب بنعم.
كما تلاحظ، لقد ظهرت صورة الشاشة، التي ضغطت المفتاح Print Screen عندها.
- احفظ هذه الصورة في ملف، من خلال القائمة ملف، البند حفظ.
وبذلك تكون قد حصلت على ملف صورة الشاشة الحالية.
يمكنك أيضاً، ضغط المفتاح Alt+Print Screen لنسخ محتويات النافذة النشطة فقط، وليس كامل مساحة الشاشة.
وضع الصور على النموذج أثناء مرحلة التنفيذ
تستطيع أيضاً وضع الصور على النموذج أثناء تنفيذ البرنامج، والذي نعبر عنه بمرحلة التنفيذ.
استخدم العبارة التالية لتحميل صورة تدعى C:\VB5Prg\OurPic.bmp، ووضعها على نموذج يدعى frmOurForm باستخدام العبارة التالية:
frmOurForm.Picture = LoadPicture("C:\VB5Prg\OurPic.bmp")
يمكن وضع صورة واحدة فقط على النموذج، في لحظة معينة، ولهذا يستبدل التابع الوظيفي LoadPicture()، صورة الخلفية الحالية (أي في حال وجود واحدة على النموذج) بالصورة الجديدة.
ملاحظة
استخدم العبارة التالية لمحو (مسح) صورة موجودة مسبقاً على النموذج.
frmOurForm.Pictare= LoadPictare("")
حالما تنفيذ العبارة السابقة يصبح النموذج بدون صورة خلفية.
عنصر التحكم Image
تستطيع أيضاً وضع ملفات الصور BMP في عنصر التحكم Image، الذي يدعم الخاصية Stretch. تمكّنك هذه الخاصية من مد (تكبير) الصورة إلى أي حجم شئت. (لا يدعم النموذج ولا عنصر تحكم Picture هذه الخاصية).
استخدم العبارة التالية لتحميل الصورة C:\VB5Prg\Ch07\MyPic.bmp ووضعها في عنصر التحكم Image المدعو imgMyImage:
imgMyImage.Picture = LoadPicture("C:\VB5Prg\Ch07\MyPic.bmp")
يتسبب التابع الوظيفي LoadPicture() باستبدال الصورة الحالية في حال وجودها حسبما اتفقنا لأن عنصر التحكمImage لا يستوعب أكثر من صورة واحدة في نفس اللحظة.
أما لمحو (مسح) صورة موجودة حالياً في عنصر التحكم Image أثناء مرحلة التنفيذ، فاستخدم العبارة التالية:
imgMyImage.Picture = LoadPicture("")
استخدم العبارة التالية لإسناد القيمةTrue إلى الخاصيةStretch للنموذج imgMyImage:
imgMyImage.Stretch = True
بعد إسناد القيمةTrue إلى الخاصية Stretch. سوف تكبر الصورة آلياً لتملأ كامل مساحة
عنصر التحكم Imge، أي بكلمة أخرى يكبر فيجول بيسك أو يصغر حجم الصورة آلياً.
فمثلاً، إذا كان عنصر التحكم Image بحجم 2 بوصة × 2 بوصة، وكان يحتوي على الصورة MyPic.bmp، فسوف يصغر فيجول بيسك الصورة MyPic.bmp من حجمها الأصلي المساوي إلى 3 بوصة × 3 بوصة، إلى 2 بوصة × 2 بوصة.
تستطيع أيضاً إسناد إحدى القيمتين True أو False، أثناء مرحلة التصميم إلى الخاصية Stretch لعنصر التحكم Image.
عنصر التحكم Picture
يتشابه عنصر التحكم Picture كثيراً مع عنصر التحكم Image، باستثناء أنه يقدّم المزيد من الخصائص، والمزيد من الحوادث والطرق. إلا أنه لا يقدم الخاصية Stretch، (فقط عنصر التحكمImage وحده الذي يدعم الخاصية Stretch).
يقدّم عنصر التحكم Picture الخاصية AutoSize، ويؤدي إسناد القيمة True إلى هذه الخاصية، إلى قيام فيجول بيسك بضبط حجم عنصر التحكم Picture وفقاً لحجم ملف الصورة الذي يحتويها.
فمثلاً، إذا كان ملف الصورة بحجم 3 بوصة × 3 بوصة، فسوف يضبط فيجول بيسك عنصر التحكم Picture بحيث يساوي 3 بوصة × 3 بوصة، لا يقدم النموذج ولا عنصر التحكم Image الخاصية AutoSize.
يستخدم عنصر التحكم Image مصادر أقل Resource، من تلك التي يستخدمها العنصر Picture، ولهذا يتمكن من إعادة رسم الصورة بشكل أسرع.
دمج ملفات الصور في الملفات التنفيذية EXE
اتفقنا إذاً، أن التابع الوظيفي LoadPicture()، يُستخدم لتحميل صورة في عنصر التحكم Image أو في عنصر التحكمPicture أو في النموذج، أثناء مرحلة التنفيذ.
إلا أن استخدام هذا التابع الوظيفي لا يخلو من سلبية، فيجب أن تكون الصورة BMP
موجودة في الدليل المحدد ضمن وسيط التابع الوظيفي LoadPicture().
ولهذا يتوجب أن يحتوي القرص الذي توزعه (القرص الذي يحوي برنامجك الكامل) على ملفات الصور التي يستخدمها برنامجك.
من جهة أخرى يصبح ملف الصورة جزءاً من الملف التنفيذي EXE النهائي، إذا تم إسناد ملف الصورة أثناء مرحلة التصميم إلى عنصر التحكم الذي سيحوي الصورة، (النموذج أو عنصر التحكم Image أو العنصر Picture)، فلا تعود هناك حاجة لتوزيع ملف الصورة كملف منفصل.
ملفات الصورة التي يدعمها فيجول بيسك هي: ملفات الصور النقطية BMP، وملفات الأيقونات ICO وملفات الرسوم المتجهية WMF وملفات مؤشرات الفأرة CUR.
ملفات الرسوم النقطية Bitmap Files
هي عبارة عن ملفات تحمل أحد الامتدادين BMP أو DIB. يحتوي ملف الرسوم النقطية على بايتات تصف مواقع وألوان النقاط الضوئية (Pixels) للصورة.
ملفات الأيقونات Icon Files
عبارة عن ملفات تحمل الامتداد ICO. تتشابه هذه الملفات مع الملفات من النوع BMP و DIB، إلا أنها تمثل صوراً يبلغ الحجم الأعظمي لها 32×32 نقطة ضوئية، (النقطة الضوئية Pixel: هي أصغر عنصر نقطي يمكن للشاشة إظهاره، وتتحدد دقة الشاشة به).
ملفات الرسوم المتجهية Meta Files
عبارة عن ملفات تحمل الامتداد WMF، وتحوي لائحة من التعليمات الرسومية التي تصف كيفية توليد الصورة.
ملفات مؤشرات الفأرة Cursor Files
ملفات تحمل الامتداد CUR. تتشابه مع ملفات الأيقونات ICO. وهي ملفات صغيرة تُستخدم عادة لتمثيل مؤشر الفأرة، كالساعة الرملية ورأس السهم.
برنامج العين المتحركة
يمكننا نقل وتحريك عنصر تحكم ما إما بتغيير الخاصيتين Left و Top، أو باستخدام الطريقة Move.
سنكتب برنامجاً يدعى العين المتحركة، يوضح كيف تستطيع تحريك كائن ما، بتغيير الخاصيتين Left و Top لهذا الكائن.
التمثيل المرئي لبرنامج العين المتحركة
سنشرع كعادتنا بالتمثل المرئي للبرنامج:
أنشئ مشروعاً تنفيذياً قياسياً Standard EXE جديداً.
احفظ نموذج المشروع بالاسم MoveEye.frm في الدليل C:\VB5prg\Ch07، واحفظ ملف المشروع بالاسم MoveEye.vbp في نفس الدليل.
أنشئ نموذج برنامج العين المتحركة طبقاً للجدول 7-4.
النموذج المكتمل سيبدو مشابهاً لذاك المبين في الشكل 7-8.
الشكل 7-8 النموذج frmMoveEye بعد انتهائه في مرحلة التصميم.
جدول 7-4. جدول خصائص النموذج frmMoveEye.
الكائن الخاصية القيمة
Form Name frmMoveEye
Caption برنامج العين المتحركة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdMove
Caption &تحريك
RightToLeft True
Image Name imgEye
Picture Eye.Ico
Stretch True
يطالبك الجدول 7-4 بإسناد اسم الملف Eye.Ico للخاصية Picture لعنصر التحكم imgEye.
يمكنك العثور على هذا الملف في الدليل الفرعي \Icons\Misc الذي أنشئ عند تنصيب فيجول بيسك. إذا لم يحتو الدليل على هذا الملف، تستطيع استخدام أي ملف بديل.
إدخال نص برنامج العين المتحركة
سنكتب الآن نص برنامج العين المتحركة:
تحقق أن قسم التصاريح العامة للنموذجfrmMoveEye يحتوي عہارة Option Explicit:
'يجب الاعلان عن كل المتغيرات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_Click():
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء cmdMove_Click():
Private Sub cmdMove_Click()
Dim Counter As Integer
'تنفيذ الحلقة 100 مرة
For Counter = 1 To 100
'ازاحة الصورة 20 وحدة إلى اليسار
imgEye.Left = imgEye.Left - 20
'انقاض ارتفاع الصورة 20 وحدة منطقية
imgEye.Top = imgEye.Top - 20
Next
End Sub
تنفيذ برنامج العين المتحركة
لنشاهد ما كتبناه على أرض الواقع:
نفذ برنامج العين المتحركة.
تتحرك صورة العين عند نقر الزر تحريك، وتستطيع تكرار النقر على هذا الزر إلى أن تختفي العين عن الأنظار.
كيف يعمل برنامج العين المتحركة
يحرّك برنامج العين المتحركة، عنصر التحكم Image (صورة العين)، بتبديل الخاصيتين Left و Top.
نص الإجراء cmdMove_Click()
يُنفذ الإجراء cmdMove_Click() آلياً عند نقر الزر تحريك:
Private Sub cmdMove_Click()
Dim Counter As Integer
'تنفيذ الحلقة 100 مرة
For Counter = 1 To 100
'ازاحة الصورة 20 وحدة إلى اليسار
imgEye.Left = imgEye.Left - 20
'انقاض ارتفاع الصورة 20 وحدة منطقية
imgEye.Top = imgEye.Top - 20
Next
End Sub
تُنقص العبارة الأولى في الحلقةFor الإحداثي العمودي للزاوية اليسرى العليا للصورة بمقدار 20 Twips:
imgEye.Top = imgEye.Top - 20
كما تنقص العبارة الثانية في الحلقة For الإحداثي الأفقي للزاوية اليسرى العليا للصورة بمقدار 20 Twips أيضاً:
imgEye.Left = imgEye.Left - 20
يوضح الشكل 7-9 تأثير هاتين العبارتين:
الشكل 7-9 تحريك الصورة بمقدار 20 Twips إلى الأعلى و 20 Twips إلى اليسار.
تُنفذ الحلقة For.Next مائة مرة ولهذا تُحرك الصورة 100 مرة، مما يعطي الناظر وهم الحركة المستمرة.
تحريك أو نقل عنصر تحكم باستخدام الطريقة Move
ينقل برنامج العين المتحركة الذي تناولناه سابقاً الصورة بتبديل الخصائص Top و Left. تعتبر الطريقة Move طريقة أخرى لتحريك عنصر التحكم.
استبدل نص الإجراء cmdMove_Click() السابق بالنص التالي:
Private Sub cmdMove_Click()
Dim Counter As Integer
Dim LeftEdge As Single
Dim TopEdge As Single
' وضع احداثيات الصورة وأبعادها في المتحولات
LeftEdge = imgEye.Left
TopEdge = imgEye.Top
'تنفيذ الحلقة 100 مرة
For Counter = 1 To 100
'ازاحة الصورة 20 وحدة إلى اليسار
LeftEdge = LeftEdge - 20
'انقاض ارتفاع الصورة 20 وحدة منطقية
TopEdge = TopEdge - 20
' زيادة العرض 10 وحدات منطقية
imgEye.Move LeftEdge, TopEdge
Next
End Sub
يُجهز هذا الإجراء متحولين هما: LeftEdge و TopEdge، بإسناد الموقع الحالي للزاوية اليسرى العليا للصورة لهما، ثم ينفذ الحلقة For.Next مائة مرة.
تنقص قيمة المتحولينLeftEdge و TopEdge بمقدار 20 Twips مع كل تكرار للحلقة.
تستخدم الطريقةMove مع المتحول LeftEdge باعتباره الإحداثي الأفقي الجديد، والمتحول TopEdge باعتباره الإحداثي العمودي الجديد.
المزيد عن طريقة Move
الصيغة الكاملة لعبارةMove تعطى بالشكل التالي:
[Object name].Move newLeft, newTop, newWidth, newHight
نستنتج من العبارة السابقة، أن بإمكاننا تعيين عرض وارتفاع جديدين للكائن بعد تحريكه. وإليك المثال التالي:
استبدل نص الإجراء cmdMove_Click() السابق بالنص التالي:
Private Sub cmdMove_Click()
Dim Counter As Integer
Dim LeftEdge As Single
Dim TopEdge As Single
Dim NewWidthOfImage As Single
Dim NewHeightOfImage As Single
imgEye.Stretch = True
' وضع احداثيات الصورة وأبعادها في المتحولات
LeftEdge = imgEye.Left
TopEdge = imgEye.Top
NewWidthOfImage = imgEye.Width
NewHeightOfImage = imgEye.Height
'تنفيذ الحلقة 100 مرة
For Counter = 1 To 100
'ازاحة الصورة 20 وحدة إلى اليسار
LeftEdge = LeftEdge - 20
'انقاض ارتفاع الصورة 20 وحدة منطقية
TopEdge = TopEdge - 20
' زيادة العرض 10 وحدات منطقية
NewWidthOfImage = NewWidthOfImage + 10
' زيادة الارتفاع 10 وحدات منطقية
NewHeightOfImage = NewHeightOfImage + 10
imgEye.Move LeftEdge, TopEdge, _
NewWidthOfImage, NewHeightOfImage
Next
End Sub
نفّذ البرنامج، ولاحظ أن العين تتحرك وتكبر في نفس الوقت، وبعد مائة مرة، يبدو النموذج كما في الشكل 7-10.
الشكل 7-10 استخدام طريقة Move لتحريك وتكبير العين في نفس الوقت.
أول عبارة بعد عبارات التصاريح هي العبارة التالية:
imgEye.Stretch = True
يتم إسناد القيمة True للخاصية Stretch للعنصر imgEye، بواسطة العبارة السابقة، مما يعني أن البرنامج يستطيع تكبير الصورة (أنجزنا هذه الخطوة مسبقاً أثناء مرحلة التصميم، إلا أن تكرارها هنا ما هو إلا بهدف توضيح أن الخاصية Stretch يمكن تحديدها أثناء مرحلة التنفيذ أيضاً).
يتم إسناد قيمتين ابتدائيتين تمثلان عرض وارتفاع الصورة، إلى المتحولين NewWidthOfImage و NewHeightOfImage:
NewWidthOfImage = imgEye.Width
NewHeightOfImage = imgEye.Height
تنفذ الطريقة Move بعد ذلك 100 مرة، ومع كل تكرار للحلقة تزداد قيمة المتحولين NewWidthOfImage و NewHeightOfImage بمقدار 10 Twips.
تحدد الطريقة Move الإحداثيات الجديدة للزاوية اليسرى العليا للصورة، وكذلك العرض والارتفاع الجديدين بعد إنجاز عملية التحريك:
imgEye.Move LeftEdge, TopEdge, _
NewWidthOfImage, NewHeightOfImage
ملاحظة
تُستخدم طريقة Move لتحريك أي كائن Object باستثناء القوائم، وقد تكون بعض عناصر التحكم غير مرئية (مثال، عنصر التحكم Timer)، ولهذا لا يحمل تحريكها أي معنى.
مقارنة تقنيات التحريك
ستجد عند مقارنة أوامر برنامج العين المتحركة، باستخدام كلتا تقنيتي التحريك، أن الطريقة Move أفضل طرق التحريك. فاستخدام الخاصتينTop وLeft في التحريك يعطي انتقالاً غير متوازن. لن تشعر بهذا الأمر طبعاً عند استخدام حاسب ذي معالج سريع (بنتيوم بسرعة 233 ميغا هرتز) لأن الصورة التي تحركها صغيرة جداً.
ولكن ستلاحظ عند استخدام طريقة Move بعض الوميض على الشاشة. ويزداد هذا الوميض مع تزايد حجم الصورة. هذا بغض النظر عن سرعة الحاسب PC المستخدم هنا. يمكن إزالة هذا الوميض باستخدام تقنيات DirectX.
نقل عنصر التحكم Picture
أوضح البرنامج السابق أن استخدام طريقة Move لتحريك عنصر تحكم، يعطي حركة أخف من تبديل الخاصيتين Top و Left. يمكنك الحصول على نتائج أفضل باستخدام عنصر التحكم Picture بدل عنصر التحكم Image. ولرؤية كيف تستخدم عنصر التحكم Picture، بدل النموذج frmMoveEye:
احذف عنصر التحكم Image المسمى imgEye من النموذج باختياره، ثم ضغط المفتاح Delete على لوحة المفاتيح.
انقر نقراً مزدوجاً على عنصر التحكم Picture فوق مربع الأدوات ليتوضع على النموذج.
أسند الاسم picEye إلى الخاصية Name لعنصر التحكم Picture.
أسند اسم الملف Eye.Ico إلى الخاصية Picture للعنصر picEye.
أسند القيمة 0-None للخاصية BorderStyle للعنصر picEye، مما يعني عدم إحاطة الصورة بحدود.
أسند القيمة 0-Flat للخاصية Appearance للعنصر picEye، مما يعني أن عنصر التحكم هذا سيظهر مسطحاً، وليس ثلاثي الأبعاد.
أسند القيمة True للخاصية AutoSize للعنصر picEye، لتمكين عنصر التحكم من تغيير حجمه ليتسع صورة العين آلياً.
أسند اللون الرمادي Gray للخاصية BackColor للعنصر picEye، (حتى تكون خلفية صورة العين، نفس لون خلفية النموذج).
استبدل الإجراء cmdMove_Click() السابق بالإجراء التالي:
Private Sub cmdMove_Click()
Dim Counter As Integer
Dim LeftEdge As Single
Dim TopEdge As Single
' وضع احداثيات الصورة وأبعادها في المتحولات
LeftEdge = imgEye.Left
TopEdge = imgEye.Top
'تنفيذ الحلقة 100 مرة
For Counter = 1 To 100
'ازاحة الصورة 20 وحدة إلى اليسار
LeftEdge = LeftEdge - 20
'انقاض ارتفاع الصورة 20 وحدة منطقية
TopEdge = TopEdge - 20
imgEye.Move LeftEdge, TopEdge
Next
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
نفّذ البرنامج وانقر الزر Move، وراقب كيف تتحرك العين.
مصفوفة عناصر التحكم
يعرّف عنصر التحكم على أنه مصفوفة، وبنود هذه المصفوفة هي عناصر تحكم. فنستطيع مثلاً إنشاء مصفوفة من عناصر التحكم Image.
برنامج القمر
سنكتب الآن برنامجاً يدعى برنامج القمر، وهذا البرنامج سيستخدم مصفوفة من عناصر التحكم Image.
التمثيل المرئي لبرنامج القمر
سنشرع الآن بطور التمثيل المرئي لنموذج برنامج القمر:
أنشئ مشروعاً تنفيذياً قياسياً Standard EXE جديداً.
احفظ نموذج المشروع بالاسم Moon.Frm في الدليل C:\VB5Prg\Ch07، واحفظ المشروع بالاسم Moon.vbp في ذ ات الدليل.
أسند الخصائص التالية للنموذج Moon.Frm:
Name: frmMoon
Caption: برنامج القمر
RightToLeft: True
ضع عنصر تحكم Image في النموذج frmMoon، بالنقر المزدوج على رمز عنصر التحكم Image في إطار مربع الأدوات.
يستجيب فيجول بيسك بوضع عنصر التحكم Image في النموذج frmMoon.
اسحب عنصر التحكم Image إلى القسم العلوي اليساري من النموذج.
أسند الاسم imgMoon للخاصية Name لعنصر التحكم Image الذي وضعته في النموذج، (أطلقنا على عنصر التحكم هذا الاسم imgMoon).
أسند القيمة False للخاصية Visible لعنصر التحكم imgMoon.
أسند القيمة False للخاصية Stretch لعنصر التحكم imgMoon.
أسند الملف Moon01.Ico إلى الخاصية Picture لعنصر التحكم imgMoon (يقع هذا الملف ضمن الدليل الفرعي Icons\Elements للدليل الذي ثبّت فيه فيجول بيسك).
طبعاً تستطيع استخدام أي ملف آخر مكان هذا الملف في حال عدم توافره.
يفترض أن يبدو النموذج frmMoon كما في الشكل 7-11.
الشكل 7-11 العنصر الأول في مصفوفة عنصر التحكم Image.
انتهينا الآن من وضع عنصر التحكم Image في النموذج. يعتبر هذا العنصر أول بند (البند ذي الرقم صفر) في مصفوفة العناصر. إلا أن العنصر الذي وضعناه هو حتى هذه اللحظة عنصر تحكم نظامي (أي ليس عنصراً في مصفوفة). وتستطيع التحقق من ذلك بالرجوع إلى الخاصية Index للعنصر imgMoon، والتي ستكون فارغة.
اتبع الخطوات التالية لوضع عنصر تحكم ثاني في مصفوفة عناصر التحكم:
انقر نقراً مزدوجاً على رمز عنصر التحكم Image في إطار مربع الأدوات.
يستجيب فيجول بيسك بوضع عنصر تحكم Image ثان في النموذج frmMoon، يحتوي النموذج الآن على عنصري تحكم Image.
اسحب عنصر التحكم Image الثاني إلى يمين العنصر الأول.
أسند القيمة False إلى الخاصية Visible للعنصر الثاني.
أسند القيمة False إلى الخاصية Stretch للعنصر الثاني.
أسند القيمة Moon 02.Ico إلى الخاصية Picture للعنصر الثاني.
يفترض أن يبدو النموذج frmMoon كما هو مبين في الشكل 7-12.
الشكل 7-12 العنصرين الأول والثاني في مصفوفة عناصر التحكم Image.
أسند الاسم imgMoonإلى الخاصية Name لعنصر التحكم Image الثاني، و انقر الآن في أي مكان من النموذج.
يستجيب فيجول بيسك بإظهار مربع الحوار المبين في الشكل 7-13، حيث يتحقق فيجول بيسك بواسطته، من رغبتك بتسميته العنصر الثاني بنفس اسم عنصر التحكم الأول.
انقر الزر نعم في مربع الحوار المبين بالشكل 7-13.
الشكل 7-13 إنشاء مصفوفة عناصر تحكم Control Array.
لقد أعلمت فيجول بيسك بأنك ترغب بإنشاء مصفوفة عناصر تحكم Control Array.
تَفَحَّص الخاصية Index لأول عنصري تحكم.
ستجد أن الخاصية Index لعنصر التحكم Image الأول تساوي الصفر، وتساوي 1 لعنصر التحكم Image الثاني.
مما يعني أنك تملك الآن مصفوفة عناصر تحكم يدعى imgMoon()، العنصر الأول في المصفوفة هوimgMoon(0) (وهو الملف Moon01.Ico)، والذي يمثل أول عنصر وضعته في النموذج.
والعنصر الثاني في المصفوفة هو العنصر imgMoon(1) ويمثل الملف Moon02.Ico.
كرر الآن المعالجة السابقة وأضف ستة عناصر أخرى إلى مصفوفة عناصر التحكم Control Array. سيكون لديك عند الانتهاء، ثمانية عناصر في المصفوفة، حسب ما يبينه الشكل 7-14 والجدول 7-5.
لا تنس إسناد نفس القيم لخصائص العناصر الست المتبقية،(Name وStretch وVisible).
لاحظ أن فيجول بيسك لا يعيد تنبيهك بإظهار مربع الحوار المبين بالشكل 7-13 عند إضافة العناصر الإضافية إلى المصفوفة imgMoon() لأن فيجول بيسك علم أنimgMoon عبارة عن مصفوفة عناصر تحكم Control Array (كبر النموذج إذا دعت الحاجة، ليتسع كل الأقمار).
الشكل 7-14 الأقمار الثمانية لمصفوفة عناصر التحكم.
الجدول 7-5. مصفوفة عناصر التحكم المدعوimgMoon().
عنصر المصفوفة محتويات العنصر
imgMoon(0) Moon01.Ico
imgMoon(1) Moon02.Ico
imgMoon(2) Moon03.Ico
imgMoon(3) Moon04.Ico
imgMoon(4) Moon05.Ico
imgMoon(5) Moon06.Ico
imgMoon(6) Moon07.Ico
imgMoon(7) Moon08.Ico
استأنف بناء النموذج frmMoon تبعاً للجدول 7-6.
يفترض أن يبدو النموذج المكتمل كما يبينه الشكل 7-15.
الشكل 7-15 النموذج frmMoon.
الجدول 7-6. جدول خصائص برنامج القمر.
الكائن الخاصية القيمة
Form Name frmMoon
Caption برنامج القمر
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
CommandButton Name cmdStart
Caption ا&بدأ
RightToLeft True
Timer Name tmrTimer
Interval 250
Enabled True
Image Name imgCurrentMoon
Visible True
Picture (None)
Stretch False
Image Control (انظر الجدول 7-5) (انظر الجدول 7-5)
ملاحظة
اترك الخاصية Picture للعنصرimgCurrentMoon على حالها دون تغيير القيمة الافتراضية لها. لأننا سنسند لها قيمة من ضمن نص البرنامج. لا يعتبر عنصر التحكم imgCurrentMoon جزءاً من مصفوفة عناصر التحكم imgMoon().
لا يظهر عنصر التحكم Timer خلال مرحلة التنفيذ، لذلك ضعه على النموذج في أي موقع.
إدخال نص برنامج القمر
سندخل الآن نص برنامج القمر:
أدخل النص التالي ضمن قسم التصاريح العامة للنموذج frmMoon:
'يجب التصريح عن كل المتحولات
Option Explicit
'التصريح هنا عن أي متحول يجعله متاحا في
' frmMoon جميع أجزاء النموذج
Dim gRotateFlag As Integer
Dim gCurrentMoon As Integer
أدخل النص التالي ضمن الإجراء cmdExit_click():
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء cmdSart_click():
Private Sub cmdStart_Click()
' التبديل بين حالتي البدء والتوقف
If gRotateFlag = 0 Then
gRotateFlag = 1
cmdStart.Caption = "&توقف"
Else
gRotateFlag = 0
cmdStart.Caption = "&ابدأ"
End If
End Sub
أدخل النص التالي ضمن الإجراء Form_Load():
Private Sub Form_Load()
'إعطاء قيمة أولية للمتحولات
gRotateFlag = 0
gCurrentMoon = 0
End Sub
أدخل النص التالي ضمن الإجراء tmrTimer_Timer():
Private Sub tmrTimer_Timer()
'سوف ينفذ هذا الإجراء كل ربع ثانية
If gRotateFlag = 1 Then
imgCurrentMoon.Picture = _
imgMoon(gCurrentMoon).Picture
gCurrentMoon = gCurrentMoon + 1
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
End If
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج القمر
لنشاهد برنامج القمر الآن، وهو يعمل:
نفّذ برنامج القمر.
انقر الزر ابدأ.
كما تلاحظ، يظهر القمر وكأنه يدور حول نفسه (محوره).
انقر الزر خروج لإنهاء برنامج القمر.
نص برنامج القمر
يستخدم نص برنامج القمر، مصفوفة من عناصر التحكم Images لإظهار عناصر المصفوفة الواحد تلو الآخر، مما يعطي الإحساس بأن القمر يدور حول نفسه.
نص قسم التصاريح العامة
يصرح قسم التصاريح العامة عن متحولين صحيحين: gRotateFlag وgCurrentMoon. وبذلك يصبح هذان المتحولان مرئيين من قبل كافة إجراءات النموذج frmMoon.
نص الإجراء Form_Load()
ينفذ الإجراء Form_Load() آلياً، عند تشغيل البرنامج،ويعتبر مكاناً مناسباً لإنجاز مختلف مهام الابتداء. فمثلاً يتم إسناد القيمة الابتدائية صفر إلى المتحولين اللذين تم التصريح عنهما في قسم التصاريح العامة:
gRotateFlag = 0
gCurrentMoon = 0
ملاحظة
يُسند فيجول بيسك آلياً قيمة ابتدائية تساوي الصفر للمتحولات عند التصريح عنها، إلا أن إسناد قيم ابتدائية إلى المتحولات في الإجراء Form_Load() يسهّل قراءة نص البرنامج.
نص الإجراء cmdSart_click()
يُنفذ الإجراء cmdSart_click() عند النقر على ابدأ. وهو ينفذ بدوره العبارة If.Else. التي تتحقق من القيمة الراهنة للمتحول gRotateFlag:
Private Sub cmdStart_Click()
' التبديل بين حالتي البدء والتوقف
If gRotateFlag = 0 Then
gRotateFlag = 1
cmdStart.Caption = "&توقف"
Else
gRotateFlag = 0
cmdStart.Caption = "&ابدأ"
End If
End Sub
فإذا كانت القيمة الراهنة للمتحول gRotateFlag تساوي الصفر، تُبدَّل هذه القيمة إلى الواحد، ويحوَّل عنوان الزر cmdStart إلى &توقف. أما إذا كانت القيمة الراهنة لذلك المتحول (أي gRotateFlag) تساوي الواحد، فإن الإجراء يبدلها إلى صفر، ويرجع عنوان الزر cmdStart إلى ا&بدأ مرة أخرى.
يُستخدم المتحول gRotateFlag في إجراء الميقاتية الذي سنناقشه للتو.
نص الإجراء tmrTimer_Timer()
يُنفَّذ الإجراء tmrTimer_Timer() كل 250 ميلي ثانية، بسبب إسناد القيمة 250 إلى الخاصية Interval للميقاتية trmTimer.
Private Sub tmrTimer_Timer()
'سوف ينفذ هذا الإجراء كل ربع ثانية
If gRotateFlag = 1 Then
imgCurrentMoon.Picture = _
imgMoon(gCurrentMoon).Picture
gCurrentMoon = gCurrentMoon + 1
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
End If
End Sub
تبقى قيمة المتحول gRotateFlag مساوية إلى الصفر، ما لم تنقر الزر ابدأ، ولا تنفذ العبارات الواقعة ضمن كتلة الشرط:
If gRotateFlag = 1 Then
imgCurrentMoon.Picture = _
imgMoon(gCurrentMoon).Picture
gCurrentMoon = gCurrentMoon + 1
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
End If
أما عند نقر الزر ابدأ، فتصبح قيمة gRotateFlag مساوية الواحد، عندها تنفذ العبارات الواقعة ضمن كتلة الشرط:
If gRotateFlag = 1 Then
imgCurrentMoon.Picture = _
imgMoon(gCurrentMoon).Picture
gCurrentMoon = gCurrentMoon + 1
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
End If
يعمل جزء البرنامج الموجود ضمن عبارة الشرط على إسناد الخاصية Picture لمصفوفة عناصر التحكم إلى الخاصية Picture للعنصر imgCurrentMoon:
imgCurrentMoon.Picture = imgMoon(gCurrentMoon).Picture
على سبيل المثال، إذا كانت قيمة المتحول gCurrentMoon مساوية إلى الصفر، فسوف يتم إسناد الخاصية Picture للعنصر الأول (ذي الترتيب صفر) من عناصر مصفوفة التحكم إلى الخاصية Picture للعنصر imgCurrentMoon. مما يعني أن صورة عنصر التحكم الأول Moon01.Ico سوف تظهر (لأن imgMoon(0).Picture يحوي الصورة Moon01.Ico).
تزيد العبارة التالية في كتلة الشرط if قيمة المتحول gCurrentMoon بمقدار واحد:
gCurrentMoon = gCurrentMoon + 1
وعند التنفيذ التالي للإجراء tmrTimer_Timer() (أي بعد مرور 250 ميلي ثانية)، يشير المتحول gCurrentMoon إلى العنصر التالي في مصفوفة عناصر التحكم.
تختبر العبارات التالية في الإجراء tmrTimer_Timer() قيمة gCurrentMoon، فإذا كانت مساوية إلى 8، فهذا يعني أنه تم للتو إظهار العنصر الثامن من عناصر مصفوفة عناصر التحكم، ولهذا يجب إعادة تصفير المتحول gCurrentMoon، أي:
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
التحريك Animation
يوضح برنامج القمر مقدار السهولة التي يمكن بها كتابة برنامج تحريك Animation في فيجول بيسك. نستطيع تحسين برنامج القمر بحيث تغدو أوامر التحريك فيه أعمق أثراً.
تحسين برنامج القمر
طوِّر برنامج القمر وفق ما يلي:
أسند القيمة 55 إلى الخاصية Interval للميقاتية tmrTimer.
أضف النص البرمجي التالي إلى قسم التصاريح العامة للنموذج frmMoon:
Option Explicit
Dim gRotateFlag As Integer
Dim gCurrentMoon As Integer
Dim gDirection As Integer
Dim gLeftCorner As Single
Dim gTopCorner As Single
Dim gWidthOfMoon As Single
Dim gHeightOfMoon As Single
Dim gEnlargeShrink As Integer
عدّل الإجراء Form_Load() حيث يغدو بالشكل التالي:
Private Sub Form_Load()
gRotateFlag = 0
gCurrentMoon = 0
gDirection = 1
gLeftCorner = imgCurrentMoon.Left
gTopCorner = imgCurrentMoon.Top
gWidthOfMoon = 1
gHeightOfMoon = 1
gEnlargeShrink = 1
imgCurrentMoon.Stretch = True
End Sub
عدل الإجراء tmrTimer_Timer() بحيث يغدو كما يلي:
Private Sub tmrTimer_Timer()
'سوف ينفذ هذا الإجراء كل ربع ثانية
If gRotateFlag = 1 Then
imgCurrentMoon.Picture = _
imgMoon(gCurrentMoon).Picture
gCurrentMoon = gCurrentMoon + 1
If gCurrentMoon = 8 Then
gCurrentMoon = 0
End If
gLeftCorner = gLeftCorner + 10 * gDirection
gTopCorner = gTopCorner + 10 * gDirection
gWidthOfMoon = gWidthOfMoon + 10 * gEnlargeShrink
gHeightOfMoon = gHeightOfMoon + 10 * gEnlargeShrink
If gWidthOfMoon > 700 Then
gEnlargeShrink = -1
End If
If gWidthOfMoon < 10 Then
gEnlargeShrink = 1
End If
If imgCurrentMoon.Top > frmMoon.ScaleHeight Then
gDirection = -1
End If
If imgCurrentMoon.Top < 10 Then
gDirection = 1
End If
End If
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ النسخة المحسنة لبرنامج القمر
دعنا نشاهد النسخة المحسنة لبرنامج القمر على أرض الواقع:
نفّذ برنامج القمر.
وكما تشاهد يدور القمر حول محوره ويظهر أيضاً وكأنه يتحرك في ثلاثة أبعاد.
نص قسم التصاريح العامة
يحوي قسم التصاريح العامة للنموذج frmMoon على تصاريح إضافية عن المتحولات التي يفترض أن تكون مرئية لكل إجراءات النموذج.
نص الإجراء Form_Load()
يسند هذا الإجراء قيماً ابتدائية إلى المتحولات. فالمتحولان gLeftCorner و gTopCorner يمثلان الموقع الابتدائي للزاوية اليسرى العليا لعنصر التحكم imgCurrentMoon:
gLeftCorner = imgCurrentMoon.Left
gTopCorner = imgCurrentMoon.Top
كما أن الخاصية Stretch لعنصر التحكم imgCurrentMoon تساوي True
imgCurrentMoon.Stretch = True
مما يعني أن حجم العنصر imgCurrentMoon سوف يتغير بحيث يتسع ضمن عنصر التحكم.
هذه الخطوة ضرورية لأن حجم الصورة imgCurrentMoon سوف يزاد وينقص أثناء تنفيذ برنامج القمر.
نص الإجراء tmrTimer_Timer()
كتلة If الأولى في الإجراء tmrTimer_Timer() هي ذاتها في النسخة السابقة لهذا الإجراء، وتعتبر مسؤولة عن إظهار أحد صور مصفوفة التحكم.
تستخدم الطريقة Move حال ظهور الصورة Image لتحريكها، وهكذا فان الموقع الجديد للزاوية اليسرى العليا للصورة (صورة القمر)، يتوضع عند الإحداثيين X = gLeftCorner وY = gTopCorner.
تستخدم طريقة Move الوسيطين الاختياريين Width (العرض) و Height (الارتفاع):
imgCurrentMoon.Moveg gLeftCorner , gTopCorner , _
gWidthOfMoon , gHeightOfMoon
وبعد التحريك، تمتلك الصورة عرضاً وارتفاعاً جديدين.
تجهز العبارات التالية لعبارة Move المتحولات التالية للتنفيذ التالي للإجراء tmrTimer_Timer():
gLeftCorner = gLeftCorner + 10 * gDirection
gTopCorner = gTopCorner + 10 * gDirection
gWidthOfMoon = gWidthOfMoon + 10 * gEnlargeShrink
gHeightOfMoon = gHeightOfMoon + 10 * gEnlargeShrink
ستزيد قيمة المتحولات السابقة أو تنقص، اعتماداً على قيمة المتحولات gDirection وgEnlargeShrink، فإذا كانت قيمة gDirection تساوي "1"، تزاد قيمة gLeftCorner كمثال بمقدار 10 Twips، أما إذا كانت قيمة gDirection تساوي "-1" فسوف تنقص قيمة gLeftCorner بمقدار 10 Twips).
يلي ذلك كله تفحص قيمة gWidthOfMoon، هل هي كبيرة جداً أم صغيرة جداً ؟!:
If gWidthOfMoon > 700 Then
gEnlargeShrink = -1
End If
If gWidthOfMoon < 10 Then
gEnlargeShrink = 1
End If
يختبر نص الإجراء بعد ذلك الموقع الحالي للزاوية اليسرى العليا من الصورة Image للتأكد من عدم تقاطعهما مع أسفل أو أعلى النموذج:
If imgCurrentMoon.Top > frmMoon.ScaleHeight Then
gDirection = -1
End If
If imgCurrentMoon.Top < 10 Then
gDirection = 1
End If
الخلاصة
تعلمنا في هذا الفصل كيفية استخدام عناصر التحكم الرسومية، كما تعلمنا كيفية إظهار ملفات الصور في عنصري التحكم Image وPicture وكيفية تحريك هذه الصور. ولا تنس أن مصفوفة عناصر التحكم تقدم تقنية مفيدة، تُستخدم غالباً في التحريك Animation.
الفصل الثامن
أساليب الرسم المباشرة
يركز هذا الفصل على أساليب رسومية أخرى، تتشابه مع عناصر التحكم الرسومية التي تناولناها في الفصل السابع. يعتبر استخدام الأساليب الرسومية الأخرى، أسهل في بعض الأحيان من استخدام عناصر التحكم الرسومية.
برنامج النقاط
يرسم برنامج النقاط نقاطاً في مواقع عشوائية من النموذج، موضحاً كيف تستخدم الطريقة Pset لرسم النقاط.
التمثيل المرئي لبرنامج النقاط
سنبدأ كعادتنا عند تصميم البرنامج بتمثيل نموذج البرنامج:
أنشئ الدليل C:\VB5Prg\Ch08، لأننا سنحفظ عملنا في هذا الدليل.
أنشئ مشروعاً تنفيذياً قياسياً جديداً Standard EXE، واحفظ نموذج المشروع بالاسم Points.frm في الدليل C:\VB5Prg\Ch08، واحفظ المشروع بالاسم Points.vbp في ذات الدليل.
أنشئ النموذج frmPoints طبقاً للجدول 8-1.
يُفترض أن يبدو النموذج المكتمل كذاك المبين في الشكل 8-1.
الشكل 8-1 النموذج frmPoints (طور التصميم).
الجدول 8-1. جدول خواص النموذج frmPoints.
الكائن الخاصية القيمة
Form Name frmPoints
Caption برنامج النقاط
RightToLeft True
Timer Name tmrTimer
Interval 60
Enabled True
Menu (انظر الجدول 8-2) (انظر الجدول 8-2)
جدول 8-2. جدول قوائم النموذج frmPoints.
العنوان الخاصية Name
&ملف mnuFile
…&خروج mnuExit
&رسوم mnuGraphics
…ار&سم النقاط mnuDrawPoints
…ا&مسح النقاط mnuClear
إدخال نص برنامج النقاط
سنكتب الآن نص برنامج النقاط:
أدخل النص التالي ضمن قسم التصاريح العامة للنموذج frmPoints:
'يجب التصريح عن كل المتحولات
Option Explicit
'متحول لمعرفة هل سوف ترسم النقاط أم سوف تمسح
Dim gDrawPoints
أدخل النص التالي ضمن الإجراء Form_Load() للنموذج frmPoints:
Private Sub Form_Load()
'تعطيل الرسم
gDrawPoints = 0
End Sub
أدخل النص التالي ضمن الإجراء mnuClear_Click():
Private Sub mnuClear_Click()
'تعطيل الرسم
gDrawPoints = 0
'تنظيف سطح النموذج
frmPoints.Cls
End Sub
أدخل النص التالي ضمن الإجراء mnuDrawPoints_Click() للنموذج frmPoints:
Private Sub mnuDrawPoints_Click()
'تفعيل الرسم
gDrawPoints = 1
End Sub
أدخل النص التالي ضمن الإجراء mnuExit_Click للنموذج frmPoints:
Private sub mnuExit_Click()
End
End sub
أدخل النص التالي ضمن الإجراء tmrTimer1_Timer() للنموذج frmPoints:
Private Sub tmrTimer_Timer()
Dim R, G, B
Dim X, Y
Dim Counter
'إذا كان الرسم مفعلا نفّذ ما يلي
If gDrawPoints = 1 Then
'ارسم 100 نقطة عشوائية
For Counter = 1 To 100 Step 1
'الحصول على لون عشوائي
R = Rnd * 255
G = Rnd * 255
B = Rnd * 255
'الحصول على موقع احداثيات عشوائي
X = Rnd * frmPoints.ScaleWidth
Y = Rnd * frmPoints.ScaleHeight
'ارسم النقطة
frmPoints.PSet (X, Y), RGB(R, G, B)
Next
End If
End Sub
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج النقاط
دعنا نشاهد برنامج النقاط قيد التنفيذ:
نفّذ برنامج النقاط.
اختر ارسم النقاط من القائمة رسوم.
يستجيب البرنامج بإظهار نقاط ذات ألوان عشوائية في مواقع عشوائية من النموذج (انظر الشكل 8-2).
الشكل 8-2 رسم نقاط عشوائية على سطح برنامج النقاط.
اختر امسح النقاط من القائمة رسوم.
يستجيب البرنامج بمسح سطح برنامج النقاط.
اختر خروج من القائمة ملف لإنهاء البرنامج.
كيف يعمل برنامج النقاط
يستعمل برنامج النقاط، الطريقة الرسومية Pset لرسم نقطة ما في النموذج، كما يستخدم الطريقة Cls لمحو النموذج.
نص قسم التصاريح العامة
يُصرَح عن المتحول gDrawPoints في قسم التصاريح العامة، ويخدم هذا المتحول كراية Flag. فإذا كان مساوياً إلى الواحد (أي الراية مرفوعة)، فهذا يعني تمكين عملية الرسم، وإذا ساوى الصفر، فهذا يعني عدم تمكين الرسم (الراية غير مرفوعة).
نص الإجراء Form_Load
يُنفّذ هذا الإجراء آلياً عند بدء تشغيل البرنامج:
Private Sub Form_Load()
'تعطيل الرسم
gDrawPoints = 0
End Sub
يسند هذا الإجراء القيمة الابتدائية صفر إلى المتحول gDrawPoints لمنع أو لعدم تمكين رسم النقاط.
نص الإجراء mnuClear_Click()
ينفذ هذا الإجراء عند اختيار امسح النقاط من القائمة رسوم:
Private Sub mnuClear_Click()
'تعطيل الرسم
gDrawPoints = 0
'تنظيف سطح النموذج
frmPoints.Cls
End Sub
يمنع هذا الإجراء عملية الرسم بإسناد القيمة صفر، إلى المتحول gDrawPoints ثم يستخدم الطريقة Cls لتنظيف سطح البرنامج من الرسوم التي عليه.
ملاحظة
استخدم الطريقة Cls (Clean Screen) لتنظيف محتويات سطح كائن ما، تمسح هذه الطريقة الرسوم المتولدة أثناء مرحلة التنفيذ بواسطة طرق الرسم المختلفة.
لاحظ مثلاً أن استخدام العبارة frmMyForm.Cls يؤدي إلى تنظيف سطح النموذج frmMyForm من أي رسوم متولدة عليه.
نص الإجراء mnuDrawPoints_Click()
ينفذ الإجراء mnuDrawPoints_Click() عند اختيار ارسم النقاط من القائمة رسوم:
Private Sub mnuDrawPoints_Click()
'تفعيل الرسم
gDrawPoints = 1
End Sub
يسند هذا الإجراء القيمة واحد إلى الراية (المتحول) gDrawPoints لتمكين الرسم.
نص الإجراء tmrTimer_Timer()
ينفذ الإجراء tmrTimer_Timer() تلقائياً كل 60 ميلي ثانية، وذلك بسبب إسناد القيمة 60 إلى الخاصية Interval:
Private Sub tmrTimer_Timer()
Dim R, G, B
Dim X, Y
Dim Counter
'إذا كان الرسم مفعلا نفّذ ما يلي
If gDrawPoints = 1 Then
'ارسم 100 نقطة عشوائية
For Counter = 1 To 100 Step 1
'الحصول على لون عشوائي
R = Rnd * 255
G = Rnd * 255
B = Rnd * 255
'الحصول على موقع احداثيات عشوائي
X = Rnd * frmPoints.ScaleWidth
Y = Rnd * frmPoints.ScaleHeight
'ارسم النقطة
frmPoints.PSet (X, Y), RGB(R, G, B)
Next
End If
End Sub
تفحص العبارة if قيمة الراية gDrawPoints، فإذا كانت مساوية إلى "الواحد"، فهذا يعني أنك اخترت ارسم النقاط من القائمة رسوم، ولذلك تنفذ كتلة العبارة If.
ترسم الحلقة For مائة نقطة، وكل نقطة ترسم بلون عشوائي في موقع عشوائي. تستخدم الطريقة الرسومية PSet لرسم كل نقطة من هذه النقاط:
frmPoints.PSet (X, Y), RGB(R, G, B)
طريقة الرسم PSet
حسب ما أوضحنا، ترسم الطريقة PSet نقطة عند الإحداثيين X و Y المحددين ضمنها
(بواسطة وسائطها).
تمتلك الطريقة PSet وسيطاً إضافياً يدعى Step، وعند استخدام الوسيط Step، تُرسم النقطة نسبة إلى الإحداثيين CurrentX (الإحداثي X الحالي) وCurrentY (الإحداثي Y الحالي).
فمثلاً، لنفترض أن الإحداثي X الحالي CurrentX يساوي 100، والإحداثي Y الحالي CurrentY يساوي 50.
وهكذا يؤدي استخدام العبارة التالية:
frmPoints.PSet Step (10,20)، RGB(R,G,B)
إلى رسم نقطة عند الموقع (X=110 و Y=70)، تحُدَّث قيمة المتحولين CurrentX وCurrentY مباشرة (أي تلقائياً) بعد تنفيذ هذه العبارة، وتصبح قيمة CurrentX = 110 و CurrentY = 70.
تذكر أننا اصطلحنا منذ الفصل الرابع بأن فيجول بيسك، يحدّث قيمة الإحداثيين CurrentX و CurrentY تلقائياً، بإسناد إحداثيي نقطة النهاية لآخر رسم إليهما).
استبدل نص الإجراء tmrTimer_Timer() بالنص التالي:
Private Sub tmrTimer1_Timer()
Dim R, G, B
Dim X, Y
Dim Counter
If gDrawPoints = 1 Then
For Counter = 1 To 100 Step 1
R = Rnd * 255
G = Rnd * 255
B = Rnd * 255
frmPoints.PSet Step(1, 1), RGB(R, G, B)
If CurrentX >= frmPoints.ScaleWidth Then
CurrentX = Rnd * frmPoints.ScaleWidth
If CurrentY >= frmPoints.ScaleHieght Then
CurrentY = Rnd * frmPoints.ScaleHieght
End If
Next
End If
End Sub
احفظ المشروع بالطريقة المعتادة.
نفّذ البرنامج، واختر ارسم النقاط من القائمة رسوم، واترك البرنامج يعمل لفترة.
يرسم البرنامج الآن خطوطاً، حسب ما يبينه الشكل 8-3.
الشكل 8-3 استخدام الإمكانية Step لطريقة الرسم PSet.
يستخدم نص الإجراء tmrTimer1_Timer() الطريقة PSet مع الإمكانية Step:
frmPoints.PSet Step (1,1)، RGB(R,G,B)
تبعد كل نقطة مرسومة عن سابقتها بمقدار وحدة إلى اليمين ووحدة إلى الأسفل. وهذا يشرح سبب رسم النقاط وكأنها خطوط مستقيمة حسب ما يوضحه الشكل 8-3.
تتحقق عبارتي If في هذا الإجراء، من أن النقاط المرسومة لا تتجاوز حدود النموذج.
ملاحظة
استخدم الطريقة PSet (Point Set) لرسم نقطة في كائن ما، وذلك كالتالي:
ObjectName.Pset (X,Y),Color
تضع العبارة السابقة نقطة على الكائن عند الموقع (X,Y) وبلون معين.
لوضع نقطة معينة على الكائن نسبة إلى آخر نقطة تم رسمها، استخدم العبارة التالية:
ObjectName.Pset Step (X,Y),Color
وهي مكافئة للعبارة التالية:
ObjectName.Pset (oldX + X,oldY + Y),Color
حيث oldX و oldY، إحداثيات آخر نقطة تم رسمها على الكائن.
الطريقة Point
تعود هذه الطريقة بقيمة لون نقطة ضوئية Pixel محددة. فمثلاً، لمعرفة لون النقطة الضوئية المحددة بالموقع 40 و 30، استخدم العبارة التالية:
PixelColor = Point (30,40)
ورغم أن برنامج النقاط لم يستخدم الطريقة Point، إلا أنك قد تجد استخداماً لها في مشاريعك المستقبلية.
رسم الخطوط Line
تسمح الطريقة Line للمستخدم برسم خطوط، وتمتلك الصيغة التالية:
Line(X1,Y1)-(X2,Y2), Color
علماً أن (X1,Y1)يمثل إحداثي نقطة بداية الخط، ويمثل (X2,Y2)إحداثي نقطة نهاية الخط، كما أن Color يمثل لون الخط. ويؤدي تجاهل كتابة النقطة الأولى (X1,Y1) إلى رسم الخط بدءاً من الإحداثيين CurrentX وCurrentY. وذلك كالتالي:
Line -(X2,Y2), Color
سنضيف عنصر قائمة جديد يدعى رسم خطوط إلى نظام قوائم برنامج النقاط، بغية توضيح عمل طريقة Line، يعطي الجدول 8-3 جدول القوائم الجديد لبرنامج النقاط.
الجدول 8-3. جدول القوائم الجديد للنموذج frmPoints.
العنوان الاسم
&ملف mnuFile
…&خروج mnuExit
&رسوم mnuGraphics
…ار&سم النقاط mnuDrawPoints
…ا&مسح النقاط mnuClear
…رسم &خطوط mnuLines
أضف النص التالي إلى الإجراء mnuLines_Click() للنموذج frmPoints:
Private sub mnuLines_Click()
Line -(Rnd * frmPoints.ScaleWidth, _
Rnd * frmPoints.ScaleHeight),RGB(0,0,0)
End sub
يرسم هذا الإجراء خطاً واحداً من آخر نقطة رسم وصل إليها، إلى نقطة عشوائية.
احفظ المشروع بالطريقة المعتادة.
نفّذ البرنامج النقاط.
اختر رسم خطوط من القائمة رسوم.
يُرسم خط في النموذج، ويتشابه مع ذاك المبين في الشكل 8-4.
الشكل 8-4 رسم خط ما بواسطة الطريقة Line.
بسبب تجاهل الإحداثيين (X1,Y1)، ترسم عبارة Line في هذا الإجراء خطاً ما، ابتداءً من الإحداثيين CurrentX وCurrentY، تكون القيمة الابتدائية للإحداثيين CurrentX وCurrentY مساوية إلى الصفر عند بدء تشغيل البرنامج. وهذا يشرح سبب بداية الخط في الشكل 8-4 من الإحداثيين 0,0.
اختر رسم خطوط من القائمة رسوم عدة مرات.
يُرسم خط جديد في كل مرة، ويبدأ من نهاية الخط السابق (انظر الشكل 8-5).
اختر خروج من القائمة ملف لإنهاء البرنامج.
الشكل 8-5 رسم خطوط متصلة.
دعنا الآن نكتب برنامجاً يرسم عدة خطوط عند اختيار رسم خطوط من القائمة رسوم:
Private Sub mnuLines_Click()
Dim Counter
For Counter = 1 To 100 Step 1
Line -(Rnd * frmPoints.ScaleWidth, _
Rnd * frmPoints.ScaleHeight), RGB(0, 0, 0)
Next
End Sub
نفّذ البرنامج.
اختر رسم خطوط من القائمة رسوم.
يرسم البرنامج مائة خط متصل، حسب ما يبينه الشكل8-6.
الشكل 8-6 رسم مائة خط متصل.
استخدام الوسيط Step في الطريقة Line
يمكنك استخدام الوسيط Step الاختياري في الطريقة Line، كما يلي:
Line (X1,Y1) - Step (dx,dy),Color
علماً أن (X1,Y1) تمثل إحداثيات نقطة البداية، أما Step (dx,dy) فهي دلالة لفيجول بيسك، بأن نقطة نهاية الخط تقع عند الإحداثيين X1 + dx و Y1 + dy. فمثلاً ترسم العبارة التالية:
Line (20,30) - Step (50,100), RGB(0,0,0)
خطاً يبدأ من الإحداثيين 20 , 30 وينتهي بالإحداثيين 70 , 130.
يمكن استخدام الإمكانية Step أيضاً لرسم مربع. ترسم العبارات التالية المربع المبين في الشكل 8-7:
Line (10,20) - (400,20)
Line -Step(0,400)
Line -Step(-300,0)
Line -Step(0,-400)
الشكل 8-7 رسم مربع بطريقة رسم الخط Line.
كما تشاهد تعتبر عبارات Line الأربعة لازمة لرسم مربع واحد، الطريقة الأسهل لرسم مربع، بواسطة الطريقة Line تكون باستخدام Line مع الخيار B، أي:
Line (100,20)-(400,420),RGB(0,0,0),B
الإحداثيان الأولين هما إحداثيا الزاوية اليسرى العليا للمربع، أما الإحداثيان اللذان يليهما فيمثلان إحداثيي الزاوية السفلى اليمنى للمربع. يطلب الوسيط B من فيجول بيسك، رسم مربع له هاتين الزاويتين.
إذا أردت ملء المربع (طمسه)، استخدم الوسيط F:
Line(100,20)-(400,420),RGB(0,255,0),BF
ترسم هذه العبارة مربعاً وتملؤه باللون الأخضر، لا توجد فاصلة بين B و F لأنك لا تستطيع استخدام F بدون B.
ملاحظة
يقصد برسم المربع هنا، رسم شكل رباعي الأضلاع، وهو ليس بالضرورة مربعاً متساوي الأضلاع.
ملء المربع بواسطة الخاصية FillStyle
تُقدم الخاصية FillStyle طريقة ثانية لملء المربع المرسوم، فباستخدام الخاصيتين FillColor وFillStyle للنموذج، واستخدام طريقة Line مع الوسيط B دون الوسيط F نستطيع ملء المربع:
frmMyForm.FillStyle = 2
frmMyForm.FillColor = RGB(255,0,0)
frmMyForm.Line (100,20)-(400,420),RGB(0,0,0),B
تسند العبارة الأولى القيمة 2 إلى الخاصية FillStyle. يبين الجدول 8-4 معاني القيم النهائية المحتملة لهذه الخاصية، وعندما تكون قيمة FillStyle مساوية إلى 2، يمُلأ الكائن بخطوط أفقية.
تسند العبارة الثانية اللون الأحمر RGB(255,0,0) إلى الخاصية FillColor، (بمعنى أن المربع سيلون بالأحمر)، وهكذا تتسبب العبارات الثلاث برسم مربع وملؤه بخطوط شاقولية حمراء.
الجدول 8-4. القيم الثمانية المحتملة للخاصية FillStyle.
القيمة الشرح
0 لون خالص مصمت Solid.
1 لون شفاف غير مرئي Transparent (القيمة الافتراضية).
2 خطوط أفقية Horizontal Lines.
3 خطوط عمودية Vertical Lines.
4 خطوط مائلة للأعلى Upward diagonal Lines.
5 خطوط مائلة للأسفل Downward diagonal Lines.
6 خطوط متقاطعة Cross hatch
7 خطوط متقاطعة مائلة Diagonal Cross hatch.
للتعرف على معاني كل قيمة من قيم الخاصية FillStyle في الجدول 8-4 قم بما يلي:
أضف القائمة رسم مربع إلى نظام قوائم النموذج frmPoints.
يعطي الجدول 8-5 جدول القائمة الجديد.
الجدول 8-5. إضافة القائمة رسم مربع إلى النموذج frmPoints.
العنوان الخاصية Name
&ملف mnuFile
…&خروج mnuExit
&رسوم mnuGraphics
…ار&سم النقاط mnuDrawPoints
…ا&مسح النقاط mnuClear
…رسم &خطوط mnuLines
رسم مربع mnuDrawBox
…أحمر mnuRed
…أخضر mnuGreen
…أزرق mnuBlue
…- mnuSep1
…تغيير نمط الرسم mnuSetStyle
أضف النص التالي ضمن الإجراء mnuRed_Click() للنموذج frmPoints:
Private Sub mnuRed_Click()
'تغيير الخاصية FillColor إلى الأحمر
frmPoints.FillColor = RGB(255, 0, 0)
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(255, 0, 0), B
End Sub
أضف النص التالي ضمن الإجراء mnuBlue_Click() للنموذج frmPoints:
Private Sub mnuBlue_Click()
'تغيير الخاصية FillColor إلى الأحمر
frmPoints.FillColor = RGB(255, 0, 0)
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(0, 0, 255), B
End Sub
أضف النص التالي ضمن الإجراء mnuGreen_Click() للنموذج frmPoints:
Private Sub mnuGreen_Click()
'تغيير الخاصية FillColor إلى الأحمر
frmPoints.FillColor = RGB(255, 0, 0)
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(0, 255, 0), B
End Sub
أضف النص التالي ضمن الإجراء mnuSetStyle_Click() للنموذج frmPoints:
Private Sub mnuSetStyle_Click()
Dim FromUser
Dim Instruction
Instruction = "FillStyle أدخل رقماً(0-7) لتعيينه للخاصية"
'الحصول على قيمة من المستخدم
FromUser = InputBox$(Instruction, _
"FillStyle تعيين قيمة ")
'تنظيف النموذج
frmPoints.Cls
'التأكد من القيمة المدخلة
If Val(FromUser) >= 0 And Val(FromUser) <= 7 Then
frmPoints.FillStyle = Val(FromUser)
Else
Beep
MsgBox ("قيمة غير صحيحة")
End If
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(0, 0, 0), B
End Sub
احفظ المشروع، باختيار Save Project من القائمة File لفيجول بيسك.
تنفيذ برنامج النقاط
لنشاهد ما كتبناه قيد العمل:
نفّذ برنامج النقاط.
اختر تغيير نمط الرسم من القائمة رسم مربع.
يستجيب البرنامج بإظهار مربع إدخال (Input Box) حسب ما يظهر من الشكل 8-8.
الشكل 8-8 إدخال قيمة للخاصية FillStyle.
أدخل رقماً بين صفر و سبعة، وانقر الزر OK. يمثل هذا الرقم قيمة الخاصية FillStyle.
يُظهر البرنامج المربع ويملؤه حسب قيمة FillStyle المدخلة في الخطوة السابقة. يظهر في الشكل 8-9 المربع عندما تكون قيمة FillStyle مساوية إلى 4 (خطوط مائلة). قد تضطر إلى سحب الحافة اليسارية للإطار لتوسيعه.
الشكل 8-9 التمرن على الخاصية FillStyle.
اختر أحمر أو أزرق أو أخضر من القائمة رسم مربع.
يستجيب البرنامج برسم المربع باللون المنتقى.
تمرن على برنامج النقاط، واختر خروج من القائمة ملف لإنهائه.
نص الإجراء mnuRed_Click()
ينفذ الإجراء mnuRed_Click عند اختيار أحمر من القائمة رسم مربع:
Private Sub mnuRed_Click()
'تغيير الخاصية FillColor إلى الأحمر
frmPoints.FillColor = RGB(255, 0, 0)
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(255, 0, 0), B
End Sub
يحدد هذا الإجراء قيمة الخاصية FillColor باللون الأحمر، ثم يستخدم الطريقة Line مع الوسيط B لرسم مربع. يملأ المربع تبعاً للقيمة الراهنة للخاصية FillStyle للنموذج.
يعمل الإجراءان mnuBlue_Click() و mnuGreen_Click() بطريقة مشابهة، محددين قيمة الخاصية FillColor باللون الأزرق Blue أو الأخضر Green.
نص الإجراء mnuSetStyle_Click
ينفذ هذا الإجراء عند اختيار تغيير نمط الرسم من القائمة رسم مربع:
Private Sub mnuSetStyle_Click()
Dim FromUser
Dim Instruction
Instruction = "FillStyle أدخل رقماً(0-7) لتعيينه للخاصية"
'الحصول من المستخدم على القيمة
FromUser = InputBox$(Instruction, _
"FillStyle تعيين قيمة ")
'تنظيف النموذج
frmPoints.Cls
'التأكد من القيمة المدخلة
If Val(FromUser) >= 0 And Val(FromUser) <= 7 Then
frmPoints.FillStyle = Val(FromUser)
Else
Beep
MsgBox ("قيمة غير صحيحة")
End If
'رسم المربع
frmPoints.Line (100, 80)-Step(5000, 3000), _
RGB(0, 0, 0), B
End Sub
يستخدم هذا الإجراء التابع الوظيفي InputBox() للحصول على رقم بين صفر وسبعة، ثم ينظف النموذج بواسطة الطريقة Cls، يلي ذلك التحقق من القيمة التي أدخلها المستخدم وذلك باستخدام العبارة If بغية التحقق من أن القيمة تقع ضمن المجال الصحيح (المسموح به).
فإذا كانت القيمة المدخلة واقعة بين صفر وسبعة،تُحَدَّث عند ذلك الخاصية FillStyle بإسناد تلك القيمة إليها.
ترسم آخر عبارة في الإجراء مربعاً باستخدام الطريقة Line مع الإمكانية B. يُرسم المربع اعتماداً على القيمتين الحاليتين للخاصتين FillColor وFillStyle للنموذج.
برنامج الدائرة
نُقدم الآن طريقة رسم هامة أخرى وهي الطريقة Circle، تُستخدم هذه الطريقة لرسم الدوائر والقطوع الناقصة، ويوضح برنامج الدائرة كيفية رسم الدوائر.
يمكنك استخدام الطريقة Circle لرسم الدوائر سواء في النموذج، أوفي عنصر تحكم الصورة.
التمثيل المرئي لبرنامج الدائرة
نبدأ كعادتنا بطور التمثيل المرئي (طور التصميم) لنموذج برنامج الدائرة:
أنشئ مشروعاً تنفيذياً قياسياً جديداً Standard EXE، واحفظ نموذج المشروع بالاسم Circles.frm في الدليل C:\VB5Prg\Ch08، واحفظ المشروع بالاسم Circles.vbp في الدليل C:\VB5Prg\Ch08.
أنشئ النموذج frmCircles وفقاً للجدول 8-6.
يفترض أن يبدو النموذج المكتمل كما في الشكل 8-10.
الشكل 8-10 النموذج frmCircles في طور التصميم.
الجدول 8-6 جدول خصائص النموذج frmCircles.
الكائن الخاصية القيمة
Form Name frmCircles
Caption برنامج الدائرة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Picture Box Name picCircles
BorderStyle 1-Fixed Single
Vertical Scroll Bar Name vsbRadius
Max 100
Min 1
Value 1
Horizontal Scroll Bar Name hsbCircleWidth
Max 10
Min 1
Value 1
Label Name lblWidth
Caption العرض:
RightToLeft True
Label Name lblRadius
Caption نصف القطر:
RightToLeft True
إدخال نص برنامج الدائرة
سندخل الآن نص برنامج الدائرة:
تحقق من احتواء قسم التصاريح العامة على العبارة Option Explicit، أي:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmCircles:
Private Sub cmdExit_Click()
End
End Sub
أدخل النص التالي ضمن الإجراء hsbCircleWidth_Change():
Private Sub hsbCircleWidth_Change()
Dim X, Y, Radius
picCircles.DrawWidth = hsbCircleWidth.Value
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
picCircles.Cls
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(255, 0, 0)
End Sub
أدخل النص التالي ضمن الإجراء hsbCircleWidth_Scroll():
Private Sub hsbCircleWidth_Scroll()
hsbCircleWidth_Change
End Sub
أدخل النص التالي ضمن الإجراء vsbRadius_Change():
Private Sub vsbRadius_Change()
Dim X, Y, Radius
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
picCircles.Cls
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(255, 0, 0)
End Sub
أدخل النص التالي ضمن الإجراء vsbRadius_Scroll():
Private Sub vsbRadius_Scroll()
vsbRadius_Change
End Sub
احفظ المشروع بالطريقة المعتادة.
تنفيذ برنامج الدائرة
لنشاهد ما كتبناه قيد التنفيذ:
نفّذ برنامج الدائرة.
غَيِّر موقع مؤشر شريط التمرير العمودي.
يتغير نصف قطر الدائرة الظاهرة، وفقاً لوضعية مؤشر شريط التمرير العمودي (انظر الشكل 8-11).
غَيِّر موقع مؤشر شريط التمرير الأفقي لتحديد قيمة جديدة لعرض حدود الدائرة. وترسم الدائرة بخط مختلف العرض.
الشكل 8-11 تغيير نصف قطر الدائرة بواسطة شريط التمرير العمودي.
كيف يعمل برنامج الدائرة
يستخدم برنامج الدائرة الطريقة Circle لرسم الدائرة. يتغير نصف قطر الدائرة تبعاً لموقع مؤشر شريط التمرير العمودي، ويتغير عرض حدود الدائرة تبعاً لموقع مؤشر شريط التمرير الأفقي.
نص الإجراء vsbRadius_Change()
ينفذ الإجراء vsbRadius_Change() عند تغيير موقع مؤشر شريط التمرير الأفقي:
Private Sub vsbRadius_Change()
Dim X, Y, Radius
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
picCircles.Cls
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(255, 0, 0)
End Sub
يحسب هذا الإجراء، إحداثيي نقطة مركز الدائرة (x,y) بحساب إحداثيات مركز عنصر تحكم الصورة، بحيث يكون مركز الدائرة هو نفسه مركز عنصر تحكم الصورة.
يلي ذلك تنظيف المحتويات الرسومية السابقة الموجودة على عنصر تحكم الصورة، وذلك باستخدام الطريقة Cls (أي تنظيف العنصر من الدائرة السابقة في حال وجودها)، وأخيراً ترسم الدائرة باستخدام الطريقة Circle:
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(255, 0, 0)
يكون نصف قطر الدائرة المرسومة بلون أحمر، أكبر عشر مرات من القيمة (الحالية) الراهنة لموقع مؤشر شريط التمرير العمودي.
ملاحظه
استخدم الطريقة Circle لرسم دائرة ما على الكائن:
ObjectName.Circle(X , Y) , Radius , color
فمثلاً، لرسم دائرة زرقاء على النموذج المدعو frmMyForm باحداثيي مركز 1000,500 ونصف قطر 75، استخدم العبارة التالية:
frmMyForm.Circle (1000 , 500), 75 , RGB(0,0,255)
بطريقة مشابهة، يرسم الإجراء vsbRadius_Scroll() دائرة جديدة عند تغيير موقع مؤشر شريط التمرير العمودي، وذلك باستدعاء الإجراء vsbRadius_Change.
نص الإجراء hsbCircleWidth_Change()
ينفذ الإجراء hsbCircleWidth_Change() عند تغيير موقع مؤشر شريط التمرير الأفقي:
Private Sub hsbCircleWidth_Change()
Dim X, Y, Radius
picCircles.DrawWidth = hsbCircleWidth.Value
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
picCircles.Cls
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(255, 0, 0)
End Sub
يغيّر هذا الإجراء الخاصية DrawWidth لعنصر تحكم الصورة المدعو picCircles، تبعاً لموقع مؤشر شريط التمرير الأفقي. تحدِد قيمة الخاصية DrawWidth عرض الدائرة المرسومة في عنصر تحكم الصورة. وكما تشاهد هناك تشابه كبير بين هذا الإجراء والإجراء vsbRadius_Change(). ولكن بدلاً من تغيير نصف القطر، يتم هنا تحديث الخاصية DrawWidth لعنصر تحكم الصورة:
picCircles.DrawWidth = hsbCircleWidth.Value
وبطريقة مشابهة، يرسم الإجراء hsbCircleWidth_Scroll() دائرة جديدة، عند تغيير عرض حدود الدائرة، عند تحريك مؤشر شريط التمرير الأفقي، وذلك باستدعاء الإجراء hsbCircleWidth_Change().
تحسين برنامج الدائرة
نستطيع بإضافة بعض الأسطر إلى برنامج الدائرة، الحصول على مؤثرات رسومية جذابة:
أضف الزر نمط الرسم إلى النموذج frmCircles، حسب مايبينه الشكل 8-12.
أسند لهذا الزر الخصائص التالية:
Name: cmdDrawStyle
Caption: نمط الرسم
RightToLeft: True
الشكل 8-12 إضافة الزر نمط الرسم إلى برنامج الدائرة.
أضف النص التالي ضمن الإجراء cmdDrawStyle_Click() للنموذج frmCircles:
Private Sub cmdDrawStyle_Click()
Dim TheStyle
TheStyle = InputBox$("أدخل رقماً(0-6):")
If Val(TheStyle) < 0 Or Val(TheStyle) > 6 Then
Beep
MsgBox ("إدخال غير صحيح")
Else
picCircles.DrawStyle = Val(TheStyle)
End If
End Sub
احذف شريط التمرير الأفقي. (تأكد من اختيار شريط التمرير الأفقي ثم اضغط المفتاح Delete لحذفه).
كتبنا في النسخة السابقة لبرنامج الدائرة، نص الإجراء hsbWidth_Change()، أما الآن، فقد حذفنا عنصر التحكم هذا، لهذا يضع فيجول بيسك نص هذا الإجراء في المنطقة General للنموذج frmCircles، لهذا تستطيع بعد حذفك عنصر التحكم، إزالة إجراءاته (Procedures) أيضاً من المنطقة General.
احذف الإجراء hsbWidth_Change() من المنطقة General، وذلك بإضاءته كاملاً بما في ذلك أول وآخر سطرين فيه، ثم اضغط الزر Delete من لوحة المفاتيح.
احذف الإجراء hsbWidth_Scroll() من المنطقة General بنفس الطريقة المتبعة في الخطوة السابقة.
احذف اللافتة lblWidth باختيارها، ثم ضغط المفتاح Delete من لوحة المفاتيح.
حدد اللون الأبيض White في الخاصية BackColor لعنصر التحكم picCircles، مما يعني أن الدائرة سترسم على خلفية بيضاء، الأمر الذي يمكِّنك من مشاهدة تأثيرات نماذج الرسم بشكل أفضل.
تنفيذ برنامج الدائرة
دعنا نشاهد النص الذي كتبناه قيد التنفيذ:
نفّذ برنامج الدائرة.
انقر الزر نمط الرسم.
يستجيب البرنامج بإظهار مربع رسالة، يطلب منك إدخال رقم بين الصفر والستة.
أدخل رقماً بين الصفر والستة (هذا الرقم يمثل نمط الرسم)، ثم انقر على الزر OK.
حرك مؤشر شريط التمرير العمودي جيئة وذهاباً، وشاهد التأثيرات التي تتسبب بها قيم مختلفة لأنصاف الأقطار والأنماط المختلفة، على الدائرة.
أنهِ البرنامج بالنقر على الزر خروج.
الخاصية DrawStyle
يُنفذ الإجراء cmdDrawStyle_Click() عند نقر الزر نمط الرسم.
يُطلب منك إدخال رقم بين الصفر والستة، ويُستخدم هذا الرقم كقيمة للخاصية DrawStyle لعنصر تحكم الصورة. يعرض الجدول 8-7 قائمة بالقيم السبعة المحتملة للخاصية DrawStyle ومعانيها.
الجدول 8-7. القيم السبعة المحتملة للخاصية DrawStyle.
القيمة الشرح
0 مصمت Solid (القيمة الافتراضية).
1 شَرطة Dash ( - - - ).
2 نقطة Dot ( . . . ).
3 شَرطة نقطة Dash Dot ( - . - . ).
4 شَرطة نقطة نقطة Dash Dot Dot ( - . . - . . ).
5 غير مرئي Invisible.
6 مصمت داخلي Inside Solid.
ملاحظة
تغير الخاصية DrawStyle، طريقة رسم الخطوط على الكائن، كما رأينا في الجدول السابق.
لكن هناك شرط واحد لكي تظهر هذه التأثيرات وهو: أن يكون عرض حدود الخطوط مساو للواحد (DrawWidth = 1)، ولا يمكن ظهور هذه التأثيرات، في حال ما إذا كانت قيمة الخاصية DrawWidth أكبر من الواحد.
تحسين برنامج الدائرة مجدداً
سنجري الآن تعديلاً إضافياً على برنامج الدائرة:
استبدل نص الإجراء vsbRadius_Change() بالنص التالي:
Private Sub vsbRadius_Change()
Dim X, Y, Radius
Static LastValue
Dim R, G, B
R = Rnd * 255
G = Rnd * 255
B = Rnd * 255
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
If LastValue > vsbRadius.Value Then
picCircles.Cls
End If
picCircles.Circle (X, Y), vsbRadius.Value * 10, _
RGB(R, G, B)
LastValue = vsbRadius.Value
End Sub
احفظ المشروع باختيار Save Project من القائمة File.
تنفيذ النسخة المحسنة من برنامج الدائرة
سنشاهد الآن بعض المؤثرات الرسومية الجميلة:
نفّذ برنامج الدائرة.
انقر على الزر نمط الرسم.
يستجيب البرنامج بإظهار مربع الدخول Input Box الذي يطالبك بإدخال رقم بين الصفر والستة.
أدخل الرقم 2 ثم انقر على الزر OK.
زد موقع مؤشر شريط التمرير العمودي نصف القطر بالنقر عدة مرات، فوق رأس السهم النازل الواقع أسفل شريط التمرير هذا.
يستجيب البرنامج برسم دوائر كما في الشكل 8-13.
أنقص موقع مؤشر شريط التمرير العمودي نصف القطر بالنقر عدة مرات، فوق رأس السهم الصاعد المتوضع أعلى شريط التمرير.
يستجيب البرنامج برسم دوائر متعاقبة أصغر.
تمرن على برنامج الدائرة، ثم أنهِ البرنامج بنقر الزر خروج.
الشكل 8-13 رسم دوائر بواسطة النسخة المحسنة من برنامج الدائرة.
نص الإجراء vsbRadius_Change()
ينفذ الإجراء vsbRadius_Change() آلياً عند تغيير موقع مؤشر شريط التمرير.
يبدأ الإجراء بالتصريح عن بضعة متحولات، ويعرّف المتحول الثاني كمتحول ساكن Static:
Static LastValue
مما يعني أن المتحول LastValue لا تسند له القيمة الابتدائية صفر، كلما نُفذ هذا الإجراء، وبمعنى آخر، يحافظ المتحول على قيمته ضمن هذا الإجراء.
يجهز الإجراء بعد ذلك المتحولات الثلاثة R,G,B ويسند إليها أرقاماً تمثل ألواناً عشوائية:
'توليد لون عشوائي
R = Rnd * 255
G = Rnd * 255
B = Rnd * 255
يحسب الإجراء بعد ذلك إحداثيات مركز عنصر تحكم الصورة:
X = picCircles.ScaleWidth / 2
Y = picCircles.ScaleHeight / 2
تستخدم الإحداثيات بعد ذلك ضمن هذا الإجراء كإحداثيات لمركز الدوائر.
يحتفظ المتحول LastValue بقيمة الخاصية Value لشريط التمرير العمودي، قبل تغيير موقع مؤشر شريط التمرير.
تتحقق العبارة If إذا كان الموقع الحالي لمؤشر شريط التمرير (المحدد بالخاصية Value)، أصغر من آخر موقع لشريط التمرير:
If LastValue > vsbRadius.Value Then
picCircles.Cls
End If
إذا كانت القيمة الراهنة للخاصية Value لشريط التمرير العمودي، أصغر من قيمة المتحول LastValue، فهذا يعني أنك أنقصت قيمة شريط التمرير. وفي هذه الحالة تنفذ الطريقة Cls التي تنظف عنصر تحكم لصورة.
يرسم الإجراء بعد ذلك دائرة باستخدام الطريقة Circle:
picCircles.Circle (X, Y), vsbRadius.Value * 10, RGB(R, G, B)
وآخر شيء يفعله هذا الإجراء، هو تحديث قيمة المتحول LastValue. وعند التنفيذ التالي لهذا الإجراء، تمثل قيمة المتحول LastValue الخاصية Value لشريط التمرير قبل التغيير:
LastValue = vsbRadius.Value
فإذا زاد المستخدم شريط التمرير، لا تنفذ الطريقة Cls، وهكذا تبقى الدوائر التي رسمت مسبقاً على الشاشة عند زيادة شريط التمرير، وينظف عنصر تحكم الصورة عند إنقاص شريط التمرير.
المتحول الساكن LastValue
لعل المتحول LastValue هو الشيء الهام الواجب الانتباه إليه، من المناقشة السابقة.
يصرح عن هذا المتحول بأنه Static:
Static LastValue
تُسند القيمة صفر إلى المتحول LastValue عند تنفيذ الإجراء vsbRadius_Change() لأول مرة من قبل فيجول بيسك. تتغير هذه القيمة أثناء تنفيذ الإجراء، وعند التنفيذ التالي لهذا الإجراء، يُعاد إسناد القيمة الابتدائية صفر إلى المتحولات الغير ساكنة non static (مثل المتحول X و Y و Radius) من جديد.
أما المتحول LastValue فلا تتبدل قيمته منذ آخر تنفيذ للإجراء، وذلك بسبب التصريح عنه بأنه من النوع الساكن Static (بمعنى أنه يحتفظ بقيمته التي أسندت إليه من التنفيذ السابق للإجراء).
قد تلاحظ تشابهاً بين المتحول المصرح عنه في قسم التصاريح العامة General Declarations، وبين المتحول المصرح عنه كمتحول ساكن Static. ففي كلتا الحالتين، يحتفظ المتحول بقيمته طالما أن البرنامج يعمل. لكن هنالك اختلاف هام بين نوعي المتحولين هذين:
المتحول المصرح عنه في قسم التصاريح العامة لنموذج يمكن الولوج إليه من ضمن أي إجراء في النموذج.
المتحول المصرح عنه في إجراء كمتحول ساكن Static، يقبل الولوج إليه من ضمن الإجراء الذي صرّح عن هذا المتحول.
فإذا حاولت مثلاً الولوج إلى المتحول LastValue من ضمن الإجراء Form_Load() مثلاً، فسوف ينتج لديك خطأ، لأنك لا تستطيع الوصول إلى هذا المتحول من خارج الإجراء vsbRadius_Change()، يمكنك أيضاً التصريح عن متحول آخر يدعى LastValue ضمن الإجراء Form_Load(). وهذه القيمة يمكن التصريح عنها كمتحول ساكن أو متحول غير ساكن نظامي، لكن لا يوجد أي صلة بين المتحول LastValue المنتمي للإجراء Form_Load()، وبين المتحول LastValue الخاص بالإجراء vsbRadius_Change().
وكما ترى، يعتبر التصريح عن متحول ساكن، حيلة جيدة للاستخدام، عندما لا ترغب بفقدان قيمة المتحول بعد الانتهاء من تنفيذ الإجراء.
تُخزن المتحولات غير الساكنة النظامية، والمتحولات الساكنة في الحاسب الشخصي PC بطرق مختلفة. فمثلاً قارن بين كيفية تخزين المتحول Radius، (والذي يمثل متحولاً نظامياً غير ساكن ومحلي ضمن الإجراء vsbRadius_Change()، وتخزين المتحول LastValue الساكن.
تضيع قيمة المتحول Radius بعد الخروج من الإجراء vsbRadius_Change() إلى الأبد، وهكذا فإن خلايا الذاكرة التي كانت مخصصة لحفظ المتحول Radius تصبح حرة (أي خالية). أما خلايا الذاكرة المستخدمة لحفظ المتحول الساكن LastValue، تبقى محجوزة طالما أن برنامج الدائرة قيد التنفيذ. كذلك الأمر، يبقى المتحول المصرح عنه في قسم التصاريح العامة في الذاكرة طالما أن البرنامج يعمل.
رسم القطوع الناقصة والأقواس
تُستخدم الطريقة Circle لرسم القطوع الناقصة والأقواس.
وتعطى الصيغة العامة الكاملة لهذه الطريقة بما يلي:
[object.]Circle [Step] ( X , Y ), _
radius , _
[color], _
[start], _
[ end ], _
[aspect]
يُؤدي استخدام الكلمة Step ضمن صيغة العبارة Circle، إلى الدلالة على أن الإحداثيين (X,Y) منسوبين للإحداثيين CurrentY CurrentX ,. فمثلاً، إذا كانت قيمة CurrentX تساوي 1000، وقيمة CurrentY تساوي 3000، ترسم العبارة التالية دائرة بنصف قطر يساوي 80، ومركز الإحداثيات (X = 1010 , Y = 3010):
frmMyform.Circle Step (10,20),80
الوسيط Aspect (نسبة القطرين)
الوسيط Aspect عبارة عن رقم موجب يتسبب برسم قطوع ناقصة. فمثلاً، تُولد الطريقة Circle دائرة مكتملة إذا كانت قيمة Aspect تساوي الواحد، أما عندما تكون قيمة Aspect أكبر من الواحد، فتولد الطريقة Circle عند ذلك، قَطعاً ناقصاً، يتطاول على محوره العمودي. وعندما تكون قيمة Aspect أقل من الواحد، تولد الطريقة Circle قَطعاً ناقصاً يمتد على محوره الأفقي. تُبين الأشكال 8-14و 8-15و 8-16 ثلاثة قطوع ناقصة بثلاثة قيم مختلفة للوسيط Aspect (نسبة القطرين).
الشكل 8-14 رسم دائرة مكتملة Aspect = 1.
الشكل 8-15 رسم قطع ناقص متطاول أفقياً Aspect = 0.5.
الشكل 8-16 رسم قطع ناقص متطاول عمودياً Aspect = 2.7.
برنامج القطوع الناقصة
يوضح برنامج القطوع الناقصة، كيفية رسم القطوع الناقصة، بأنصاف أقطار وقيم مختلفة للوسيط Aspect.
التمثيل المرئي لبرنامج القطوع الناقصة
نبدأ كعادتنا بالتمثيل المرئي لنموذج البرنامج:
أنشئ مشروعاً جديداً قياسياً من النوع Standard EXE، ثم احفظ نموذج المشروع بالاسم Ellipses.frm في الدليل C:\VB5Prg\Ch08، واحفظ ملف المشروع في ذات الدليل بالاسم Ellipses.vbp.
أنشئ النموذج frmEllipses طبقاً للجدول 8-8.
يُفترض أن يبدو النموذج كما هو مبين في الشكل 8-17.
الشكل 8-17 النموذج frmEllipses (طور التصميم).
الجدول 8-8. جدول خصائص النموذج frmEllipses.
الكائن الخاصية القيمة
Form Name frmEllipses
Caption برنامج القطوع الناقصة
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Horizontal Scroll Bar Name hsbAspect
Max 100
Min 1
Value 1
Horizontal Scroll Bar Name hsbRadius
الكائن الخاصية القيمة
Max 100
Min 1
Value 1
Label Name lblInfo
Caption نسبة القطرين:
RightToLeft True
Label Name lblAspect
Caption نسبة القطرين:
RightToLeft True
Label Name lblRadius
Caption نصف القطر:
RightToLeft True
إدخال نص برنامج القطوع الناقصة
ستدخل الآن نص برنامج القطوع الناقصة:
تحقق بأن العبارة Option Explicit تقع ضمن قسم التصاريح العامة للنموذج frmEllipses:
' يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء cmdExit_Click():
Private sub cmdExit_Click()
End
End sub
أدخل النص التالي ضمن الإجراء Form_Load():
Private Sub Form_Load()
hsbAspect.Value = 10
hsbRadius.Value = 10
lblInfo.Caption = "نسبة القطرين: 1"
frmEllipses.DrawWidth = 2
End Sub
أدخل النص التالي ضمن الإجراء hsbAspect_Change():
Private Sub hsbAspect_Change()
Dim X, Y
Dim Info
X = frmEllipses.ScaleWidth / 2
Y = frmEllipses.ScaleHeight / 2
frmEllipses.Cls
frmEllipses.Circle (X, Y), hsbRadius.Value * 10, _
RGB(255, 0, 0), , , hsbAspect.Value / 10
Info = "نسبة القطرين: " + Str(hsbAspect.Value / 10)
frmEllipses.lblInfo.Caption = Info
End Sub
أدخل النص التالي ضمن الإجراء hsbAspect_Scroll():
Private Sub hsbAspect_Scroll()
hsbAspect_Change
End Sub
أدخل النص التالي ضمن الإجراء hsbRadius_Change() للنموذج frmEllipses:
Private Sub hsbRadius_Change()
Dim X, Y
Dim Info
X = frmEllipses.ScaleWidth / 2
Y = frmEllipses.ScaleHeight / 2
frmEllipses.Cls
frmEllipses.Circle (X, Y), hsbRadius.Value * 10, _
RGB(255, 0, 0), , , hsbAspect.Value / 10
Info = "نسبة القطرين: " + Str(hsbAspect.Value / 10)
frmEllipses.lblInfo.Caption = Info
End Sub
أدخل النص التالي ضمن الإجراء hsbRadius_Scroll():
private sub hsbRadius_Scroll()
hsbRadius_Change()
End sub
تنفيذ برنامج القطوع الناقصة
لنشاهد ما كتبناه على أرض الواقع:
نفّذ برنامج القطوع الناقصة.
بدّل موقع مؤشر شريط التمرير نصف القطر لرسم دوائر وقطوع، بواسطة قيم مختلفة لنصف القطر.
بدّل موقع مؤشر شريط التمرير نسبة القطرين لرسم قطوع ناقصة ذات قيم مختلفة للوسيط Aspect.
لاحظ أن قيمة الوسيط Aspect الراهنة تظهر على يمين شريط التمرير نسبة القطرين. يرسم البرنامج دائرة مكتملة عندما تكون قيمة نسبة القطرين تساوي الواحد، أما عندما تكون قيمة نسبة القطرين أقل من الواحد، يرسم البرنامج عندها قَطعاً ناقصاً ممتداً على محوره الأفقي، كما يظهر من الشكل 8-15، أما عندما تكون قيمة نسبة القطرين أكبر من الواحد، يرسم البرنامج قطعاً ممتداً على محوره العمودي، حسب ما يوضحه الشكل 8-16.
كيف يعمل برنامج القطوع الناقصة
يرسم البرنامج قطوعاً ناقصة باستخدام الطريقة Circle. وتستخدم الخاصية Value لشريطي التمرير كوسائط تمرر للطريقة Circle.
نص الإجراء Form_Load()
ينفذ الإجراء Form_Load() عند تحميل النموذج frmEllipses (أي في بداية التنفيذ):
Private Sub Form_Load()
hsbAspect.Value = 10
hsbRadius.Value = 10
lblInfo.Caption = "نسبة القطرين: 1"
frmEllipses.DrawWidth = 2
End Sub
يسند هذا الإجراء القيمة 10 إلى الخاصية Value لشريط التمرير ثم يظهر اللافتة lblInfo وهي تحمل العنوان (نسبة القطرين: 1)، على يمين شريط التمرير نسبة القطرين. ستلاحظ قريباً أن البرنامج يستخدم عُشْر قيمة الخاصية Value لشريط التمرير نسبة القطرين، كقيمة للوسيط Aspect في الطريقة Circle.
فمثلاً، عندما تكون قيمة الخاصية Value لشريط التمرير نسبة القطرين مساوية إلى 20، فهذا يعني أن الطريقة Circle تستخدم القيمة 2 كقيمة للوسيط Aspect، وهذا هو السبب وراء قيام الإجراء Form_Load() بتسمية اللافتة lblInfo بالعنوان (نسبة القطرين: 1) بعد إسناد القيمة 10 إلى شريط التمرير نسبة القطرين.
تسند آخر عبارة في هذا الإجراء القيمة 2 إلى الخاصية DrawWidth للنموذج.
frmEllipses.DrawWidth = 2
يتسبب هذا الأمر، برسم الأشكال بعرض يساوي إلى وحدتي قياس (أي 2 Units)، وحدة القياس قد تكون نقطة ضوئية Pixel، (حسبما هو محدد في الخاصية ScaleMode)، وهكذا فعند استخدام الطريقة Circle ترسم القطوع بخط عرضه وحدتين.
لاحظ أن الإجراء عمد إلى إسناد قيمة معينة للخاصية DrawWidth، وإسناد عنوان للافتة lblInfo، وإسناد قيمة أيضاً لشريطي التمرير، وهي عمليات كان يمكن إنجازها أثناء طور التصميم (أي في مرحلة التمثيل المرئي).
نص الإجراء hsbAspect_Change()
ينفذ الإجراء hsbAspect_Change() عند تبديل موقع شريط التمرير نسبة القطرين:
Private Sub hsbAspect_Change()
Dim X, Y
Dim Info
X = frmEllipses.ScaleWidth / 2
Y = frmEllipses.ScaleHeight / 2
frmEllipses.Cls
frmEllipses.Circle (X, Y), hsbRadius.Value * 10, _
RGB(255, 0, 0), , , hsbAspect.Value / 10
Info = "نسبة القطرين: " + Str(hsbAspect.Value / 10)
frmEllipses.lblInfo.Caption = Info
End Sub
يحسب هذا الإجراء إحداثي مركز النموذج ويسندهما للمتحولين X,Y.
ينظف الإجراء سطح النموذج من أي قطوع مرسومة مسبقاً، مستخدماً الطريقة Cls، ثم يرسم القطع الناقص:
frmEllipses.Circle (X, Y), hsbRadius.Value * 10, _
RGB(255, 0, 0), , , hsbAspect.Value / 10
يُسند إلى الوسيط Radius (نصف القطر) القيمة الحالية لشريط التمرير نصف القطر مضروبة بـ 10، كما يُسند إلى الوسيط Aspect، عُشْر قيمة الخاصية Value لشريط التمرير نسبة القطرين.
لاحظ أننا لم نستخدم الوسيطين الاختياريين Start وEnd للطريقة Circle بعد، بل وضعنا مكانهما فاصلتين (أي فاصلتين بين الوسيط Color والوسيط Aspect)، تشير هاتان الفاصلتان لفيجول بيسك بأن الوسيطين الاختياريين غير مذكورين (مهملين).
نص الإجراء hsbRadius_Change()
يُنفذ هذا الإجراء آلياً، عند تبديل موقع مؤشر شريط التمرير نصف القطر (أي تحريك الزالقة)، يعتبر هذا الإجراء مشابهاً للإجراء hsbAspect_Change()، فيظهر القطع الناقص وتعدّل محتويات اللافتة lbllnfo.
لاحظ أن نص الإجراء hsbRadius_Scroll()، يستدعي الإجراء hsbRadius_Change()، كما أن نص الإجراء hsbAspect_Scroll() يستدعي بدوره الإجراء hsbAspect_Change()، (بمعنى أنك تنفذ الإجراءات المرافقة للحادثة تغيير Change عند حصول حادثة التمرير Scroll).
برنامج الأقواس
سنكتب الآن برنامج الأقواس Arcs، يوضح هذا البرنامج كيفية استخدام الطريقة Circle لرسم أقواس ذات نقاط بدء وانتهاء مختلفة. نذكرك الآن بالصيغة العامة الكاملة للطريقة Circle:
[object.]Circle [Step] ( X , Y ), _
radius , _
[color], _
[start], _
[ end ], _
[aspect]
يُحدد الوسيطان End, Start نقطتي البداية والنهاية لقوس الدائرة. فإذا كانت نقطة البداية تُساوي مثلاً الدرجة صفرْ، ونقطة النهاية تساوي الدرجة 45ْ، فهذا يعني أن هذا الجزء فقط من الدائرة هو الذي سيرسم. يوضح الشكل 8-18 جزء من دائرة (قوس) مرسوم بالطريقة Circle، نقطة بدايته الزاوية صفرْ ونقطة نهايته الزاوية 45ْ. كما يوضح الشكل 8-19 قوساً ذو نقطة بداية عند الدرجة 23ْ ونقطة نهاية عند الدرجة 180ْ.
الشكل 8-18 رسم قوس (0ْ-45ْ).
الشكل 8-19 رسم قوس (23ْ-180ْ).
التمثيل المرئي لبرنامج الأقواس
سنصمم الآن نموذج برنامج الأقواس:
أنشئ مشروعاً تنفيذياً قياسياً Standard EXE، ثم احفظ نموذج المشروع بالاسم Arcs.frm في الدليل C:\VB5Prg\Ch08، واحفظ ملف المشروع في ذات الدليل بالاسم Arc.Vbp.
أنشئ النموذج frmArcs حسب الجدول 8-9.
يفترض أن يبدو النموذج المكتمل كما في الشكل 8-20.
الشكل 8-20 النموذج frmArcs. في مرحلة التصميم.
الجدول 8-9. جدول خصائص النموذج frmArcs.
الكائن الخاصية القيمة
Form Name frmArcs
Caption برنامج الأقواس
RightToLeft True
CommandButton Name cmdExit
Caption &خروج
RightToLeft True
Horizontal Scroll Bar Name hsbFrom
Max 360
Min 0
Value 0
Horizontal Scroll Bar Name hsbTo
Max 360
Min 0
Value 0
Vertical Scroll Bar Name vsbRadius
Max 100
Min 1
Value 1
Label Name lblFrom
الكائن الخاصية القيمة
Caption من الزاوية:
RightToLeft True
Label Name lblTo
Caption إلى الزاوية:
RightToLeft True
Label Name lblRadius
Caption نصف القطر:
RightToLeft True
إدخال نص برنامج الأقواس
سنبدأ الآن بكتابة نص برنامج الأقواس:
تحقق بأن قسم التصاريح العامة للنموذج frmArcs يحوي العبارة Option Explicit.
' يجب التصريح عن كل المتحولات
Option Explicit
أنشئ إجراءاً جديداً يدعى DrawArcs في قسم التصاريح العامة للنموذج frmArcs. (انقر نقرةً مزدوجة على النموذج لإظهار نافذة نص البرنامج ثم اختر Add Procedure من القائمة Tools، ثم اختر النوع Sub في الحقل Type لمربع الحوار Add Procedure، وعين المجال Public في الحقل Scope، ثم اكتب DrawArc في المربع Name، وأخيراً انقر الزر OK).
أدخل النص التالي ضمن الإجراء DrawArc() الذي أنشأناه في الخطوة السابقة:
Public Sub DrawArc()
Dim x, y
Const pi = 3.14159265
x = frmArcs.ScaleWidth / 2
y = frmArcs.ScaleHeight / 2
frmArcs.Cls
Circle (x, y), vsbRadius.Value * 20, , _
hsbFrom * 2 * pi / 360, hsbTo * 2 * pi / 360
lblFrom.Caption = "من الزاوية: " + Str(hsbFrom.Value)
lblTo.Caption = "إلى الزاوية: " + Str(hsbTo.Value)
lblRadius.Caption = "نصف القطر:" + Str(vsbRadius.Value * 20)
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmArcs:
Privat sub cmdExit_Click()
End
End sub
أدخل النص التالي ضمن الإجراء hsbFrom_Change() للنموذج frmArcs:
Privat sub hsbFrom_Change()
DrawArc
End sub
أدخل النص التالي ضمن الإجراء hsbFrom_Scroll() للنموذج frmArcs:
Privat sub hsbFrom_Scroll()
hsbFrom_Change
End sub
أدخل النص التالي ضمن الإجراء hsbTo_Change():
Privat sub hsbTo_Change()
DrawArc
End sub
أدخل النص التالي ضمن الإجراءhsbTo_Scroll للنموذج frmArcs:
Private Sub hsbTo_Scroll()
hsbTo_Change
End Sub
أدخل النص التالي ضمن الإجراء VsbRadius_Change للنموذج frmArcs:
Private Sub vsbRadius_Change()
DrawArc
End Sub
أدخل النص التالي ضمن الإجراء VsbRadius_Scroll للنموذج frmArcs:
Private Sub vsbRadius_Scroll()
vsbRadius_Change
End Sub
احفظ المشروع بالطريقة المعتادة.
تنفيذ برنامج الأقواس
لنشاهد برنامج الأقواس على أرض الواقع:
نفّذ برنامج الأقواس.
زد نصف القطر، بتحريك مؤشر شريط التمرير نصف القطر (شريط التمرير العمودي).
زد قيمة شريط التمرير من زاوية (شريط التمرير الأفقي اليميني).
زد قيمة شريط التمرير إلى زاوية (شريط التمرير الأفقي اليساري).
كما تلاحظ، يُرسم قوس يبدأ من النقطة المحددة بواسطة شريط التمرير من زاوية، وينتهي بالنقطة المحددة بشريط التمرير إلى زاوية.
يوضح الشكل 8-21 قوساً يبدأ من الدرجة 180ْ، وينتهي بالدرجة 23ْ.
الشكل 8-21 رسم قوس (180ْ-23ْ).
انقر الزر خروج لإنهاء البرنامج.
كيف يعمل برنامج الأقواس
يَستخدم برنامج الأقواس الطريقة Circle لرسم الأقواس.
تُستخدم قيم الخاصية Value لكل من شريط التمرير نصف القطر وشريطي التمرير من زاوية و إلى زاوية كوسائط للطريقة Circle.
نص الإجراء DrawArc()
ينفذ الإجراء DrawArc() عند تغيير موقع مؤشر شريط التمرير نصف القطر، أو موقع مؤشر شريط التمرير من زاوية، أو عند تغيير موقع مؤشر شريط التمرير إلى زاوية.
يُعرّف هذا الإجراء قيمة الثابت pi (p)، ويُسند له القيمة العددية المكافئة:
CONST pi = 3.14159265
ثم يحسب إحداثيات مركز النموذج:
x = frmArcs.ScaleWidth / 2
y = frmArcs.ScaleHeight / 2
وينظف محتويات النموذج بعد ذلك بالطريقة Cls:
frmArcs.Cls
ثم يرسم القوس باستخدام الطريقة Circle:
Circle (x, y), vsbRadius.Value * 20, , _
hsbFrom * 2 * pi / 360, hsbTo * 2 * pi / 360
نكرر الصيغة الكاملة للطريقة Circle:
[Object].Circle [Step] (X,Y),Radius, _
[color],[Start],[End], [Aspect]
يتحدد مركز القوس في هذا الإجراء بالوسيطين X,Y، كما يتحدد نصف قطر القوس بقيمة الخاصية Value لشريط التمرير vsbRadius مضروبة بـ 20.
تُحدد قيمة الخاصية Min لشريط التمرير، أثناء مرحلة التصميم بالقيمة 1، كما حُددت الخاصية Max لهذا الشريط بالقيمة 100. مما يعني أن نقل مؤشر شريط التمرير من الموضع الأدنى Min إلى الموضع الأعلى Max، يستلزم النقر مائة مرة على أسهم الشريط.
تُضرب قيمة Value بالقيمة 20، ثم تُستخدم القيمة الناتجة للوسيط Radius (نصف القطر)، مما يعني أن نصف القطر يمكن أن يتخذ أي قيمة ما بين 20 و2000.
لم نستخدم في مثالنا هذا الوسيط Color، وإنما وضعنا فاصلة مكانه للإشارة إلى عدم استخدامه. يستخدم البرنامج في مثل هذه الحالة اللون المحدد بالخاصية ForeColor للنموذج، والذي يكون اللون الأسود في الحالة الافتراضية.
الوسيطان التاليان في الطريقة Circle هما: Start و End، ويجب تمرير قيمتهما بالراديان.
تم إسناد القيمة 1 للخاصية Min لشريطي التمرير من زاوية و إلى زاوية، وإسناد القيمة 360 للخاصية Max. مما يعني أن كلا الشريطين، مقسم إلى 360 جزء، يمثل كل جزء منها درجة واحدة، وتستخدم الصيغة التالية للتحويل من الدرجات إلى الراديان:
Radians = Degree * 2 * pi / 360
فمثلاً، الدرجة 360 تكافئ:
360 * 2 * pi / 360 = 6.2831853 Radians
وهذا ما يشرح السبب الذي دفع الإجراء DrawArc إلى جداء قيمة الخاصية Value للشريطين من زاوية (يمثل الوسيط Start)، والشريط إلى زاوية (يمثل الوسيط End) بالقيمة
الفصل التاسع
إظهار البيانات بصيغة مجدولة
تدعو الضرورة أحياناً إلى إظهار البيانات بشكل صفوف وأعمدة (أي ضمن جداول). يمكن إنجاز ذلك باستخدام الطريقة Print عن طريق إظهار النص سطراً تلو الآخر وحساب المواقع التي ستظهر البيانات عندها.
وعموماً، يقدم فيجول بيسك عنصر تحكم الجدول، يمكّنك من تشكيل الجداول بسهولة.
سنتعلم في هذا الفصل كيفية استخدام عنصر تحكم الجدول.
برنامج الجدول
سنكتب الآن برنامجاً ندعوه برنامج الجدول، الذي يعتبر مثالاً على كيفية استخدام عنصر تحكم الجدول، اللازم لإنشاء جدول من المعلومات.
أنشئ الدليل C:\VB5Prg\Ch09، لأننا سنستخدمه لحفظ برامج هذا الفصل.
أنشئ مشروعاً تنفيذياً قياسياً Standard EXE، واحفظ نموذج المشروع بالاسم Table.frm في الدليل C:\VB5Prg\Ch09، واحفظ ملف المشروع بالاسم Table.Vbp في ذات الدليل.
سنتأكد أولاً من وجود عنصر تحكم الجدول في المشروع قبل استخدامه، علماً بأن عنصر تحكم الجدول، عبارة عن عنصر من النوع OCX.
يوضح الشكل 9-1 رمز عنصر تحكم الجدول. ضع مؤشر الفأرة (بدون النقر عليها) فوق رمز عنصر التحكم هذا، فيظهر مستطيل أصفر يحمل الرسالة MsFlexGrid، وبهذه الطريقة تتحقق من وجود رمز عنصر تحكم الجدول في إطار مربع الأدوات.
الشكل 9-1 رمز عنصر تحكم الجدول في إطار مربع الأدوات.
إذا لم يكن عنصر تحكم الجدول موجوداً في إطار مربع الأدوات، أضفه باتباع ما يلي:
اختر Components من القائمة Project لفيجول بيسك، واختر الصفحة Controls لمشاهدة عناصر التحكم المتاحة Controls)).
يستجيب فيجول بيسك بإظهار صفحة عناصر التحكمControls في مربع الحوار Components.
تأكد أن خانة الاختيار التي تظهر في الصفحة Control بجانب البند
Selected Item Only لا تحوي علامة اختيار داخلها، (لأنك ترغب بمشاهدة لائحة عناصر التحكم الكلية، وليس فقط العناصر المحتواة مسبقاً في المشروع).
تفحّص لائحة عناصر التحكم المخصصة حتى تجد البند Microsoft FlexGrid Control 5.0.
عند وجود علامة اختيار يسار البند Microsoft FlexGrid Control 5.0، فهذا يعني أن عنصر تحكم الجدول موجود مسبقاً في إطار مربع الأدوات، ثم انقر على الزر OK في مثل هذه الحالة، للخروج من مربع الحوار Components.
إذا لم يكن هناك علامة اختيار يسار هذا البند، فهذا يعني أن عنصر التحكم ليس موجوداً حالياً في إطار مربع الأدوات، ولإضافته انقر على خانة الاختيار بجانبه لاختياره، ثم انقر الزر OK.
اتبع الخطوات التالية لإضافة البند Microsoft FlexGrid Control 5.0، إذا لم يظهر في اللائحة السابقة:
انقر الزر Browse في الصفحةControls في مربع الحوار Components.
يظهر نتيجة ذلك مربع الحوار Add ActiveX Control.
اختر الملف MsFlxGrd.OCX من الدليل System ثم انقر على الزر فتح.
عندها يظهر عنصر التحكم Microsoft FlexGrid Control 5.0 نتيجة ذلك، كأحد بنود لائحة عناصر التحكم Controls.
تحقق من وجود علامة اختيار في خانة الاختيار يسار عنصر التحكم Microsoft FlexGrid Control 5.0 ثم انقر الزر OK.
يُظهر الشكل 9-2 البند Microsoft FlexGrid Control 5.0 ضمن الصفحة Controls للإطار Components.
ملاحظة
إذا كنت تعمل ضمن النظام Windows95، يكون اسم دليل النظام هو:
C:\Windows\System
أما إذا كنت تعمل ضمن النظام WinNT، يكون اسم دليل النظام هو:
C:\WinNT\System32
الشكل 9-2 البند Microsoft FlexGrid Control 5.0.
ملاحظة
يأتي فيجول بيسك بعدة إصدارات منها مثلاً Learning Edition وProfessional Edition وEnterprise Edition.
فإذا لم تحتوِ إصداراتك على الملف MsFlxGrd.OCX، فهذا يعني أنك لن تقدر على بناء برنامج الجدول (لأن برنامج الجدول سوف يستخدم عنصر التحكم OCX هذا). لكن رغم ذلك استمر في قراءة برنامج الجدول حتى يتضح لك كيفية استخدام عنصر تحكم الجدول ضمن البرامج.
والآن انقر نقرة مزدوجة فوق رمز عنصر الجدول في مربع الأدوات.
يظهر عنصر الجدول نتيجة ذلك ضمن النموذج، حسب ما يبينه الشكل 9-3.
الشكل 9-3 وضع عنصر الجدول في النموذج (طور التصميم).
أنشئ النموذج بإسناد الخصائص التالية له:
Name: frmTable
Caption: برنامج الجدول
RightToLeft: True
أسند لعنصر تحكم الجدول الخصائص التالية:
Name: grdTable
Rows: 13
Cols: 5
RightToLeft: True
يفترض أن يبدو الجدول المكبر كما في الشكل 9-4.
كبّر النموذج frmTable، وضع فيه زراً آخر.
أسند لزر الأمر الجديد الخصائص التالية:
Name: cmdExit
Caption: &خروج
RightToLeft: True
ملاحظة
تم إسناد القيمة True للخاصية RightToLeft التابعة لعنصر تحكم الجدول، وذلك بغية تعريبه، وبذلك يصبح العمود الأول من جهة اليمين بدلاً من جهة اليسار، بالنسبة للمستخدم. اقرأ الفصل 22 لمزيد من الإيضاح.
الشكل 9-4 عنصر الجدول بعد تكبيره.
تحقق من وجود العبارة Option Explicit ضمن قسم التصاريح العامة:
'يجب التصريح عن كل المتحولات
Option Explicit
أدخل النص التالي ضمن الإجراء Form_Load() للنموذج frmTable:
Private Sub Form_Load()
'اجعل السطر الحالي هو السطر رقم صفر
grdTable.Row = 0
'اكتب في الخلية (سطر=0،عمود=1)
grdTable.Col = 1
grdTable.Text = "كهرباء"
grdTable.Col = 2
grdTable.Text = "ماء"
grdTable.Col = 3
grdTable.Text = "مواصلات"
grdTable.Col = 4
grdTable.Text = "طعام"
grdTable.Col = 0
grdTable.Row = 1
grdTable.Text = "كانون الثاني"
grdTable.Row = 2
grdTable.Text = "شباط"
grdTable.Row = 3
grdTable.Text = "آذار"
grdTable.Row = 4
grdTable.Text = "نيسان"
grdTable.Row = 5
grdTable.Text = "أيار"
grdTable.Row = 6
grdTable.Text = "حزيران"
grdTable.Row = 7
grdTable.Text = "تموز"
grdTable.Row = 8
grdTable.Text = "آب"
grdTable.Row = 9
grdTable.Text = "أيلول"
grdTable.Row = 10
grdTable.Text = "تشرين الأول"
grdTable.Row = 11
grdTable.Text = "تشرين الثاني"
grdTable.Row = 12
grdTable.Text = "كانون الأول"
End Sub
أدخل النص التالي ضمن الإجراء cmdExit_Click() للنموذج frmTable:
Private Sub cmdExit_Click()
End
End Sub
احفظ المشروع بالطريقة المعتادة.
نفّذ البرنامج الآن، رغم أننا لم ننته بعد من كتابته، يُظهر البرنامج، عنصر الجدول كما في الشكل 9-5.
الشكل 9-5 برنامج الجدول.
تنقل بواسطة مفاتيح الأسهم من خلية إلى أخرى عبر الجدول.
كما تلاحظ، يمتلك عنصر الجدول الآن 13 سطراً و5 أعمدة (بما في ذلك سطر العنوان وعمود العنوان). والسبب في ذلك طبعاً، هو إسناد القيمة 13 إلى الخاصية Rows، وإسناد القيمة 5 إلى الخاصية Cols للعنصر grdTable.
أنهِ البرنامج بنقر الزر خروج.
نفّذ الخطوتين التاليتين وأعد تشغيل البرنامج، وراقب النتائج:
أسند القيمة 2-flexGridInset للخاصية GridLines للعنصر grdTable.
أسند اللون الأبيض White إلى الخاصية BackColor (الخلفية) للعنصر grdTable.
نص الإجراء Form_Load()
يُنفّذ هذا الإجراء عند بدء تحميل النموذج frmTable. يبدأ هذا الإجراء بتحديد السطر الراهن (عن طريق إسناد القيمة صفر للخاصية Row):
'اجعل السطر الحالي هو السطر رقم صفر
grdTable.Row = 0
ملاحظة
يمتلك عنصر الجدول، خاصية تدعى Row، وأخرى تدعى Rows. حاول جاهداً أن لا تخلط بينهما.
تستخدم الخاصية Row لمعرفة أو تغيير السطر الحالي، بينما تستخدم الخاصية Rows لمعرفة أو تغيير عدد الأسطر الحالي.
كما يمتلك عنصر الجدول خاصية تدعى Col، وأخرى تدعى Cols، تجنب كذلك الخلط بينهما.
تستخدم الخاصية Col لمعرفة أو تغيير العمود الحالي، بينما تستخدم الخاصية Cols لمعرفة أو تغيير عدد الأعمدة الحالي.
يكتب الإجراء حال تحديد السطر الراهن، ضمن الخلية المحددة بالسطر Row # 0 والعمود Col # 1 كما يلي:
'اكتب في الخلية (سطر=0،عمود=1)
grdTable.Col = 1
grdTable.Text = "كهرباء"
أي بمعنى أن الإجراء حدد السطر الراهن (السطر الفعال) على أنه السطر رقم صفر، وحدد العمود رقم 1 على أنه العمود الفعال، ثم أسند العنوان كهرباء، إلى الخاصية Text لعنصر الجدول، ونتيجة ذلك، تتوضع كلمة كهرباء في السطر رقم صفر، والعمود رقم 1.
بشكل مشابه، يُسند الإجراء العناوين: ماء و مواصلات و طعام، إلى الخلايا المحددة بالسطر صفر والعمود 2 والعمود 3 والعمود 4 على التوالي. فمثلاً، استخدمت العبارات التالية لتعيين الخاصية Text المحددة بالسطر صفر والعمود 4.
grdTable.Col = 4
grdTable.Text = "طعام"
لا حاجة طبعاً لإسناد القيمة صفر مجدداً إلى الخاصية Row، كلما غيرنا قيمة الخاصية Col، لأنها تحافظ على قيمتها، ما لم يتم إسناد قيمة أخرى إليها.
ملاحظة
يبدأ ترقيم الأسطر والأعمدة في عنصر الجدول، بدءاً من الرقم صفر، وبذلك يكون رقم السطر للخلية الأولى صفراً، ورقم عمودها صفر أيضاً.
يُباشر الإجراء حال الانتهاء من كتابة العناوين الأربعة الرأسية، بتحديد الخاصية Text للعمود اليساري (العناوين الجانبية). فمثلاً استخدمت العبارات التالية لتحديد الخاصية Text للخلية المحددة بالسطر 1 والعمود صفر:
grdTable.Col = 0
grdTable.Row = 1
grdTable.Text = "كانون الثاني"
ملاحظة
يُظهر عنصر الجدول، المعلومات بصيغة جدولية، حيث تستطيع الانتقال من خلية لأخرى، إما بواسطة مفاتيح الأسهم، أو بواسطة شريطي التمرير، لكن لا يمكنك إدخال المعلومات بواسطة لوحة المفاتيح مباشرة داخل الخلية.
تغيير عرض الخلية
قد لا تكون الخلية بالاتساع الكافي، وذلك تبعاً للخط المستخدم، فمثلاً قد لا تتسع الكلمة كهرباء، ضمن خليتها (انظر إلى الشكل 9-5). تستطيع اتباع الخطوات التالية لتوسيع الخلية أثناء زمن التنفيذ.
أضف إجراءً جديداً للنموذج frmTable بالنقر المزدوج عليه (لإظهار إطار نص البرنامج)، ثم باختيار Add Procedure من القائمة Tools لفيجول بيسك.
يُظهر فيجول بيسك مربع الحوار Add Procedure.
أدخل اسم الإجراء الجديد في الحقل Name، لنفترض أننا سنسمي هذا الإجراء SetColWidth.
تحقق من اختيار Sub في مربع الحوار Add Procedure.
تحقق من اختيار Public في مربع الحوار Add Procedure.
انقر الزرOK في مربع الحوار Add Procedure.
يُشكل فيجول بيسك إجراءً جديداً يدعى SetColWidth، ويُظهره في المنطقة العامة General للنموذج frmTable.
أدخل النص التالي ضمن الإجراء SetColWidth:
Public Sub SetColWidth()
Dim Counter
For Counter = 0 To 4 Step 1
grdTable.ColWidth(Counter) = 1300
Next
End Sub
يستخدم هذا الإجراء الحلقة For لتبديل الخاصية ColWidth لكل عمود من أعمدة الجدول إلى 1300 Twip. وكما يظهر من اسم الخاصيةColWidth فإن هذه الخاصية مسؤولة عن تحديد عرض العمود.
وهكذا تحدد grdTable.ColWidth(0) عرض العمود الأول، وتحدد
grdTable.ColWidth(1) عرض العمود الثاني وهكذا...
أضف العبارة SetColWidth (اسم الإجراء الجديد) إلى نهاية الإجراء Form_Load()، بحيث يبدو بالشكل التالي:
Public Sub Form_Load()
''''''''''''''''''''''''''''''''
'اترك أقسام الإجراء على حالها '
'وأضف لها السطر الأخير '
''''''''''''''''''''''''''''''''
SetColWidth
End Sub
احفظ المشروع بالطريقة المعتادة.
نفّذ برنامج الجدول.
يُفترض أن يبدو إطار برنامج الجدول كذلك المبين بالشكل 9-6.
الشكل 9-6 توسيع عرض الأعمدة.
استخدم مفاتيح الأسهم أو شريطي التمرير للانتقال بين الخلايا.
كما ترى من الشكل 9-7، فقد تغير عرض كل الأعمدة.
أنهِ البرنامج بنقر الزر خروج.
كبّر عنصر التحكم grdTable بسحب حوافه، بحيث يظهر كما في الشكل 9-8.
لاحظ أن عرض الخلايا لم يتغير، رغم تكبير كامل منطقة عنصر تحكم الجدول، السبب في ذلك أن توسيع الخلايا يتم فقط أثناء زمن التنفيذ.
الشكل 9-7 استعمال شريطي التمرير أو مفاتيح الأسهم للانتقال بين الخلايا.
الشكل9-8 تكبير حجم عنصر الجدول أثناء زمن التصميم.
نفّذ برنامج الجدول.
يظهر عنصر الجدول الآن، كذاك المبين في الشكل 9-9. كما تلاحظ المنطقة الكلية لعنصر تحكم الجدول أكبر وعرض الخلايا الآن أوسع.
الشكل9-9 عنصر الجدول بعد تكبيره وتوسيع خلاياه.
تمرن على الانتقال بين الخلايا، واستخدام مفاتيح الأسهم أو شريطي التمرير.
أنهِ برنامج الجدول بنقر الزر خروج.
تغيير ارتفاع الخلية
سنكتب الآن نص البرنامج المسؤول عن تغيير ارتفاع الخلايا خلال مرحلة التنفيذ.
أضف إجراءً للنموذجfrmTable بالنقر المزدوج على النموذج frmTable (لإظهار إطار نص البرنامج)، ثم اخترAdd Procedure من القائمة Tools لفيجول بيسك.
يُظهر فيجول بيسك مربع الحوار Add Procedure.
اكتب اسماً للإجراء، (ليكن SetRowHeight) في الحقل Name.
تحقق من اختيار كل من Sub و Public ضمن مربع الحوار Add Procedure
انقر الزر OK.
يُشكل فيجول بيسك إجراءً جديداً يدعى SetRowHeight، في المنطقة العامة General Area للنموذج frmTable.
أدخل النص التالي ضمن الإجراء SetRowHeight:
Public Sub SetRowHeight()
Dim Counter
For Counter = 0 To 12
grdTable.RowHeight(Counter) = 500
Next
End Sub
تعتبر الخاصية RowHeight مسؤولة عن تحديد ارتفاع الخلية.
يَستخدم الإجراء SetRowHeight الحلقةFor لتحديد ارتفاع كل سطر من أسطر عنصر الجدول بـ 500 Twips.
أضف العبارة SetRowHeight في نهاية الإجراء Form_Load() بالشكل التالي:
Public Sub Form_Load()
''''''''''''''''''''''''''''''''
'اترك أقسام الإجراء على حالها '
'وأضف لها السطر الأخير '
''''''''''''''''''''''''''''''''
SetColWidth
SetRowHeight
End Sub
احفظ المشروع كالعادة.
نفّذ برنامج الجدول.
يُفترض أن تبدو خلايا الجدول كما في الشكل 9-10.
الشكل 9-10 زيادة ارتفاع سطور الجدول.
شريطي تمرير عنصر تحكم الجدول
لعلك لاحظت أن فيجول بيسك يضيف آلياً شريطي التمرير الأفقي والعمودي، عندما لا تتسع الخلايا ضمن المنطقة التي يحتلها عنصر الجدول. السبب في ذلك أننا تركنا قيمة الخاصية ScrollBars لعنصر الجدول على حالها، أي وفق قيمتها الافتراضية المساوية إلى 3-flexScrollBarBoth، فإذا أردت إخفاء شريطي التمرير، تستطيع تحديد القيمة 0-flexScrollBarNone للخاصيةScrollBars أثناء زمن التصميم، أو تنفيذ العبارة التالية من ضمن نص البرنامج:
grdTable.ScrollBars = 0
إذا أردت الإبقاء على شــريط التمرير الأفقي فقط، تسـتطيع إسـناد القيمة 1-flexScrollBarHorizontal إلى الخاصية ScrollBars أثناء طور التصميم.
أو استخدم العبارة التالية ضمن نص البرنامج:
grdTable.ScrollBars = 1
وبالعكس إذا أردت الإبقاء على شريط التمرير العمودي فقط، تستطيع استخدام القيمة
2-flexScrollBarVertical للخاصية ScrollBars في طور التصميم.
ملاحظة
مهما تكن قيمة الخاصية ScrollBars فلا توجد مشكلة، لأنك قادر دائماً على الانتقال من خلية لأخرى بواسطة مفاتيح الأسهم من لوحة المفاتيح.
تحديد الخاصيتين Rows و Cols أثناء زمن التنفيذ
حددنا قيمتي الخاصيتين أثناء طور التصميم، فكانت Cols تساوي 5 و Rows تساوي13.
قد يكون عدد الأسطر والأعمدة معلوماً فقط، خلال زمن التنفيذ.
فمثلاً، تستطيع إعداد برنامج الجدول، ليُظهر فقط العمودين كهرباء و ماء شهرياً، (أي فاتورتي الماء والكهرباء). سيتوجب على البرنامج عندها تغيير عدد الأعمدة إلى ثلاثة فقط (واحد للعناوين اليسارية، وواحد للعنوان كهرباء وآخر للعنوان ماء).
تُستخدم عبارة مشابهة للعبارة التالية لإنجاز عملية تغيير عدد الأعمدة:
grdTable.Cols = 3
كما تُستخدم عبارة مشابهة للعبارة التالية، لتغيير عدد الأسطر:
grdTable.Rows = n
علماً أن n متحول يمثل عدد الأسطر. (إضافة لسطر عناوين الأعمدة).
ملء باقي خلايا برنامج الجدول
اتبع الخطوات التالية لملء ما تبقى من خلايا برنامج الجدول:
أضف إجراءً جديداً إلى المنطقة General للنموذج frmTable.
أطلق على هذا الإجراء الاسم FillCells.
أدخل النص التالي ضمن الإجراء FillCells():
Public Sub FillCells()
Dim RowCounter, ColCounter
For ColCounter = 1 To 4
grdTable.Col = ColCounter
For RowCounter = 1 To 12
grdTable.Row = RowCounter
grdTable.Text = "غير معروف"
Next
Next
End Sub
أضف العبارة FillCells إلى نهاية نص الإجراء Form_Load().
يفترض أن يبدو الإجراء بشكل مماثل لما يلي:
Public Sub Form_Load()
''''''''''''''''''''''''''''''''
'اترك أقسام الإجراء على حالها '
'وأضف لها السطر الأخير '
''''''''''''''''''''''''''''''''
SetColWidth
SetRowHeight
FillCells
End Sub
نص الإجراء FillCells()
لقد استخدمت حلقتين متداخلتين في الإجراء FillCells():
For ColCounter = 1 To 4
grdTable.Col = ColCounter
For RowCounter = 1 To 12
grdTable.Row = RowCounter
grdTable.Text = "غير معروف"
Next
Next
ينفذ هذا الإجراء حلقتي For، وتُسنِد كلتا الحلقتين الكلمة غير معروف إلى الخاصية Text لكل خلية من الخلايا. تَعّد الحلقة الخارجية من 1 إلى 4، وتعد الحلقة الداخلية من 1 إلى 12.
وبذلك تتمكن الحلقتان For من تغطية كل خلايا الجدول (باستثناء السطر العلوي الذي يمثل سطر العناوين، وباستثناء العمود اليساري كذلك) وإسناد الكلمة غير معروف إليها.
احفظ المشروع بالطريقة المعتادة.
نفّذ برنامج الجدول.
تملأ خلايا عنصر التحكم بالنص غير معروف (انظر الشكل 9-11).
أنهِ البرنامج بالنقر على الزر خروج.
أضف الآن النص التالي إلى الإجراء FillCells() لنملأ بعض خلايا الجدول بقيم ذات معنى:
Public Sub FillCells()
Dim RowCounter, ColCounter
For ColCounter = 1 To 4
grdTable.Col = ColCounter
For RowCounter = 1 To 12
grdTable.Row = RowCounter
grdTable.Text = "غير معروف"
Next
Next
grdTable.Row = 1
grdTable.Col = 1
grdTable.Text = "$100.00"
grdTable.Row = 2
grdTable.Col = 1
grdTable.Text = "$50.00"
grdTable.Row = 2
grdTable.Col = 2
grdTable.Text = "$75.00"
End Sub
الشكل 9-11 ملء خلايا عنصر الجدول بنص ما (كلمة غير معروف).
يملأ النص الذي أضفناه للتو إلى الإجراء FillCells()،ثلاث خلايا من الجدول، بإسناد رقم سطر وعمود الخلية المحددة، إلى الخاصيتين Row و Col ثم إسناد النص المطلوب إلى الخاصية Text للخلية.
نفّذ برنامج الجدول.
كما تلاحظ، تظهر ثلاث خلايا وهي تحمل النص $100.00 و$50.00 و$75.00 (انظر الشكل 9-12).
أضف زراً يدعى تنظيف إلى النموذج frmTable، حسب ما يوضحه الشكل 9-13.
أسند له الاسم cmdClear في الخاصية Name، أما الخاصية Caption فأسند إليها العنوان &تنظيف.
يفترض أن يبدو النموذج frmTable كما في الشكل 9-13.
الشكل 9-12 ملء ثلاث خلايا في الجدول.
الشكل 9-13 إضافة الزر تنظيف.
أدخل النص التالي ضمن الإجراء cmdClear() للنموذج frmTable:
Private Sub cmdClear_Click()
Dim RowCounter, ColCounter
For ColCounter = 1 To 4
grdTable.Col = ColCounter
For RowCounter = 1 To 12
grdTable.Row = RowCounter
grdTable.Text = ""
Next
Next
End Sub
يعمل هذا الإجراء على تنظيف خلايا الجدول من المعلومات.
احفظ المشروع باختيار Save Project من القائمة File لفيجول بيسك.
نفّذ البرنامج.
انقر الزر تنظيف.
يستجيب البرنامج بمحي كل معطيات الخلايا في عنصر تحكم الجدول.
يعمل الإجراء cmdClear_Click() بشكل مشابه للإجراء FillCells() باستثناء أنه يكتب لاشيء ("") بدلاً من كتابة نص في الخلايا:
For ColCounter = 1 To 4 Step 1
grdTable.Col = ColCounter
For RowCounter = 1 To 12 Step 1
grdTable.Row = RowCounter
grdTable.Text = ""
Next
Next
وبهذا يتسبب فى حذف حذف المعطيات السابقة. يستخدم الإجراء أيضاً حلقتين تَعّد إحداهما إلى 4 وأخرى تعد إلى 12، مما يسمح له بتغطية كل خلايا الجدول باستثناء سطر العنوان وعمود العنوان.
هناك تقنية أفضل، تتمثل باستخدام نص البرنامج التالي:
For ColCounter = 1 To grdTable.Cols - 1
grdTable.Col = ColCounter
For RowCounter = 1 To grdTable.Rows - 1
grdTable.Row = RowCounter
grdTable.Text = ""
Next
Next
فبدلاً من تحديد النهايتين 4 و12 بشكل صريح ضمن حلقتي For، تَستخدم هذه الطريقة قيم الخاصيتين Cols وRows لعنصر تحكم الجدول. وبذلك يتم تنظيف الجدول مهما كان عدد أسطره أو أعمدته. وفي حال ما إذا عدّلت قيمة هاتين الخاصيتين أثناء طور التصميم أو أثناء زمن التنفيذ، حينها لا تحتاج لتغيير نص الإجراء.
محاذاة النص في الخلايا
تُستخدم خلايا السطر صفر (Row # 0) لإظهار عناوين الأعمدة، وتستخدم خلايا العمود الواقع أقصى اليمين لإظهار عناوين الأسطر.
تدعى هذه الخلايا بالسطور الثابتة والأعمدة الثابتة، لأنها تظل دائماً في مكانها، مهما قمت بعملية إزاحة للخلايا الأخرى. تتم إزاحة خلايا الجدول الأخرى يميناً ويساراً، وصعوداً ونزولاً بواسطة شريطي التمرير ومفاتيح الأسهم. وبالمناسبة تدعى خلايا الجدول التي ينتقل المستخدم عبرها بالخلايا غير الثابتة.
تستخدم الخاصية ColAlignment لتنظيم وضبط محاذاة الأعمدة غير الثابتة. والقيم المحتملة لهذه الخاصية مبينة في الجدول 9-1.
الجدول 9-1. الوضعيات الممكنة للبيانات ضمن خلايا الجدول.
القيمة الشرح
0 يسار أعلى الخلية.
1 يسار وسط الخلية (قيمة افتراضية للمعلومات النصية).
2 يسار أسفل الخلية.
3 وسط أعلى الخلية.
4 مركز الخلية.
5 وسط أسفل الخلية.
6 يمين أعلى الخلية.
7 يمين وسط الخلية (قيمة افتراضية للمعلومات الرقمية).
8 يمين أسفل الخلية.
9 عام (يسار وسط للمعلومات النصية، ويمين وسط للمعلومات الرقمية).
فمثلاً لمحاذاة محتويات الخلية إلى الطرف الأيمن والأسفل من الخلية، أسند القيمة 8 إلى الخاصية ColAlignment لهذه الخلية. أما لمحاذاة محتويات خلية إلى الطرف الأيمن والأعلى من الخلية فأسند القيمة 6 إلى الخاصية ColAlignment.
استخدم الخطوات التالية لرؤية عمل الخاصية ColAlignment على أرض الواقع:
أضف الزر محاذاة إلى النموذج frmTable، حسب ما يظهر في الشكل 9-14.
أسند إلى خصائص الزر محاذاة، ما يلي:
الاسم cmdAlign إلى الخاصية Name.
العنوان &محاذاة إلى الخاصية Caption.
الشكل 9-14 إضافة الزر محاذاة.
أدخل النص التالي ضمن الإجراء cmdAlign_Click() للنموذج frmTable:
Private Sub cmdAlign_Click()
Dim ColCounter
For ColCounter = 1 To grdTable.Cols - 2
grdTable.ColAlignment(ColCounter) = 4
Next
End Sub
يسند هذا الإجراء القيمة 4 إلى الخاصية ColAlignment لكل الأعمدة غير الثابتة، باستثناء العمود الواقع أقصى اليسار.
وحسب ما أورده الجدول 9-1، يؤدي إسناد القيمة 4 إلى الخاصية ColAlignment لتمركز البيانات ضمن الخلية.
نفّذ برنامج الجدول.
انقر الزر محاذاة.
كما تلاحظ، يتمركز النص في كل الخلايا غير الثابتة، باستثناء الخلايا الواقعة في العمود اليساري الأخير.
السبب الذي دفعنا إلى عدم توسيط النص في العمود اليساري الأخير، تمكينك من المقارنة بين الخلايا التي يتم تغيير خاصيتها ColAlignment، وبين خلايا العمود اليساري الذي نحافظ فيه على الخاصية ColAlignment بدون تغيير (أي وفق القيمة الافتراضية).
بقي أن تعلم أننا نستطيع أيضاً ضبط (محاذاة) الأعمدة والسطور الثابتة. تُستخدم الخاصية FixedAlignment لهذا الغرض. يمكن استخدام هذه الخاصية مثلاً لمحاذاة السطور والأعمدة الثابتة بشكل مختلف عن السطور والأعمدة غير الثابتة التي تقع تحت العنوان. مثلاً، أسند القيمة 1 إلى الخاصية FixedAlignment للعمود الأول على سبيل المثال، ثم أسند أي قيمة أخرى من القيم المدرجة في الجدول 9-1 إلى الخلايا التي تقع تحت هذا العمود.
استخدم العبارة التالية، كمثال لتوسيط النص الموجود في العمود الواقع أقصى اليمين:
grdTable.FixedAlignment(0) = 1
استخدم العبارات التالية لتوسيط العناوين: الكهرباء و الماء و الطعام (أي توسيط عناوين الأعمدة 1 و2 و3):
grdTable.FixedAlignment(1) = 4
grdTable.FixedAlignment(2) = 4
grdTable.FixedAlignment(3) = 4
تمرن على مختلف قيم الجدول 9-1 واحكم على النتائج بنفسك.
الخلاصة
تعلمت فى هذا الفصل كيفية استخدام عنصر تحكم الجدول وكيفية ملئه بالمعلومات، أو تنظيفه من المعلومات، كما تعلمت أيضاً كيفية محاذاة المعلومات فى الخلية بشتى الأوضاع وكيف أن الجدول يحتوى على خلايا ثابتة (تستخدم كعناوين)، وخلايا متحركة (لإظهار المعلومات. يمكنك الأن تقديم المعلومات للمستخدم فى شكل جدول أنيق.
الفصل العاشر
عملية الإظهار والطباعة
سنتعلم في هذا الفصل كيفية إظهار وطباعة المعلومات، وكيفية إظهار النص بخطوط مختلفة Fonts، وكيفية صياغة الأرقام والتواريخ وإرسال المعطيات (النصية والرسومية) إلى الطابعة.
الخطوط الكتابية Fonts
هنالك نوعان من الخطوط: خطوط قابلة لتغيير حجمها (متدرجة) Scaleable، وخطوط غير قابلة لتغيير حجمها (غير متدرجة) non Scaleable.
يتشكل الخط القابل للتدرج، باستخدام الصيغ الرياضية، فمثلاً يُعرّف الحرف B لمرة واحدة فقط، وتُولّد كل الأحجام الأخرى للحرف B من نفس الحرف الأصلي بتكبيره أو تصغيره.
من جهة ثانية، يخزّن الخط غير القابل للتدرج، بشكل نقطي Bitmap، وتخزّن كذلك الأحجام الأكبر والأصغر لنفس الخط بأشكال نقطية مختلفة، بحيث يكون لكل مقاس حرف مختلف، صورة خاصة به).
ولهذا السبب، قد يظهر الخط المتدرج Scaled (المصغر خاصة) أحياناً، بجودة أقل من الخط غير القابل للتدرج non Scaleable، وخاصة على الشاشة.
استخدام خطوط مختلفة في برامجك
لا بد من اختيار نوع خط Font للنص الذي ترغب بإظهاره، وتعتبر عملية اختيار الخط المناسب عملاً هاماً، فهل سيتوافر هذا الخط لدى المستخدمين الآخرين؟.
ينتقي ويندوز عند عدم توافر ذلك النوع من الخط، أقرب خط مشابه للمطلوب، ولكن عندما لا يكون لدى المستخدم خياراً واسعاً من الخطوط، فقد ينتقي ويندوز خطاً أكبر من الخط الذي يراد استخدامه، مما قد يفسد النموذج، بالتسبب بتخطي النص، بل وفي بعض الأحيان، يحاول ويندوز اختيار الخط الأشبه بالخط المطلوب، مستعيناً بخط موجود على حاسب المستخدم، مما قد يتسبب أيضاً بإفساد جمال وتناسق النماذج.
لعل الوسيلة الأسهل للتغلب على هذه المشكلة، تتمثل باستخدام الخطوط الشهيرة فقط، والتي تأتي مع برمجية النظام ويندوز الأصلية. يمكن لبرامجك أيضاً تفحص الملف Win.INI الذي يحتوي مقطعاً يحمل العنوان [Fonts]، يأتي ضمن هذا المقطع كل الخطوط المثبتة في النظام وبعد تفحص هذا المقطع يمكن للبرنامج تحديد الخط الذي سيستخدمه.
الخاصية FontTransparent
يدعم النموذج وكذلك عنصر تحكم الصورة Picture، الخاصية FontTransparent.فإذا كانت قيمة هذه الخاصية تساوي False، يظهر النص بالخلفية المشار إليها بالخاصية BackColor للكائن الذي سيتم إظهار النص عليه. فمثلاً إذا كانت BackColor للنموذج تشير إلى اللون الأزرق، فإن النص سيظهر على النموذج مع خلفية زرقاء.
يبين الشكل10-1 نموذجاً يحمل صورة نقطية ما بداخله، أي بمعنى أنه تم إسناد ملف من نوع Bmp إلى الخاصية Picture لهذا النموذج.
الشكل 10-1 النموذج frmMyForm وبداخله صورة نقطية من نوع BMP.
تستطيع إظهار نص داخل النموذج بواسطة الطريقة Print. سوف ينفذ الإجراء Form_Click() آلياً عند نقر النموذج:
Private Sub Form_Click()
frmMyForm.FontTransparent = True
frmMyForm.Print "هذه الجملة شفافة"
frmMyForm.FontTransparent = False
frmMyForm.Print "هذه الجملة غير شفافة"
End Sub
يُسند نص هذا الإجراء القيمة True إلى الخاصية FontTransparent للنموذج ثم يستخدم الطريقة Print:
frmMyForm.Print "هذه الجملة شفافة"
ثم يُسند الإجراء القيمة False إلى الخاصية FontTransparent للنموذج ويستخدم الطريقة Print لإظهار النص التالي:
frmMyForm.Print "هذه الجملة غير شفافة"
يبين الشكل 10-2 النموذج بعد النقر عليه عدة مرات (يظهر بعد كل نقرة سطري نص).
وهكذا، فالسطر الأول والثالث والخامس والسابع ... الخ، يظهر وفق القيمة True للخاصية FontTransparent، ويظهر السطر الثاني والرابع والسادس ... الخ، وفق القيمة False للخاصية FontTransparent للنموذج.
لاحظ أن السطور التي تظهر وفق القيمة True للخاصية FontTransparent تقبل اللون الذي يتم إظهارها عليه وتندمج معه، انظر للسطر الثالث مثلاً في الشكل 10-2.
بعكس السطور التي تظهر وفق القيمة False لهذه الخاصية والتي تتسبب بإخفاء جزء من الشكل الذي تظهر عليه، كأن تظهر على خلفية بيضاء (لأن الخاصية BackColor للنموذج على سبيل المثال تشير إلى اللون الأبيض).
تظهر السطور الفردية بدون أن تؤثر على الشكل، وذلك لأن قيمة الخاصية FontTransparent تساوي True، بعكس السطور الزوجية التي تساوي قيمة الخاصية FontTransparent فيها False، والتي تحذف جزءاً من الشكل.
الشكل 10-2 إظهار النص فوق الصورة المبينة في الشكل 10-1.
برنامج عرض الخطوط
يوضح برنامج عرض الخطوط مختلف خصائص الخط المتوفرة في فيجول بيسك.
التمثيل المرئي لبرنامج عرض الخطوط
نبدأ كعادتنا بالتمثيل المرئي لنموذج البرنامج:
أنشئ الدليل C:\VB5Prg\Ch10 لحفظ العمل فيه.
أنشئ مشروعاً قياسياً تنفيذياً Standard EXE، واحفظ النموذج فيه بالاسم ShowFont.frm في الدليل C:\VB5Prg\Ch10 واحفظ ملف المشروع بالاسم ShowFont.VbP في الدليل C:\VB5Prg\Ch10
أنشئ النموذج frmShowFont تبعاً للجدول 10-1.
يفترض أن يبدو النموذج المكتمل كذاك المبين في الشكل 10-3.
الشكل 10-3 النموذج frmShowFont (طور التصميم).
الجدول 10-1. جدول خصائص النموذج frmShowFont.
الكائن الخاصية القيمة
Form Name frmShowFonts
Caption برنامج عرض الخطوط
RightToLeft True
TextBox Name txtTest
Text (اتركه فارغاً)
MultiLine True
ScrollBars 3-Both
RightToLeft True
CommandButton Name cmExit
Caption &خروج
RightToLeft True
CheckBox Name chkBold
Caption خط عريض
Font (اجعله خطاً عريضاً)
RightToLeft True
الكائن الخاصية القيمة
CheckBox Name chkItalic
Caption خط مائل
Font (اجعله خطاً مائلاً)
RightToLeft True
CheckBox Name chkStrike
Caption يتوسطه خط
Font (اجعله خطاً يتوسطه خط)
RightToLeft True
CheckBox Name chkUnderline
Caption تحته خط
Font (اجعل تحته خطاً)
RightToLeft True
Menu (انظر الجدول 10-2) (انظر الجدول 10-2)
الجدول 10-2. جدول قائمة النموذج frmShowFont.
العنوان الخاصية Name
ال&خطوط mnuFonts
…الخط Courier mnuCourier
…الخط MS Sans Serif mnuMSSansSerif
الأ&حجام mnuSize
…حجم 10 نقاط mnu10Points
…حجم 12 نقطة mnu12Points
إدخال نص برنامج عرض الخطوط
سنكتب الآن نص برنامج عرض الخطوط:
ليست هناك تعليقات:
إرسال تعليق