الدرس التاسع نبذة عن الموقت
في هذا الدرس نقوم بتعلم طريقة استخدام الوقت
وتعتبر هذه الخاصية مهمة جدا في الكثير ن البرامج المستخدمة
أولا لتحميل ملف التنفيذ الرجاء الضغط على الرابط التالي
أما الآن مع سطور البرمجة
// كتابة الحزم الإفتراضية
using System;//لاستخدام الأوامر الخاصة بالنظام
using System.Timers;//وهذه الحزمة خاصة بالوقت والمنبه وهذه أول مرة نستخدمها في هذه الدروس
using System.Drawing;//خاص بالطباعة على الشاشة
using System.Windows.Forms;//خاص بعناصر الويندوز كالقوائم ومربع التحرير
/********************
إطار Constants
وهو خاص بكتابة الثوابت
وهذا إطار أنشأناه لتسهيل كتابة الثوابت والأوامر
********************/
static class Constants
{
public const String ApplicationName = "حساب الوقت"; // اسم البرنامج
public const int TimeUp = 3600 *10; // تعيين الزمن الأقصى الذي يمكن حسابه والقيمة المستخدمة بالثانية أي ساعة في 10
public const String TextBoxFontName = "MS Gothic"; // نوع حرف مربع التحرير
public const int TextBoxFontSize = 31; // حجم حرف مربع التحرير
public const int TextBoxMaxLength = 10; // عدد ما يمكن إدخاله في مربع التحرير
public const int TextBoxWidth = 300; // عرض مربع التحرير
public const int TextBoxHeight = 50; // إرتفاع مربع التحرير
public const String TextBoxHourLength = "ساعة"; // ما يكتب بعد عدد الساعات
public const String TextBoxMinuteLength = "دقيقة"; // ما يكتب بعد عدد الدقائق
public const String TextBoxSecondLength = "ثانية"; // ما يكتب بعد عدد الثواني
public const String ButtonFontName = "MS UI Gothic"; // نوع حرف الأزرار
public const int ButtonFontSize = 30; // حجم حرف الأزرار
public const int ButtonWidth = 150; // عرض الأزرار
public const int ButtonHeight = TextBoxHeight; // إرتفاع الأزرار
public const String StartButtonLength = "تشغيل"; // اسم زر التشغيل
public const String StopButtonLength = "إيقاف"; // اسم زر الإيقاف
}
/********************
إطار test
ويبدأ تنفيذ البرنامج من هذه النقطة
********************/
class test
{
public static void Main()
{
Application.Run(new Form1());
}
}
/********************
إطار Form1
********************/
class Form1 : Form
{
private bool bCountFlag = false; // يتم تفعيله فقط عند الضغط زر التشغيل
private int nCounter = 0; // يتم زيادة الأرقام بعد كل ثانية
private System.Timers.Timer timer;
private TextBox textbox;
private Button button;
/* تطبيق الأوامر الأولية */
public Form1()
{
SetTimer();// حزمة لتحديد الوقت
FormDesign();//حزمة لإنشاء العناصر المختلفة
}
/* حزمة SetTimer*/
/* إعداد الموقت */
public void SetTimer()
{
timer = new System.Timers.Timer();
timer.Elapsed += new ElapsedEventHandler(MyTimer);
timer.Interval = 1000; // ألف جزء من الثانية
timer.AutoReset = true;
}
/* حزمة FormDesign */
/* إعداد النافذة */
public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;
MaximizeBox = false; // تعطيل زر تكبير الشاشة
FormBorderStyle = FormBorderStyle.Fixed3D; // تعطيل خاصية تغيير حجم الشاشة
Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + Constants.ButtonWidth, Constants.ButtonHeight);
// إنشاء مربع التحرير
textbox = new TextBox();
textbox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
textbox.Width = Constants.TextBoxWidth;
textbox.Height = Constants.TextBoxHeight;
textbox.Text = Convert.ToString(nCounter) + Constants.TextBoxSecondLength;
textbox.Multiline = false; // تعطيل خاصية تعدد السطور وجعله سطر واحد
textbox.TextAlign = HorizontalAlignment.Right; // جعله على اليامين
textbox.MaxLength = Constants.TextBoxMaxLength;
textbox.ReadOnly = true; // جعل مربع التحرير قابل للقراءة فقط ولا يمكن الكتابة عليه
textbox.Parent = this;
textbox.Location = new Point(0, 0);
textbox.TabIndex = 1;
textbox.TabStop = true;
// إنشاء زر
button = new Button();
button.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
button.TextAlign = ContentAlignment.MiddleCenter; // جعله في مركز الوسط
button.Width = Constants.ButtonWidth;
button.Height = Constants.ButtonHeight;
button.Text = Constants.StartButtonLength;
button.BackColor = SystemColors.Control;
button.Parent = this;
button.Location = new Point(Constants.TextBoxWidth, 0);
button.Click += new EventHandler(ButtonClick);
button.TabIndex = 0;
button.TabStop = true;
}
/* حزمة ButtonClick */
/* عند الضغط على الزر */
public void ButtonClick(object sender, EventArgs e)
{
if (bCountFlag) // يتم تعطيل المنبه أو الموقت عند التشغيل
{
timer.Stop();
button.Text = Constants.StartButtonLength;
textbox.Focus();
}
else // تشغيل الموقت
{
nCounter = 0;
textbox.Text = Convert.ToString(nCounter) + Constants.TextBoxSecondLength;
timer.Start();
button.Text = Constants.StopButtonLength;
}
bCountFlag = !bCountFlag;
}
/* حزمة MyTimer */
/* يتم طلبها كل ثانية */
public void MyTimer(object sender, ElapsedEventArgs e)
{
nCounter++;
int nSecond = nCounter;
if (nSecond >= Constants.TimeUp)
{
button.PerformClick(); // الضغط على الزر
}
textbox.Text = "";
if (nSecond >= 3600) // عند تجاوز عدد الثواني 3600 أي ساعة كاملة
{
int nHour = nSecond / 3600;
nSecond %= 3600;
textbox.Text = Convert.ToString(nHour) + Constants.TextBoxHourLength;
}
if (nSecond >= 60) // عند تجاوز عدد الثواني 60 انية أي دقيقة
{
int nMinute = nSecond / 60;
nSecond %= 60;
textbox.Text += Convert.ToString(nMinute) + Constants.TextBoxMinuteLength;
}
textbox.Text += Convert.ToString(nSecond) + Constants.TextBoxSecondLength;
System.Media.SystemSounds.Beep.Play(); // إصدار صوت. وهو الصوت الإفتراضي عند الرسائل والتحذيرات
}
/* حزمة OnFormClosing */
/* ويتم طلبها تلقائيا عند إغلاق البرنامج */
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
DialogResult dr;
if (bCountFlag) // إذا كان أثناء تشغيل الموقت
{
dr = MessageBox.Show("هل ترغب في إيقاف الموقت والخروج من البرنامج؟", Constants.ApplicationName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
if (dr == DialogResult.Yes) // الخروج من البرنامج إثناء التشغيل
{
timer.Stop();
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
else // وإذا كان الموقت معطلا
{
e.Cancel = false;
}
}
}
شرح البرنامج
في ما يلي شرح مختصر لأكواد هذا البرنامج
أولا بالنسبة للحزم الإفتراضية
ولإستخدام الموقت قمنا بإضافة حزمة
System.Timers
ثانيا إطار Constants كما وضحنا في الدرس السابق هو لتسهيل كتابة الثوابت المستخدمة في هذا البرنامج
وبالنسبة لإطار test فهو نقطة بداية تنفيذ البرنامج
وذلك من خلال الحزمة الرئيسية حزمة Main
ومن خلال هذه الحزمة وباستخدام أمر Application.Run نقوم باستدعاء إطار Form1 والذي يعتبر الإطار الأساسي في هذا البرنامج
وبعد ذلك نجد إطار Form1 وهو يحتوي على كافة العناصر الخاصة بالنظام
وبعد تنفيذه مباشرة نقوم بطلب حزمة FormDesign
وحزمة SetTimer
حزمة SetTimer
يتم إعداد حزمة SetTimer بعد بداية البرنامج مباشرة
يتم إنشاء الموقت وذلك كما يليtimer = new System.Timers.Timer()
وبالطبع يمكن كتابتها timer = new Timer()
ولكن لتسهيل الفهم وخاصة للمبتدئين جعلناها بهذه الطريقة
وبهذا يتم طلب الموقت بصورة مستمرة على حسب الزمن المحدد وفي هذه الحالة هي كل ثانية
وكما هو موضح في سطر timer.Interval = 1000 فألف هنا بمعنى ألف جزء من الثانية
لذا إذا أردنا كتابتة ثانية واحدة يلزم كتابتها كما هو موضح أعلاه
وبكتابة سطر timer.Elapsed += new ElapsedEventHandler(MyTimer) يتم طلب حزمة MyTimer
وفي سطر timer.AutoReset = true يتم تفعيل الموقت وجعله يعمل باستمرار . وخاصية true تعتبر الوضع الإفتراضي للموقت
لذا في حالة نريد استخدامها لمرة واحدة يجب علينا جعلها في وضع FALSE
حزمة FormDesign
وكما تعلمنا في الدرس السابق نقوم بإجراء إعدادات الويندوز في هذه الحزمة
فمثلا في سطر startPosition = FormStartPosition.CenterScreen نجعل شاشة البرنامج في وسط الشاشة
وفي سطر MaximizeBox = false يتم تعطيل زر تكبير الشاشة
وفي سطر FormBorderStyle = FormBorderStyle.Fixed3D يتم تعطيل خاصية تغيير حجم الشاشة
وفي سطور Text = Constants.ApplicationName;
و BackColor = SystemColors.Window;
و ClientSize = new Size(Constants.TextBoxWidth + Constants.ButtonWidth, Constants.ButtonHeight);
يتم تعيين اسم البرنامج ولون الخلفية وحجم شاشة البرنامج
وبعد الإعدادات العامة للويدوز
أولا نقوم بإنشاء مربع التحرير
textbox = new TextBox();
textbox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
textbox.Width = Constants.TextBoxWidth;
textbox.Height = Constants.TextBoxHeight;
textbox.Text = Convert.ToString(nCounter) + Constants.TextBoxSecondLength;
textbox.Multiline = false; //تعطيل خاصية تعدد الأسطر
textbox.TextAlign = HorizontalAlignment.Right; // جعلها على اليمين
textbox.MaxLength = Constants.TextBoxMaxLength;
textbox.ReadOnly = true; // تعطيل خاصية التحرير وجعله مربع تحرير خاص بالقراءة فقط
textbox.Parent = this;
textbox.Location = new Point(0, 0);
textbox.TabIndex = 1;
textbox.TabStop = true;
ومربع التحرير هذا لإظهار الزمن فقط لذا قمنا بتعطيل خاصية إمكانية الكتابة والتحرير
وبعدها قمنا بإنشاء زر التشغيل والإيقاف
button = new Button();
button.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
button.TextAlign = ContentAlignment.MiddleCenter; // جعلناها في مركز الوسط
button.Width = Constants.ButtonWidth;
button.Height = Constants.ButtonHeight;
button.Text = Constants.StartButtonLength;
button.BackColor = SystemColors.Control;
button.Parent = this;
button.Location = new Point(Constants.TextBoxWidth, 0);
button.Click += new EventHandler(ButtonClick);
button.TabIndex = 0;
button.TabStop = true;
فالأزرار ومربعات التحرير كما هو في معظم العناصر الأخرى
بعد إنشاء العنصر المعين وذلك باسم ما
نقوم باستخدام هذا الاسم لإعداد الحيز والحجم والرقم التسلسلي وبقية الخصائص الخاصة بكل عنصر
وحزمة الضغط على الزر ButtonClick يتم الإنتقال إليها بعد الضغط على الزر المعين
ولكننا في هذا البرنامج قمنا بإنشاء زر واحد وذلك لتشغيل وإيقاف الموقت
فمثلا عند بداية البرنامج يكون اسم الزر تشغيل
ولكن بعد تشغيل الموقت نقوم بتغيير اسم الزر إلى إيقاف
وبهذه الطريقة يمكننا ومن خلال معرفة اسم الزر المضغوط تنفيذ الأوامر التي نريد
وبالتأكيد يمكننا إنشاء زر منفصل للتشغيل وزر للإيقاف
وعلى الأشخاص الذين لهم الرغبة محاولة كتابة كل زر على حدا
وأثناء حساب الزمن وعندما نقوم بالضغط على زر إيقاف نقوم مرة أخرى بتغيير اسم الزر إلى تشغيل
وذلك كما هو موضح في
if (bCountFlag)
{
timer.Stop();
button.Text = Constants.StartButtonLength;
textbox.Focus();
}
else
{
nCounter = 0;
textbox.Text = Convert.ToString(nCounter) + Constants.TextBoxSecondLength;
timer.Start();
button.Text = Constants.StopButtonLength;
}
بعد الضغط على زر تشغيل نقوم بإضافة ثانية واحدة باستمرار وبعدها يتم إظهار هذه النتيجة في مربع التحرير
وفي سطر timer.Start نقوم بتفعيل الموقت وبعدها نقوم بتغيير اسم الزر من تشغيل إلى إيقاف
وعند الضغط على زر إيقاف نقوم بتعطيل الموقت باستخدام خاصية timer.Stop ومن ثم نقوم بتغيير اسم الزر من إيقاف إلى تشغيل مرة أخرى
وبعدها نجعل المؤشر على مربع التحرير كما هو موضح في سطر textbox.Focus()
وعند الضغط على أي من الزرين نقوم بكتابة
سطر bCountFlag = !bCountFlag
وذلك لتغير قيمة المتغير bCountFlag
وتكون قيمة المتغير bCountFlag هي TRUE طالما كان الموقت شغال
أما في حالة التعطيل تكون قيمته FALSE
وبكتابة bCountFlag = !bCountFlag
وبجعل علامة ! قبل علامة يساوي تكون قيمة المتغير مخالفة لما بعدها
بمعنى إذا كانت قيمة المتغير true تصبح false والعكس صحيح
حزمة MyTimer
يتم تفعيل وتشغيل الموقت باستخدام timer.Start
ومن ثم يتم إعداد الوقت وذلك على حسب الزمن الذي قمنا بإعداده في حزمة SetTimer
وفي هذا البرنامج جعلنا قيمة الزمن المراد حسابه هو ثانية واحدة لذا يتم إضافته إلى المتغير nCounter
وذلك في سطر nCounter++ أي إضافة 1 بعد كل ثانية
ولأننا نطلب هذه الحزمة كل ثانية ويتم إضافة رقم واحد إلى المتغير nCounter يمكننا التعرف على الزمن بالتعرف على قيمة المتغير nCounter
ولكيلا يتم حساب الوقت بالثواني إلى ما لا نهاية نقوم بالتأكد من عدد الثواني الحالية وذلك كما هو موضح في السطور
if (nSecond >= Constants.TimeUp)
{
button.PerformClick(); // الذهاب إلى حزمة تنفيذ الأزرار
}
في حالة لم يتجاوز عدد الثواني الحد المعين وهو ساعة أو دقيقة نقوم بتفريغ محتوى مربع التحرير وذلك كما يلي
textbox.Text = ""
ومن ثم نقوم بإضافة القيمة السليمة إلى مربع التحرير
وفي سطر if (nSecond >= 3600) // إذا كان عدد الثواني أكثر من ساعة كاملة
{
int nHour = nSecond / 3600;
nSecond %= 3600;
textbox.Text = Convert.ToString(nHour) + Constants.TextBoxHourLength;
}
وبالقسمة على 3600 نحصل على عدد الساعات
وفي سطرnSecond %= 3600 المتبقي من نتيجة القسمة على 3600 نقوم بإضافته إلى المتغير nSecond
وباستخدام هذا المتغير أيضا يمكننا التعرف على عدد الدقائق وذلك بالقسمة على 60 كما هو موضح في سطر
if (nSecond >= 60) // إذا كانت عدد الثواني المتبقية أكثر من 60
{
int nMinute = nSecond / 60;
nSecond %= 60;
textbox.Text += Convert.ToString(nMinute) + Constants.TextBoxMinuteLength;
}
وبعد الحصول على عدد الدقائق يكون المتبقي هو ثواني فقط لذا يمكننا إضافتها إلى محتوى مربع التحرير كما يلي
textbox.Text += Convert.ToString(nSecond) + Constants.TextBoxSecondLength;
ويكون محتوى مربع التحرير كما يلي عدد الساعات بالأرقام متبوعا بكلمة ساعة وعدد الدقائق متبوعة بكلمة دقيقة وعدد الثواني متبوعا بكلمة ثانية
وأثناء تشغيل الموقت يتم إصدار صوت التحذير الإفتراضي للنظام وذلك كما هو موضح في السطر
System.Media.SystemSounds.Beep.Play(); // ويتم إصدار صوت كل ثانية
وربما لا يتم إصدار صوت وذلك إعتمادا على نوع الجهاز
حزمة OnFormClosing
يتم طلب هذه الحزمة عند إغلاق البرنامج بصورة تلقائية
وهذه الحزمة أيضا لها أكثر من طريقة للكتابة سوف نتعرف على بعضها في المرات التالية
ون خلال هذه الحزمة يمكننا كتابة ما نود فعله عند الخروج من البرنامج
DialogResult dr;
if (bCountFlag) // إذا كان الموقت شغال عند إغلاق البرنامج
{
dr = MessageBox.Show("هل ترغب في إيقاف الموقت والخروج من البرنامج?", Constants.ApplicationName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
if (dr == DialogResult.Yes) // الخروج من البرنامج
{
timer.Stop();
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
else // إذا كان الموقت معطلا
{
e.Cancel = false;
}
عند إغلاق البرنامج وإذا كان الموقت في وضع التشغيل يتم إصدار رسالة تنبيهية
للخروج من البرنامج وعند إختيارنعم يتم إيقاف الموقت والخروج من البرنامج
وفي حالة إختيار لا يتم مواصلة حساب الزمن
أما إذا كان الموقت متوقفا يتم الخروج من البرنامج بدون أي رسالة تنبيهية
الملخص
يعتبر هذا البرنامج ولحد كبير مشابه للبرنامج المستخدم في الدرس السابق
لذا نتمنا أن يكو سهلا في الفهم والتطبيق
وباستخدام الموقت تتسع أمامنا المزيد من الفرص ونكون قد تعلمنا الكثير من الخصائص المهمة والضرورية لإنشاء العديد من البرامج
وبالله التوفيق كما لا تنسونا من صالح الدعاء