Второй способ обработки событий: Оператор AddHandler
Создайте проект без кнопок. Введите такой код:
Dim b As New Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(b) 'Добавляем новую кнопку в коллекцию
AddHandler
b.Click, AddressOf Обработчик_нажатия_на_кнопку
End Sub
Private Sub Обработчик_нажатия_на_кнопку(ByVal На_кого_нажали As Object, ByVal e As EventArgs)
На_кого_нажали.Text = "Нажали"
На_кого_нажали.Left = На_кого_нажали.Left + 30
End Sub
Поведение кнопки после запуска точно такое же, как и при 1 способе.
Пояснения: Вместо слова WithEvents и фрагмента Handles b.Click мы пишем один оператор:
AddHandler b.Click, AddressOf Обработчик_нажатия_на_кнопку
Слово AddHandler можно перевести как «Добавить обработчик». Слово AddressOf указывает на процедуру-обработчик события, иначе обработчик невозможно было бы найти, ведь в заголовке самого обработчика ничего теперь не указывает на то, какое событие он должен обрабатывать. В целом оператор можно перевести так: «Добавить обработчик события b.Click, находящийся в процедуре Обработчик_нажатия_на_кнопку».
В общем, оператор AddHandler связывает событие с обработчиком. Обратите внимание, что выполняется оператор в процессе выполнения кода проекта и пока он не выполнился, обработка невозможна, то есть нажатие на кнопку ни к чему не будет приводить. Более того, связь эту можно в любое время убрать аналогичным оператором RemoveHandler, после чего кнопка прекратит реагировать на нажатия.
К сожалению, никто нам здесь не предлагал автоматически создать заготовку обработчика.
Несколько обработчиков у одного события. Почему «Добавить» обработчик, а не «Создать»? Потому что обработчиков у одного события может быть много. Если вы хотите, чтобы при наступлении события выполнялась еще одна процедура-обработчик, просто напишите для нее еще один оператор AddHandler:
AddHandler b.Click, AddressOf Еще_один_обработчик_нажатия_на_кнопку
Один обработчик для нескольких событий. И при 2 способе одним обработчиком можно обрабатывать разные события и у разных объектов:
Dim b1, b2 As New Button
Dim t As New TextBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(b1)
Me.Controls.Add(b2)
Me.Controls.Add(t)
AddHandler b1.Click, AddressOf Обработчик_события_с_элементом_упр
AddHandler b2.MouseEnter, AddressOf Обработчик_события_с_элементом_упр
AddHandler t.Click, AddressOf Обработчик_события_с_элементом_упр
End Sub
Private Sub Обработчик_события_с_элементом_упр(ByVal С_кем_произошло_событие As Object, _
ByVal Информация As EventArgs)
С_кем_произошло_событие.Left = С_кем_произошло_событие.Left + 30
End Sub
Здесь путешествовать по форме будут две кнопки и одно текстовое поле, причем первая кнопка и текстовое поле при щелчке, а вторая кнопка – при наведении мыши.
Слуга ста господ. Приятно, что при 2 способе можно обрабатывать события массива объектов, чего не позволяет 1 способ. Вспомним задачу о 40 графических полях с рожицами (15.8). Давайте сделаем так, чтобы щелчок по любому графическому полю заставлял его прыгнуть вверх на 10 пикселей. Вот программа:
Dim Рожица(40) As PictureBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
For i = 1 To 40
Рожица(i) = New PictureBox 'Создаем очередной объект
Рожица(i).SizeMode = PictureBoxSizeMode.AutoSize
Рожица(i).Image = Image.FromFile("FACE02.ICO")
Рожица(i).Top = Me.Height - 50
Рожица(i).Left = 20 * i
Me.Controls.Add(Рожица(i)) 'Добавляем новую рожицу в коллекцию формы
AddHandler Рожица(i).Click, AddressOf Обработчик
Next
End Sub
Private Sub Обработчик(ByVal На_кого_нажали As Object, ByVal e As EventArgs)
На_кого_нажали.Top = На_кого_нажали.Top - 10
End Sub