![]() | ![]() | ![]() | ||
| | |
| ||||||||
![]() |
| | LinkBack | أدوات الموضوع | انواع عرض الموضوع |
| |||
| دروس #C مصوره للمبتدئين , دروس #C مصوره للاحتراف , دروس #C مصوره ميزه , دروس #C مصوره مميزه ![]() ![]() من صفحة التحميل الرئيسية لميكروسوفت : http://www.microsoft.com/downloads/ ثم إبحث عن Net Framework 2.0 حجم الملف يقارب 24 ميجا بايت عند فتح هذا اللينك ستجد زر مكتوب عليه Download ......... البرنامج الثاني هو بيئة التطوير , أي المكان الذي سنكتب فيه تعليمات البرنامج ونجربه يوجد هناك عدة بيئات تطوير مجانية متوفره منها بيئة ميكروسوفت بإصدارها المضغوط Express لتحميل C# 2005 Express حجم الملف يقارب 450 ميجا بايت إذا لم تستطع تحميل هذه البيئة فهناك بيئة أخرى مجانية Sharp Developer حجم الملف يقارب 4 ميجا بايت لتنظيم العمل على الدروس ينصح عمل مجلد جديد على القرص المحلي D وتسميته CS يجب أولاً تنصيب البرنامج الأول dotnetfx.exe وعند الإنتهاء منها يتم تنصيب البيئة SharpDevelop2_2.0.0.1591_Setup.exe أو C# Express وبهذا تكون مستعداً لتلقي الدرس الأول ومع الدرس لاول مفهوم لغات البرمجة منذ بداية ظهور الكهرباء وتطورها , ظهرت فكرة معالجة التيار الكهربائي والإستفادة منه فمثلاً المصباح يأخذ الكهرباء ويعالجها "يحولها" إلى ضوء والراديو يأخذ الكهرباء ويحولها إلى صوت .. وهكذا وبالتالي فإن أي عمل مع الكهرباء يحتاج إلى ثلاثة أشياء مهمة 1- مدخلات "تيار كهربائي". 2-معالجة "تحويل التيار إلى ضوء , صوت....". 3-مخرجات "ضوء , صوت ....". بالإضافة إلى جهاز التحويل "المصباح , الراديو" الحاسوب لا يخرج عن هذه القاعدة فهو يحتاج إلى مدخلات ليعالجها ويحولها إلى مخرجات مثلاً عندما تضغط اي زر في لوحة المفاتيح , فإن تيار كهربائي يتولد وينطلق بإتجاه المعالج المعالج بدوره يحول هذا التيار إلى تيار مختلف ينطلق نحو الشاشة ويظهر الحرف قد يتسائل البعض كيف يفرق المعالج بين زر وآخر في لوحة المفاتيح , فجميع الأزرار تطلق تيار كهربائي وهذا هو أساس العمل في الحاسوب , حيث أن معالج الكمبيوتر لا يستقبل تيار مستمر كما في المصباح , أو في الراديو , أو في أي جهاز كهربائي وإنما معالج الكمبيوتر يستقبل تيار متغير , للتوضيح نفرض أن العدد 1 يمثل مرور تيار والعدد 0 يمثل عدم مرور التيار عندما يكون المصباح مطفأ يكون التيار الذي يستقبله هكذا 0000000000000000 أما عندما نضيئ المصباح فإن التيار يكون هكذا 1111111111111111 وهكذا مع الراديو و المكواه و.و.و. لكن في الحاسوب يختلف شكل التيار لأنه يكون متغير فيكون شيئاً هكذا 110001010100011110101000111010101001 وهذه هي الطريقة التي يفرق المعالج حرف عن حرف آخر فالتيار الذي يمثل حرف الواو مثلاً يكون هكذا 11001010 وحرف الطاء يكون هكذا 10111010 وحرف النون يكون هكذا 01010011 وبالتالي فإن كلمة وطن ستكون هكذا 010100111011101011001010 ولا ننسى أن معنى 0 عدم مرور تيار و معنى 1 مرور تيار وبإفتراض أن سرعة قراءة المعالج لرقم هي ثانية واحد فأن التيار الكهربائي الذي يمثل حرف الواو 11001010 سيكون هكذا: في البداية ينقطع التيار لفترة ثانية ثم يمر التيار لمدة ثانية ثم ينقع لمدة ثانية ثم يمر لمدة ثانية ثم ينقطع لمدة ثانيتين ثم يمر لمدة ثانيتين أي أن المعالج سيستغرق ثمان ثواني لقراءة حرف الواو في المثال السابق افترضنا أن سرعة المعالج هي ثانية واحدة لكنها في الحقيقة أسرع بكثير ومن هنا أعتقد انا فهمنا ما معنى سرعة المعالج "هي سرعة قراءته للرقم الواحد" والرقم الواحد سواءاً كان 1 أو 0 يسمى "بت" Bit فعندما تكون سرعة المعالج 3200 يعني أنه يقراً 3200 ميجا بايت في الثانية الواحدة والميجا يحتوي على 1024 كيلو بايت والكيلو بايت يحتوي على 1024 بايت والبايت يحتوي على 8 بت يعني أن هذا المعالج يقراً 3277832 بت في الثانية الواحدة يعني أنو بيقرأ حرف الواو في مدة 0.00000244 من الثانية والآن بعد أن عرفنا كيف يقرأ الكمبيوتر الكلمات بقي أن نعرف كيف ينفذ الكمبيوتر الأوامر المطلوبة منه. كان الحاسوب في بدايته يستقبل الأوامر كتيار كهربائي مثل ما رأينا سابقاً لكن هذه الطريقة غير عملية , فإذا أردنا أن نأمر الكمبيوتر بأن يطبع كلمة وطن على الشاشة فسيكون الأمر شبيهاً بهذا 01010011101010101011010100111011101011001010 فهذه هل اللغة التي يفهمها الحاسوب , لكنها لغة صعبة الفهم على الإنسان لذلك ظهر ما يسمى بلغات البرمجة " وهي لغات قريبة من لغة الإنسان ويفهما الحاسوب" حيث أن لغات البرمجه سهلت التعامل مع الحاسوب وأصبح من الممكن إصدار الأوامر للحاسوب هكذا كود: Print "وطن" وحيث أن الحاسوب لا يفهم هذه اللغة يوجد ما يسمى بالمترجم , وهو برنامج ملحق بلغة البرمجة وظيفته قراءة الأوامر المدخلة وتحويلها إلى تيار يفهمه المعالج , لكن عملية الترجمة تتم بشكل غير ظاهر فما على المبرمج إلا أن يكتب الأوامر ويشغل البرنامج .. والمترجم يقرأ Print "وطن" ويحولها إلى 01010011101010101011010100111011101011001010 ويرسلها إلى المعالج.. مفهوم الكائنات في لغات البرمجة كل شيئ يعتبر كائن له صفات وله أفعال كأي كائن في الوجود فمثلاً السيارة كائن له صفات "مثل اللون والشكل وعدد الإطارات...." وله أفعال مثل "السير , التوقف, ..." لا حظوا أن الأفعال قد تكون من الكائن نفسه "السير" و قد تكون من كائن آخر في الحاسوب أيضاً الأمر لا يختلف فكل شيئ يعتبر كائن له صفات وأفعال فمثلاً هذا المنتدى كائن له صفات وأفعال وزر"إقتباس" تحت هذه المشاركة هو كائن له صفات مثل اللون و الكلام المكتوب عليه و الحجم... وله أفعال مثل أنه يعمل رد جديد مع إقتباس الرد الحالي... و صندوق النص في آخر هذه الصفحة عند الرد السريع , يعتبر كائن له صفات كاللون وله أفعال كإرسال الرد إلى قاعدة بيانات المنتدى.. وزر ابدأ أو Start في الوندوز هو كائن وشريط المهام Task Bar هو كائن يحتوي على كائن آخر "زر ابدأ" إذاً يمكن لكائن أن يحتوي على عدة كائنات فالسيارة كائن يحتوي على كائن آخر وهي الإطارات مثلاً التطبيق بعد تنصيب البرامج افتح مجلد CS الي أنشأناه في القرص D وداخل المجلد CS قم بإنشاء مجلد جديد اسمه Projects من سطح المكتب لإتح ايقونة برنامج بيئة التطوير وهذا شكلها: ![]() بعد أن تفتح البيئة سيظهر لك زرين في الوسط هكذا : ![]() أنقر على زر New Solution المؤشر عليه بالأحمر ستظهر لك هذه النافذة: ![]() أنقر لى إشارة + الموظحه في رقم 1 ثم انقر علىwindows applications كما في رقم 2 ثم أنقر على Windows Application كما في رقم 3 , عند صندوق اسم المشروع أكتي إسم المشروع الذي ترغب به وليكن MyMediaPlayer كما في رقم 4 ثم انقر على الزر في رقم 5 وإختر مجلد Projects الذر أنشاته سابقاً داخل مجلد CS في القرص D ثم أنقر على زر Create في رقم 6 بتظهر لك نوافذ المشروع وفيها شفرة المشروع الإفتراضية , تحت نافذة الشفرة انقر على زر Design كما في الصورة ![]() ستظهر أمامك هذه النوافذ: ![]() في اليسار انقر على Windows Forms كما في رقم 1 ستظهر لك جميع الكائنات التي نحتاجها في البرامج وفي الوسط ستظهر لك نافذة فارغة نسميها Form وهذه النافذة هي النافذة الرئيسية للمشروع ولا ننسى إن هذه النافذة تعتبر كائن لها صفات مثل إسمها " MyMediaPlayer" ولها أفعال مثل ما سنلاحظ لاحقاً على اليسار يوجد جدول وهذا هو جدول صفات الكائنات ومن خلاله يمكن تغيير أي صفة من صفات الكائن ما رأيك لو قمنا بتغيير لون النافذة إلى الأزرق.. نذهب إلى جدول الخصائص ونبحث عن خاصية BackColor ننقر على الصندوق أمامها ستظهر قائمة ألوان , نختار منها أي لون وليكن الأزرق نلاحظ أن لون النافذة تغير , يعني أننا غيرنا صفة من صفات هذا الكائن الآن نرجع الكائن للونه الطبيعي يوجد صفة أيضاً مهمة إسمها Text إبحث عنها في جدول الصفات عند رقم 2 ستجد مكتوب أمامها MyMediaPlayer إمسحها وأكتب بدلها "مشغل الصوت والفيديو". ملاحظة: لسهولة الوصول إلى الصفات يمكن ترتيب الصفات بالترتيب الأبجدي بالنقر على زر الترتيب في أعلى جدول الصفات : ![]() من نافذة الأدوات على اليسار انقر على صورة الزر المكتوب أمامه Button واستمر في الضغط واسحب الماوس فوق النافذة الفارغة سيكون شكل النافذة هكذا: ![]() يمكن تغيير حجم أو موقع الزر , الآن تأكد من إختيار الزر و اذهب إلى نافذة الصفات إبحث عن صفة اسمها Text وأكتب بدل button1 أكتب "ترحيب". لاحظ أنا غيرنا صفة من صفات الزر , ولكن كيف نغير من أفعال الزر لأنه كائن ولا بد له من أفعال والزر يمكن أن يفعل أي شيء لكنا نريده أن يظهر رسالة ترحيب .. للذهاب إلى أفعال الزر أنقر نقراً مزدوجا Double Click على الزر , ستظهر لك نافذة الشفرة : ![]() وينتقل مؤشر الماوس إلى مكان بين حاصرتين مكتوب فوقة void Button1Click... ومعنى هذا أن المعالج عند ضغط الزر سينفذ الأوامر المكتوبة بين الحاصرتين لا تهتم للشفرة المكتوبة فوق ولا تعدل فيها أبدا فهي مهمه لتشغيل البرنامج الآن بين الحاصرتين يجب أن نكتب الأمر الذي يظهر الرسالة وهذا الأمر هو كود: MessageBox.Show("مرحباً بكم إلى سي شارب"); لنشرح الأمر , أولا MessageBox هو كائن في لغة البرمجة يمثل إظهار رسالة و Show هو كائن أخر داخل كائن MessageBox ويقوم بطباعة الرسالة على الشاشة وكلمة "مرحباً بكم إلى سي شارب" تعتبر مدخل للكائن وهو يعالج الأمر ويخرج الرسالة على الشاشة لاحظ أن الأمر MessageBox.Show يعني أظهر رسالة , ولكن المعالج لن ينفذة لأنه لا يعرف ماذا يكتب في الرسالة لذلك يجب فتح قوس وكتابة الرسالة بين علامة إقتباس , والقوسين تعني أن بينهما مدخلات , أما علا مة الأقتباس فهي مهمة لأنه بدونها سيعتبر المترجم أن مرحباً بكم إلى سي شارب هي جزء من الأمر ولا يفهم هذا الأمر لذلك لن يعمل البرنامج ويجب أن تكون الرسالة بين علامتي أقتباس حتى يتجاوزها المترجم في نهاية السطر يجب كتابة الفاصلة المنقوطه حتى نخبر المترجم أن هذه هي نهاية السطر وينتقل إلى السطر التالي ملاحظة: يجب أن تكون حذراً جداً عند كتابة الشفرة فزيادة نقطة أو حرف تجعل المترجم يرتبك ولا يشغل البرنامج وأيضاً يجب مراعاة الأحرف الكبيرة والصغيرة فالمترجم لن يفهم هذا الأمر messagebox بينما يفهم هذا الأمر MessageBox بقي لنا أن نشغل البرنامج ونرى كيف سيعمل , لتشغيل البرنامج أنقر على زر التشغيل أعلى نافذة الشفرة: ![]() عند تشغيل البرنامج ستظهر لك النافذة الأساسية وعند النقر على زر الترحيب ستظر رسالة الترحيب: ![]() مبروك لقد نجحت في تنفيذ أول برنامج بلغة C# الواجب أنشئ مشروع جديد و انشئ فيه زر لرسالة ترحيب غيّر لون النافذة الأساسية , و غير حجمها , وغير لون الزر وغير حجمه من الممكن أيضاً إنشاء زر آخر يظهر رسالة أخرى وأرسل التطبيق لإرسال التطبيق: اذهب إلى مجلد CS في القرص D ثم إلى مجلد Projects ثم إلى مجلد MyMediaPlayer ثم إلى مجلد bin ثم إلى مجلد Debug ستجد ملف تنفيذي بإسم MyMediaPlayer هذا هو برنامجك الأول .. أضغطه ببرنامج الونزيب وأرسله لي ملاحظة:عند عمل الواجب أو عند تجربة كائنات أخرى , أنشئ مشروع جديد للعبث به , لكن لا تغير أي شيئ في المشروع الذي نطبق عليه .نهاية الدرس الأول. |
![]() |
![]() ![]() |
| |||
| الدرس الثاني المتغيرات في الدرس الأول تعلمنا أن كل شيئ في الحاسوب يعتبر كائن وفي الحقيقة هناك نوعين من الكائنات : كائنات حقيقية: وهي التي لها صفات وأفعال ويمكن أن يكون لها تمثيل مرئي متغيرات : وهي متغيرات لا تحتوي على صفات أو أفعال وإنما تحتوي على قيمة محددة ولا تكون مرئية أي انه من الممكن أن يحتوي الكائن "المتغير" X على قيمة مخزنة في ذاكرة الحاسوب ومن الممكن أن تكون قيمة المتغير أما رقم أو نص أو حرف أو رقم عشري أو.... وإذا أردنا أن ننشئ متغير في ذاكرة الحاسوب فيجب أن نحدد نوع القيمة التي سيحملها المتغير مع العلم أننا نختار إسم الكائن كما نشاء مادام الإسم يحقق الشروط التالية: 1-أن يكون اسم المتغير حروف أو ارقام لاتينية 2-أن لا يكون أول حروف الإسم رقم , فهذا الإسم غير مسموح 5int بينما هذا مسموح int5 3-أن لا يحتوي الإسم على علامات أواشارات مثل # أو $ أو * أو + , الإشارة المسموحة فقط هي _ وهذه الشروط تنطبق على أسماء الكائنات أو المتغيرات التي سنقوم بإنشائها إذاً المتغير هو كائن يستخدم لتخزين قيمة من نوع محدد مثلاً إذا أردنا أن نعرف متغير اسمه x من نوع رقم سيكون الكود كالتالي: كود: int x; وكلمة int إختصار لكلمة integer ومعناها عدد صحيح الكود السابق معناه أنا عرفنا متغير اسمه x سيحمل قيمة من نوع عدد صحيح لاحظ أنك تستطيع تغيير اسم المتغير كما تشاء المهم أن تراعي شروط التسمية الثلاثة وإذا أردنا تحميل هذا المتغير قيمة محدد يكون الكود كالتالي: كود: x=20; الكود السابق معناه أن المتغير x يحمل القيمة 20 ويستمر بحمل القيمة حتي يتوقف البرنامج أو نحملة قيمة أخرى لاحظ الكود التالي: كود: int Var1; int Var2; Var1=10; Var2=Var1; قمنا بتعريف متغيرين من نوع رقم صحيح ثم حملنا الرقم الأول قيمة 10 وفي السطر الأخير حملنا المتغير الثاني قيمة المتغير الأول أي أن المتغير الثاني يحمل أيضاً القيمة 10 ملاحظة مهمه:في لغات البرمجه معامل التساوي ليس تبادلي يعني أن Var2=Var1 لا تساوي أبداً Var1=Var2 لإن معامل = في لغات البرمجة يقوم بنقل قيمة المتغير في اليمين إلى المتغير في اليسار فلو عكسنا المعاملات في السطر الأخير من الكود السابق هكذا : كود: int Var1; int Var2; Var1=10; Var1=Var2; فسيظهر لنا خطأ عند السطر الأخير لأن المعالج سيحاول نقل ما في المتغير Var2 إلى المتغير Var1 ولكن المتغير Var2 لا يحتوي على أي قيمة لذلك سيظهر لنا الخطأ بعض أنواع المتغيرات وكيفية تعريفها: رقم صحيح int نص أو كلمة string رقم حقيقي "رقم يقبل الكسور العشرية مثل 41.51" double حرف char تاريخ أو وقت DateTime قيمة بوليانية bool معنى القيمة البوليانية أي أن المتغير يحمل قيمة صح أو خطأ , للتوضيح: كود: int k;string w;double m;char n;bool p;k=15;w="هذا نص";m=12.15;n="م";p=true; لا حظ أن المتغير من نوع رقم لا يحتاج إلى علامتي إقتباس بينما المتغير من نوع نص أو حرف يحتاج إلى علامتي إقتباس المتغير من نوع bool يحمل أما قيمة true أو false ماذا لو جربنا الكود التالي: كود: k="نص"; سيظهر لنا خطأ لأنا نحاول أن نحمل المتغير k قيمة من نوع نص بينما المفروض أن يحمل قيمة من نوع رقم كما عرفناه وأيضاً هذا الكود خاطئ لنفس السبب كود: k=w; حيث أن w يحتوي على قيمة من نوع نص و k المفروض أن يحمل قيمة من نوع رقم ماذا لو كان لدينا هذا الكود: كود: w="45"; k=w; سيظهر لنا خطأ أيضاً عند السطر الثاني بالرغم من أن w يحمل رقم لأن المترجم لا يعرف أن w يحمل رقم , فهو يعتبر كل ما هو بين علامتي اقتباس على أنه نص وبالتالي فالمترجم لن يقبل أن يحمل k قيمة نصية لأن من المفروض أن يحمل رقم للتغلب على هذه المشكلة يوجد في بيئة التطوير كائن للتحويل ما بين الأنواع وهذا الكائن يقوم بتحويل القمية إلى أي نوع فإذا اردنا تنفيذ الكود السابق بإستخدام كائن التحويل: كود: w="45"; k=Convert.ToInt32(w); الكائن Convert قام بأخذ قيمة w وحولها إلى رقم ثم حملها للمتغير k لاحظ أننا للوصول إلى أفعال أو صفات الكائن نكتب اسم الكائن ثم نقطة ثم فعل أو صفة الكائن فالكائن Convert يحتوي على فعل ToInt32 لذلك كتبنا اسم الكائن ثم نقطه ثم فعل الكائن ووضعنا بين القوسين المدخلات , ومن أفعال الكائن Convert: ToInt32 للتحويل إلى رقم صحيح كما رأينا في المثال السابق ToString للتحويل إلى نص ToDouble للتحويل إلى عدد عشري ToChar للتحويل إلى حرف ToBoolean للتحويل إلى قيمة بوليانية ملاحظة: الرقم الأخير من المتغير ToInt32 يعني حجمة في الذاكرة, مثلاً int16 حجمه 16 بت و int32 حجمة 32 بت ويوجد أيضاً 64, وكل نوع له مدى محدد لا يستطيع يتجاوزه, مثلاً int16 يستطيع خزن أي رقم من – 32,768 إلى 32,767 و int32 يستطيع خزن أي رقم من – 2,147,483,648 إلى 2,147,483,647 و int64 له مدى أكبر بكثير, لذلك إخترنا int32 كحل وسط , لأنه يخزن أرقام كبيرة , ولا يستهلك مكان كبير في الذاكرة التطبيق: أفتح مشروع التطبيق الذي طبقنا عليه في الدرس الماضي غير النص الكتوب في الزر من "ترحيب" إلى "اظهار قيمة x" من خلال تعديل الصفة Text من جدول الصفات انقر نقراً مزدوجا على الزر لتنتقل إلى شفرة الزر .. ثم قم بحذف سطر الأوامر التالي: كود: MessageBox.Show("مرحباً بكم إلى سي شارب"); في مكان الكود المحذوف أكتب الكود التالي: كود: int x; x=50; MessageBox.Show(x); في السطر الأول عرفنا متغير اسمه x سيحمل قيمة من نوع رقم صحيح في السطر الثاني حملنا المتغير x قيمة 50 في السطر الثالث كتبنا أمر اظهار الرسالة , لاحظ أننا وضعنا x بدل نص الرسالة حيث أن المترجم سيقوم بإظهار رسالة ويكتب داخلها القيمة المحملة على x قبل تجربة البرنامج , هل تعتقد أن هناك خطأ في الشفرة السابقة؟ نعم هناك خطأ فلو جربت تشغيل البرنامج ثم الضغط على الزر ستظهر لك رسالة خطأ وسبب الخطأ أن كائن MessageBox.Show يحتاج إلى مدخلات من نوع نص ليظهرها في الرسالة وقد مررنا x على أنه المدخلات ولكنه من نوع رقم صحيح ربما يتسائل البعض ما أدراني أن الكائن MessageBox.Show يحتاج إلى مدخلات من نوع نص وليس من نوع رقم الأمر بسيط جداً , إذا كنت تريد ان تعرف نوع المدخلات التي يحتاجها الكائن سيظهر لك ذلك في رسالة صغيرة بمجرد أن تفتح القوس الأول كما في الصورة: ![]() عندما انتهيت من كتابة القوس الأول ظهر صندوق المعلومات وأظهر اسماء وانواع المدخلات التي يحتاجها الكائن السهم يشير إلى الكلمة التاليه: اقتباس: string text الجزء الأول من الكلمة السابقة يعني نوع المدخل وهو string أي نص والجزء الثاني هو أسم المدخل text وهذا سنشرحه فيما بعد , ولكن ما يهمنا هو الجزء الأول لنعرف نوع المدخل الذي يحتاجه الكائن ملاحظة:بعض الكائنات ومنها كائن MessageBox.Show يمكن أن تقبل مدخلات متعدده فيمكن أن تقبل مدخل واحد وهو نص الرسالة كما رأينا في الدرس السابق و يمكن أن تقبل أكثر من مدخل الكائن MessageBox.Show يقبل 21 نوع من المدخلات ومن الممكن أن تتجول بين أنواع المدخلات الممكنه للكائن بالضغك على زر الأسهم فوق وتحت في لوحة المفاتيح عند ظهور صندوق معلومات المدخلات كما في الصورة: ![]() ولكن ما يهمنا حالياً من أنواع المدخلات هو النوع رقم 15 الذي يحتاج فقط لنص الرسالة نعود إلى الكود السابق الذي أظهر لنا خطأ نتيجة تضارب انواع البيانات لحل مشكلة التضارب نستخدم كائن التحويل لتحويل قيمة x إلى نص ثم تمريرها إلى الكائن MessageBox.Show لأنه كما قلنا لا يقبل إلا مدخلات من نوع نص و x من نوع رقم الكائن الذي يحول من رقم إلى نص هو Convert.ToString وبالتالي سيصبح الكود الصحيح هكذا: كود: int x; x=50; MessageBox.Show(Convert.ToString(x)); جرب البرنامج الآن واضغط على الزر ستظهر لك رسالة مكتوب عليها 50 وهكذا تغلبنا على مشكلة تضارب البيانات .. لتوسيع التطبيق سنستخدم كائن آخر من كائنات البيئة وهو مربع النص اضغط على زر Design أسفل الشفرة لترجع إلى نافذة التصميم ![]() الآن قم بسحب كائن مربع النص وأفلته فوق النافذة كما سحبت الزر في الدرس الأول ![]() ليصبح شكل النافذة هكذا: ![]() تأكد من إختيار مربع النص واذهب إلى جدول الصفات إبحث عن الصفة (Name) ستجد مكتوباً أمامها textBox1 غيرها إلى t1 لاحظ أنا غيرنا إسم الكائن من textBox1 إلى t1 وذلك لسهولة التعامل معه في الشفره كما سنرى لاحقاً الآن اضغط مزدوجاً على الزر لترجع إلى الشفرة أمسح السطر الثاني من الكود السابق وأكتب بدل منه هذا الكود كود: x=t1.Text; لاحظ أن الكائن t1 الذي هو مربع النص له صفة اسمها Text وهي تمثل النص المكتوب عليه معنى الكود السابق أن المترجم سيقوم بأخذ ما هو مكتوب في مربع النص المسمى t1 ويحمله للمتغير x أي أن الكود كاملأ سيصبح هكذا: كود: int x; x=t1.Text(); MessageBox.Show(Convert.ToString(x)); ملاحظة:لمعرفة صفات وأفعال الكائن أكتب إسم الكائن ثم أكتب نقطة , ستظهر لك نافذة بجميع اعمال وصفات الكائن ففي المثال السابق بمجر د كتابة تكتب t1 ثم نقطة سيظهر لك هذا الصندوق : ![]() وبمجرد أن تكتب حرف t من كلمة Text سينقل الإختيار في الصندوق إلى كلمة Text: ![]() وللإختصار اضغط على زر Tab لكي تكتب كلمة Text آلياً لاحظ في الصورة السابقة أن نوع صفة Text هو string أي نص وبالتالي لو حاولت تنفيذ البرنامج وضغط الزر سيظهر خطأ لأننا حاولنا أن نحمل المتغير x قيمة نصيه بينما يجب أن نحملة رقم , يأتي دور كائن التحويل مرة أخرى ولكن هذه المرة من نص إلى رقم فيصبح الكود الكامل والصحيح هكذا: كود: int x; x=Convert.ToInt32(t1.Text); MessageBox.Show(Convert.ToString(x)); في السطر الأول عرفنا متغير من نوع رقم وفي السطر الثاني حملنا هذا المتغير القيمة المكتوبة في مربع النص وحولناها إلى رقم وفي السطر الثالث لم نغير شيء الآن نفذ البرنامج , وقبل أن تضغط الزر أكتب أي رقم في مربع النص ثم اضغط الزر ستظهر لك رسالة بالرقم الذي كتبته تأكد انك ستكتب رقم وليس حرف وإلا ظهرت لك رسالة خطأ .. لتوسيع التطبيق أضف متغيرين آخرين y,z وأضف مربع نص آخر وسمه t2 غير النص المكتوب على الزر وأكتب بدلاً منه "اظهار ناتج الجمع" ليكون شكل النافذة هكذا: ![]() الآن اذهب إلى الشفرة وعدلها إلى التالي: كود: int x; int y; int z; x=Convert.ToInt32(t1.Text); y=Convert.ToInt32(t2.Text); z=x+y; MessageBox.Show(Convert.ToString(z)); عرفنا ثلاثة متغيرات من نوع رقم صحيح في السطر الرابع حملنا x الرقم المكتوب في t1 وفي السطر الخامس حملنا y الرقم المكتوب في t2 وفي السطر السادس حملنا z مجموع x وy وفي السطر السابع أظهرنا قيمة z في الرسالة , لاحظ أنا وضعنا z بدل x في السطر الأخير الآن قم بتنفيذ البرنامج , وأكتب عدداً صحيحاً في كل مربع نص وأضغط الزر ستظهر لك نافذة مجموع العددين : ![]() اغلق الرسالة وجرب أن تضع في أحد مربعات النص رقماً حقيقياً مثل 41.25 واضغط على الزر ستظهر لك رسالة خطأ لأن المتغيرات xوyوz تحمل متغيرات من نوع رقم صحيح وأنت حاولت أن تحملها رقم حقيقي اضغط على زر Continue في رسالة الخطأ ليتم إيقاف تنفيذ البرنامج: ![]() إذهب إلى الشفرة وحاول أن تجد الحل للقيام بجمع أعداد حقيقية, وذلك هو الواجب تلميح:نعرف أن double تعني رقم حقيقي والكائن Convert.ToDouble يحول إلى رقم حقيقي ما عليك إلا أن تضع double بدل من int وتضعConvert.ToDouble بدل من Convert.ToInt32 لحظة , لم ينتهي الواجب بعد أضف إلى البرنامج ثلاثة أزرار إضافية للقيام بباقي العمليات الرياضية 1-اظهار ناتج الطرح 2-اظهار ناتج الضرب 3-اظهار ناتج القسمة ليصبح شكل النافذه هكذا: ![]() .نهاية الدرس الثاني. |
| |||
| الدرس الثالث الجمل الشرطية: معظم عمل الحاسوب يقوم على المقارنة بين قيمتين لإتخاذ أي قرار بعبارة أدق أي عمل يقوم به الحاسوب هو عبارة عن عدد من المقارنات بين قيم مخزنة في مسجلات المعالج مسجلات المعالج هي عبارة عن أجزاء من المعالج يمكن أن تخزن قيم صغيرة وكل مسجل يستطيع أن يخزن 16 بت , وهذه القيم المخزنة يقوم المعالج بمقارنتها مع قيم اخرى في مسجلات أخرى من نفس المعالج لإنتاج تيار كهربائي يمثل نتيجة المقارنة إذاً مبدأ عمل الحاسوب هو المقارنه , عرفنا المقارنه على مستوى المعالج ولكن هذا لا يهمنا , وما يهمنا هو المقارنه على مستوى لغة البرمجة والمقارنه تعتبر أحد أهم اعمدة اي لغة من اللغات , وهناك عدة صيغ للمقارنة 1- إذا كان (الشرط) فـ {التعليمات التي تنفذ في حالة توفر الشرط} كود: if (x>y) { MessageBox.Show("إكس أكبر من واي"); } في الكود السابق سيقوم المعالج بإظهار الرسالة إذا كان x أكبر من y وإلا فلن تظهر أي رسالة لاحظ أننا لم نضع الفاصة المنقوطة بعد الشرط لأن المعالج لم يكمل جملة الشرط ويجب أن ندعه يكمل الجملة إلى نهاية الحاصرة الثانية 2-إذا كان (الشرط) فـ {التعليمات التي تنفذ في حالة توفر الشرط} وإلا {التعليمات التي تنفذ في حالة عدم توفر الشرط} if (x> كود: y){MessageBox.Show("إكس أكبر من واي");}else{MessageBox.Show("إكس ليس أكبر من واي");} في الكود السابق سيقوم المعالج بإظهار رسالة "إكس أكبر من واي" إذا كان x أكبر من y أما إذا لم يكن x اكبر من y فستظهر رسالة "إكس ليس أكبر من واي" لاحظ أننا لم نضع فاصلة منقوطة بعد كلمة else لأن التعليمة لم تكتمل بعد 3-إذا كان(الشرط1) فـ {التعليمات التي تنفذ عن توفر الشرط1} وإلا إذا كان (الشرط 2) فـ {التعليمات التي تنفذ في حالة عدم توفر الشرط1 و توفر الشرط 2} وإلا إذا كان ... كود: if (x>5){MessageBox.Show("اكس أكبر من خمسة");}else if(x<4){MessageBox.Show("اكس ليس أكبر من خمسة , وأكس أصغر من أربعة");}.. في الكود السابق يبدأ المعالج بفحص الشرط الأول فإذا تحقق يظهر رسالة "اكس أكبر من خمسة" وإن لم يتحقق فإنه ينتقل إلى الشرط الثاني فإذا تحقق سيظهر رسالة "اكس ليس أكبر من خمسة , وأكس أصغر من أربعة" وهكذا حتي ينتهي من جميع الشروط .. لاحظ أنه من الممكن أن يكون في الجملة أكثر من شرطين هناك عدد من معاملات المقارنه بالإضافة إلى < و >: < أكبر من مثل ما رأينا سابقاً > أصغر من مثل ما رأينا سابقاً == يساوي كود: if (x == y){MessageBox.Show("اكس يساوي واي");} =! لا يساوي كود: if (x != y){MessageBox.Show("اكس لا يساوي واي");} أحياناً نحتاج إلى شرط مزدوج , أي أننا نحتاج إلى شرط مكون من جزئين مثلاً إذا كان x أكبر من y و x أصغر من z كود: if (x>y & x<z){MessageBox.Show("اكس أكبر من واي و أصغر من زد");} لاحظ انا وضعنا الشرطين بينها علامة & أما إذا أردنا شرط مزدوج من نوع آخر : مثلاً إذا كان x أكبر من y أو x يساوي 10 كود: if (x>y | x==10){MessageBox.Show("اكس أكبر من واي أو يساوي 10");} لاحظ انا وضعنا الشرطين بينها علامة | إذا & تعني و و | تعني أو ملاحظة : علامة | يمكن طباعتها بالضغط على Shift مع زر \ والذي عادة ما يأتي بجانب زر المسح BackSpace وفوق زر Enter الدوارات: هناك أنواع كثيرة من الدوارات لكننا سنتعرف حالياً على أهم نوع منها والدوارات هي تعليمات فائدتها تكرار تعليمات محدد لعدد محدد من المرات مثلاً إذا أردنا أن نظهر رسالة ما عشر مرات أو عشرين مرة , لن نكتب التعليمة عشر أو عشرين مرة حيث يستخدم المعالج متغير من نوع رقم كعداد وفي كل مرة تنفذ العملية يزداد العداد رقم واحد وهكذا حتى يتوفر شرط وقوف الدواره , وأحياناً قد يكون عداد عكسي يعني أنه في كل مرة ينقص رقم إذاً هناك أربعة أشياء مهمة لجملة الدوارة for 1- متغير من نوع عدد يستخدم كعداد مع تزويدة برقم إبتدائي يبدأ منه 2- شرط إستمرار الدوارة في العمل 3- تعريف نوع العداد هل هو تصاعدي أم تنازلي 4- التعليمات التي تنفذ كود: for (int i = 0;i < 10;i++){MessageBox.Show("من الدوارة");} في الكود السابق كلمة for تستخدم لتعريف الدوارة بعد فتح القوس وضعنا تعريف للعداد int i=0 ووضعنا له قيمة 0 أي أن العداد سيبدأ من 0 وضعنا فاصلة منقوطة وو ضعنا بعدها شرط الإستمرار في العمل وهو أن يكون i أصغر من عشرة وضعنا فاصلة منقوطة ووضعنا بعدها نوع العداد وهو تصاعدي ++i أما إذا كان تنازلي نضع --i ثم أغلقنا القوس وفتحنا حاصرتين بينهما التعليمات التي سينفذها المعالج معنى الدوارة السابقة أن المعالج سيظهر الرسالة للمرة الأولى ثم يزيد i ويفحص شرط الإستمرار أذا تحقق شرك الإستمرار يظهر الرسالة مرة أخرى ويزيد العداد برقم ويفحص شرط الإستمرار ..... في الكود السابق سيقوم المعالج بإظهار الرسالة عشر مرات ملاحظة : يمكن إستخدام متغير العداد داخل التعليمات كود: for (int i = 0;i < 10;i++){MessageBox.Show(Convert.ToString(i));} في الكود السابق سيظهر المعالج الرسالة للمرة الأولى وفيها قيمة العداد الأولية وهي 0 وفي المرة الثانية سيظهر الرسالة وفيها قيمة العداد بعد أن زاد برقم أي 1 وهكذا حتى العدد 9 , وعندما يزد العداد بعدها برقم أي يصبح 10 سيفحص المعالج شرط الإستمرار وهو أن يكوت المتغير أصغر من 10 ولكن المتغير هذه المرة ليس أصغر من عشرة لذلك سيتوقف المعالج عن تنفيذ التعليمات ويخرج من جملة for التطبيق: أفتح تطبيق الدرس السابق : وقم بحذف صندوقي النص بواسطة زر Delete غير النص المكتوب في الزر إلى "تشغيل الدوارة" من صندوق الأدوات قم بسحب أداة القائمة : ![]() من خلال الخاصية (Name) قم بتغيير إسم القائمة من ListBox1 إلى l1 ليسهل التعامل معها من الشفرة ملاحظة: عند عمل تطبيق باللغة العربية يجب تحويل الأدوات في النافذه للترتيب العربي أي من اليمين إلى اليسار ويتم ذلك عن طريق تحديد النافذة وتغيير صفتين من صفاتها وهي صفات RightToLeft و صفة RightToLeftLayout من جدول الصفات حيث تكون الخاصية الأولى Yes والخاصية الثانية True : ![]() عندها ستلاحظ ان إتجاه الأدوات تغير ويصبح شكل النافذة هكذا : ![]() الآن اضغط مزدوجاً على الزر للذهاب للشفرة قم بحذف الكود الموجود مسبقاً بين الحاصرتين وأكتب بدلاً عنه هذا الكود: كود: for (int i=0;i<10;i++){l1.Items.Add(" من الدوارة ");} قمنا بعمل دوارة من الصفر إلى 10 لإضافة كلمة "من الدوارة" إلى القائمة الكائن l1.Items.Add يقوم بإضافة ما داخل القوس للقائمة l1 وبالتالي فالكود السابق سيقوم بكتابه كلمة "من الدوارة" عشر مرات على القائمة جرب تشغيل البرنامج وإضغط على الزر , يجب أن ترى شيئاً كهذا: ![]() ملاحظة : إذا أردنا أن نجمع كلمتين أو نصين في نص واحد فيمكننا إستخدام إشارة + مثلاً إذا أردنا أن نظر رسالة تقول مرحباً بكم فيمكن عمل ذلك هكذا كود: MessageBox.Show("مرحباً" + "بكم"); هناك كلمتين ربطنا بينهما بعلامة + والآن لنعدل التطبيق قليلاً لكي نجرب إستخدام العداد : قم يتعديل كود الدوارة وأضف إلى كلمة "من الدوارة" أضف العداد هكذا: كود: for (int i=0;i<10;i++){l1.Items.Add(" من الدوارة " + Convert.ToString(i));} بما أن العداد من نوع رقم إستخدمنا كائن التحويل لنحوله إلى نص ثم ربطناه بكلمة "من الدوارة" عند تشغيل البرنامج سترى شيئاً كهذا : ![]() أعتقد أن الصورة لا تحتاج للشرح ... الآن لماذا لا نطبق جملة شرطية داخل الدوارة .. سنكتب شفرة لطباعة كلمة "من الدوارة" و إذا كان العداد أكبر من خمسة سنضيف كلمة "أكبر من خمسة" : قم بتغيير كود الدوارة إلى هذا الكود: كود: for (int i=0;i<10;i++){if (i>5){l1.Items.Add(" من الدوارة " + Convert.ToString(i) + " أكبر من خمسة ");}else{l1.Items.Add(" من الدوارة " + Convert.ToString(i) );}} الكود باللون الأحمر سينفذ عشر مرات . والكود بالخط المائل سينفذ إذا كان العداد i أكبر من خمسة. والكود الذي تحته خط سينفذ إذا كان العداد i أصغر من أو يساوي خمسة . عند تنفيذ البرنمج ستكون النافذه هكذا : ![]() الواجب: الواجب صعب قليلاً هذه المرة ... إستخدم الدوارة والجمل الشرطية لتنفيذ عملية إضافة نصوص للقائمة 12 مرة بحيث يكتب في آخر كل نص ما إذا كان العداد أكبر من 6 أو يساوي 6 أو أصغر من 6 لتكون النتيجة هكذا: ![]() تلميح : ستستخدم الجمل الشرطية من النوع الثالث بثلاث شروط أي أن جملة الشرط ستكون شبيهة بهذه: كود: if (...){...}else if(...){...}else if(...){...} أكمل الفراغات , طبعاً كل هذا داخل الدوارة .نهاية الدرس الثالث. |
| |||
| الدرس الرابع الإجراءات 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- متغيرات خاصة private وهي تستخدم من قبل إجراءات ودوال النافذة الواحدة فقط ولا تراها النوافذ الأخرى كود: 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 كما في الصورة ![]() .نهاية الدرس الرابع. |
| |||
| الدرس الخامس تشغيل ملف فيديو دوال تشغيل الفيديو موجودة في ملف Microsoft.DirectX.AudioVideoPlayback.dll الذي أضفناه إلى التطبيق في الدرس السابق دوال الفيديو تشبه إلى حد كبير دوال الصوت عدى عن إختلافات بسيطة من اهم هذه الإختلافات أنه يمكنك أن تحدد كائن حاضن Owner Control لشاشة الفيديو معنى كائن حاضن اي كائن يعمل كشاشة فيديو أما إذا لم تحدد كائن حاضن فان التطبيق سيفتح نافذه جديدة لتكون شاشة الفيديو قراءة أحداث المفاتيح كل كائن له صفات و دوال كما عرفنا سابقاً , والكائنات تحتوي أيضاً على أحداث Events مثلاً الزر له عدة أحداث منها عند الضغط عليه Click وعند الضغط المزدوج DoubleClick و عند مرور مؤشر الماوس به MouseOver وفي الدروس السابقة إستخدمنا حدث Click فقط للتصفح بين أحداث الكائن , إختر الكائن ثم أفتح نافذة الصفات "الخواص" واختر زر الأحداث: ![]() ستظهر لك قائمة بجميع الأحداث للكائن المحدد ولكي تضيف تعليمات عند حدوث حدث معين اضغط مزدوجاً على أسم الحدث في القائمة ستتنتقل إلى الشفرة لتكتب التعليمات التي تنفذ عن حدوث ذلك الحدث ومن الأحداث المهة حدث KeyPress وينطلق هذا الحدث عند الضغط على أي مفتاح في لوحة المفاتيح . التطبيق إفتح تطبيق الدرس السابق وعدل النص في زر فتح ملف الصوت إلى "فتح ملف ميديا" وفي زر تشغيل ملف الصوت إلى "تشغيل ملف ميديا" أضف زراً جديداً وغير النص فيه إلى "ملئ الشاشة" قبل تشغيل ملف الفيديو يجب أن نحدد له كائن حاضن ليعمل كشاشة افتح التصميم وأضف أدات البانيل إلى الفورم: ![]() تأكد من إختيار البانيل و غير صفة الإسم إلى p1 غير صفة العرض Width إلى 400 وصفة الإرتفاع Height إلى 300 ![]() من خلال صفة BackgroundImage إختر اي صورة لتكون خلفية الشاشة ليصبح شكل النافذة هكذا: ![]() أضغط مزدوجاً على أي زر للذهاب إلى الشفرة , نحتاج إلى تعريف كائن عام Global من نوع فيديو ولأننا سنستخدمة في أكثر من إجراء سنعرفه خارج جميع الإجراءات والدوال , إذهب إلى الشفرة حيث عرفنا متغير الصوت في الدرس السابق وأكتب تعريف كا ئن الفيديو : كود: private Video vp; تحت تعريف كائن الصوت من الدرس السابق : ![]() سنجعل التطبيق يفتح ملفات صوت أو ملفات فيديو , لكن المشكلة أن للصوت كائن وللفيديو كائن آخر , وبالتالي يجب أن نعرف نوع الملف حتى نستخدم الكائن المحدد وبما أن أنواع الفيديو كثيرة جداً فلا يمكننا فحص نوع الملف لتأكد من نوعه وبالتالي فالحل الوحيد هو أن نحاول أولا تشغيل الملف بكائن الفيديو فإن ظهر لنا خطأ فنحاول نشغلة بكائن الصوت , وأن ظهر لنا خطأ للمرة الثانية فالملف غير صالح قد يسأل البعض لماذا بدأنا بتجربة كائن الفيديو مع أن معظم الملفات ستكوت صوت والإجابة أن كائن الصوت ممكن أن يشغل ملفات فيديو بدون صورة , يعني انه يفتح ملف الفيديو ويشغل الصوت الذي فيه , وبالتالي فربما يكون الملف فيديو ويتم تشغيله كملف صوت لذلك يجب أولاً تجربة كائن الفيديو حتى إذا كان ملف فيديو يشغل الصوت مع الصورة وإذا كان ملف صوت نجرب كائن الصوت .. لعمل ذلك نحتاج إلى تنفيذ جملة تعقب الإخطاء try مرتين متداخلتين: كود: try{//شغل ملف الفيديو}catch{ try { //شغل ملف الصوت } catch { //الملف غير صالح }} أولا سنجرب فتح ملف فيديو فإذا حدث خطأ فإن المترجم ينتقل لتنفيذ التعليمات داخل جملة catch والتي هي باللون الأزرق , وهناك جملة tryأخرى نقوم من خلالها بتجربة فتح ملف صوت فإذا حدث أي خطأ فان المترجم ينتقل لتنفيذ تعليمات catch التي تحتها خط في زر فتح ملف الميديا أمسح الكود السابق وأكتب بدلاً عنه : كود: OF.ShowDialog(); try { vp = Video.FromFile(OF.FileName); vp.Owner = p1; p1.Width = 400; p1.Height = 300; } catch { try { ap = Audio.FromFile(OF.FileName); } catch { MessageBox.Show("الرجاء إختيار ملف صالح"); } } التعليمة OF.ShowDialog تفتح نافذة فتح ملف ميديا عند إختيار الملف نجرب تشغيل الفيديو عبر هذه التعليمات: كود: vp = Video.FromFile(OF.FileName); vp.Owner = p1; p1.Width = 400; p1.Height = 300; في السطر الأول نحمل الملف الموجود في كائن فتح الملف إلى كائن الفيديو في السطر الثاني نحدد الكائن الحاضن Owner لكائن الفيديو في السطر الثالث والرابع , نعيد تحديد حجم الكائن الحاضن إلى الحجم الأصلي لأن ملفات الفيديو لها أحجام مختلفة وحجم الكائن الحاضن قد يختلف على حسب حجم الصورة في ملف الفيديو لذلك من الأفضل إعادة تحجيم الكائن الحاضن عند حدوث أي خطأ سينتقل المترجم لتنفيذ الكود باللون الأزرق وتعليمة تحميل ملف الصوت إلى كائن الصوت: كود: ap = Audio.FromFile(OF.FileName); عند حدوث خطأ آخر هنا سينتقل المترجم إلى تنفيذ تعليمة catch الداخلية وهي إظهار رسالة الخطأ سنستخدم نفس الطريقة في إجراء الضغط على زر تشغيل ملف الميديا إفتح التصميم وأضغط علية مزدوجاً للإنتقال للشفرة أمسح الشفرة الموجودة وأكتب بدلاً منها: كود: try { vp.Play(); } catch { try { ap.Play(); } catch { MessageBox.Show("حدث خطأ اثناء محاولة تشغيل الملف"); } } نجرب تشغيل ملف الفيديو وإذا حدث خطا نجرب تشغيل ملف الصوت وإذا حدث خطأ آخر نظهر رسالة. افتح التصميم واضغط مزدوجاً على زر ملئ الشاشة وأكتب تعليمة ملئ الشاشة لكائن الفيديو: كود: vp.Fullscreen = true; كائن الفيديو يحتوي على صفة Fullscreen من نوع قيمة بوليانية اما صح أو خطأ فإذا حددنا الصفة بقية true فأن تشغيل الفيديو سيكون ملى الشاشة و إذا حددناها false سيرجع تشغيل الفيديو إلى الكائن الحاضن عرفنا كيف نجعل التشغيل ملئ الشاشة لكن المشكل كيف نرجعه للكائن الحاضن لأنه في وضع ملى الشاشة لن نستطيع أن نرى أي شيئ في شاشة الكمبويتر سوى الفيديو يأتي هنا دور حدث الضغط على أي من مفاتيح لوحة المفاتيح حيث سنجعل الفيديو يرجع إلى الكائن الحاضن بمجرد الضغط على أي من مفاتيح لوحة المفاتيح إفتح التصميم وإختر النافذة الأساسية "لا تختر أي زر أو كائن تأكد من إختيار النافذه كلها" إذهب إلى قائمة الإحداث وأضغط مزردوجاً على الحدث KeyPress ![]() ستنتقل إلى شفرة الحدث , أكتب تعليمة إعادة صورة الفيديو إلى الكائن الحاضن : كود: vp.Fullscreen = false; هناك مشكلة ستواجهنا هنا وهي في حالة إذا كان تركيز لوحة المفاتيح على زر محدد فلن ينطلق حدث الضغط على النافذة , سينطلق الحدث على الزر المحدد فقط والشفرة السابقة على النافذه الأساسية ,,, الحل أن هناك صفة في النافذة تمكنها من إطلاق الحدث حتى ولو حصل في أي كائن من الكائنات هذه الخاصية هي KeyPreview عدلها من False إلى True لتصبح كما في الصورة ![]() الآن شغل البرنامج وجرب تشغيل ملف صوت أو فيديو او ملف نصي تلميحات الأدوات أحيانا تحتاج إلى إظهار ملا حظة بسيطة للمستخدم عن وظيفة زر في التطبيق مثلاً وتظهر هذا الملاحظات في مستطيل أصفر يظهر بمجرد مرور الماوس من فوق الزر مثلاً لو تمرر الماوس فوق زر Start في شريط المهام ستظهر هذه الملاحظة Click here to begin لعمل مثل هذه الملاحظات في تطبيقنا نحتاج لإضافة كائن جديد افتح التصميم واسحب كائن تلميحات الأدوات ToolTip ![]() الآن في أي كائن تختارة ستجد صفة جديدة إسمها ToolTip on toolTip1 أكتب فيها أي تلميح نصي للكائن : ![]() عند تشغيل البرنامج وتمرير الماوس من فوق الزر ستظهر الملاحظة هكذا: ![]() الواجب أرسل التطبيق. .نهاية الدرس الخامس. |
| |||
| الدرس السادس تشغيل ملفات الريل بلاير Playing RM Files سنستخدم في هذا الدرس الإجراءات كثيراً , ولمزيد من التوضيح عنها أرجع إلى الدرس الرابع تقنية rm تم تصميمها بواسطة شركة .Real Networks Inc حيث أن لهذه التقنية مزايا كثيرة من أهمها حجم الملفات الصغير الذي يتيح تداول الملفات عبر الوب بسهولة في الدروس السابقة تعاملنا مع ملفات الميديا بأي تقنية ما عدا هذه التقنية ولأن هذه التقنية تختلف تماماً عن التقنيات الأخرى خصصنا لها هذا الدرس. لتشغيل ملفات rm نحتاج لملفات dll تحتوي على دوال تشغيل rm الملفات موجودة للتحميل من هنا وهي من شركة Real تم تحويرة قليلاً ليتعامل مع بيئة الدوت نت في التطبيق سنجد إختلاف بين أوامر rm والأوامر الأخرى لأن شركة Real تحتكر هذه التقنية ولا تقبل بتوزيعها على الشركات الأخرى لذلك فميكروسوفت لا تدعم تشغيل ملفات rm فمثلاً كما رأينا في الدرس السابق فان أمر تشغيل ملف صوت أو فيديو عادي هو: كود: Play(); أما لتشغيل ملف rm فيكون الأمر هكذا كود: DoPlay(); هذه مقارنه بسيطة بين أوامر ميكروسوفت وأوامر Real كود: AVI----------------Real 1-FromFile---------SetSource 2-Play-------------DoPlay 3-Stop-------------DoStop 4-Pause------------DoPause 5-Duration---------GetLength 6-CurrentPosition----GetPosition/SetPosition الأمر الأول يستخدم لتحميل الملف الأمر رقم 2 يستخدم لتشغيل الملف الأمر 3 لإيقاف تشغيل الملف نهائياً الأمر 4 لإيقاف تشغيل الملف مؤقتاً الأمر 5 لإيجاد طول الملف بالثواني الأمر 6 لإيجاد مكان التشغيل , أي إيجاد الموقع في الملف الذي يتم تشغيله مثلاً إذا أنتجت الدالة 60 معنى ذلك أنه يتم الآن تشغيل الثانية رقم 60 من الملف في أوامر Real هناك أمرين أحدهما لقرائة الموقع والآخر لضبط الموقع أما في أوامر ميكروسوفت فالقراءة والضبط تستخدم نفس الأمر سنستخدم في هذا الدرس جميع الأوامر السابقة التطبيق إفتح تطبيق الدرس السابق أضف الملف AxInterop.RealAudioObjects.dll الذي قمت بتحميلة إلى المراجع References كما فعلنا في الدرس الرابع سنضيف في هذا التطبيق كائن عام جديد من نوع مشغل rm وليكون إسم هذا الكائن rp إختصار لـ Real Player سنقوم بتعريف هذا الكائن تحت تعريفات كائنات الصوت والصورة في الدرس السابق هكذا: كود: private AxRealAudioObjects.AxRealAudio rp=new AxRealAudioObjects.AxRealAudio(); لاحظ أن كود تعريف الكائن يختلف قليلاً عن تعريف كائنات ميكروسوفت بعد تعريف كائن مشغل rm أصبح لدينا ثلاثة كائنات رئيسية مشغل صوت و مشغل فيديو ومشغل rm وعند فتح ملف جديد سنبدأ بإختبار هل هو ملف فيديو ثم هل هو ملف صوت ثم هل هوملف rm وبالتالي سنستخدم جملة try ثلاث مرات متداخلة عند فتح الملف وعند تشغيل الملف وعند إيقاف تشغيل الملف أو عند تقديم أو تأخير المف .. وإذا أردنا أختصار الكود لنستخدم جملة try المتداخلة فقط عند فتح الملف سنستخدمها فقط عند فتح "تحميل الملف" ومنها سنعرف نوع المف , ونقوم بخزن نوع المف في متغير عام من نوع نص , وعند تشغيل الملف بدلاً من إستخدام try المتداخله كما فعلنا في الدرس السابق سنفحص نوع الملف من خلال المتغير من نوع نص الذي خزنا فيه نوع الملف عند الفتح دون إستخدام جملة try وذلك سيسهل كثيرا ويسرع عملية تشغيل الملف والتعامل معه إذاً سنعرف متغير عام من نوع نص لخزن نوع الملف وليكون إسمه type نعرف هذا المتغير تحت تعريفات كائن الصوت والفيديو و مشغل rm هكذا: كود: private string type; بحيث تصبح المتغيرات العامة هكذا : ![]() اذهب إلى التصميم أضف للنافذة الأساسية زرين زر للإيقاف و زر للإيقاف المؤقت إذهب إلى كرد البرنامج .. سنقوم بكتابة إجراء مستقل لتحميل ملف الميديا إلى أحد الكائنات الثلاثة إجراء تحميل الملف وهذه الإجراء سيكون مستقله لكي نستطيع إستخدامه في أكثر من مكان لنسمي هذه الإجراء LoadFile وستكون وظيفته إختبار نوع الملف ثم ضبط قيمة المتغير type ليحمل حرف يرمز إلى نوع الملف و ايضاً هذالإجراء ستقوم بتحميل الملف للكائن المناسب من الكائنات الثلاثة الأحرف التي سيحملها المتغير type هي A إذا كان ملف صوت و V إذا كان ملف فيديو وR إذا كان ملف rm أي أن الإجراء سيفحص نوع الملف فإذا كان ملف صوت سيحمل type الحرف A ويحمل الملف إلى كائن الصوت ap أما إذا كان فيديو فيحمل type الحرف V ويحمل الملف لكائن الفيديو vp أما إذا كان الملف rm فيحمل type الحرف R ويحمل الملف لكائن الريل rp فحص نوع الملف سيكون بنفس الطريقة في الدرس السابق ولكنا سنستخدم try ثلاث مرات متداخلة أنسخ هذا الكود إلى الشفرة وتأكد أن يكون هذا الكود خارج أي دالة أخرى: كود: void LoadFile(string Path){ StopFile(); ap=null;//تصفير الصوت vp=null;//تصفير الفيديو this.Controls.Add(rp);//تصفير الريل rp.Visible=false;//أخفاء مظهر الريل try { vp = Video.FromFile(Path); vp.Owner = this.p1; p1.Width = 400; p1.Height = 300; type="V"; } catch { try { ap = Audio.FromFile(Path); type="A"; } catch { try { rp.SetSource(Path); type="R"; } catch { MessageBox.Show("الرجاء إختيار ملف صالح"); type="N"; } } }} الكود السابق يمثل إجراء فحص الملف وتحملية إلى أحد الكائنات الإجراء هو جزء من الشفرة يمكن إستخدامه أكثر من مرة من خلال إستدعائه بإسمه فقط وبما أنه إجراء مستقلة يجب ان تكون خارج أي إجراء أخر: ![]() الإجراء يتكون من مدخل واحد Path من نوع نص ويمثل مسار الملف الذي سيتم تحميلة أي أننا عندما نستدعي الإجراء سنكتب إسمه ونعطيه مدخل من نوع نص مثلاً: كود: LoadFile("C://s.mp3"); الكود السابق سيقوم بإستدعاء الإجراء و الإجراء سيقوم بفحص وتحميل الملف s.mp3 الموجود في القرص c ملاحظة: في لغة السي شارب يعتبر حرف \ حرفاً غير مسموح به لذلك عند كتابة مسار الملف يتم إستبدالة بـ // في السطر الأول من الإجراء تعلمية StopFile وهي إستدعاء لإجراء أخر سنشرحه فيما بعد يقوم إجراء StopFile بإيقاف تشغيل أي ملف لكي يتم تحميل ملف جديد بدلاً منه وإذا لم نوقف تشغيل الملف السابق وقمنا بتحميل ملف آخر سيحدث تداخل في الملفات ويتم تشغيل أكثر من ملف في آن واحد في السطور 2 و3 و4 و5 كما هو مشروح في الكود يتم تصفير الكائنات ومعنى التصفير هو إلغاء تحميل الملفات السابقة لكي يتم تحميل ملفات جديدة بعدها جملة try الأولى تقوم بتحميل كائن الفيديو الملف المدخل من خلال المتغير Path فإذا تم التحميل بنجاح فإن التعليمة type="V" تقوم بتحميل الحرف V إلى المتغير type دلالة على أن نوع الملف هو فيديو , أما إذا حدث إي خطأ في التحميل فسوف يقفز المعالج إلى تنفيذ الكود باللون الأخظر ويتم فيها تحميل الملف لكائن الصوت فإذا تم التحميل بنجاح يتم تحميل المتغير type الحرف A دلالة على أن نوع الملف هو صوت , أما إذا حدث خطأ في التحميل فالمعالج سيقفز إلى تنفيذ الكود باللون الأحر ويتم فيه تحميل الملف إلى كائن rm "لاحظ الأختلاف في الأمر عن أوامر الصوت والفيديو" فإذا تم التحميل بنجاح يتم تحميل المتغير type الحرف R دلالة على أن نوع الملف هو ريل وإذا حدث خطأ في التحميل يقفز المعالج لتنفيذ الكود باللون البرتقالي حيث يظهر رسالة خطأ ويحمل المتغير الحرف N دلالة على أن نوع الملف غير معروف . إجراء تشغيل الملف سنقوم بكتابة إجراء مستقل أخر لتشغيل الملف , إجراء التشغيل سيكون أسهل بكثير من إجراء تحميل الملف لان لدينا نوع الملف مخزن في المتغير type ولن نقوم بفحص نوع الملف مرة أخرى حيث سنقوم بإستخدام تعليمة if لنعرف الحرف الموجود في type ومن خلالة نعرف نوع الملف فنشغل الكائن المطلوب لنسمي هذا الإجراء PlayFile ولن تكون لهذا الإجراء أي مدخلات أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر : كود: void PlayFile() { if(type=="V") { vp.Play(); } else if(type=="A") { ap.Play(); } else if(type=="R") { rp.DoPlay(); } } في المقارنة الأولى إذا كان المتغير يحمل الحرف V فهذا يعني أن نوع الملف هو فيديو كما في إجراء التحميل ولذلك سيتم تشغيل كائن الفيديو vp , إما إذا لم يكن V فينتقل المعالج للمقارنة الثانية وإلا للثالثة إجراء الإيقاف المؤقت في هذا الإجراء أيضاً سنستفيد من محتويات المتغير type لتحديد نوع الملف والتعامل مع الكائن المحدد أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر : كود: void PauseFile() { if (type=="V") { vp.Pause(); } else if (type=="A") { ap.Pause(); } else if (type=="R") { rp.DoPause(); } } لا أظن أنها تحتاج إلى شرح.. إجراء إيقاف التشغيل أنسخ هذا الكود إلى الشفرة وتأكد أن يكون خارج أي إجراء أخر: كود: void StopFile() { if (type=="V") { vp.Stop(); } else if (type=="A") { ap.Stop(); } else if (type=="R") { rp.DoStop(); } } هذا هو الإجراء الذي إستدعيناه في إجراء تحميل الملف لو قمت بتشغيل البرنامج الآن لن يتم تشغيل أي إجراء لأننا لم نستدعي أي منها إفتح التصميم وإضغط مزدوجاً على زر فتح ملف ميديا , إمسح الكود السابق وأكتب بدلاً عنه: كود: OF.ShowDialog(); LoadFile(OF.FileName); PlayFile(); في السطر الأول إستدعينا نافذة فتح الملف في السطر الثاني إستدعينا إجراء تحميل الملف و حملنا المدخل بناتج كائن فتح الملف أي أنه في شفرة إجراء التحميل ستكون قيمة المدخل Path هي قيمة OF.FileName بعد إستدعاء إجراء تحميل الملف استدعينا إجراء تشغيل الملف , أي أنه سيتم تشغيل الملف بمجرد إختياره إذهب إلى التصميم مجددا واضغط مزدوجاً على زر التشغيل, أمسح الكود السابق وأكتب بدلاً عنه: كود: PlayFile(); إستدعاء لإجراء التشغيل لا غير نلاحظ كيف أستدعينا إجراء التشغيل في زر فتح الملف وفي زر التشغيل اذهب للتصميم واضغط مزدوجاً على زر الإيقاف المؤقت وأكتب فيه هذا الكود: كود: PauseFile(); اذهب الي التصميم واضغط مزدوجاً على زر الإيقاف وأكتب هذا الكود: كود: StopFile(); نستطيع الآن أن نقول أن التطبيق يشغل جميع أنواع الملفات ملاحظة: عند أستيراد ملف دوال الريل بلاير AxInterop.RealAudioObjects.dll تقوم بيئة التطوير بإنشاء الملف الآخر كربط بين التطبيق والملف حيث يتكون الملف Interop.RealAudioObjects.dll بجانب التطبيق بمجرد تشغيل التطبيق من بيئة التطوير وهذا الملف ضروري لأنه يعمل كوسيط بين التطبيق وملف دوال الريل إذا لم تستطيع البيئة تكوين هذا الملف لسبب أو لآخر يجب ان يوضع بجانب التطبيق أي أن ملفات dll التي يحتاجها التطبيق أصبحت أربعة ملفات مع ملفات الدروس السابقة الواجب أرسل التطبيق.. .نهاية الدرس السادس. |
| |||
| الدرس السابع التنقل في الملف ملف الصوت أو الفيديو يحتوي على خاصية طول الملف أي أن كل ملف له طول زمني ويتم قياس الطول في مشغلات ميكروسوفت بالثانية , وفي مشغلات rm بالملي ثانية يتم إيجاد طول الملف من خلال الخاصية Duration في مشغلات ميكروسوفت أو الخاصية GetLength في مشغلات rm مثلا التعليمة التالية : كود: ap.Duration; ستنتج رقم يحدد طول الملف بالثواني مثلاُ إذا أنتجت رقم 100 يعني هذا أن طول الملف 100 ثانية أم التعليمة التالية: كود: rp.GetLength(); فهي تنتج رقم يحدد طول الملف بالملي ثانية مثلاً إذا أنتجت 50000 يعني أن طول الملف 50 ثانية إذاً هناك فرق كبير بين قيمة طول الملف في مشغلات ميكروسوفت ومشغلات rm من أهم الوظائف لأي مشغل ميديا هو إمكانية التنقل عبر الملف سوءاً تقديماً أو تأخيراً ويتم التنقل عبر الملف من خلال تعديل خاصية من خصائص كائن التشغيل الخاصية ترجع قيمة تحتوي على رقم يمثل موقع التشغيل الحالي مثلاً إذا أرجعت الخاصية الرقم 50 في مشغل ميكروسوفت فهذا يعني أن تشغيل الملف وصل إلى الثانية رقم 50 أما إذا أرجعت 40000 في مشغلات rm فهذا يعني أن تشغيل الملف وصل إلى الثانية رقم 40 الخاصية في مشغلات ميكروسوفت هي CurrentPosition سواءاً لقراءة القمية أو لتعديلها فمثلاً التعليمة التالية: كود: ap.CurrentPosition; ترجع رقم يمثل رقم الثانية الذي وصل إليها التشغيل , فمثلاً لو كان طول الملف 100 ثانية وأرجعت الرقم 50 فهذا يعني أن تشغيل الملف وصل إلى المنتصف أما التعليمة التالية: كود: ap.CurrentPosition=60; هذه التعليمة تقوم بنقل التشغيل إلى الثانية رقم 60 , أي أن التشغيل يقفز من موقعه إلى الثانية رقم 60 وفي مشغلات rm هي GetPosition لقراءة القمية أو SetPosition لتعديل القيمة فمثلاً التعليمة : كود: rp.GetPosition(); ترجع رقم يمثل رقم الملي ثانية الذي وصل إليها التشغيل فمثلاُ إذا كان طول الملف 10000 ملي ثانية وأرجعت الرقم 5000 فهذا يعني أن التشغيل وصل إلى الثانية رقم 5 اي إلى منتصف الملف أما التعليمة التالية: كود: rp.SetPosition(60000); هذه التعليمة تقوم بنقل التشغيل إلى الثانية رقم 60 , لاحظ أن جميع تعاملات مشغل rm تكون بالملي ثانية وليست بالثانية كما في مشغلات ميكروسوفت , والثانية الواحد = 1000 ملي ثانية إذاً التنقل عبر الملف يتم من خلال تعديل خاصية موقع التشغيل الموقت Timer المؤقت هو عبارة عن كائن لضبط الوقت , ويستخدم لتكرار حدث معين خلال فترة زمنية محددة مثلاً إظهار رسالة كل 50 ثانية , أو تنفيذ كود معين كل 10 ثوان ![]() يتم تحديد طول الفترة الزمنية من خلال تعديل الخاصية "الصفة" Interval حيث أن هذه الخاصية تأخذ الزمن بالملي ثانية أي أنه إذا أردنا أن تكون الفتره ثانية واحدة فإن الخاصية Interval يجب ان تكون قيمتها 1000 , وإذا أردنا ثانيتين تكون 2000 ويتم كتابة الكود المراد تنفيذه من خلال الضغط مزدوجاً على المؤقت في هذا الدرس سنستخدم الموقت ليفحص موقع تشغيل الملف كل ثانية التطبيق إفتح تطبيق الدرس السابق , وأضف زرين للتقديم والتأخير أضف مؤقت Timer , ستلاحظ انه سيضاف إلى الشريط الأصفر تحت نافذة التصميم ![]() إختر المؤقت وقم بتعديل خاصية Interval إلى 1000 ,"ثانية واحدة" وعدل قيمة الخاصية Enabled إلى True , هذه الخاصية تقوم بتشغيل أو تعطيل عمل الموقت فإذا كانت القمية True فالمؤقت مفعل , أما إذا كانت False فهو معطل ولن يعمل ![]() أضف كائن التنقل TrackBar ليستخدم كأداة تنقل عبر الملف ![]() إختر كائن التنقل و عدل الخاصية TickFrequency إلى 0 لكي تختفي خطول القياس وعدل الخاصية TickStyle إلى Both إذا أردت ![]() كائن التنقل يرجع قيمة بين الخاصيتين Minimum و Maximum فمثلاً إذا كان Minimum = 0 و Maximum=50 فإن الخاصية Value سترجع قيمة بين 0 و 50 تمثل مكان المؤشر بالنسبة للكائن فمثلاً إذا كان المؤشر في منتصف الكائن فإن Value سترجع الرقم 25 وبما اننا نحتاج للتنقل عبر الملف فالمفروض أن نعدل الخاصية Minimum إلى 0 ونعدل الخاصية Maximum إلى طول الملف حتى ترجع القمية Value رقم بين 0 وطول الملف وبما أن طول كل ملف يختلف عن الملف الآخر , فإننا سنعدل الخاصية Maximum عند تحميل أي ملف ولن نحتاج لتعديل الخاصية Minimum لأن قيمتها الإفتراضية هي 0 سيصبح شكل النافذه هكذا: ![]() إجراء ضبط كائن التنقل إنقل هذا الكود إلى شفرة البرنامج مع مراعات أن يكون خارج أي إجراء آخر كود: void SetTrackBar() { if (type=="V") { trackBar1.Maximum=Convert.ToInt32(vp.Duration); } else if (type=="A") { trackBar1.Maximum=Convert.ToInt32(ap.Duration); } else if (type=="R") { trackBar1.Maximum=Convert.ToInt32(rp.GetLength()); }} إسم الإجراء هو SetTrackBar ونقوم فيه بفحص نوع الملف كما شرحنا في الدرس السابق فإذا كان نوع الملف صوت أو فيديو فإنا نأخذ طول الملف عبر الخاصية Duration ثم نحول الرقم إلى عدد صحيح عبر كائن التحويل Convert.ToInt32 والرقم الناتج نحملة لخاصية Maximum في كائن التنقل , وبهذا مهما تنقلنا في الكائن فأن القيمة الناتجة ستكون بين 0 و طول الملف إما إذا كان نوع الملف rm فإنا نأخذ طول الملف عبر الخاصية GetLength ونحول الرقم إلى عدد صحيح ونحمله للخاصية Maximum ذلك هو إجراء ضبط القيمة العظمى لكائن التنقل ,لكن أين نستدعي هذا الإجراء ؟؟؟ أفضل مكان لإستدعاء هذا الإجراء هو بعد تحميل الملف أي بعد إستدعاء إجراء التحميل LoadFile إفتح كود زر فتح الملف وأضف تعليمة الإستدعاء بعد تعليمة إستدعاء إجراء تحميل الملف: كود: OF.ShowDialog(); LoadFile(OF.FileName); SetTrackBar(); PlayFile(); اللون الأزرق يمثل الزيادة التي أضفناها إلى الشفرة. بعد أن قمنا بضبط القمية العظمى لكائن التنقل نحتاج لكود التنقل عبر الملف إي أننا نحتاج لكود يقوم بالتنقل عبر الملف بمجرد تغيير مؤشر كائن التنقل إضغط مزدوجا على كائن التنقل لتنتقل إلى الكود الذي يتنفذ بمجرد تغيير المؤشر TrackBar1Scroll إنسخ الكود التالي : كود: if (type=="V") { vp.CurrentPosition=trackBar1.Value; } else if (type=="A") { ap.CurrentPosition=trackBar1.Value; } else if (type=="R") { rp.SetPosition(trackBar1.Value);} عند تغيير مؤشر كائن التغيير سيقوم المعالج بتنفيذ الكود السابق trackBar1.Value ترجع رقم بين 0 و طول الملف على حسب موقع المؤشر حيث نقوم بفحص نوع الملف فإذا كان فيديو أو صوت نعدل موقع التشغيل عبر الخاصية CurrenPosition أما إذا كان rm فنعدل موقع التشغيل عبر الخاصية SetPosition. الآن نحتاج إلى كود لتحريك مؤشر كائن التنقل ليحدد الموقع الذي وصل إليه التشغيل لعمل ذلك نحتاج لإستخدام المؤقت حيث نقوم كل ثانية بفحص موقع التشغيل ونعدل موقع المؤشر إضغط مزدوجاً على كائن المؤقت لتنتقل إلى الكود الذي ينفذ كل ثانية وأنسخ الكود التالي : كود: if (type=="V") { trackBar1.Value=Convert.ToInt32(vp.CurrentPosition ); } else if (type=="A") { trackBar1.Value= Convert.ToInt32(ap.CurrentPosition); } else if (type=="R") { trackBar1.Value=Convert.ToInt32(rp.GetPosition()); } الكود السابق سينفذ كل ثانية لإننا حددنا خاصية Interval في المؤقت إلى 1000 يقم الكود السابق بفحص نوع الملف فإذا كان صوت أو فيديو نقوم بأخذ موقع التشغيل الحالي عبر الخاصية CurrentPosition ونحولها إلى عدد صحيح ونحمل الرقم الناتج إلى الخاصية Value حيث أن الخاصية Value تمثل موقع مؤشر كائن التنقل . وإذا كان الملف rm نأخذ طول الملف عبر الخاصية GetPosition ونحولها إلى عدد صحيح ونحملها في خاصية موقع المؤشر Value الكود السابق يقوم بتغيير موقع مؤشر كائن التنقل على حسب موقع التشغيل الذي وصل إليه الملف. بقي لنا كود زري التقديم والتأخير .. إضغط مزدوجاً على زر التقديم وأنقل الكود التالي : كود: if (type=="V") { vp.CurrentPosition=vp.CurrentPosition+20; } else if (type=="A") { ap.CurrentPosition=ap.CurrentPosition+20; } else if (type=="R") { rp.SetPosition(rp.GetPosition()+20000); } في الكود السايق نقوم بتعديل موقع التشغيل ليكون موقع التشغيل الحالي + 20 ثانية أي أننا إذا ضغطنا على زر التقديم فان التشغيل سيقفز 20 ثانية إلى الأمام يمكن وضع عدد أكبر من العشرين ثانية إذا أردت أو أصغر .. لاحظ أنه إذا كان نوع الملف rm فإننا إضفنا إلى الموقع الحالي 20000 لأن مشغل rm يتعامل بالملي ثانية شغل البرنامج وإفتح ملف ميديا وجرب تحريك مؤشر كائن التنقل. الواجب * أكتب كود زر التأخير .. * قد يحدث خطأ في زري التقديم والتأخير إذا تم التأخير لأقل من صفر أو التقديم لأكثر من طول الملف لذلك يجب وضع كود الزرين داخل جملة try هكذا: كود: try{//كود التقديم أو التأخير}catch{} عند حدوث خطأ لن يتم تنفيذ أي شيئ. * أرسل التطبيق. ملاحظات: * تأكد من إتجاه مؤشر كائن التنقل من خلال الخاصية RightToLeft. * لجعل خلفية الزر شفافة عدل خاصية FlatStyle إلى Popup و خاصية BackColor إلى Transparent ![]() * يمكن تغيير الصور في الأزرار بواسطة الخاصية Image. * يمكن تعديل لون خلفية الكائن الحاضن للفيديو إلى شفاف لتصبح كما في الصورة . ![]() * للأسف ليست كل الكائنات تدعم الخلفية الشفافة , فكائن التنقل مثلاً لا يدعمها .. ملاحظة لمستخدمي بيئة Sharp Developer: إحياناً عند الضغط المزدوج على المؤقت يحصل خطأ وتغلق بيئة التطوير ولكتابة كود المؤقت إذا حدث هذا الخطأ دون الضغط مزدوجاً على المؤقت: افتح شفرة التصميم من خلال فتح مستعرض الملفات ثم فتح MainForm.Designer.cs و ابحث عن كود تعريف المؤقت وأضف بعده هذا السطر: كود: this.timer1.Tick+=new System.EventHandler(this.Timer1Tick); كما في الصورة : ![]() ثم إفتح شفرة البرنامج عند الإجراءات من خلال إختيار MainForm.cs وأضف هذا الإجراء وتأكد أنه خارج أي إجراء: كود: void Timer1Tick(object sender, System.EventArgs e) { if (type=="V") { trackBar1.Value=Convert.ToInt32(vp.CurrentPosition ); } else if (type=="A") { trackBar1.Value= Convert.ToInt32(ap.CurrentPosition); } else if (type=="R") { trackBar1.Value=Convert.ToInt32(rp.GetPosition()); } } .نهاية الدرس السابع. |
| |||
| الدرس الثامن المصفوفات: المصفوفات هي عبارة عن مجموعة متغيرات من نفس النوع متراصة ومترابطة داخل كائن Array ويتم الوصول لأي عنصر في هذه المجموعة من خلال ترتيبة في المجموعة Index مثلاً : مصفوفة أيام الأسبوع تعتبر مجموعة متغيرات من نوع نص و مصفوفة أيام الشهر تعتبر مجموعة متغيرات من نوع رقم .. يتم تعريف المصفوفة بإحدى ثلاث طرق : 1-طريقة تعريف إسم المصفوفة فقط التعريف بهذه الطريقة نادراً ما يستخدم , ويحدد فقط إسم لكائن المصفوفة بدون أن يقوم بإنشاءة: كود: string[] days; الكود السابق يعرف إسم days لمصفوفة عناصرها من نوع نص لاحظ القوسين المربعين بعد كلة string دلالة على أن days تمثل مصفوفة نصوص وليس نص 2-طريقة تعريف المصفوفة وتحديد عدد عناصرها طريقة التعريف هذه تعرف و تنشئ كائن مصفوفة وتحدد عدد عناصر هذه المصفوفة: كود: string[] days= new string[7]; لأن المصفوفة هي كائن وجب علينا تعريفه بإستخدام عبارة new والرقم 7 بين قوسي تعريف الكائن هو عدد عناصر المصفوفة أي أن الكود السابق عرف مصفوفة إسمها days تحتوي على 7 عناصر من نوع نص لكن هذه الطريقة لا تحمل قيم لعناصرها , أي أنها تحتوي على 7 نصوص فارغة 3-طريقة تعريف المصفوفة وتحميل قيم لعناصرها هذه الطريقة تعرف وتنشئ كائن المصفوفة وتحمل قيم لجميع عناصر المصفوفة: كود: string[] days= new string[]{"السبت","الأحد","الإثنين","الثلاثاء","الأربعاء"," الخميس","الجمعة"}; في الكود السابق قمنا بتعريف كائن المصفوفة وقمنا بتحميل القيم لجميع عناصره بإدخالها كمجموعة نصوص بين حاصرتين تفصل بين كل نص وآخر علامة , لاحظ أنا لم نحدد عدد عناصر المصفوفة حيث سيقوم المعالج بتحديدها آلياً من خلال عد النصوص المدخلة بين الحاصرتين ملاحظة : العناصر المدخلة بين حاصرتين يجب أن تكون من نفس نوع عناصر المصفوفة الوصول إلى عناصر المصفوفة: كما قلنا سابقاً يتم الوصول إلى عناصر المصفوفة من خلال ترتيب العنصر المراد الوصول إليه والترتيب في المصفوفات يبدأ من الصفر , أي أن أول عنصر في المصفوفة ترتيبة صفر فمثلاً في مصفوفة الأيام , يوم السبت ترتيبة صفر و الأحد ترتيبة 1 ... والجمعة ترتيبة 6 ويتم الوصول إلى العنصر المحدد بكتابة إسم المصفوفة الموجود بها متبوعا بقوسين مربعين بينهما ترتيب العنصر ماذا لو أردنا إظهار رسالة تخبرنا بالعنصر الذي ترتيبة 4 في مصفوفة الأيام : كود: string[] days= new string[]{"السبت","الأحد","الإثنين","الثلاثاء","الأربعاء"," الخميس","الجمعة"};MessageBox.Show(days[4]); لاحظ كيف تم الوصول إلى العنصر الرابع في مصفوفة days من خلال العبارة days[4] الكود السابق ينتج هذه الرسالة : ![]() يمكن أيضاً تعديل أي عنصر من عناصر المصفوفة من خلال ترتيبة في المصفوفة : كود: string[] days= new string[]{"السبت","الأحد","الإثنين","الثلاثاء","الأربعاء"," الخميس","الجمعة"};days[4]="الأربعاء بعد التعديل";MessageBox.Show(days[4]); في السطر الثاني غيرنا قيمة العنصر الذي ترتيبة 4 إلى "الأربعاء بعد التعديل" الكود السابق ينتج الرسالة التالية : ![]() القوائم مع أن المصفوفات تعتبر من أهم هياكل البيانات التي استخدمت في لغات البرمجه منذ نشأتها إلا أن لها عدداً من العيوب التي سعت C#2005 لحلها من خلال إدخال نوع جديد من هياكل البيانات اهم العيوب هو حجم المصفوفة الثابت , فعند تعريف مصفوفة وإسناد قيم لها أو تعريف حجمها لن تستطيع أن تزيد من حجمها أو تنقص منه , وأيضاً لا توجد طريقة فعالة للبحث بين العناصر مثلاً في مصفوفة أيام الأسبوع لا يوجد طريقة للبحث عن يوم السبت مثلاً إلى باستخدام دوارة تمر بجميع عناصر المصفوفة: كود: for(int i=0;i<days.Lehgth;i++){if (days[i]=="السبت"){MessageBox.Show("هذا يوم السبت");}} هيكل البيانات الجديد الذي تفادى عيوب المصفوفات هو القائمة حيث يتم تعريف القائمة وتعريف أنواع عناصرها هكذا: كود: List<string> dayslist; ولأن القائمة كائن وليست متغير , فيجب إستخدام عبارة new ليصبح التعريف الصحيح هكذا: كود: List<string> dayslist=new List<string>(); لاحظ أننا لم نحدد لها حجم أو عدد لعناصر لأن حجمها متغير , حيث تستطيع أن تضيف لها عنصر هذا: كود: dayslist.Add("السبت"); كما أنك تستطيع أن تضيف لها عناصر مصفوفة كاملة: كود: dayslist.AddRange(days); الكود السابق يضيف عناصر المصفوفة days إلى القائمة dayslist وتستطيع أن تحذف منها عنصر هكذا : كود: dayslist[5].Remove(); الكود السابق يحذف العنصر الذي ترتيبة 5 من القائمة كما أنك تستطيع البحث عن عنصر ما هكذا : كود: dayslist.Contains("السبت"); الدالة السابقة سترجع القيمة true إذا كان العنصر موجود في القائمة أو ترجع القيمة false إذا لم يوجد العنصر في القائمة مما سبق نستنتج أن القائمة أفضل بكثير وأسهل في الإستخدام من المصفوفة وهذا ما سنستخدمه في تطبيقنا التطبيق: تشغيل أكثر من ملف سنضيف خاصية جديدة للبرنامج وهي فتح أكثر من ملف وإضافتها إلى قائمة التشغيل حيث سنستخدم قائمة عناصرها من نوع نص لتخزين مسارات الملفات في قائمة التشغيل إفتح تطبيق الدرس السابق , ومن صندوق الأدوات قم بسحب أداة القائمة : ![]() من خلال الخاصية (Name) في جدول الخصائص قم بتغيير إسم القائمة من ListBox1 إلى pl ليسهل التعامل معها من الشفرة , هذه هي قائمة التشغيل قم بإعادة ترتيب الأدوات في النافذة حتى يصبح شكلها هكذا : ![]() قم بتحديد إداة OF في الشريط الأصفر تحت النافذة: ![]() وإذهب إلى جدول الخصائص وقم بتغيير خاصية Multiselect إلى True ![]() عند إسناد قيمة True إلى هذه الخاصية فإنها تسمح لأداة إختيار الملفات بإختيار أكثر من ملف واحد كل مرة: ![]() الآن سنعرف متغير عام من نوع قائمة عناصرها نصوص لخزن مسارات الملفات المختارة بأداة إختيار الملفات كائن القائمة موجود في فضاء الأسماء System.Collections.Generic لذلك يجب إضافة عبارة using لتضمين كائنات ودوال الفضاء إذهب إلى شفرة النافذة وأضف عبارة using التالية تحت عبارات using الموجوده في رأس الصفحة : كود: using System.Collections.Generic; إذهب إلى شفرة البرنامج وقم بكتابة الكود التالي تحت كود تعريف كائنات Audio و Vedio و type : كود: public List<string> albume=new List<string>(); ![]() تحميل قيم القائمة أداة إختيار الملفات OF تحتوي على خاصية إستخدمناها في الدروس السابقة وهي خاصية FileName , وهذه الخاصية تحمل قيمة من نوع نص للملف الذي قام المستخدم بإختياره لكن ماذا لو إختيار المستخدم أكثر من ملف واحد ؟ لحسن الحظ يوجد خاصية أخرى إسمها FileNames "بزيادة حرف s عن الخاصية الأخرى" والخاصية FileNames تحمل مصفوفة جميع الملفات الذي قام المستخدم بإختيارها وعناصر المصفوفة من نوع نص لخزن مسارات الملفات المختارة فمثلاً لو إختار المستخدم 3 ملفات سيكون عدد عناصر هذه المصفوفة 3 إذهب إلى التصميم وإضغط مزدوجاً على زر فتح ملف ستجد الكود التالي : كود: OF.ShowDialog(); LoadFile(OF.FileName); SetTrackBar(); PlayFile(); وغيره إلى الكود إلى التالي : كود: OF.ShowDialog();albume.AddRange(OF.FileNames); LoadFile(albume[0]);FillList(); SetTrackBar(); PlayFile(); في السطر الثاني قمنا بتحميل جميع عناصر المصفوفة OF.FileNames إلى القائمة albume والمصفوفة OF.FileNames كما شرحنا سابقاً تحتوي على عناصر تحمل مسارات الملفات المختارة وقمنا بإضافة عناصرها إلى القائمة albume والتي سنستخدمها في أنحاء البرنامج في السطر الثالث قمنا بتحميل العنصر الذي ترتيبة صفر من قائمة albume حتى يتم تشغيله وفي السطر الرابع إستدعينا إجراء FillList الذي يقوم بملئ قائمة التشغيل بأسماء الملفات في عناصر القائمة albume كما سنشرح في الفقرة التالية إجراء FillList هذا الإجراء سيقوم بنقل جميع عناصر القائمة albume إلى قائمة التشغيل حتى يسهل الوصول للمقطع الصوتي المراد تشغيلة , لكن , القائمة albume تحتوي على مسارات الملفات كاملة , وقائمة التشغيل لا تتسع لكتابة مسار الملف كاملاً نريد فقط أسماء الملفات في قائمة التشغيل لحسن الحظ يوجد كائن في إطار العمل داخل الفضاء System.IO يقوم بهذا العمل الكائن Path يحتوي على دالة GetFileName تقوم بأخذ مسار الملف كاملاً وتنتج لنا إسم الملف فقط إذا كان مسار الملف هو : كود: c:\sounds\s1\track.mp3 فالدالة GetFileName تأخذ المسار كامل وترجع القيمة التالية : كود: track.mp3 يتم إستدعاء الكائن Path من خلال كتابة عنوناه الكامل : كود: string FileName; FileName=System.IO.Path.GetFileName("c://sounds//s1//track.mp3"); MessageBox.Show(FileName); في السطر الأول عرفنا متغير من نوع نص ليحمل نتيجة الدالة GetFileName في السطر الثاني قمنا بإستدعاء الدالة GetFileName من خلال كتابة عنوانها كاملاً وأسندنا ناتج الدالة للمتغير FileName السطر الثالث سينتج رسالة مكتوب عليها : track.mp3 بعد أن شرحنا عمل الدالة GetFileName سنحتاج في هذا الإجراء أيضاً لدوارة تقوم بالمرور على كافة عناصر القائمة albume يمكنك الرجوع للدرس الثالث ومراجعة الدوارات تبدأ الدوارة من 0 إلى عدد عناصر القائمة , حيث يمكن معرفة عدد عناصر القائمة من خلال الخاصية Count : كود: albume.Count; إفتح شفرة البرنامج , وأنسخ الكود التالي وتأكد أن يكون خارج أي إجراء آخر : كود: void FillList() {pl.Items.Clear(); for(int i=0;i<albume.Count;i++) { string FileName; FileName=System.IO.Path.GetFileName(albume[i]); pl.Items.Add(FileName); } } الأمر pl.Items.Clear يقوم بتنظيف القائمة من أي عناصر موجوده مسبقاً حتى تستعد لإدخال العناصر الجديدة الكود داخل حاصرتي for سيتم تنفيذه بعدد عناصر القائمة albume في السطر الأول من الكود داخل حاصرتي for , قمنا بتعريف الكائن الذي سيحمل نتيجة الدالة GetFileName وفي السطر الثاني إستدعينا الدالة GetFileName ومررنا لها العنصر الذي ترتيبة i من قائمة albume طبعاً في أول مرة يتم تنفيذ الكود سيكون i يساوي صفر , والمرة الثانية 1 والثالثة 2 وهكذا فإن قيمة i متغيرة من مرة لأخرى في السطر الثالث أضفنا إسم المكلف الناتج إلى قائمة التشغيل pl .. عند تشغيل البرنامج حالياً وإختيار عدة ملفات ستنتقل جميع أسماء الملفات إلى قائمة التشغيل ويبدأ البرنامج بتشغيل أول ملف في القائمة : ![]() إختيار الملف من قائمة التشغيل إذهب إلى التصميم , وأنقر مزدوجاً على قائمة التشغيل , ستنتقل إلى شفرة البرنامج أنسخ الكود التالي حيث مؤشر الفارة " بين حاصرتي إجراء plSelectedIndexChanged كود: StopFile(); LoadFile(albume[pl.SelectedIndex]); SetTrackBar(); PlayFile(); حيث يتم تنفيذ الكود السابق كل مرة تقوم بها بإختيار عنصر من قائمة التشغيل. عند إختيار عنصر من قائمة التشغيل , فإن السطر الأول يقوم بإيقاف تشغيل الملف الحالي والسطر الثاني يأخذ ترتيب العنصر المختار من قائمة التشغيل من خلال الخاصيةSelectedIndex ويقوم بتحميل الملف من قائمة albume الذي ترتيبة هو نفس ترتيب العنصر المختار في قائمة التشغيل السطر الثالث والرابع تم شرحهما سابقاً .. الآن قم بتشغيل البرنامج وإختر أكثر من ملف , سيتم نقل إسماء الملفات لقائمة التشغيل ثم تشغيل أول ملف في القائمة , وعند إختيار ملف آخر من قائمة التشغيل سيتوقف تشغيل الملف الحالي ويبدأ تشغيل الملف المختار خطأ شائع: أحيانا يقم المؤقت بتغيير قيمة شريك التنقل قبل أن يتم تحميل الملف وهذا يسبب خطأ لأن قيم شريط التنقل الكبرى والصغرى لم يتم ضبتها بعد ولا يجوز تغيير قيمة شريك التنقل قبل ضبط قيمه الصغرى والكبرى لمعالجة الخطأ إذهب إلى شفرة إجراء المؤقت Timer1Tick : كود: void Timer1Tick(object sender, System.EventArgs e) { if (type=="V") { trackBar1.Value=Convert.ToInt32(vp.CurrentPosition ); } else if (type=="A") { trackBar1.Value= Convert.ToInt32(ap.CurrentPosition); } else if (type=="R") { trackBar1.Value=Convert.ToInt32(rp.GetPosition()); } } وأضف إلى بدايتها الكود التالي: كود: if (trackBar1.Maximum == 0) { SetTrackBar(); } وهذا الكود يفحص ما إذا كانت قيمة شريط التنقل الكبرى قد تم ضبطها فإن كانت قيمتها 0 يعني أنه لم يتم ضبطها بعد وبالتالي يستدعي إجراء ضبطها مرة أخرى حيث يصبح شكل الإجراء هكذا بعد وضعه داخل عبارة try لتفادي الأخطاء الأخرى : كود: void Timer1Tick(object sender, System.EventArgs e) { try { if (trackBar1.Maximum == 0) { SetTrackBar(); } if (type=="V") { trackBar1.Value=Convert.ToInt32(vp.CurrentPosition ); } else if (type=="A") { trackBar1.Value= Convert.ToInt32(ap.CurrentPosition); } else if (type=="R") { trackBar1.Value=Convert.ToInt32(rp.GetPosition()); } } catch { } } الواجب أرسل التطبيق. .نهاية الدرس الثامن. |
![]() |
| مواقع النشر (المفضلة) |
| أدوات الموضوع | |
| انواع عرض الموضوع | |
|
|
اضغط هنا وادخل ايميلك حتى يصلك جديدنا
| | | | | | |
| | | | | | |
| | | | |
اعلانات نصيه |
| دروس تصميم دوت نت |
| شبكة ابو الوليد |
![]() | ![]() | ![]() |
القسم العام - اخبار التقنيه - العاب كمبيوتر - برامج - دروس التصميم - مسجات - برامج و العاب جوال - لغات برمجه - تطوير منتديات - جوجل google - قوالب واستايلات - SEO و XML و RSS - هاكات - تطوير مواقع - نطاقات - استضافه - تبادل اعلانى - دروس فوتوشوب - ملحقات فوتوشوب - فلاش - سويش ماكس - تصميم استايلات - العاب - مواقع عالميه - دروس فرونت بيج - دريم ويفر
منتدى بناتى