Vb. Параметри на нетния подател и събитие

В VB6 подпрограма за събитие, като Button1_Click, беше много по-малко сложна, защото системата нарече подпрограмата строго по име. Ако съществува събитие Button1_Click, системата го извика. Тя е пряка и пряма.

Но във VB.NET има две големи ъпгрейди, които правят VB.NET SOOPercharged (това е „OOP“ за Обектно-ориентирано програмиране).

  1. Клаузата "Handles" контролира дали системата извиква подпрограмата, а не името.
  2. Параметрите на изпращача и e се предават на подпрограмата.

Използване на параметри

Нека да разгледаме един прост пример, за да видим разликата, която параметрите правят във VB.NET.

Частен подбутон1_Click ( 

 ByVal подател като система. обект,

 ByVal e като система. EventArgs

 ) Дръжки Button1.Click

 „Кодът ви идва тук

Край Sub

Подпрограмите на събитията винаги получават обект „изпращач“ и системен параметър на EventArgs „e“. Тъй като параметърът EventArgs е обект, той поддържа каквито свойства и методи са необходими. Например, старата подпрограма на събитието VB6 MouseMove, използвана за получаване на четири параметъра:

instagram viewer
  • Бутон като цяло число
  • Shift като цяло число
  • X като единичен
  • Y Като единичен

Когато по-напредналите мишки излязоха с повече бутони, VB6 имаше истински проблем при поддръжката им. VB.NET предава само един параметър MouseEventArgs, но поддържа много повече свойства и методи. И всеки от тях са обекти, които поддържат още повече. Например, e Свойството на бутона съдържа всички тези свойства:

  • Наляво
  • среден
  • прав
  • Нито един
  • XButton1
  • XButton2

Ако някой измисли "трансцендентална" мишка с "виртуален" бутон, VB.NET ще трябва да актуализира само .NET Framework, за да го поддържа и няма да се счупи предишен код.

Има редица .NET технологии, които абсолютно зависят от тези параметри. Например, тъй като вашият компютър обикновено има само един екран за показване на графика, вашият код трябва да обедини графиката, която създава, в същото изображение, използвано от Windows. Поради тази причина трябва да се сподели един "графичен" обект. Основният начин, по който вашият код е в състояние да използва този "графичен" обект, е да използва параметъра e, който е премина към събитието OnPaint с обекта PaintEventArgs.

Защитени отмени Sub OnPaint (

 ByVal e като система. Windows. Форми. PaintEventArgs)

 Dim g като графика = e. Graphics

Други примери

Какво друго можете да направите с тези параметри? За илюстрация, да предположим, че искате да намерите дали низ, може би нещо, което сте въвели в Textbox, съществува в някоя от колекция от други текстови полета, когато щракнете върху него. Можете да кодирате няколко десетки практически еднакви подпрограми за всеки Textbox:

Ако TextBox42.Text. Индекс на(

 SearchString. Текст) = -1 

 Тогава NotFound. Текст = 

 „Не е намерено“

Но е много по-лесно да се кодира само един и да се остави да се справи с всички тях. Параметърът на подателя ще разкрие кой текст е щракнат.

Частен Sub FindIt (

 ByVal подател като система. обект,

 ByVal e като система. EventArgs

 ) Обработва TextBox1.Enter, 

 TextBox2.Enter, 

... и на и на.. .

 TextBox42.Enter

 Dim myTextbox като TextBox

myTextbox = подател

 Dim IndexChar As Integer = 

 myTextbox. Текст. Индекс на( 

 SearchString. Текст)

 Ако IndexChar = -1 Тогава _

 NOTFOUND. Text = "Не е намерено" _

 Друго

 NOTFOUND. Text = "Намерено!"

 Край Sub

Наскоро един програмист ме помоли за по-добър начин да "изтрия реда, който е щракнат в който и да е от шест посочени списъка." Той работеше в няколко десетки реда код, които просто ме объркаха. Но с помощта на подател, това беше наистина много просто:

Частен под списъкBox_Click ( 

 ByVal подател като обект, 

 ByVal e като система. EventArgs

 ) Обработва ListBox1.Click, ListBox2.Click

 Затъмнете myListBox като нов ListBox

 myListBox = подател

 myListBox. Предмети. RemoveAt (myListBox. SelectedIndex)

Край Sub

Още един пример за намаляване на въпроса е въпросът, който беше изпратен от Пиер в Белгия. Пиер тестваше равенството на Button1 и подателя с помощта на е оператор за обекти:

Ако подателят е Button1, тогава ...

Това е синтактично правилно, тъй като изпращачът и Button1 са и двата обекта, към които може да се направи препратка. И тъй като подателят наистина е идентичен с Button1, защо не работи?

Отговорът зависи от ключова дума, която се намира малко по-рано в изявлението. Първо, нека проверим документацията на Microsoft за е оператор.

Visual Basic сравнява две обектни референтни променливи с оператора Is. Този оператор определя дали две референтни променливи се отнасят към един и същ екземпляр на обект.

Забележете, че подателят е изпратен ByVal. Това означава, че се предава копие на Button1, а не самият действителен обект. Така че, когато Пиер тества, за да види дали изпращачът и Button1 са един и същи екземпляр, резултатът е False.

За да проверите дали Button1 или Button2 е щракнат, трябва да превърнете подателя в действителен обект на Button и след това да тествате свойство на този обект. Обикновено се използва текст, но можете да тествате стойност в Tag или дори свойството Location.

Този код работи:

Dim myButton As Button

myButton = подател

Ако myButton. Text = "Бутон1" Тогава

instagram story viewer