Поделиться через


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

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

В Widget примере класса используются традиционные инструкции обработки событий. Visual Basic предоставляет другие методы работы с событиями. В качестве упражнения можно изменить этот пример, чтобы использовать операторы AddHandler и Handles.

Чтобы обрабатывать событие PercentDone класса Widget

  1. Поместите следующий код в Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Ключевое WithEvents слово указывает, что переменная mWidget используется для обработки событий объекта. Укажите тип объекта, указав имя класса, из которого будет создан объект.

    Переменная mWidget объявлена в Form1, потому что переменные WithEvents должны быть уровня класса. Это верно независимо от типа класса, в который они будут помещены.

    Переменная mblnCancel используется для отмены LongTask метода.

Написание кода для обработки события

Как только вы объявляете переменную с помощью WithEvents, имя переменной отображается в левом раскрывающемся списке редактора кода класса. При выборе mWidgetWidget события класса отображаются в раскрывающемся списке справа. При выборе события отображается соответствующая процедура события с префиксом 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. Выберите (события формы1) в раскрывающемся списке слева в редакторе кода.

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

Запуск программы

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

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

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

См. также