Vb. Параметры Net Sender и e Event

В VB6 подпрограмма события, такая как Button1_Click, была намного менее сложной, потому что система вызывала подпрограмму строго по имени. Если событие Button1_Click существовало, система вызывала его. Это прямое и прямое.

Но в VB.NET есть два основных обновления, которые делают VB.NET SOOPercharged (это "ООП" для Объектно-ориентированного программирования).

  1. Предложение «Handles» определяет, вызывает ли система подпрограмму, а не имя.
  2. Параметры отправителя и e передаются в подпрограмму.

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

Давайте рассмотрим простой пример, чтобы увидеть разницу между параметрами в VB.NET.

Частный Sub Button1_Click ( 

 ByVal отправитель как система. Объект,

 ByVal e As System. EventArgs

 ) Обрабатывает Button1.Click

 «Ваш код идет сюда

End Sub

Подпрограммы событий всегда получают объект «отправитель» и системный параметр EventArgs «e». Поскольку параметр EventArgs является объектом, он поддерживает все необходимые свойства и методы. Например, старая подпрограмма события MouseBove VB6 использовалась для получения четырех параметров:

instagram viewer
  • Кнопка как целое число
  • Shift As Integer
  • X как один
  • Y как один

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

  • Осталось
  • средний
  • Правильно
  • Никто
  • XButton1
  • XButton2

Если кто-то изобрел «трансцендентную» мышь с «виртуальной» кнопкой, VB.NET нужно будет только обновить .NET Framework для его поддержки, и в результате предыдущий код не сломается.

Существует ряд технологий .NET, которые абсолютно зависят от этих параметров. Например, поскольку на вашем ПК обычно отображается только один экран для отображения графики, ваш код должен объединить создаваемую графику с тем же изображением, которое используется Windows. По этой причине один «графический» объект должен быть общим. Основным способом, которым ваш код может использовать этот «графический» объект, является использование параметра e, который перешел на событие OnPaint с объектом PaintEventArgs.

Защищенные переопределения Sub OnPaint (

 ByVal e As System. Окна. Формы. PaintEventArgs)

 Dim g As Graphics = e. Графика

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

Что еще можно сделать с этими параметрами? Для иллюстрации предположим, что вы хотите выяснить, существует ли строка, возможно, что-то, что вы ввели в текстовое поле, в каком-либо из набора других текстовых полей, когда вы щелкаете по нему. Вы можете кодировать несколько десятков практически идентичных подпрограмм для каждого текстового поля:

Если TextBox42.Text. Индекс(

 SearchString. Текст) = -1 

 Тогда не нашёл. Текст = 

 "Не обнаружена"

Но намного проще кодировать только один и позволить ему обрабатывать все из них. Параметр отправителя покажет, какое текстовое поле было нажато.

Private Sub FindIt (

 ByVal отправитель как система. Объект,

 ByVal e As System. EventArgs

 ) Обрабатывает TextBox1.Enter, 

 TextBox2.Enter, 

... и так далее.. .

 TextBox42.Enter

 Dim myTextbox As TextBox

myTextbox = отправитель

 Dim IndexChar As Integer = 

 MyTextBox. Текст. Индекс( 

 SearchString. Текст)

 Если IndexChar = -1, то _

 Не обнаружена. Текст = "Не найдено" _

 Остальное _

 Не обнаружена. Text = "Найдено!"

 End Sub

Недавно программист попросил меня найти лучший способ «удалить строку, которая была нажата в любом из шести указанных списков». Он работал в пару десятков строк кода, которые просто смутили меня. Но с использованием sender это было действительно довольно просто:

Private Sub ListBox_Click ( 

 ByVal sender As Object, 

 ByVal e As System. EventArgs

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

 Dim myListBox As New ListBox

 myListBox = отправитель

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

End Sub

Еще один пример, подтверждающий эту мысль, - вопрос, который прислал Пьер в Бельгии. Пьер проверял равенство Button1 и отправителя, используя Является оператор для объектов:

Если отправитель Button1, то ...

Это синтаксически правильно, потому что sender и Button1 являются объектами, на которые можно ссылаться. И поскольку отправитель действительно идентичен Button1, почему он не работает?

Ответ зависит от ключевого слова, найденного немного раньше в утверждении. Во-первых, давайте проверим документацию Microsoft для Является оператор.

Visual Basic сравнивает две ссылочные переменные объекта с оператором Is. Этот оператор определяет, относятся ли две ссылочные переменные к одному и тому же экземпляру объекта.

Обратите внимание, что отправитель прошел ByVal. Это означает, что передается копия Button1, а не сам объект. Поэтому, когда Пьер проверяет, являются ли sender и Button1 одним и тем же экземпляром, результатом является False.

Чтобы проверить, была ли нажата кнопка 1 или кнопка 2, вы должны превратить отправителя в фактический объект Button, а затем проверить свойство этого объекта. Обычно используется текст, но вы можете проверить значение в теге или даже в свойстве Location.

Этот код работает:

Dim myButton As Button

myButton = отправитель

Если моя кнопка. Text = "Button1" Тогда

instagram story viewer