دورة الدوت نت
الدرس(9): الدوال والاجراءات
السلام عليكم ورحمة الله وبركاته
بسم الله الرحمن الرحيم
اليوم سوف نتطرق لموضوع بالغ الأهمية في فيجوال بيسك
دوت نت وهو الاجراءات و الدوال.
أفضل شرح هذا الدرس باستخدام مشروع Widows Appllication
أولا:الدوال Functions
الدالة Function
: هي عبارة عن برنامج صغير يستقبل وسيطات(Parameters)
ويطبق بعض العمليات عليها ثم يخرج لنا ناتج الدالة...وتكون بالشكل التالي:
كود:
Function FunctionName ( Parameters(
أي أننا نقوم بتعريف دالة جديدة
باستخدام الكلمة المحجوزة Function
ونضع بعدها اسم الدالة FuncionName
ثم بين قوسين نضع الوسيطيات(Parameters)
القسم الأول: الدوال الموجودة في فيجوال بيسك دوت
نت
بداية الدوال الموجودة في فيجوال بيسك دوت نت كثيرة
جدا وسنشرح القليل منها ان شاء الله
هناك دوالة رياضية و هناك دوال لها وظائف تقنية كالتحويل
وبعض الوظائف الأخرى..
هناك تركيبة(Structure-راجع
فصل التركيبات) خاصة باللغة تسمى بMath وتحتوي الكثير من الدوال ويمكن استخدامها بسهولة..
مثال: حساب القيمة المطلقة لقيمة عددية(نعرف القيمة
المطلقة بانها القيمة الموجبة للمقدار سواء كان موجبا أو سالبا)
أنشيء نموذج جديد وضع فيه أداة نص TextBox وأداة تسمية
Label وأداة زر
Button واضبط الخصائص
ليظهر بالشكل التالي:
وفي اجراء Click
للزر Button أدخل الكود التالي:
كود:
Label1.Text =
Math.Abs(Integer.Parse(TextBox1.Text((
ببساطة: استدعينا الدالة Abs من التركيبة
Math والتي تقوم
بحساب القيمة المطلقة ولاحظ أننا استخدمنا الدالة Integer.Parse
لتحويل محتوى النص من صورته النصية إلى عددية
مثال آخر:
Label1.Text = Math.Pow( 2 , 3
(
وضعت هذا المثال لتوضيح أن الدالة
لا تقتصر على وسيط واحد بل أكثر حسب المراد وتقوم الدالة Pow بحساب القوة
الثالثة للأساس 2 ويمكنك تغيير القيم حسب رغبتك.
وبتطرق بسيط إلى الدوال التي تقوم بوظائف تقنية كالتحويل
بنستعرض بعض الأمثلة:
مثال: تحويل القيمة النصية إلى قيمة عددية
كما رأينا في مثال حساب القيمة المطلقة فاننا قمنا
بعملية تحويل من نص(مدخل صندوق النص) إلى قيمة عددية لان الدالة Abs لا تتعامل
مع نصوص بل أعداد وجرب إزالة التحويل وسيظهر الخطأ.
اذن ان اردنا التحويل من قيمة نصية لعددية يمكننا
استخدام الدالة
Integer.Parse(String(
وتقوم بتحويل النص الوسيط إلى قيمة عددية
مثال آخر:تحويل القيمة العددية لنصية:
هناك بعض الدوال التي لا تستطيع التعامل مع القيمة
على صورتها العددية بل تحتاج وسيط نصي فنقوم بتحويل الصورة العددية إلى صورتها النصية
باستخدام الدالة
كود:
Str(Number(
فهذه الدالة تستقبل وسيط عددي ويكون ناتجها صورة
نصية
بهذا نكون انتهينا من الدوال الموجودة في فيجوال
بيسك دوت نت
الآن ماذا اذا أردت صنع دالة خاصة مثلا تقوم بحساب
مساحة دائرة...؟
يمكنك بناء دالة باستخدام الكلمة المحجوزة Function كما وضحنا
في بداية الدرس
بداية الصورة الافتراضية للدالةو بما أن للدالة ناتج
و قيمة فالافضل تحديد نوع الدالة:
كود:
Function Fun_Name (Parameters) As Type
الآن سوف نسمي الدالة باسم CircleArea وعلينا
تحديد الوسيطات اللازمة لعلمية حساب المساحة وكما هو معروف لا يلزمنا سوى نصف قطر الدائرة
وبالنسبة للقيمة ط (PI)
يمكننا استخدامها من خلال الثابت Math.PI
تمعن في الكود التالي:
Function CircleArea(ByVal Radius As Integer) As Double
Dim Area As
Double
Area =
Math.PI * Math.Pow(Radius, 2)
Return Area
End Function
Private Sub
Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text =
CircleArea(Integer.Parse(TextBox1.Text))
End Sub
الآن انظر معي:
قمنا بصنع دالة سميناها CircleArea
والتي تقوم بحساب مساحة الدائرة حسب نصف قطرها المدخل
وبعدها قمنا بتحديد الوسطيات وهي Radius نصف القطر
والآن كما قلنا فان للدالة ناتج لها يمكن استخراجه
من عمليات الدالة الداخلية لكن كيف يمكن اعطاء هذه الدالة تلك القيمة بعد انتاجها داخل
الدالة....
يمكن ذلك باحدى طريقتين:
استخدام الكلمة المحجوزة Return
اسناد ناتج الدالة المطلوب إلى الدالة مباشرة
توضيح:
في المثال الاخير أردنا أن يكون ناتج الدالة هو المتغير
Area ويمكن إعطاء
قيمته للدالة كالتالي:
الاولى:
استخدمنا الأمر Return
واستخدمناه كالتالي:
كود:
Return Area
ويقوم باعطاء قيمة Area لناتج الدالة
الثانية:
يمكننا استبدال الأمر Return
بالاسناد المباشر للقيمة كمثال:
كود:
CicleArea=Area
أما بالنسبة لByVal
و ByRef فيتم شرحهما بعد قليل
لكن ماذا ان اردت الخروج من الدالة عند الوصول لنتيجة
معينة
يمكن ذلك بسهولة باستخدام الأمر Exit Funtion
مثال:
كود:
Function
Fun_Name (Parameters) As String
If
X > 2 Then Exit Function
End
Function
ويمكنك استخدام الدالة في أي مكان حسبما تحديدك لمحدوديتها
كما وضحنا في الفصول السابقة عن المحدودية ومجال الاستخدام
وبهذا يمكنك استنتاج أن من أهم فوائد الدوال توفير
الوقت وتقليل حجم الكود.
ثانيا:الاجراءات الفرعية Subs
تختلف هذه عن سابقتها بانها لا تخرج لنا نواتج وانما
تقوم بتنفيذ تعليمات وفقا للوسيطات
بداية أيضا هناك اجراءات موجودة اصلا في فيجوال بيسك
دوت نت وأخرى تصنعها انت
صياغة الاجراء الفرعي مشابهة لصياغة الدالة باختلاف
أن الدالة يمكنك تحديد نوع ناتجها بينما الاجراء الفرعي تستطيع تحديد مقبض الإجراء
أولا : الدوال الموجودة في فيجوال بيسك دوت نت
سوف نستعرض مثالا من الاجراءات الموجود في فيجوال
بيسك دوت نت ونوضح أجزاءه
مثال:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub
الشرح:
الكلمة المحجوزة Private تفيد أن الاجراء يمكن استخدامه فقط داخل نموذج الحاضن فقط
الكلمة المحجوز Sub تفيد اننا نبدا بصنع اجراء فرعي
Button1_Click
هو اسم الاجراء
ما بين القوسين تمثل الوسيطات المرسلة للحدث
الآن Handle تفيد كيف يتم اجراء الحدث وهنا ألحقناها ب Button1.Click وهنا نفيد
الاجراء أن يتم تنفيذ الاجراء عند القيام بالضغط على Button1
End Sub
تفيد بانتهاء الاجراء
الآن اصنع الاجراء الخاص بك بنفسك:
بداية الصيغة العامة للاجراء
الفرعي هي
Sub
كود:
Sub_Name (Parameters)
Statements
End Sub
والآن لنقوم بتصميم اجراء فرعي يقوم باغلاق
النموذج الذي نمرره للاجراء
كود:
Sub CloseForm(frm As Form)
frm.Close()
End
Sub
لكن كيف يمكن استدعاء هذا الحدث وتمرير
الوسيطات له
ضع زر Button
جديد واضغط عليه ضغطا مزدوجا وقم يكتابة الكود التالي:
رمز برمجي:
CloseForm(Me(
هنا قمنا باستدعاء الاجراء CloseForm ومررنا
له النموذج الحالي(Me)
ويمكن أيضا استدعاء الاجراء بالطريقة التاليه باستخدام
الكلمة المحجوزة Call
مثال:
رمز برمجي:
Call CloseForm(Me(
الآن انتهينا من الدوال والاجراءات وبقت علينا قضية
تتعلق بتمرير الوسيطات
الارسال بالقيمة او الارسال بالمرجع
أولا: الارسال بالقيمة باستخدام الكلمة المحجوزة
ByVal
هنا يتم تمرير المتغيرات دون تغيير القيمة الاصلية
للمتغير وبالتالي يتم ارسال نسخة جديدة من البيانات المرسلة في كل مرة تستدعي فيها
الاجراء لذا فهي تستهلك مزيدا من الوقت لكنها لا تؤثر على باقي أجزاء البرنامج لانها
تقوم بارسال نسخة جديدة من البيانات المرسلة.
ثانيا:الارسال بالمرجع باستخدام الكلمة المحجوزة
ByRef
هنا يتم ارسال مؤشر للمتغير مما يمكنك بتغيير قيمة
المتغير الاصلية وهنا لا يتم انشاء نسخة جديدة من البيانات بل فقط يتم ارسال البيانات
الاصلية وهنا تكون العملية اسرع من الارسال بالقيمة
بهذا نكون قد انتهينا ان شاء الله من الشرح لهذا
الفصل وسوف اعرض مثالا يجمع الكثير مما تم دراسته في الفصول السابقة.
أولا :قم بفتح مشروع جديد من نوع Windows Appllication
وأضف نموذج غير الاصلي وأيضا قم باضافة وحدة نمطية
(Module) ويمكن استخدام الModule في صناعة
الاجراءات واستخدامها في كامل اجزاء المشروع
ثانيا:سمي النموذج الاول بـ MainForm والثاني
بـMsgForm
واضف الأدوات الظاهرة بالشكل واضبط خصائصها كما هو
واضح:
في داخل الموديول أضف الكود التالي:
Const PI As Double = 3.14
Structure Circle
Public Function CalculateArea(ByVal Radius As Integer) As Double
Return (PI * Math.Pow(Radius, 2))
End
Function
Public Function CalculateLength(ByVal Radius As Integer) As Double
Return (PI * Radius * 2)
End
Function
Public Sub ShowMsg(ByVal Text As String, ByVal Title As String)
MsgForm.Label1.Text = Text
MsgForm.Text = Title
MsgForm.ShowDialog()
End
Sub
Dim A As String
End
Structure
في هذا الكود قمنا بتعريف ثابت اسميناه PI
واسندنا اليه القيمة 3.14
وقمنا ببناء تركيبة من نوع Structure واسميناها
Circle ووضعنا
فيها دالتين واحدة تقوم بحساب محيط الدائرة والثانية تقوم بحساب مساحة الدائرة
كما قمنا بصنع اجراء يقوم بعرض
النموذج MsgForm من خلال
الامر ShowDialog الذي يقوم باظهار النموذج على شكل مربع حوار مثل مربعات الرسائل
أما في نموذج MainForm فتمعن في
الأكواد التالية داخل النموذج
وكذلك نموذج الMsgForm
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.Close()
End Sub
نتمنى ان تكونوا قد استمعتم معنا
abdalkader Al-badani
انتظروا الدرس القادم



ليست هناك تعليقات:
إرسال تعليق