Пошаговое руководство. Обработка событий (Visual Basic)

Это последний из двух разделов, посвященных рассмотрению методов работы с событиями. В первом разделе Пошаговое руководство: объявление и создание событий демонстрировались методы объявления и вызова события. В этом разделе форма и класс из предыдущего пошагового руководства используются для демонстрации способов обработки событий при их возникновении.

В примере класса 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, назначается имя переменной в качестве префикса.

Чтобы обработать событие

  1. Выберите mWidget из левого раскрывающегося списка в редакторе кода.

  2. Выберите событие PercentDone из правого раскрывающегося списка. Редактор кода откроет процедуру обработки события mWidget_PercentDone.

    Примечание

    Использование редактора кода может быть полезным, но он не обязательно для вставки новых обработчиков событий.В данном пошаговом руководстве наиболее простым способом является копирование обработчиков событий непосредственно в код.

  3. В обработчик событий 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 позволяет обновить надпись, а также предоставляет пользователю возможность воспользоваться кнопкой Отмена.

  4. В обработчик события 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. Выберите (События Form1) из левого раскрывающегося списка в редакторе кода.

  2. Выберите событие Load из правого раскрывающегося списка. Редактор кода откроет процедуру обработки события Form1_Load.

  3. Добавьте следующий код к процедуре события 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 в значение True. Значение процента выполнения обновляется только в первом случае.

Чтобы выполнить программу

  1. Нажмите клавишу F5, чтобы перевести проект в режим выполнения.

  2. Нажмите кнопку Запустить задачу . При каждом вызове события PercentDone в надписи обновляется значение процента выполненной работы.

  3. Нажмите кнопку Отмена для отмены задачи. Обратите внимание, что вид кнопки Отмена не меняется сразу после нажатия. Событие Click не происходит до тех пор, пока инструкция My.Application.DoEvents не позволит обработку события.

    Примечание

    Метод My.Application.DoEvents обрабатывает события образом, отличным от формы.Например, в данном пошаговом руководстве необходимо нажать кнопку Отмена дважды.Чтобы разрешить форме непосредственно обрабатывать события, можно использовать многопоточность.Дополнительные сведения см. в разделе Работа с потоками (C# и Visual Basic).

Иногда может понадобиться запустить программу с помощью клавиши F11 с пошаговым выполнением кода. Это позволяет увидеть, как начинается выполнение метода LongTask, а затем форма Form1 появляется при каждом вызове события PercentDone.

Что же произойдет, если метод LongTask будет снова вызван, когда выполнение уже вернулось в код Form1? В худшем случае, если метод LongTask вызывался каждый раз при возникновении данного события, может произойти переполнение стека.

Можно вызвать переменную mWidget для обработки событий для другого объекта Widget путем назначения ссылки на новый Widget переменной mWidget. Действительно, данная операция может выполняться кодом в процедуре Button1_Click при каждом нажатии кнопки.

Чтобы обработать события для другого объекта Widget:

  • Добавьте следующую строку кода в процедуру Button1_Click непосредственно перед строкой, считывающей mWidget.LongTask(12.2, 0.33):

    mWidget = New Widget
    ' Create a new Widget object.
    

Приведенный выше код создает новый объект Widget при каждом нажатии этой кнопки. Как только метод LongTask завершается, ссылка на объект Widget отменяется и объект Widget уничтожается.

Переменная WithEvents может содержать только одну ссылку на объект, поэтому при назначении mWidget нового объекта Widget события предыдущего Widget перестают обрабатываться. Если mWidget является единственной объектной переменной, содержащей ссылку на старый объект Widget, то объект уничтожается. При необходимости обработки событий от нескольких объектов Widget можно использовать оператор AddHandler, чтобы по отдельности обрабатывать события каждого объекта.

Примечание

Можно объявить столько переменных WithEvents, сколько требуется. При этом массивы переменных WithEvents не поддерживаются.

См. также

Задачи

Пошаговое руководство. Объявление и создание событий (Visual Basic)

Другие ресурсы

События (Visual Basic)