قراءة
عرض

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

6-1 الروتينات والدوال والإجراءات Subroutine ,Functions and Procedures

تعلمنا حتى الآن كتابة برامج قصيرة توضح فكرة معينة دون التركيز على بناء مشروع متكامل لكنك قد تجد نفسك مضطر لتكرار مجموعة من الجمل التي تؤدي وظيفة معينة في أكثر من موقع في مشروعك. وإذا قمت بذلك فانه سيكون مضيعة للوقت ومملا . لذا فان لغة فيجول بيسك كغيرها من اللغات تدعم إمكانية كتابة برامج فرعية أو روتينات (Subroutines ) ودوال وظيفية (Functions) لتحل هذه المشكلة .
البرامج الفرعية هي عبارة عن برامج مستقلة تؤدي وظيفة معينة ويمكن مناداتها من البرنامج الرئيسي أو من أي برنامج فرعي آخر.
يركز هذا الفصل على كتل البناء البرمجية، فلغة الفيجول بيسك كحال اللغات الأخرى، تستخدم كتل بناء برمجية: مثل الإجراءات Procedures، والتوابع الوظيفية Functions، وعبارات الشرط If End If، وعبارات الحلقات، والمتحولات، وغير ذلك من مفاهيم البرمجة الهامة الأخرى.

6-2 إضافة الإجراء الروتيني Sub Add Procedure Sub
مثال عن كيفية كتابة برنامج لضرب عددينxe "برنامج ضرب عددين"
يوضح هذا البرنامج كيف تستخدم الإجراءات والتوابع الوظيفية ضمن البرامج المطوّرة في لغة الفيجول بيسك.
التمثيل المرئي لبرنامج ضرب عددين
سننجز الآن التمثيل المرئي لبرنامج ضرب عددين:

أنشئ الدليل D:\ subroutinprog، سنستخدم هذا الدليل لحفظ العمل المنجز.
افتح مشروعاً جديداً من نوع Standard EXE، وأحفظ نموذج المشروع بالاسم Multiply.frm في الدليل D:\ subroutinprog ، وأحفظ ملف المشروع بالاسم Multiply.Vbp في ذات الدليل.
أنشئ النموذج frmMultiply طبقاً للجدول 6-1.

يفترض أن يظهر النموذج لدى اكتماله كما في الشكل 6-1


الجدول 6-1. جدول خصائص النموذج frmMultiply.
الكائن
الخاصية
القيمة
Form
Name
frmMultiply

Caption

برنامج ضرب عددين

RightToLeft

True
CommandButton
Name
cmdExit

Caption

&خروج

RightToLeft

True
CommandButton
Name
cmdCalculate


Caption
اح&سب النتيجة

RightToLeft

True
Text Box
Name
txtResult

Text

(اجعله فارغاً)

RightToLeft

True
Label
Name
lblResult

Caption

النتيجة:


RightToLeft
True


كتل البناء البرمجية الروتينات والاجراءات

الشكل 6- 1

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


كتل البناء البرمجية الروتينات والاجراءات

الشكل6- 2

إضافة الإجراء
المدعو Multiply.

انقر الزر OK لإغلاق مربع الحوار Add Procedure.

يستجيب فيجول بيسك بإضافة الإجراء Multiply() إلى المنطقة العامة من النموذج frmMultiply، ويظهر نص الإجراء Multiply بالشكل التالي:
Public Sub Multiply()
End Sub
سنحتاج إلى تعديل السطر الأول من الإجراء Multiply() ليصبح الإجراء بعدها كالتالي:
Public Sub Multiply(X As Integer, Y As Integer)
End Sub
لأننا سنمرر للإجراء Multiply، وسيطين يمثلان العددين المطلوب معرفة ناتج ضربهما.
أدخل الآن النص التالي ضمن الإجراء Multiply:

Public Sub Multiply(X As Integer, Y As Integer)

Dim Z
Z = X * Y
txtResult.Text = Str(Z)
End Sub
اختر البند Save Project من القائمة File لفيجول بيسك لتحفظ عملك.


تنفيذ برنامج ضرب عددين
نفّذ برنامج ضرب عددين، وانقر الزر احسب النتيجة.
يستجيب البرنامج بإظهار الرقم 6 ضمن مربع النص. (يحسب الإجراء ناتج ضرب 2 مع 3، ويظهر الناتج ضمن مربع النص، عند نقر الزر احسب النتيجة).

كيف يعمل برنامج ضرب عددين

يُنفذ برنامج ضرب عددين، الإجراء Multiply() لحساب حاصل ضرب عددين.
نص الإجراء cmdCalculate_Click()
ينفذ هذا الإجراء عند نقر الزر احسب النتيجة. تَستدعي العبارة الوحيدة الموجودة ضمنه الإجراء Multiply() مع وسيطين هما العددين 2 و 3:
Private Sub cmdCalculate_Click()
Multiply 2, 3
End Sub
يحتاج الإجراء لمعرفة العددين اللذين سيحسب حاصل ضربهما، ولهذا قدمنا له العددين 2 و3 كوسيطين له.
نص الإجراء Multiply()
يمتلك الإجراء Multiply() وسيطين:
يدعى الوسيط الأول X، ويصرح عنه بأنه من نوع صحيح Integer، والوسيط الثانيY من
النوع صحيح Integerأيضاً:

Public Sub Multiply(X As Integer, Y As Integer)

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


ملاحظة
يجب استخدام الأقواس للإحاطة بوسائط الإجراء، عند استدعائه بواسطة العبارة Call. لا تهم الطريقة التي تُستدعى بها الإجراء، ولهذا يمكنك اختيار الطريقة التي تناسبك. لدى إضافة الإجراء Multiply() اخترنا النطاق Scope بأنه من نوع Public (انظر الشكل6- 2). ولهذا صرح فيجول بيسك عن الإجراء Multiply بأنه من النوع العام Public:
Public Sub Multiply()
لو اخترنا النطاق Private بدلاً من Public، لكان شكل التصريح كما يلي:
Private Sub Multiply()
الفرق بين التصريحين، أن الإجراء في حالة Public يكون عاماً، ويمكن استخدامه من قبل أي إجراء آخر في أي موقع من ملفات المشروع، فحسب ما سيتوضح عبر الكتاب يمكن للبرنامج الواحد أن يتألف من عدة ملفات (ربما عدة نماذج) وبالتالي، فعند التصريح عن إجراء بأنه Public، فإنّ بمقدور كل ملفات البرنامج استخدامه.
أما عند استخدام Private، فتنعكس الآية، إذ لا يمكن استخدام الإجراء إلا من قبل الإجراءات الموجودة ضمن نفس الملف. وفي حالتنا هذه يمكن لإجراءات النموذج frmMultiply فقط استخدام الإجراء Multiply().

6-2 إضافة الإجراء Function Add Procedure Function

استخدام تابع وظيفي داخل برنامج ضرب عددين

يُطلق على الإجراء Multiply() عبارة إجراء Procedurexe "Procedure"، لأنه لا يعيد أي قيمة. وهو يشبه التابع الوظيفي أي Functionxe "Function"، باستثناء أنه يعيد قيمة بعد استدعائه.
سنكتب الآن نص برنامج يوضح كيفية استخدام التابع الوظيفي. أولاً، احذف الإجراء Multiply() من برنامج ضرب عددين بإتباع ما يلي:
أظهر إطار نص البرنامج بالنقر المزدوج على منطقة خالية في النموذج frmMultiply.
حدد موقع الإجراء Multiply() في إطار نص البرنامج، ستعثر على هذا الإجراء ضمن المنطقة General Declarations، والتي تستطيع الانتقال إليها بوضع اللائحة اليسارية الموجودة عند قمة إطار نص البرنامج على General ووضع اللائحة المجاورة لها على Multiply.
ضع إضاءة فوق كامل الإجراء. بما في ذلك عنوانه وآخر سطر فيه، (ضع المؤشر عند أول حرف في الإجراء، ثم اضغط Ctrl+A).
اضغط المفتاح Delete على لوحة المفاتيح.
هذا كل شيء بالنسبة لحذف الإجراء Multiply.
اتبع الآن الخطوات التالية لإضافة تابع وظيفي جديد إلى البرنامج Multiply():
أظهر إطار نص برنامج النموذج frmMultiply.
اختر Add Procedure من القائمة Tools.
يستجيب فيجول بيسك بإظهار مربع الحوار Add Procedure.
أدخل الاسم Multiply ضمن مربع النص Name.
اختر Function ضمن الحقل Type.
اختر Public ضمن الحقل Scope.
يفترض أن يبدو مربع الحوار Add Procedure الآن كما في الشكل6- 3.


كتل البناء البرمجية الروتينات والاجراءات

الشكل6- 3

مربع الحوار Add Procedure
وإضافة التابع الوظيفي Multiply().

انقر الزر Ok لإغلاق مربع الحوار Add Procedure.

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


تمارين:
جد حاصل ضرب العددين 2 و 3 باستخدام الـ---Sub Procedure Add

كتل البناء البرمجية الروتينات والاجراءات



كتل البناء البرمجية الروتينات والاجراءات

Option Explicit

Private Sub Command1_Click()
multiply 2, 3
End Sub

Public Sub multiply(x As Integer, y As Integer)

Dim z As Integer
z = x * y
Text1.Text = Str(z)
End Sub


جد مربع العدد 4 باستخدام ال---Function Procedure Add
Option Explicit

Private Sub Command1_Click()

كتل البناء البرمجية الروتينات والاجراءات



كتل البناء البرمجية الروتينات والاجراءات

Dim v As Integer

Dim rs As Integer
rs = vsquare(v)
Label1.Caption = rs
End Sub

Public Function vsquare(ByVal v As Integer)

v = 4
vsquare = v * v
End Function





رفعت المحاضرة من قبل: انعام عبدالجبار الطائي
المشاهدات: لقد قام 0 عضواً و 194 زائراً بقراءة هذه المحاضرة








تسجيل دخول

أو
عبر الحساب الاعتيادي
الرجاء كتابة البريد الالكتروني بشكل صحيح
الرجاء كتابة كلمة المرور
لست عضواً في موقع محاضراتي؟
اضغط هنا للتسجيل