Пошаговое руководство. Обработка событий (Visual Basic)
Это второй из двух разделов, демонстрирующих работу с событиями. В первом разделе, пошаговом руководстве по объявлению и созданию событий, показано, как объявлять и вызывать события. В этом разделе используется форма и класс из этого пошагового руководства, чтобы показать, как обрабатывать события при их выполнении.
В Widget
примере класса используются традиционные инструкции обработки событий. Visual Basic предоставляет другие методы работы с событиями. В качестве упражнения можно изменить этот пример, чтобы использовать AddHandler
инструкции и Handles
инструкции.
Обработка события PercentDone класса Мини-приложения
Поместите следующий код в
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Ключевое слово
WithEvents
указывает, что переменнаяmWidget
используется для обработки событий объекта. Укажите тип объекта, указав имя класса, из которого будет создан объект.Переменная
mWidget
объявлена вForm1
том, чтоWithEvents
переменные должны быть уровня классами. Это верно независимо от типа класса, в который они помещается.Переменная
mblnCancel
используется для отменыLongTask
метода.
Написание кода для обработки события
Как только вы объявляете переменную с помощьюWithEvents
, имя переменной отображается в левом раскрывающемся списке редактора кода класса. При выборе mWidget
Widget
события класса отображаются в раскрывающемся списке справа. При выборе события отображается соответствующая процедура события с префиксом mWidget
и символом подчеркивания. Все процедуры событий, связанные с переменной WithEvents
, задают имя переменной в качестве префикса.
Чтобы обработать событие
Выберите
mWidget
в раскрывающемся списке слева в редакторе кода.PercentDone
Выберите событие из правого раскрывающегося списка. Редактор кода открывает процедуруmWidget_PercentDone
события.Примечание.
Редактор кода полезен, но не требуется для вставки новых обработчиков событий. В этом пошаговом руководстве более прямо можно скопировать обработчики событий непосредственно в код.
Добавьте следующий код в обработчик событий
mWidget_PercentDone
.Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
Всякий раз, когда
PercentDone
событие возникает, процедура события отображает процент завершения в элементеLabel
управления. ЭтотDoEvents
метод позволяет перезаписи метки, а также дает пользователю возможность нажать кнопку "Отмена ".Добавьте следующий код для обработчика
Button2_Click
событий:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Если пользователь нажимает кнопку "Отмена" во время LongTask
выполнения, Button2_Click
событие выполняется сразу после того, как DoEvents
инструкция разрешает обработку событий. Переменная mblnCancel
уровня класса имеет True
значение , а mWidget_PercentDone
затем событие проверяет его и задает ByRef Cancel
аргумент True
.
Подключение переменную WithEvents в объект
Form1
теперь настроен для обработки Widget
событий объекта. Все, что остается, заключается в том, чтобы найти Widget
где-то.
При объявлении переменной WithEvents
во время разработки объект не связан с ним. Переменная WithEvents
похожа на любую другую переменную объекта. Необходимо создать объект и назначить ссылку на нее переменной WithEvents
.
Создание объекта и назначение ссылки на него
Выберите (события формы1) в раскрывающемся списке слева в редакторе кода.
Load
Выберите событие из правого раскрывающегося списка. Редактор кода открывает процедуруForm1_Load
события.Добавьте следующий код для процедуры события,
Form1_Load
чтобы создать следующуюWidget
команду:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
При выполнении этого кода Visual Basic создает Widget
объект и подключает его события к процедурам событий, связанным с mWidget
. С этого момента всякий раз Widget
, когда вызывает его PercentDone
событие, mWidget_PercentDone
выполняется процедура события.
Вызов метода LongTask
Добавьте следующий код в обработчик событий
Button1_Click
.Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
Перед вызовом LongTask
метода метка, отображающая процент завершения, должна быть инициализирована, а флаг уровня Boolean
класса для отмены метода должен иметь значение False
.
LongTask
вызывается с длительностью задачи 12,2 секунды. Событие PercentDone
вызывается каждые одну треть секунды. При каждом вызове mWidget_PercentDone
события процедура события выполняется.
Когда LongTask
будет выполнено, проверяетсяLongTask
, mblnCancel
закончился ли он обычно, или если он остановлен, так как mblnCancel
задано значение True
. Процент завершения обновляется только в предыдущем случае.
Чтобы выполнить программу, выполните следующие действия.
Нажмите клавишу F5, чтобы поместить проект в режим выполнения.
Нажмите кнопку "Пуск задачи ".
PercentDone
При каждом вызове события метка обновляется с учетом процента выполнения задачи.Нажмите кнопку "Отмена", чтобы остановить задачу. Обратите внимание, что при нажатии кнопки "Отмена" внешний вид кнопки "Отмена " не изменяется сразу. Событие
Click
не может произойти, пока инструкция не разрешает обработкуMy.Application.DoEvents
событий.Примечание.
Метод
My.Application.DoEvents
не обрабатывает события точно так же, как и форма. Например, в этом пошаговом руководстве необходимо дважды нажать кнопку "Отмена ". Чтобы форма обрабатывала события напрямую, можно использовать многопоточность. Дополнительные сведения см. в разделе "Управляемый поток".
Вы можете найти это поучительно для запуска программы с F11 и пошагового выполнения кода строки за раз. Вы можете четко увидеть, как выполняется LongTask
выполнение, а затем кратко повторно вводится Form1
при каждом PercentDone
возникновении события.
Что произойдет, если, хотя выполнение было возвращено в коде Form1
, LongTask
метод был вызван снова? В худшем случае переполнение стека может произойти при LongTask
каждом вызове события.
Переменная mWidget
может обрабатывать события для другого Widget
объекта, назначив ссылку новому Widget
mWidget
. На самом деле вы можете сделать код Button1_Click
таким образом каждый раз, когда нажимаете кнопку.
Обработка событий для другого мини-приложения
Добавьте следующую строку кода в
Button1_Click
процедуру непосредственно перед строкой, которая считываетmWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Приведенный выше код создает новый Widget
при нажатии кнопки. Как только LongTask
метод завершитсяWidget
, ссылка на выпуск Widget
и уничтожена.
Переменная WithEvents
может содержать только одну ссылку на объект одновременно, поэтому при назначении другого Widget
объекта события предыдущего Widget
объекта mWidget
больше не будут обрабатываться. Если mWidget
это единственная переменная объекта, содержащая ссылку на старую Widget
, объект уничтожается. Если вы хотите обрабатывать события из нескольких Widget
объектов, используйте инструкцию AddHandler
для обработки событий из каждого объекта отдельно.
Примечание.
Можно объявить столько WithEvents
переменных, сколько вам нужно, но массивы WithEvents
переменных не поддерживаются.