Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Это второй из двух разделов, демонстрирующих работу с событиями. В первом разделе, пошаговом руководстве по объявлению и созданию событий, показано, как объявлять и вызывать события. В этом разделе используется форма и класс из того пошагового руководства, чтобы показать, как обрабатывать события, когда они происходят.
В 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, имя переменной отображается в левом раскрывающемся списке редактора кода класса. При выборе mWidgetWidget события класса отображаются в раскрывающемся списке справа. При выборе события отображается соответствующая процедура события с префиксом 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 переменных не поддерживаются.