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


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

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

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

Обработка события PercentDone класса Мини-приложения

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

Чтобы выполнить программу, выполните следующие действия.

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

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

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

    Примечание.

    Метод My.Application.DoEvents не обрабатывает события точно так же, как и форма. Например, в этом пошаговом руководстве необходимо дважды нажать кнопку "Отмена ". Чтобы форма обрабатывала события напрямую, можно использовать многопоточность. Дополнительные сведения см. в разделе "Управляемый поток".

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

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

Переменная mWidget может обрабатывать события для другого Widget объекта, назначив ссылку новому WidgetmWidget. На самом деле вы можете сделать код 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 переменных не поддерживаются.

См. также