ПОНЯТНО О Visual Basic NET (том 3)

       

Второй способ обработки событий: Оператор 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


Содержание раздела