مرحبا بكم فى موقعكم التعليمى مفيدا ومستفيدا

الدرس الرابع - الإجراءات

اذهب الى الأسفل

الدرس الرابع - الإجراءات

مُساهمة من طرف sayed في السبت أكتوبر 29, 2011 12:34 am

الدرس الرابع

الإجراءات Procedures
الإجراء هو مجموعة أوامر ينفذها المعالج مكتوبة بين حاصرتين { }
ويتم تعرفها في مكان واحد في البرنامج ويمكن إستدعائها عدة مرات
والإجراء له ثلاثة أشياء مهمة :
1- تعريف الإسمName Decleration
2-المدخلاتParameters
3-الشفرة مكتوبة بين حاصرتين Code
فمثلاً عند الدخول إلى شفرة زر رسالة الترحيب في الدرس الأول
سنرى هذا الكود:
كود:
void Button1Click(object sender, System.EventArgs e)
{
MessageBox.Show("مرحباً بكم في اليس شارب");
}
الكود السابق يمثل إجراء ينفذه المعالج عند الضغط على الزر
نلاحظ انه يحتوي على الثلاث الأشياء المهمة للإجراء
وهي تعريف الإسم:
كود:
void Button1Click
و المدخلات:
كود:
void Button1Click(object sender, System.EventArgs e)
والشفرة مكتوبة بين حاصرتين:
كود:
{
MessageBox.Show("مرحباً بكم في اليس شارب");
}
في التعريف void تعني إجراء أي أننا سنعرف متغير من نوع إجراء
كما عرفنا متغير من نوع رقم في الدرس السابق:
كود:
int x;
بنفس الطريقة عند تعريف الإجراء:
كود:
void x;
لكن هذا التعريف لا يكفي فهو لا يحتوي على الثلاث الأشياء المهمة
مثلاً لو أردنا إجراء يظهر رسالة مكتوب عليها مثلاً "من داخل الإجراء"
فسكون التعريف كالتالي:
كود:
void sm()
{
MessageBox.Show("من داخل الإجراء");
}
عرفنا متغير من نوع إجراء اسمه sm إختصار لـ Show Message ..يمكنك تغيير إسم الإجراء كما
تشاء
يوجد لدينا الإسم:
كود:
void sm
والمدخلات:
كود:
()
لا يوجد لدينا مدخلات في هذا الإجراء ولكن يجب عمل الأقواس الفارغة
وسنعرف فيما بعد كيف نتعامل مع المدخلات
ولدينا الشفرة:
كود:
{
MessageBox.Show("من داخل الإجراء");
}
وبالتالي فالتعريف كامل ويمثل إجراء لإظهار رسالة ,
والآن إذا أردنا في أي مكان من البرنامج تنفيذ الإجراء فما علينا سوى كتابة اسمه هكذا:
كود:
sm();
التعليمة السابقة تجعل المعالج يبحث عن الإجراء sm وينفذ الأوامر بداخلة.
ربما يقول البعض ما الداعي من عمل إجراء وكتابة الكود داخلة ثم إستدعاءه
لماذا لا نكتب الكود مباشرة كما فعلنا في الدرس الأول؟؟؟
والجواب ببساطه ماذا لو أردت إظهار الرسالة خمس مرات؟؟
بالطريقة القديمة ستكتب هكذا:
كود:
void Button1Click(object sender, System.EventArgs e)
{
MessageBox.Show("من داخل الإجراء");
MessageBox.Show("من داخل الإجراء");
MessageBox.Show("من داخل الإجراء");
MessageBox.Show("من داخل الإجراء");
MessageBox.Show("من داخل الإجراء");
}
أما بطريقة الإجراءات فستكتب هكذا:
كود:
void Button1Click(object sender, System.EventArgs e)
{
sm();
sm();
sm();
sm();
sm();
}

void sm()
{
MessageBox.Show("من داخل الإجراء");
}
الكود بالأزرق هو كود الضغط على الزر و الكود بالأحمر هو كود إجراء إظهار الرسالة
نلاحظ أن طريقة الإجراءات تسهل التعامل أكثر وتوفر الوقت والجهد
ربما يقول البعض لا يوجد فرق كبير بين الطريقتين لكن ماذا إذا كانت الرسالة كبيرة جداً
أو ماذا إذا كانت الأوامر أكثر من مجرد إظهار رسالة
عندها بالتأكيد الإجراء سيوفر الكثير من الجهد والوقت
وإيضا المدخلات تجعل الإجراءات أكثر فائدة :
مثلاً لو أردنا أن نطور الإجراء السابق ليظهر رسالة مختلفة في كل مرة نستدعيه
سنجعل الرساله المراد إظهارها علي أنها مدخل متغير ويكون تعريف الإجراء كالتالي:
كود:
void sm(string msg)
{
MessageBox.Show(msg);
}
المدخلات هي متغيرات كما رأينا حيث عرفنا متغير مدخل اسمه msg من نوع نص string
وفي تعليمة إظهار الرسالة جعلنا الكائن MessageBox.Show يظهر ما في المتغير المدخل msg
الآن عند إستدعاء الإجراء يجب تمرير قيمة من نوع نص مكان المتغير المدخل هكذا:
كود:
sm("من داخل الإجراء");
sm("رسالة مختلفة من نفس الإجراء");
نلاحظ أن الإجراء أظهر رسائل مختلفة بنفس الشفرة
الأمر الأول في الكود السابق سيظهر رسالة مكتوب عليها "من داخل الإجراء"
والأمر الثاني سيظهر رسالة مكتوب عليها "رسالة مختلفة من نفس الإجراء"
ملاحظة: إذا كان لدينا أكثر من مدخل فنفصل بينها بالفاصلة مثلاً:
كود:
void sm(int x,string msg)
وعند الإستدعاء :
كود:
sm(14,"رسالة");
الدوال Functions
الدول هي إجراءات لكن لها خاصية أنها ترجع قيم
رأينا في الإجراءات أنا نستدعيها للقيام بعمل محدد فقط
أما الدوال فإنا نستدعيها للقيام بعمل محدد وإرجاع قيمة لنا
ولها خمس أشياء مهمة:
1- تعريف الإسم Name Decleration
2-نوع القمية التي ستحملها الدالة Result Data Type
3-المدخلات Parameters
4-الشفرة مكتوبة بين حاصرتين Code
5-تعليمة تحميل الدالة للقيمة الناتجة Return phrase
مثلاً إذا إردنا عمل دالة تقوم بأخذ رقمين وترجع لنا مجموعهما فيكون التعريف كما يأتي:
كود:
int sum(int x,int y)
{
int z;
z=x+y;
return z;
}
في السطر الأول عرفنا دالة إسمها sum ترجع متغير من نوع رقم int
ولها مدخلين من نوع رقم x و y
وبين الحاصرتين لدينا التعليمات التي تقوم بجمع المتغيرين
وفي التعليمة الأخيرة return z تعني تحميل الدلة القيمة الموجود في z وهي مجموع xوy
وعند الإستدعاء بنفس الطريقة في الإجراءات لكن الدالة تكون محملة بقيمة :
كود:
sum(4,5);
بدون الدالة ستكود شفرة جمع رقمين هكذا:
كود:
int z;
z=4+5;
MessageBox.Show(Convert.ToString(z));
أما بإستخدام الدالة فتكون الشفرة هكذا:
كود:
int z;
z=sum(4,5);
MessageBox.Show(Convert.ToString(z));
لاحظ أنا استدعينا الدالة وحملنا ما داخلها للمتغير z
في المثال السابق تعرفنا كيف نستخدم الدالة , رغم اننا لم نستفد منها كثيراً في المثال السابق
ولكن كان الغرض منه توضيح إستخدام الدوال .
عزل - كبسلة المتغيرات Variables Encabsulation
مارأيك بالكود التالي:
كود:
void Button1Click(object sender, System.EventArgs e)
{
int x;
x=10;
AddFive();
}

void AddFive()
{
int y;
y=5+x;
MessageBox.Show(Convert.ToString(y));
}
الكود بالأزرق هو إجراء الضغط على الزر , وبالأحمر إجراء إظهار قيمة x مضاف إليها 5
لو قمت بتنفيذ الكود السابق , ما الذي ينتج , ستقول ستظهر رسالة مكتوب عليها 15
سأقول لا , لا ليس صحيحاً , سينتج خطأ جسيم !!
السبب أن المتغير x معرف داخل الإجراء باللون الأزرق
وبالتالي فالمفروض أن نستخدمة في هذا الإجراء فقط , وإذا أستخدمناه في إجراء آخر كما فعلنا
فإن المعالج لن يتعرف على هذا المتغير !! .. ولكن ماذا لو أردنا أن نستخدم متغير في أكثر من إجراء؟؟
الجواب:
المتغيرات Variables تنقسم إلى نوعين رئيسيين :
1-متغيرات محلية Local وهي التي تعرف وتستخدم داخل الإجراء فقط
2-متغيرات عامة Global وهي التي تعرف خارج الإجراء وتستخدم من قبل إجراءات كثيرة
والمتغيرات العامة تنقسم إلى قسمين :

ِa- متغيرات خاصة pr
ivate وهي تستخدم من قبل إجراءات ودوال النافذة الواحدة فقط ولا تراها النوافذ الأخرى
كود:
private int x;
b-متغيرات عامة public وهي تستخدم من قبل إجراءات ودوال النافذة والنوافذ الأخرى
كود:
public int x;
إذن إذا أردنا أن نستخدم متغير في عدة إجراءات فإننا نعرفة خارج الإجراء
والأفضل أن يكون تعريف المتغيرات العامة في بداية كود النافذة فوق دالة Main :

كود:
//هنا تعريف المتغيرات الدولية
[STAThread]
public static void Main(string[] args)
.
.
وبالتالي فالإجراء السابق بعد التعديل سيصبح هكذا :
كود:
private int x;
.
.
void Button1Click(object sender, System.EventArgs e)
{
x=10;
AddFive();
}

void AddFive()
{
int y;
y=5+x;
MessageBox.Show(Convert.ToString(y));

}
طبعاً بفرض أننا وضعنا تعريف المتغير x فوق دالة Main
بهذه الطريقة عرفنا x مرة واحدة ويمكن إستخدامه في أكثر من إجراء من نفس النافذة
ملاحظة: إذا أردنا أن نكتب تعليق في الشفرة أو ملاحظة بدون أن يقرأها المترجم
فإننا نكتب في بداية السطر // والمترجم لن يقرأ الكود التي تحول لونها إلى الأخظر كما فعلنا
في الكود السابق , أما إذا كانت الملاحظة من عدة أسطر ولا نريد أن نضيف // لكل سطر نتيجة الكسل أو ما شابه
فيكفي أن نكتب*/ في بداية الملاحظة و/* في نهاية الملاحظة :

كود:
int x;
/* هذا السطر لن يقرأه المترجم
وهذا السطر ايضا
وهذا أيضاً*/

MessageBox.......
لحق 1 : تعقب الأخطاء Appendix 1 : Error Handling
كثيراً ما تحدث أخطاء في البرامج نتيجة تعامل المستخدم مع البرنامج ,
وبدون تعقب للأخطاء سيغلق البرنامج بمجرد أي خطأ , لذلك يجب على المبرمج
تعقب الأخطاء ليمنع من إغلاق البرنامج وليظهر رسالة للمستخدم بالخطأ
مثلاً في تطبيق الآله الحاسبة في الدرس الثاني ماذا لو أدخل المستخدم حرف بدل من رقم
بالتأكيد كائن التحويل Convert.ToInt32 سيطلق خطأ لأنه لن يستطيع تحويل حرف إلى رقم
الكود كان هكذا :
كود:
int x;
int y;
int z;
x=Convert.ToInt32(t1.Text);
y=Convert.ToInt32(t2.Text);
z=x+y;
MessageBox.Show(Convert.ToString(z));
وعند إدخال حرف إلى مربع النص t1 أو t2 فستظهر رسالة خطأ ويتوقف البرنامج
لتعقب الأخطاء نستخدم جملة try و catch حيث نكتب الكود الذي يمكن أن يسبب خطأ
ضمن جملة try ونكتب الكود الذي ينفذ في حالة حدوث حطأ ضمن جملة catch
ويصبح الكود السابق هكذا:
كود:
try
{
int x;
int y;
int z;
x=Convert.ToInt32(t1.Text);
y=Convert.ToInt32(t2.Text);
}
catch
{
MessageBox.Show("تأكد من إدخال أرقام فقط");
}
z=x+y; MessageBox.Show(Convert.ToString(z));
الكود باللون الأزرق هو مكان إحتمال وجود الخطأ لأنه المكان الذي يتم تحويل المدخلات إلى رقم
وإذا حصل إي خطأ فإن المعالج سينتقل لتنفيذ الكود باللون الأحمر
أما إذا لم يحدث أي خطأ , فالمعالج لن ينفذ الكود بالأحمر ..

ملحق 2 :إنهاء البرنامج Appendix 2 : Program Termination
لإنهاء البرنامج نحتاج إلى كائن يتعامل مع بيئة الدوت نت وهذه هي التعليمة :
كود:
System.Environment.Exit(0);
الكائن Environment يمثل بيئة الدوت نت الذي يعمل عليها البرنامج
والتعليمة Exit تجعل المعالج ينهي البرنامج ويفرغ الذاكرة Release Memory References
والمدخل 0 يعني إنهاء البرنامج تماماً و سنعرف فيما بعد مدخلات أخرى لهذه التعليمة
ملحق 3 : التعامل مع ملفات المشروع Appendix 3 :-Dealing with project files
في لغات البرمجة المشروع ليس ملف وحيد فقط ,
انما مجموعة من الملفات المترابطة مع بعضها بواسطة ملف المشروع
وعند فتح المشروع يجب فتح الملف الأساسي للمشروع وسيقوم هو آلياً
بتحميل جميع ملفات المشروع لبيئة التطوير :

كما في الصورة فالملف الأساسي للمشروع هو بامتداد csproj
وإذا كان المشروع متعدد البرامج فالملف الأساسي هو بإمتداد sln
أما إذا كان المشروع برنامج واحد كما في مشروعنا فيمكن فتح أي منهما
وإذا أردت أن تنسخ المشروع فعليك نسخ المجلد بالكامل الذي يحتوي على جميع الملفات
ثم فتح المشروع بواسطة ملف المشروع الأساسي
يتبع التطبيق..
التطبيق
ربما تسائل الكثير عن وظيفة الملفات الكثيرة التي تنتهي بإمتداد dll
حان الوقت لنعرف ذلك , dll هي إختصار لـ Dynamic Link Library
هذه الملفات كتبت بلغة برمجة و تحتوي على دوال وإجرائات وكائنات
و تستخدم في برامج أخرى, مثلاً دالة إظهار رسالة كما إستخدمناها في الدروس السابقة
موجودة في ملف اسمة System.dll ينزل مع لغة البرمجة , وبدون هذا الملف
لن نستطيع إظهار الرسالة , حيث أن شفرة إظهار الرسالة ورسم صندوق الرسالة
ورسم زر موافق ورسم شريط العنوان كلها هذه الشفرة مكتوبة مسبقاً وموجود في الملف System.dll
ونحن ما علينا سوى إستدعائها من الملف كما نستدعي دالة أو إجراء عادي ,
وهناك دوال كثيرة أخري تتعلق بقواعد البيانات موجوده في الملف System.Data.dll
وهناك دوال الرسم موجوده في System.Drawing.dll ....
إي أن الدوال و الإجراءات والكائنات في لغات البرمجة مقسمة في ملفات بغرض تنظيمها
وعندما تريد إستخدام دالة في ملف محدد يجب أن تظيف هذا الملف إلى مشروعك
حتى يتعرف علية المعالج ويستطيع إستدعاء الدوال داخلة .
ربما تسأل كيف إستخدمنا دالة إظهار الراسالة في الدروس السابقة ولم نظيف ملف System.dll
الإجابة أن لغة البرمجة تضيف هذا الملف آلياً لأنه يحتوي على دوال كثيرة الإستخدام ومهمة
ولتعرف إن هذا الملف مضاف في المشروع :

أفتح نافذة ملفات المشروع كما في رقم 1 ثم إفتح الملحقات References رقم 2
سترى مجموعة من الملفات مضافة للمشروع ومنها ملف System رقم 3
وفي بداية كود النافذة يجب إستدعاء الملف بإستخدام تعليمة using حتى يتم تحميل
جميع كائنات ودوال الملف ويتمكن المعالج من معرفتها وإستخدامها .
أحياناً ملف dll يحتوي على كائنات داخلة وداخل كل كائن دوال مختلفة
في هذه الحالة لن نستطيع إستدعاء الدالة كما فعلنا في دالة إظهار الرسالة
لأن المعالج لا يعرف مكان الدالة في الملف فهو يفحص الدوال الموجوده في الملف
ولكنه لا يفحص الكائنات , لذلك لا يجد الدوال المخزنة داخل كائنات
ويجب علينا أن نحدد عنوان الدالة داخل الملف ,
ويتم ذلك بكتابة إسم الكائن متبوعاً بنقطة ثم إسم الكائن الداخلي ... وهكذا حتى نصل إلى مكان الدالة
مثلاً دالة إنهاء البرنامج هي Exit , وهذه الدالة موجوده داخل كائن إسمة Environment
وهذا الكائن موجود داخل ملف System , فإذا إستدعينا هذه الدالة بإسمها فقط فإن المعالج لن يعرف عنوانها
ويظهر لنا خطأ , لذلك وجب علينا تحديد عنوانها هكذا :
كود:
System.Environment.Exit(0);
..
وبما أن تطبيقنا يشغل ملفات صوت وفيديو فيجب علينا إضافة الملفات التي يوجد فيها دوال الصوت والفيديو
ودوال الصوت والفيديو موجود في ملفي dll
وللأسف هذه الملفات لا ينزل مع لغة البرمجة
لذلك يجب تنزيلها
من هذا الرابط
بعد تنزيل الملفات وفك الضغط , إفتح المشروع وافتح نافذة ملفات المشرع
واضغط بالزر الأيمن على References وإختار Add Reference

ستظهر لك هذه النافذة:

إختر Browse من تبويب .Net Assemply ثم أضف ملف
Microsoft.DirectX.AudioVideoPlayback.dll
الذي قمت بتنزيله
حتى يظهر الملف في قائمة الملفات المختارة رقم 3 , ثم إختر OK
سترى أن الملف تم إضافتها إلى قائمة الملفات الملحقة :

الآن في أعلى كود النافذة يجب إستدعاء الملف ليتعرف عليه المعالج وذلك بإضافة الكود:
كود:
using Microsoft.DirectX.AudioVideoPlayback;
يضاف هذا الكود أسفل تعليمات الإضافة الإفتراضية كما في الصورة :

الآن إذهب إلى تصميم نافذة تطبيق الدرس السابق و قم بحذف القائمة l1
وعدل النص في الزر من "تشغيل الدوارة" إلى "فتح ملف الصوت"
إسحب زر آخر وأكتب عليه "تشغيل ملف الصوت"
ثم إسحب أداة OpenFileDialog إلى النافذة

ستلاحظ أنها لن تضاف في النافذة وإنما في شريط أصفر تحت
وذلك لأن هذه الأداة لا تظهر على النافذة مثل الزر أو صندوق النص
الآن إختر الأداة من الشريط الأصفر و غير إسمها من openFileDialog1 إلى OF ليسهل التعامل معها من الكود
حتى يصبح شكل النافذة هكذا :

الآن سنقوم بتعريف متغير من نوع مشغل صوت Audio, وهذا النوع موجود في ملف Microsoft.DirectX.AudioVideoPlayback
كنا نعرف متغير من نوع رقم هكذا :
كود:
int x;
وبنفس الطريقة سنعرف متغير"كائن" من نوع مشغل صوت
كود:
Audio ap;
عرفنا كائن أسمة ap من نوع Audio ..
لاحظ أن النوع Audio لا يعتبر متغير وإنما كائن لأنه يحتوي على أفعال وصفات ودوال كما سنرى
ولكن لاحظ أننا سنستخدم هذا الكائن في إجرائين إثنين , إجراء فتح الملف و إجراء تشغيل الملف
إذا في أي إجراء سنعرفه ؟؟ .... يجب أن يكون هذا المتغير متغر عام Global
لذلك يجب أن نعرفه خارج الإجرائين ونحدد هل هو عام لجميع النوافذ أم خاص لهذه النافذة
إبحث عن مكان في الشفرة خارج الإجرائين , والمفضل أن يكون كما حددته في الدرس
وقم بتعريف الكائن بهذا الكود :
كود:
private Audio ap;
بما اننا سنستخدمة في هذه النافذة فقط جعلنا نوعه خاص private :

الآن افتح التصميم و اضغط مزدوجاً على زر "فتح ملف الصوت" لتذهب إلى الكود
إمسح الكود من الدرس السابق : وأضف هذا الكود :
كود:
OF.ShowDialog();
ap=Audio.FromFile(OF.FileName);
أضغط مزدوجا على زر "تشغيل ملف الصوت" وأضف هذا الكود:
كود:
ap.Play();
في الكود الأول إستخدمنا دالة ShowDialog في أداة فتح الملفات OF لتظهر لنا نافذة لفتح ملف الصوت :

هذة الدالة ترجع قيمة من نوع نص تحتوي على مسار الملف الذي إخترته
وفي السطر الثاني إستخدمنا دالة FromFile في كائن Audio لفتح الملف وتحميلة للمتغير ap
لاحظ أن الدالة FromFile تتطلب مدخل من نوع نص يحتوي على مسار الملف المراد تحميلة
ومسار هذا الملف هو القيمة التي سترجعها الدالة OF.FileName
في الكود الثاني إستخدمنا دالة Play في المتغير ap لتشغيل ملف الصوت
الآن قم بتشغيل البرنامج وإضغط على زر "فتح ملف الصوت"
وإختر ملف صوت من نوع mp3 أو wav , لا تختر ملف من نوع rm
سنعرف فيما بعد كبف نشغل ملفات rm و ram
بعد إختيار الملف اضغط على زر "تشغيل ملف الصوت"
واستمع للصوت الناتج من برنامجك
ملاحظة : بما ان التطبيق أستخدم دوال داخل ملف Microsoft.DirectX.AudioVideoPlayback
فانه عند تشغيل البرنامج سيقوم المعالج بنسخ هذا الملف إلى مسار البرنامج
ولن يعمل البرنامج إلا إذا كان هذا الملف إلى جانبه في نفس المجلد
الواجب
*ماذا لو إخترت ملفاً غير صوتياً وجربت تشغيلة
بالطبع سيظهر لك خطأ ويتوقف البرنامج , ما رأيك لو تعقبت هذا الخطأ
وأظهرت رسالة بالعربية تخبر المستخدم ما اللذي يجري .
تلميح : ظهر الخطأ سيكون عند تعليمة
كود:
كود:
ap.Play();
لذلك يجب وضع هذه التعليمة ضمن جملة try و ...
يمكن أيضاً أن يظهر خطأ عند التعليمة :
كود:
ap=Audio.FromFile(OF.FileName);
وبالتالي فالأفضل وضعها ضمن جملة try أيضاً .

*أضف زر لإنهاء البرنامج وأرسل التطبيق ..
ملاحظة مهمة:
ليعمل تطبيق الصوت في أنظمة لا تحتوي على DirectX SDK
يجب إرفاق ملف DirectX الذي قمت بتنزيله في مجلد التطبيق بجانب ملف البرنامج
بمعنى أن نضع هذا الملف بجانب ملف البرنامج exe كما في الصورة


.نهاية الدرس الرابع.
avatar
sayed
Admin

عدد المساهمات : 190
تاريخ التسجيل : 10/10/2011
العمر : 62
الموقع : computer.hooxs.com

http://computer.hooxs.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى