Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это второй из двух разделов, демонстрирующих работу с событиями. В первом разделе, пошаговом руководстве по объявлению и созданию событий, показано, как объявлять и вызывать события. В этом разделе используется форма и класс из того пошагового руководства, чтобы показать, как обрабатывать события, когда они происходят.
В Widget
примере класса используются традиционные инструкции обработки событий. Visual Basic предоставляет другие методы работы с событиями. В качестве упражнения можно изменить этот пример, чтобы использовать операторы AddHandler
и Handles
.
Чтобы обрабатывать событие PercentDone класса Widget
Поместите следующий код в
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
завершено, проверяется, завершился ли mblnCancel
нормально или остановился, потому что LongTask
установлено значение mblnCancel
. Процент завершения обновляется только в предыдущем случае.
Запуск программы
Нажмите клавишу 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
объекта события предыдущего mWidget
объекта Widget
больше не будут обрабатываться. Если mWidget
это единственная переменная объекта, содержащая ссылку на старую Widget
, объект уничтожается. Если вы хотите обрабатывать события из нескольких Widget
объектов, используйте инструкцию AddHandler
для обработки событий из каждого объекта отдельно.
Замечание
Можно объявить столько WithEvents
переменных, сколько вам нужно, но массивы WithEvents
переменных не поддерживаются.