في VB6 ، كان روتين فرعي للحدث ، مثل Button1_Click ، أقل تعقيدًا بكثير لأن النظام يسمى الروتين الفرعي بالاسم بدقة. في حالة وجود حدث Button1_Click ، أطلق النظام عليه. إنه مباشر ومباشر.
ولكن في VB.NET ، هناك نوعان من التحسينات الرئيسية التي تتم VB.NET SOOPercharged (هذا هو "OOP" لـ البرمجة الشيئية).
- يتحكم بند "Handles" فيما إذا كان النظام يستدعي الروتين الفرعي ، وليس الاسم.
- يتم تمرير المعلمات المرسل و e إلى روتين.
استخدام المعلمات
دعونا نلقي نظرة على مثال بسيط لمعرفة الفرق الذي تحدثه المعلمات في VB.NET.
زر فرعي خاص 1 انقر (
مرسل ByVal كنظام. موضوع،
ByVal e كنظام. EventArgs
) مقابض Button1.Click
"الكود الخاص بك يذهب هنا
نهاية فرعية
تتلقى روتينات الأحداث دائمًا كائن "المرسل" ومعلمة EventArgs للنظام "e". نظرًا لأن معلمة EventArgs هي كائن ، فإنها تدعم الخصائص والأساليب الضرورية. على سبيل المثال ، روتين حدث VM6 MouseMove القديم المستخدم لتلقي أربع معلمات:
- الزر كعدد صحيح
- التحول حسب عدد صحيح
- X كأفراد
- Y كأفراد
عندما خرجت الفئران الأكثر تقدمًا بأزرار أكثر ، واجهت VB6 مشكلة حقيقية في دعمها. يقوم VB.NET بتمرير معلمة MouseEventArgs فقط ولكنه يدعم الكثير من الخصائص والأساليب. ولكل منها كائنات تدعم أكثر. على سبيل المثال ، ه. تحتوي خاصية الأزرار على كل هذه الخصائص:
- اليسار
- الأوسط
- حق
- لا يوجد
- XButton1
- XButton2
إذا اخترع شخص ما ماوسًا "هائلاً" باستخدام زر "افتراضي" ، فسيتعين على VB.NET فقط تحديث .NET Framework لدعمه ولن يتم كسر أي كود سابق نتيجة لذلك.
هناك عدد من تقنيات .NET التي تعتمد بشكل مطلق على هذه المعلمات. على سبيل المثال ، نظرًا لأن الكمبيوتر الخاص بك عادةً ما يحتوي على شاشة واحدة فقط لعرض الرسومات ، يجب أن تقوم التعليمات البرمجية بدمج الرسومات التي تقوم بإنشائها في نفس الصورة التي يستخدمها Windows. لهذا السبب ، يجب مشاركة كائن "رسومات" واحد. الطريقة الرئيسية التي يمكن للشفرة من خلالها استخدام كائن "الرسومات" هي استخدام المعلمة e تم تمريرها إلى حدث OnPaint باستخدام كائن PaintEventArgs.
تجاوزات المحمية الفرعية OnPaint (
ByVal e كنظام. شبابيك. نماذج. PaintEventArgs)
Dim g As Graphics = e. الرسومات
أمثلة أخرى
ماذا يمكنك أن تفعل مع هذه المعلمات؟ للتوضيح ، لنفترض أنك تريد معرفة ما إذا كانت هناك سلسلة ، ربما شيء أدخلته في مربع نص ، موجودة في أي واحدة من مجموعة من مربعات النص الأخرى عند النقر فوق أحدها. يمكنك ترميز عشرات الدلائل الفرعية المتطابقة تقريبًا لكل مربع نص:
إذا TextBox42.Text. دليل ل(
دالة البحث. نص) = -1
ثم NotFound. نص =
"لم يتم العثور على"
ولكن من الأسهل ترميز رمز واحد فقط والسماح له بالتعامل معهم جميعًا. ستكشف معلمة المرسل عن مربع النص الذي تم النقر فوقه.
FindIt الفرعي الخاص (
مرسل ByVal كنظام. موضوع،
ByVal e كنظام. EventArgs
) يعالج TextBox1.Enter،
TextBox2.Enter ،
... وعلى وعلى.. .
42. أدخل
خافت myTextbox كما TextBox
myTextbox = المرسل
Dim IndexChar As Integer =
myTextbox. نص. دليل ل(
دالة البحث. نص)
If IndexChar = -1 ثم _
لم يتم العثور على. نص = "غير موجود" _
آخر _
لم يتم العثور على. Text = "Found It!"
نهاية فرعية
في الآونة الأخيرة ، طلب مني مبرمج طريقة أفضل "لحذف السطر الذي تم النقر عليه في أي من القوائم الست المحددة". لقد جعلها تعمل في عشرات الأسطر من التعليمات البرمجية التي أربكتني ببساطة. ولكن باستخدام المرسل ، كان الأمر بسيطًا حقًا:
قائمة فرعية خاصة Box_Click (
مرسل ByVal ككائن ،
ByVal e كنظام. EventArgs
) يعالج ListBox1.Click ، ListBox2.Click
خافت myListBox كما ListBox جديد
myListBox = المرسل
myListBox. العناصر. RemoveAt (myListBox. الفهرس المحدد)
نهاية فرعية
أحد الأمثلة الأخرى لإثبات هذه النقطة هو سؤال أرسله بيير في بلجيكا. كان بيير يختبر المساواة بين Button1 والمرسل باستخدام يكون عامل الأشياء:
إذا كان المرسل Button1 ثم ...
هذا صحيح من الناحية النحوية لأن المرسل و Button1 كلاهما يمكن الرجوع إليهما. وبما أن المرسل مطابق تمامًا لـ Button1 ، فلماذا لا يعمل؟
تعتمد الإجابة على كلمة رئيسية تم العثور عليها قبل ذلك بقليل في العبارة. أولاً ، دعنا نتحقق من وثائق Microsoft للبحث عن يكون المشغل أو العامل.
البصرية الأساسية يقارن بين متغيرين مرجع كائن مع عامل التشغيل Is. يحدد هذا العامل ما إذا كان متغيران مرجعيان يشيران إلى نفس مثيل الكائن.
لاحظ أنه تم تمرير المرسل ByVal. هذا يعني أنه تم تمرير نسخة من Button1 ، وليس الكائن الفعلي نفسه. لذلك عندما يختبر بيير لمعرفة ما إذا كان المرسل والزر 1 متماثلان ، فإن النتيجة خطأ.
لاختبار ما إذا تم النقر فوق Button1 أو Button2 ، يجب عليك تحويل المرسل إلى كائن Button فعلي ثم اختبار خاصية ذلك الكائن. عادةً ما يتم استخدام النص ، ولكن يمكنك اختبار قيمة في العلامة أو حتى خاصية الموقع.
يعمل هذا الرمز:
خافت myButton كما زر
myButton = المرسل
إذا myButton. نص = "Button1" ثم