تتكون تقنية Forms
من عدة مكتبات تُسهِل من عملية تطوير التطبيقات. النموذج أو الاستمارة (form) هو ببساطة واجهة مُستخدِم مُكَوَّنة من عدة عناصر منفصلة (controls). تُستخدَم هذه العناصر لعَرْض معلومات للمُستخدِم أو استقبال مُدخَلات منه.
تَعتمِد برمجة تطبيقات Forms
بشكل أساسي على مفهوم الأحَدَاث (events)، والتي تُثار تلقائيًا عند ظرف معين أو نتيجة تَفاعُل المُستخدِم مع البرنامج. بالتالي، لابُد للبرنامج أن يُعالِج هذه الأحداث (event handlers) بتَّنْفيذ الإجراء المُتناسب.
برنامج "أهلا بالعالم"
على سبيل المثال، يُثار الحَدَث Load
مرة وحيدة عند تَحمِيل النموذج (form) وعَرضه لأول مرة. في المقابل، يُثار الحَدَث Shown
في كل مرة يُعرَض فيها النموذج.
لعَرْض مربع رسالة (message box) في كل مرة يُعرَض فيها النموذج، اِستخدِم الشيفرة التالية:
Public Class Form1 Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown MessageBox.Show("Hello, World!") End Sub End Class
لِعَرْضِها مرة واحدة فقط عند تَحمِيل النموذج، اِستخدِم الشيفرة التالية:
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load MessageBox.Show("Hello, World!") End Sub End Class
يُثار أيضًا الحَدَث Activate
في كل مرة يقوم فيها المُستخدِم بتَفعيل النموذج.
تنبيه: يُثار الحَدَث Load
قبل الحَدَث Show
. مع ذلك، إذا اِستدعَى مُعالِج الحَدَث Show
التابع msgBox
لِعَرْض مربع رسالة، فقد يؤدي ذلك إلى تَّنْفيذ التابع msgBox
قبل انتهاء تنفيذ مُعالِج الحََدَث Load
. لذلك، عامةً، لا يُنصَح بالاعتماد على ترتيب إثارة الحَدَثين Load
و Show
.
المؤقت Timer
لنفترض أن لدينا نموذج (form) يحتوي على العناصر التالية: زر، وعنوان (label)، ومؤقت (timer). يُهيئ المثال التالي مُعالِج حَدَث الضغط على الزر. يَعرِض ذلك المُعالِج التوقيت الحالي للمُستخدِم ثم يَضبُط مؤقت لمدة دقيقة، بعد انتهائها يُثار الحدث Tick
تلقائيًا، مما يؤدي إلى تَّنْفيذ مُعالِج الحدث Tick
الذي يُحدِّث قيمة الوقت المعروض:
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Button1.Enabled = False Timer1.Interval = 60 * 1000 'one minute intervals 'start timer Timer1.Start() Label1.Text = DateTime.Now.ToLongTimeString End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label1.Text = DateTime.Now.ToLongTimeString End Sub End Class
مثال آخر هو محاولة اِستخدَام عنصر المؤقت Timer
لمحاكاة مؤقت للعد التنازلي (countdown) لمدة معينة -مثلًا 3 دقائق.
كالمثال السابق، يُضبَط المؤقت عند الضغط على الزر. لكن، في هذا المثال، ستُستخدََم أيضًا ساعة توقيت من النوع Stopwatch
لموازنة مدة المؤقت المُحدَّدة مع الوقت الفعلي المُنصرِم منذ لحظة ضَبْط المؤقت وحتى تنْفيذ مُعالِج الحدث Tick
. يَعرِض مُعالِج الحدث Tick
الزمن المُنصرم بوحدة الثواني:
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Button1.Enabled = False ctSecs = 0 'clear count Timer1.Interval = 1000 'one second in ms. 'start timers stpw.Reset() stpw.Start() Timer1.Start() End Sub Dim stpw As New Stopwatch Dim ctSecs As Integer Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ctSecs += 1 If ctSecs = 180 Then 'about 2.5 seconds off on my PC! 'stop timing stpw.Stop() Timer1.Stop() 'show actual elapsed time 'Is it near 180? Label1.Text = stpw.Elapsed.TotalSeconds.ToString("n1") End If End Sub End Class
قد تَفترِض أنها لابُدّ وأن تكون مساوية للقيمة 180؟ في الواقع، ليس هذا ضروريًا. مثلًا قد عَرَضَ حاسوبي القيمة 182.5.
السبب وراء هذا التفاوت هو أن عنصر المؤقت Windows.Forms.Timer
أحادي الخيط (single-threaded)، ومحدود بدقة تصل إلى 55 ميللي ثانية، مما يعني أنه غير ملائم لتسجيل الزمن وتدقيقه، ولا ينبغي استخدامه لأغراض حساسة جدًا للزمن.
يُمكن الحصول على نتائج أفضل باستخدام المؤقت وساعة الإيقاف بطريقة مختلفة، كالتالي:
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Button1.Enabled = False Timer1.Interval = 100 'one tenth of a second in ms. 'start timers stpw.Reset() stpw.Start() Timer1.Start() End Sub Dim stpw As New Stopwatch Dim threeMinutes As TimeSpan = TimeSpan.FromMinutes(3) Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick If stpw.Elapsed >= threeMinutes Then '0.1 off on my PC! 'stop timing stpw.Stop() Timer1.Stop() 'show actual elapsed time 'how close? Label1.Text = stpw.Elapsed.TotalSeconds.ToString("n1") End If End Sub End Class
يوجد مؤقتات أخرى يمكن اِستخدَامها. قد تُساعِدك نتائج هذا البحث بهذا الخصوص.
بعض النصائح للمبتدئين
نَستعرِض بعض النصائح التي ينبغي أن يَتبِعهَا المبتدئون حتى يحصلوا على بداية موفقة مع VB.NET
:
- اضبط الخيارات التالية:
'can be permanently set ' Tools / Options / Projects and Soluntions / VB Defaults Option Strict On Option Explicit On Option Infer Off Public Class Form1 End Class
-
اِستخدِم العامل & وليس + لضم السَلاسَل النصية. عامةً ينبغي دراسة النوع
String
بشئ من التفصيل نظرًا للحاجة إلى استخدامه بكثرة. -
اقض بعض الوقت لاستيعاب الفرق بين أنواع القيمة وأنواع المَرجِع.
-
لا تَستخدِم التابع
Application.DoEvents
أبدًا. ألق نظرة على الفقرة التنبيهية بالرابط. عندما تكون متأكدًا من حاجتك الماسة لاستخدامه، اسأل. -
التوثيق هو رفيق دربك.
ترجمة -وبتصرف- للفصل VB Forms من كتاب .NET Framework Notes for Professionals
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.