![]()
اليكم الدرس الثالث في تعليم الفيجول بيسك ارجو من الله
ان تنفعكم في مجال التطور العلمي
احداث لوحة المفاتيح
ثلاثة احداث مرنة يوفرها لك Visual Basic ناتجة من لوحة المفاتيح هي ،KeyPress
KeyDown و KeyUp . فعندما يقوم المستخدم بالضغط على أي زر من ازرار لوحة
المفاتيح، فالحدث KeyDown سيتم تفجيره، ثم يقوم Visual Basic بتحويل المفتاح
المدخل الى مقابله في جدول ASCII ثم يتم تفجير الحدث KeyPress ، وبعد ان
يرفع المستخدم اصبعه عن المفتاح يبدأ الحدث KeyUp بالانفجار.
بالنسبة للحدث KeyPress فيفجره Visual Basic في حالة قيام المستخدم الضغط
على المفاتيح [ Ctrl+…] ،[ESCAPE] ،[BACKSPACE] ،[ENTER ] والحروف
المطبوعة، اما المفاتيح الاخرى آالاسهم او مفاتيح الوظائف وغيره ا... فلا تؤدي
الى انفجار الحدث KeyPress ولكن الاحداث KeyDown و KeyUp لها نصيب من
الوقوع. المزيد ايضا، يرسل الحدث KeyPress قيمة عددية من النوع Integer متمثلة
في متغير عددي بالاسم KeyAscii تمثل المقابل العددي للحرف المدخل في جدول
:ASCII
Private Sub Form_KeyPress(KeyAscii As Integer)
Print Chr$(KeyAscii) & " = " & KeyAscii
End Sub
المتغير KeyAscii مرسل بالمرجع وليس القيمة اي يمكنك تعديل قيمته مما يترتب
عليه مرونة آبير في التحكم في مدخلات المستخدم، هذا الكود مثلا يحول جميع
الحروف المدخلة في أداة النص الى حروف آبيرة :Capital
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub
واذا اسندت قيمة الصفر الى هذا المتغير، فانك قد الغيت عملية ارسال قيمة
المفتاح الى الأداة المستقبلة له . هذا الكود مثلا يمنع المستخدم من آتابة أي
شئ في أدا النص عدا الاعداد 0، 1، ...، 9:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
End If
End Sub
ملاحظة: تلاحظ انني اعتمد في الامثلة السابقة على الدالتين Asc و $ .Chr
مع ذلك، يمكنك الاستغناء عنهما اذا آنت تعرف المقابل العددي
للحرف المطلوب في جدول .ASCII
يزودك الحدثين KeyDown و KeyUp بقيمتين الاولى KeyCode وتمثل المفتاح
المدخل، والثانية هي Shift وتمثل حالة المفاتيح [ CTRL] ،[SHIFT ] و [ ALT ] فيما
اذا آانت مفعوصة –اقصد مضغوطة- او لا آما في الكود التالي:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift And vbShiftMask Then
المفتاح [ SHIFT ] مضغوط '
End If
If Shift And vbCtrlMask Then
المفتاح [ CTRL ] مضغوط '
End If
If Shift And vbAltMask Then
المفتاح [ ALT ] مضغوط '
End If
End Sub
بالنسبة الى قيمة المفتاح المدخل -المتمثلة في المتغير KeyCode - هي القيمة
الفيزيائية للمفتاح في لوحة المفاتيح، صحيح انها مثل قيمة المتغير KeyAscii ، الا
انها لا تمثل نوعية الحرف المدخل سواء آان صغير Small Letter او علامات آ
؟%#@ .... الخ، او حتى حروف عربية ا، ب، ت .... الخ. فهي ترسل دائما الق يمة
للحرف الانجليزي الكبير Capital آ C ،B ،A .... الخ . المزيد ايضا، لا يمكننا تعديل
قيمة المفتاح المدخل KeyCode آما آنا فعلنا في الصفحة السابقة مع المتغير
.KeyAscii
اخيرا، احداث لوحة المفاتيح KeyDown ،KeyPress و KeyUp يتم تفجيرها عندما
يكون الترآيز على الأ داة المكتوب فيها الكود، واذا وجدت احداث اضافية تابعة لنافذة
النموذج وسألتني أي الاحداث سيتم تنفيذها اولا؟، هل هي الاحداث التابعة لنافذة
النموذج ام الأداة التي عليها الترآيز؟ فساخبرك بان لديك عقلية نبيهة جدا جدا
تستحق ان تكون مبرمج Visual Basic بسببه ا! فان آانت قيمة الخاصية
KeyPreview التابعة لنافذة النموذج تساوي True ، فان النافذة ستفجر احداثها اولا
ومن ثم الأداة التي عليها الترآيز، اما ان آانت قيمة هذه الخاصية False ، فان نافذة
النموذج ستتجاهل هذه الاحداث وآأنها غير موجودة، ولن تفجر الا احداث الأداة
فقط.
حدث التغيير Change
يتم تفجير حدث التغيير Change بمجرد القيام بتغيير محتويات الاداة آتغير النص
الظاهر في الخاصية Caption او الخاصية Text . ولكن الاعتماد على هذا الحدث فيه
شيء من الخطأ، فعند تغيير قيمة الخاصية Value للأداتين CheckBox و
OptionButton لن يقوم Visual Basic بتفجير هذا الحدث، آذلك عند تغيير الشكل
الظاهري للادوات آحجمها او الوانها لن يتم تفجير هذا الحدث.
نافذة النموذج
نافذة النموذج عزيزة على قلوب جميع مبرمجي Visual Basic ، فهي البؤرة التي
نرى Visual Basic من خلالها مع الاسم الابتدائي لها Form1 والذي ص احبني منذ
عشر سنوات مع بدايات VB1 . ولحبي لها وتقديري للعشرة الطويلة بيني وبينها،
قررت تخصيص فقرة خاصة بها في هذا الفصل وفصل آامل "الاستخدام المتقدم
للنماذج" في هذا الكتاب، عساها ان تميزني بين المبرمجين آما ميزتها عن سائر
الكائنات!
قبل ان اخوض في تفصيل نافذ ة النموذج واتحدث عن خصائصها، طرقها واحداثها،
بودي التطرق الى فكرة القوالب Templates او قوالب النماذج ،Form Templates
وهي عبارة عن نماذج جاهزة التصميم ومضبوطة الخصائص تستخدمها في برامجك
اليومية بصورة متكررة دون الحاجة الى اعادة تصميمها من الصفر . اختر الامر Add
Form من قائمة Project وستفهم الفكرة من قوالب النماذج الجاهزة. ففي صندوق
الحوار الذي سيظهر امامك، ستجد العديد من النماذج التي تستخدمها آثيرا في
برامجك الاعتيادية، واذا آانت لا تملأ بريق عينيك، صمم يا مصمم النماذج آما تريد،
ومن ثم قم بحفظها في المجلد VB98\Template\Forms \ -او المسارالمحدد في
خانة التبويب Environment في صندوق الحوار Options - ستلاحظ وجود نافذتك
آقالب Template بين القوالب السابقة.
خصائص النموذج
بعد ان تبرق نافذة النموذج امام عينيك، ستبدأ بوضع الادوات عليها ومن ثم
تحجيمها. وبعد ذلك، تقوم باخت يار شكل حدودها مع الخاصية BorderStyle . القيمة
0-None لا استخدمها الا في الشاشة الافتتاحية Splash Screen لبرامجي لانها
تخفي حدودها وحتى شريط عنوانها TitleBar ، فتمنع المستخدم من امكانيات
تحريك النافذة وتسبب له حالة من الندم على تشغيل برنامجك ان لم يقم بالضغط
على المفاتيح [ Ctrl+Alt+Del ] او [ Ctrl+Shift+Esc ] آي يتمكن من اغلاق
برنامجك. اما القيمة 2-Sizable فستمكن المستخدم من تحريك النافذة بانسيابية
مريحة وتمكنه ايضا من اعادة تحجيم النافذة بالشكل الذي يناسبه ولن يقوم –ان
شاء الله- باستخدام المفاتيح السابقة. القيمت ان 1-Fixed Single و 3-Fixed Dailog
تمنع المستخدم من اعادة تحجيم النافذة مع ابقاء شريط العنوان وهي قيم قياسية
لصناديق حوار Dialog Boxes تطبيقات Windows ، والفرق بين القيمتين يظهر جليا
في ان الاولى تسمح بظهور زر التكبير Maximize والتصغير Minimize على شريط
العنوان اما الثانية فلا. استخدم القيمتين 4-Fixed ToolWindow و 5-Sizable
ToolWindow لتصغير ارتفاع شريط العنوان وهي موضة لنوافذ اشرطة الادوات.
توجد قيمة سادسة لشكل الحد اشبه ما تكون بالقيمة 0-None لكن مع حدود
ثلاثية الابعاد 3-D ، ولن تستطيع مشاهدتها الا ان آانت القيمة الموجودة في
الخاصية Caption خالية، وقيمة الخاصية ControlBox تساوي False ، مع اختيار
القيمة 3-Fixed Dailog من الخاصية السابقة .BorderStyle
تستطيع اظهار، اخفاء او تمكين صندوق التحكم او ازرار التكبير والتصغير عن طريق
الخصائص MaxButtom ،ControlBox و MinButton . النص الذي سيظهر في شريط
عنوان النافذة هو نفس النص الموجود في الخاصية Caption . تستطيع توسيط
النافذة وسط الشاشة عن طريق اختيار القيمة 2-Center من قيم الخاصية
StartupPosition ، وبامكانك منع المستخدم من تحريك النافذة عن طريق تحويل
قيمة الخاصية Moveable الى False . اما الخاصية ShowInTaskBar فهي تضيف زر
الى شريط المهام Windows Task Bar بجانب زر "ابدأ" او Start بحيث يتمكن
المستخدم من تنشيط نافذة برنامجك بمجرد النقر على هذا الزر . اخيرا، خاصية
WindowState التي تمكنك من تكبير النافذة لتغطي آامل الشاشة، تصغيرها او
استرجاع الحجم الطبيعي لها.
خصائص الصور:
عن طريق الخاصية AutoRedraw تحدد ما اذا آانت اعادة رسم نافذة النموذج تتم
تلقائيا True او يدويا False بواسطة اآوادك . في الحالة الاولى فان سرعة اعادة
الرسم تكون اسرع من الحالة الثانية، الا انها تستهلك الاف الكيلوبايت ات في الذاآرة
مما يقلل من مصادر النظام System Resources المتاحة للبرامج الاخرى، لك ان
تتخيل نافذة حجمها 800x600 مع عمق لوني True Color تستهلك 1406
آيلوبايت –ما يزيد على 1ميجا، ولك ان تتخيل 5 او 9 نوافذ جشعة من برنامجك
مفتوحة، وآم ستسبب من البطء في التحميل والحجز الكبير في الذاآرة؟ من
المهم ان اذآر هنا بان الحدث Form_Paint لن يتم تفجيره ابدا طالما آانت قيمة
هذه الخاصية True . باختصار، لا تستخدم هذه الخاصية الا عند الحاجة الماسة
فقط، وحاول وضع اآواد الكتابة والرسم آ Line ،Print .... الخ بين سطور الحدث
.Form_Paint
اذا آنت تستخدم طرق الرسم Circle ،Line .... الخ بكثرة، فانصحك بتغيير قيمة
الخاصية ClipControls الى False حتى تزيد سرعة طرق الرسم بمقدار الضعف لان
Visual Basic لن يقوم بإنشاء منطقة Clipping region ولن يقوم باعادة الرسم الا
للمناطق التي تحتاج الى اعادة رسم، اما اذا لم تستخدم طرق الرسم، فالقيمة
True تكون مناسبة لهذه الخاصية.
الخاصية HasDC تخيرك فيما لو آنت تريد إنشاء سياق رسم Device Context
لنافذة النموذج ام لا، سياق الرسم عبارة عن ترآيب خاص بنظام التشغيل يحمل
مواصفات وبيانات الصورة . اذا آنت لا تنوي وضع صورة في الخاصية Picture ، فاجعل
قيمة هذه الخاصية False آي تقلل من استهلاك مصادر النظام مع العلم ان
الخاصية hDC لن تعمل معك الا اذا قمت بتحميل صورة على نافذة النموذج
فستحمل الخاصية hDC قيمة مؤقتة تزول مباشرة بعد زوال الصورة.
الخاصية Icon
تمثل الرمز الذي يظهر في صندوق التحكم Control Box التابع لنافذة
النموذج والرمز الظاهر على زر النافذة في شريط المهام ، هذا إذا آانت الخاصية
ShowInTaskbar تساوي True ، اما ان آانت قيمة الخاصية ( None ) فان نظام
التشغيل يضع رمز افتراضي شريطة أن تكون قيمة الخاصية ControlBox تساوي
True . من الضروري أن تعلم انه لا يمكنك تخصيص رمز البرنامج EXE File Icon
بشكل مستقل، ف Visual Basic يخيرك بين احد رموز نوافذ النماذج التابعة
لمشروعك عن طريق القائمة Icon من خانة التبويب Make الموجودة في صندوق
حوار خصائص المشروع .Project Properties
الخاصية Picture تمكنك من تحميل ملف صورة ووضعه في داخل نافذة النموذج،
تدعم هذه الخاصية هيئات مختلفة من الملفات هي : ،JPG ،GIF ،DIB ،BMP
ICO ،EMF ،WMF و CUR . تستطيع تحميل ملف الصورة وقت التصميم باختيار اسم
الملف من صندوق حوار الخاصية، او استخدام طريقة اخرى افضلها آثيرا و هي
نسخ Copy الصورة من البرنامج الذي يعرضها الى الحافظة Clipboard ومن ثم
لصقها باختيار الامر Paste من القائمة Edit . واذا اردت وضع الصورة في وقت التنفيذ،
فالدالة LoadPicture تمكنك من فعل ذلك او سرقة صورة تابعة لكائن آخر:
تحميل صورة وجهي الوسيم! ‘ (” Form1.Picture = LoadPicture (“C:\Turki.BMP
نفس الصورة الموجودة في النموذج Form2.Picture = Form1.Picture ‘ Form1
ملاحظة: الخاصية Picture هي آائن يحتوي على خصائص اضافية آعرض
الصورة وارتفاع وغيرها:
Print Me.Picture.Height
Print Me.Picture.Width
اضاف VB6 متغيرات جد يدة الى الدالة LoadPicture تمكنك من استخلاص رمز Icon
من مجموعة رموز مضمنة في ملف ICO تجد شرح وافي لها في مكتبة ،MSDN
وبما انني ذآرت الدالة LoadPicture ، فما المانع من ذآر زميلتها SavePicture التي
تمكنك من حفظ الصورة الى ملف:
SavePicture Form1.Picture, “C:\Aseeri.BMP”
ملاحظة: الهيئة Format التي تحفظ بها الدالة SavePicture هي نفس هيئة
الصورة التي حملت في الخاصية، باستثناء الهيئات GIF و JPG فيتم
تحويلهما الى الهيئة .
BMP
خصائص الرسم:
الخاصية Image تمثل الرسمة الموجودة على نافذة النموذج الناتجة من استخدام
طرق الرسم Cirle ،Line .... الخ، وستكون دائما فوق الصورة الموجودة في الخاصية
Picture ، لن تستطيع استخدام او الاستفادة –ان صح التعبير - من هذه الخاصية الا
ان آانت قيمة الخاصية AutoRedraw هي .True
الخاصية DrawWidth تحدد عرض او سمك الفرشاة المستخدمة لرسم الخطوط
والاشكال بطرق الرسم Line ،PSet و Circle اما الخاصية ForeColor فهي تحدد
اللون الافتراضي للطرق السابقة . بالنسبة للخاصية DrawStyle فهي تمكنك من
تحديد شكل النقش لرسم الخطوط والدوائر باستخدام الطريقتين Line و ،Cirlce
آذلك تمكنك منه الخاصية FillStyle للمنطقة الداخل ية من المربع او الدائرة مع لون
التعبئة الموجود في الخاصية FillColor . اما الخاصيتان CurrentX و CurrentY
فتمثلان الاحداثيات الحالية التي تستخدم لطرق المخرجات والرسم Line ،Print
.... الخ، واللتان تتأثران بكل عملية رسم او خرج باستخدام الطرق السابقة . اما
الخاصية FontTransparent فهي تحدد اسلوب خرج الطباعة باستخدام الامر ،Print
فإن آانت قيمة الخاصية تساوي False فسيكون لون خلفية الطباعة هو نفس لون
الخلفية BackColor للنموذج، أما إن آانت قيمة الخاصية True فإن خلفية الطباعة
ستكون شفافة.
تقبلوا تحياتي