بسم الله الرحمن الرحيم ,, الحمد لله ,, والصلاة والسلام على رسول الله
قبل البدء أتمنى عدم تغيير العنوان مع أني رغبت في كتابة توضيح لمحتوى الدرس في العنوان ولكن لم تكن هناك مساحة كافية لذلك.
يعتبر هذا الدرس مجموع لعدة دروس صغيرة مترابطة ببعضها تم دمجها في درس واحد وسأركز في هذا الدرس على المفاهيم وأما التفاصيل فيمكنك الرجوع فيها إلى المشروع المرفق الذي أنصح بإلقاء لمحة عليه قبل قراءة الدرس. ومن خلال عنوان الدرس نستشف أن المقصود منه هو جعل النموذج يحاور المستخدم أثناء إنتظاره لاكتمال عملية معينة بإخباره عما يفعله وأين وصل تقدم العملية.
ملخص المشروع:
يستخدم الدرس مايلي: Timer, Progress Bar, Percentage, DoEvent
النموذج الأول: التعامل مع الزمن حيث تظهر رسالة لمدة 10 ثواني تتناقص على الفورم بعد ذلك يظهر زري اختيار
النموذج الثالث : يفتح نموذج عليه قائمة منسدلة تعبأ بThread ويظهر في الأسفل Progres Bar
النموذج الثاني والرابع: يفتح نموذج2 عليه 3 قوائم منسدلة تعبأ بدون Thread ولكن يفتح نموذج رابع عليه نصوص وأدوات تبين موضع التعبأة الحالي للقوائم
الشرح:
**** أداة الزمن Timer: ****
أول أداة ستلا حظها في المثال المرفق هي أداة الزمن Timer وقد طلب مني مرة أن أعمل برنامجا يقوم بسحب آخر تحديث للبيانات الموجودة على سيرفر الشركة في بداية كل ساعة وترحيلها إلى الموقع على الإنترنت بشكل تلقائي, وتم ذلك بوضع ساعة على الفورم يتم تحديثا كل ثانية مع مقارنة الوقت لفحص وصول الوقت في رأس أي ساعة ليتم بدئ السحب والترحيل. ولعمل ساعة على النموذج: أضف ليبل ثم أضف Timer Control على النموذج واذهب إلى خصائص الTimer وضع 1000 في خاصية الInterval والمقصود بها الفترة التي يتم فعل شيئ بعدها وهنا وضعنا 1000 ملي سكند وتعادل ثانية واحدة. إضغط مرتين على Timer Control ليظهر
حدث Tick واكتب الكود التالي:
Label1.Text = Now
حيث أن الدالة Now تعيد لنا الوقت والتاريخ وقد أسندنا القيمة إلى Label1
الآن في حدث التحميل للفورم ضع:
Timer2.Start()
هذا الكود يأمر المؤقت بالبدئ
**** أداة تقدم العمليات ProgressBar: ****
في المثال المرفق في نموذج3 يوجد عليه Progress Bar Control أيضا هذا النموذج مستخدم فيه تقنية Threading التي تم شرحها في الدرس الثاني ويمكنك الرجوع إليه وستلاحظ أن مؤشر تقدم العمليات يتحرك بينما يتم ملئ قائمة الأرقام ففي هذا النموذج سمحنا للمستخدم البدئ بالعمل مباشرة بفضل Threading وفي نفس الوقت بإمكان المستخدم معرفة متى بالضبط سينتهي تحميل البيانات بفضل Progress Bar.
إذهب إلى كود النموذج2 ثم إلى البروسيجر FillComboBox1 سترى ثلاثة معاملات
1- pBar1.PerformStep() : تقدم خطوة للأمام
2- pBar1.Maximum عدد الخطوات الذي سيحذوها المؤشر والتي يجب أن تساوي عدد مرات
أستدعاء pBar1.PerformStep وفي المثال القيمة تساوي 100000 وهي عدد مرات تكرار Do While حيث كل دورة تعتبر خطوة
3- pBar1.Step حجم خطوة تقدم المؤشر وتساوي واحد
أيضا تم استخدام الProgressBar في النموذج الرابع وتم التحكم فيه من خلال النموذج الثاني وعدد الخطوات 3 فقط لذلك يمكنك فهم هذه الأداة بسهولة من خلال هذا المثال.
**** البروسيجر DoEvent والنسبة Persentage: ****
هذا الأمر يتيح للمعالج قطع تنفيذ العملية الحالية والذهاب لإنجاز عملية واحدة في الإنتظار ثم العودة لإكمال العملية الحالية. ومما اضرني لاستخدام هذه الأداة المهمة في مرة من المرات أردت أن أحول بيانات الشركة التي أعمل بها من آكسس إلى SQLServer وكان حجم البيانات يزيد عن 2 جيجا مقسمة في مآت من الجداول. اضررت إلى تقسيم بعض الجداول الضخمة إلى عدة جداول صغيرة وتوزيع بياناتها فيها مما اضطرني إلى عمل الكثير من المفاتيح الفرعية وقد استغرق ملئ هذه الجداول الكثير من الوقت بسبب البحث الطويل الذي نتج من تقسم تلك الجداول الكبيرة وقد وصل أحيانا الوقت المستغرق في البحث وتوزيع البيانات إلى أكثر من عشرين ساعة. طبعا خلال هذا الوقت الطويل أحسست أني أريد أن أرعف أين وصلت العملية وكم باقي من الزمن لانتهائها وهل مازالت تعمل أم أن الجهاز قد حصل له Hang Up.
النموذج2 يحتوي على المفهوم السابق. حيث Application.DoEvents() ستلاحظ أنها تستخدم دائما بعد طلب إنجاز عملية خارج العملية الحالية (هنا سينتقل العمل من النموذج2 إلى النموذج4) من تغيير التوضيح الموجود على النموذج4. أما بالنسبة للPersentage فهناك متغير إسمه Parts نخزن فيه مجموع عدد العمليات قسمة 100 وقسمنا على 100 لأن تغير النسبة سيتم 100 مرة (من 1 إلى 100) وفي مثالنا 100000/100=1000. الآن سنستخدم هذا الناتج (Parts =1000) بأن نأخذ باقي قسمته على متغير ما (المتغير في المثال هو i) يبدأ من واحد إلى عدد العمليات (في المثال عدد العمليات=100000) كالتالي If i Mod Parts = 0 Then هذا الشرط سيتحقق بالتأكيد 100 مرة فقط لأن ال100000 تحتوي على 100*1000 ولن يكون باقي القسمة صفر إلا إذا كانت قيمة i من مضاعفات 1000.
متمنيا من العلي القدير أن يفيد المسلمين بما تقدم.
