جدول المحتويات
البرمجة بإستخدام جامباس gambas
شكر وتقدير
أحب أن أتقدم بالشكر الجزيل للأستاذ تركي العسيري لتصريحه لي بنقل محتوى كتابه Visual Basic للجميع - نحو برمجة كائنية التوجه OOP أيضا لأستاذي مؤيد السعدي مطور أعجوبة على تفضله بالسماح لي بكتابة هذا الكتاب ضمن وثائق أعجوبة
المقدمة
تصنف جامباس ضمن البيئات المعتمدة على لغة بيسك كما فيجوال بيسك و Qbasic و Kbasic و VB6 فالأساسيات واحدة وتختلف هذه اللغات عن بعضها كلما تعمقت فيها.
بدأت جامباس بالظهور على يد الفرنسي Benoît Minisini عام 1999 وهي مجانية ومفتوحة المصدر متاحة تحت ترخيص GPL
الجزء الأول: الأساسيات
الفصل الأول: تعرّف على Gambas
بيئة التطوير المتكاملة IDE
يوفر لك جامباس أدوات في قمة الروعة مجتمعة تحـت مُسمى بيئة التطوير المتكاملة Integrated Development Environment تُختصـر IDE. توفّر لك كل ما تحتاجه لتصميم نوافذ وكتابة أكواد برامجك. بل تقدم لك خدمات أكثر من ذلك، كخدمة التنقيح Debugging ,إدارة ملفـات مشـروعك، تحرير القوائم، تعديل وإنشاء قواعد البيانات … الخ .
نوافذ بيئة التطوير المتكاملة
قوائم بيئة التطوير المتكاملة
أشرطة الأدوات
*قائمة File (ملف)
وتحتوي على التالي :
مشروع جديد (New project)
فتح مشروع (Open project)
فُتِح حديثا (Open recent) وهي المشاريع التي تم العمل عليها مؤخرا
فتح مثال (Open Example) لفتح الأمثلة المرفقة بالبيئة
حفظ المشروع (Save project)
حفظ المشروع باسم (Save project as)
*قائمة Project (المشروع)
*قائمة Debug (التنقيح)
*قائمة View (عرض)
*قائمة Tools (أدوات)
* قائمة ؟ (المساعدة)
كتابة برنامجك الأول
الخطوة الأولى: فكرة البرنامج
الخطوة الثانية: إنشاء المشروع
الخطوة الثالثة: تصميم الواجهة
الخطوة الرابعة: كتابة التعليمات
الخطوة الخامسة: التجربة والتعديل
الخطوة السادسة: الترجمة
الفصل الثاني: لغة البرمجة GAMBAS
المتغيرات والثوابت
المتغيرات والثوابت هي أساس أي لغة برمجة. إن استيعاب أنواع المتغيرات مـن المسائل الضرورية التي تمكنك من اختيار الأنواع المناسبة للمتغيرات سواء لإرسالها إلى الدوال أو لإجراء العمليات الحسابية عليها. بودّي التحدث عن مبدئي قابلية الرؤية وعمر الحياة قبل الخوض في تفاصيل المتغيرات.
قابلية الرؤية وعمر الحياة
قابلية الرؤية وعمر الحياة من بين المبـادئ الضـرورية فـي جميـع لغـات البرمجـة، و Gambas يعتبر لغة برمجة حقيقية تدعم هذان المبدئان. قابلية الرؤية – Visibilityأو المدى -Scopeللمتغير تمثل قدرة البرنامج على الوصول إلى المتغير واستخدامه، فالمتغير Xالموجود في الكود التالي لا يمكن الوصول إليـه خارج الإجراء MySub1
Sub MySub1() Dim X As Integer X = 20 End Sub Sub MySub2() Print X ´لا يمثل متغير x السابق End Sub
أما عمر الحياة (Life Time) للمتغير فهي تمثل الفترة التي يظل فيها المتغير محتفظا بقيمته، فالمتغير (X) الموجود في الكود السابق، سينتهي ويزال تلقائيا من الذاكرة بمجرد الخروج من الاجراء Sub MySub1 ولكي تفهم الأسلوب الذي يتبعه Gambas لتطبيق مبدأ قابلية الرؤية وعمر المتغيرات، عليك معرفة أنواع المتغيرات مـن منظور الرؤية وعمر الحياة:
- المتغيرات المحلية الديناميكية:
المتغيرات المحلية الديناميكية Dynamic Local Variables هي متغيرات تولد مع السطر الذي تعلن عنها فيه داخل الإجراء وتموت بعد نهاية الإجراء مباشرة ويتم تحرير المساحة التي حجزتها هذه المتغيرات في الذاكرة، وبالنسـبة لقابلية الرؤية فلن تستطيع الوصول إلى هذه المتغيرات إلاّ في نفس الإجراء الذي صرح فيه المتغير. تستخدم الكلمة المحجوزة Dim للتصريح بالمتغير مع كتابة اسمه ونوعه:
Dim sName As String Dim iAge As Integer
عليـك الالتزام بالتصريح كما فـي الصيغة السابقة، فلا يمكنك تعريف المتغير مباشرة دون الالتزام بعملية التصريح بإسناد قيمة ابتدائية له:
sName = ”أعجوبة“ iAge = 99
- المتغيرات المحلية الثابتة:
قابلية الرؤية للمتغيرات المحلية الثابتة Static Local Variables هي مثل قابلية الرؤية للمتغيرات المحلية الديناميكية أي لن تتمكن من الوصـول إليها إلا من داخل الإجراء المصرح فيه، وبالنسبة لعمر حياة المتغير الثابت فهو يبقى محتفظا بقيمته حتى نهاية البرنامج إذا كان فـي ملف برمجـة Module أو حتـى يمـوت الكائن التابع له. لتصريح متغير ثابت اسـتخدم الكلمـة المحجـوزة Staticعوضا عن :Dim
Static bStaticVariable As Boolean
تستطيع جعل جميع المتغيرات التابعة للإجراءثابتة بوضع نفس الكلمة المحجوزة عند بداية الإجراء:
Static Sub Counter () جميع المتغيرات التالية ستاتيكية ‘ Dim iCounter As Integer Dim iCounter2 As Integer باقي الكود End Sub
لا تحاول تطبيق الكود السـابق كثيـرا، فـالمتغيرات الثابتة أبطـأ مـن المتغيـرات الديناميكية إلى جانب قيامها بحجز مواقع هـذه المتغيـرات فـي الـذاكرة طـوال فتـرة عمل البرنامج، فلا تحاول استخدامها إلا عند الحاجة كالرغبة في تنفيذ إجـراء معـين لمرة واحدة مثلا أو الاحتفاظ بقيمة المتغير في عدّاد:
Sub PrintData() Static bIsPrinting As Boolean If bIsPrinting Then Exit Sub Else bIsPrinting = True End If ... End Sub Sub Counter() Static iCounter As Integer iCounter = iCounter + 1 End Sub
أخيرا، الكلمة المحجوزة Staticلا تطبـق إلا على المتغيرات المحلية فلا تحاول استخدامها على متغيرات عامة أو على مستوى الوحدة فهي بطبيعتها ثابتة.
المتغيرات على مستوى الوحدة: أقصد بالوحـدة البرمجيـة Module المتمثلة في ملف برمجة Module أو نافذة نموذج Form أو فئة Class الخ من الوحدات المكوّنة للمشروع. يمكنك تصريح متغير على مستوى الوحـدة في منطقة الإعلانات العامة للوحدة أي خارج الإجراءات.
قابلية الرؤية لهذا النوع مـن المتغيـرات يكـون عـاماً لجميـع أكواد الوحـدة فـي حالة استخدام الكلمة المحجوزة Dimاو :Private
Dim sName As String Dim iAge As Integer Sub SetData() sName = ”أعجوبة“ iAge=99 End Sub Sub PrintData() Print sName Print iAge End Sub
أما إذا كنت تريد تعريف متغيرات عامة قابلة للوصول من جميع أنحاء المشروع،فالكلمة المحجوزة Public تفي بالغرض:
في ملف برمجة Module Public iNumberOfUsers As Integer في نافذة نموذج 1‘ Form Public sCurrentUser As String في نافذة النموذج 2‘ Form Private Sub Form_Load() If iNumberOfUsers <= 0 Then Exit Sub Else Me.Caption = Form1.sCurrentUser End If End Sub
أما عمر الحياة لهذا النوع من المتغيرات فيكون مرافق لعمر حياة الكائن التابع له والمصرح فيه –كعمر حياة المتغيرات الثابتة، وبالنسبة للمتغيرات العامة المصرحة في ملفات البرمجة ،Moduleفستظل محتفظة بقيمتها حتى نهاية تنفيذ البرنامج.
المتغيرات
نستطيع ان نعرف المتغيرات بمنظورين، بالمنظور الرياضي يعرف المتغير على انه مجهول س يحتوي على قيمة معينة، اما بالمنظور البرمجي –وهو الاهم- يعرف المتغير على انه قيمة تحفظ في ذاكرة الجهاز. وتختلف المساحة المحجوزة لحفظ هذه القيمة باختلاف نوع المتغير، فمتغيرمن النوع Byte لا يستهلك سوى بايت واحد من ذاكرة الحاسب، في حين أن متغير من نوع String قد يحجز مساحة تصل الى 2 جيجابايت.
وفيما يلي عرض لجميع انواع المتغيرات المدعومة من قبل Gambas :
المتغيرات من النوع Byte
يستطيع هذا النوع الاحتفاظ باي قيمة صحيحة ضمن المجال العددي [0، 552] وهو اصغر انواع المتغيرات اذ لا يحتجز سوى 1 بايت. بداية المتغيرات من نوع Byteكانت منذ الاصدار الرابع وكانت معظم استخداماتها في نسخة 16bitمـن الاصدار VB4 اذ كانت المصفوفة من النوع Byte تستخدم كثيرا عند الاتصال باجراءات APIالتي تتعامل مع الحروف، اما مع الاصدارات الاحدث فلن تتمكن من الاستفادة وتطبيق الطرق القديمة على المتغيرات من النوع ،Byteلان الترميز المتبع UNICOE يستهلك مساحة 2 بايت للحرف الواحد وليس 1 بايت كترميز ASCII باختصـار، لا تضع في ذهنك أي قضايا حرفية Stringsعند استخدامك للمتغيرات من النوع Byte فيمكن قصر استخدامك لها على الاعداد الصغيرة او البيانات الثنائية مع المتغيرات من نوع Byte .
المتغيرات من النوع Integer
اسند أي قيمة عددية صحيحة في المجال [-867,23، 767,23] للمتغيرات من النوع Integer فهي تحجز مساحة 2 بايت. وعند الحديث عن اجراءات API الخاصة بالحروف، فالمصفوفة من النوع Integer هي الانسب للترميز UNICODE بعيدا عن اجراءات API الحرفية، تفيدك المتغيرات من هذا النوع عند التعامل مع الاعداد الصحيحة، الا انني احبذ استخدام المتغيرات من النوع Long لقدرتها على احتواء قيم اكبر بكثير من المتغيرات من النوع Integer كما انها النوع القياسي لاغلب اجراءات API اما في حالة المصفوفات الكبيرة، فانني افضل استخدام المتغيرات من النوع Integer لتوفير 50% من مساحة الذاكرة.
المتغيرات من النوع Long
المتغيرات من نوع Long تستطيع حمل قيم عددية صحيحة في المجال [-846,384,741,2، 746,384,741,2] فهي تحجز مساحة قدرها 4 بايت للمتغير الواحد، وكما ذكرت في الفقرة السابقة اني احبذ استخدامها عوضا عن المتغيرات من النوع ،Integerفهي تحمل قيم كبيرة جدا مقللة الخوف من ظهور خطأ وقت التنفيذ ،Overflowفلو كتبت كود يقرأ حجم ملف معين وكنت من المدمنين للنوع ،Integerفستصاب بخيبة امل كبيرة عندما تتعامل مع الملفات التي تزيد احجامها عن 767,23:
Dim iFileSize As Integer iFileSize = FileLen (“C:\MyFile.DAT”) سيظهر خطأ اذا زاد حجم الملف عن 676,23 بايت
المتغيرات من النوع Boolean
المتغيرات من النوع Boolean هي نفس المتغيرات من النوع Integer ولكن القيم التي تمكنك من اسنادها اليها تكون اما 0 False او 1 True حجم المتغيرات من النوع Boolean هو 1 بايت، المتغيرات من النوع Booleanتسهل عليك عملية قراءة وفهم الاكواد.
المتغيرات من النوع Single
مجال القيم التي يمكن للمتغيرات من النوع Single احتوائها هو الاعداد الموجبة من 1.401298e-54 الى 3.402823e38 او الاعداد السالبة من 3.402823e38- الى 1.401298e-45- وتستهلك مساحة 4 بايت. ربما يفضل معظم مبرمجي Gambas النوع Single على النوع Double لاعتقادهم ان الأول اسرع في التنفيذ من الثاني، هذا الاعتقاد صحيح في النوع القديم من المعالجات والتي لا تحتوي على مساعد رياضي ، Math Coprocessor اما اغلب المعالجات الجديد تحتوي على المساعد الرياضي وهو خاص بالعمليات الحسابية للاعداد ذات الفاصلة العائمة Floating Point مما يجعل السرعة متقاربة جدا بين النوعين Single و Double لذلك ينصح باستخدام النوع Double عوضا عن النوع Single حتى تتقي شر الخطأ OverFlow ودقة اعلى للاعداد لكبر مجال القيم الممكنة بها. من ناحية اخرى، قد تكون المتغيرات من النوع Single اسرع بكثير من المتغيرات من النوع Double عند التعامل مع الخصائص او الطرق التي تحتك مع الاحداثيات بشكل ملحوظ كـ CurrentX ،Circle ،Line ،ScaleWidth ،ScaleHeight …. الخ فهذه الاحداثيات تستخدم النوع Single واستخدام النوع Double معها ابطأ لان Gambas يضطر الى تحويل متغيرات النوع السابق الى Single .
المتغيرات من النوع Double
مجال القيم التي يمكن للمتغيرات من النوع Doubleاحتوائها هو الاعداد الموجبة من 423- 4.9406564581247eالى 803 1.79769313486232e او الاعداد السالبة من 423- -4.9406564581247e الى 803-1.79769313486232e وتستهلك مساحة 8 بايت. معظم دوال Gambas الخاصة بالاعداد تعود بقيمة من النوع Doubleلذلك هو النوع المفضل دائما، الا ان عيبه الوحيد هو في المساحة الكبير التي يحتجزها، وقد يظهر هذا العيب جليا في المصفوفات الكبيرة من النوع Double
المتغيرات من النوع Date
هذا النوع من المتغيرات يحمل قيم تاريخية تبدأ من ١ يناير ١٠٠ إلى ٣١ ديسمبر ٩٩٩٩ ويشمل نفس المتغير وقت يبدأ من الساعة ٠٠:٠٠:٠٠ ص وحتى الساعة ٢٣:٥٩:٥٩ م وتستهلك مساحة ٨ بايت .