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


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

Обновлен: Ноябрь 2007

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

Класс Widget

Предположим, что имеется класс Widget. В классе Widget существует метод, который выполняется достаточно долго, и требуется, чтобы приложение каким-либо образом отражало ход выполнения.

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

Класс Widget предназначен для других целей, поэтому предпочтительней будет добавить событие PercentDone и передать процедуре, вызывающей методы Widget, обработку этого события и отображение сведений об изменении состояния. Событие PercentDone может также включать процедуру отмены данной задачи.

Создание примера кода для этого раздела

  1. Откройте новый проект Windows-приложения Visual Basic и создайте форму с именем Form1.

  2. Добавьте на форму Form1 две кнопки и метку.

  3. Присвойте объектам имена, как показано ниже в таблице.

    Объект

    Свойство

    Параметр

    Button1

    Text

    Начать выполнение задачи

    Button2

    Text

    Cancel

    Label

    (Name), Text

    lblPercentDone, 0

  4. В меню Project выберите команду Добавить класс, чтобы добавить класс с именем Widget.vb к проекту.

Чтобы объявить событие для класса Widget

  • Используйте ключевое слово Event для объявления события в классе Widget. Обратите внимание, что событие может иметь аргументы ByVal и ByRef, как событие WidgetPercentDone показывает:

    Public Event PercentDone(ByVal Percent As Single, _
                             ByRef Cancel As Boolean)
    

Когда вызывающий объект получает событие PercentDone, аргумент Percent содержит процент выполнения задачи. Аргументу Cancel может быть присвоено значение True, чтобы отменить вызвавший событие метод.

sc31b696.alert_note(ru-ru,VS.90).gifПримечание.

Аргументы событий можно объявлять таким же образом, как аргументы процедур, за несколькими исключениями: события не могут иметь аргументы Optional или ParamArray и события не возвращают значения.

Событие PercentDone вызывается методом LongTask класса Widget. LongTask получает два аргумента: продолжительность времени стимулирования методом выполнения работы и минимальное время интервала перед паузами LongTask для вызова события PercentDone.

Чтобы вызвать событие PercentDone:

  1. Чтобы упростить доступ к используемому этим классом свойству Timer, добавьте оператор Imports в верхней части раздела объявлений модуля класса над оператором Class Widget.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Добавьте в класс Widget следующий код:

    Public Sub LongTask(ByVal Duration As Single, _
                        ByVal MinimumInterval As Single)
        Dim Threshold As Single
        Dim Start As Single
        Dim blnCancel As Boolean
    
        ' The Timer property of the DateAndTime object returns the seconds
        ' and milliseconds that have passed since midnight.
        Start = CSng(Timer)
        Threshold = MinimumInterval
    
        Do While CSng(Timer) < (Start + Duration)
            ' In a real application, some unit of work would
            ' be done here each time through the loop.
            If CSng(Timer) > (Start + Threshold) Then
                RaiseEvent PercentDone( _
                Threshold / Duration, blnCancel)
                ' Check to see if the operation was canceled.
                If blnCancel Then Exit Sub
                Threshold = Threshold + MinimumInterval
            End If
        Loop
    End Sub
    

Когда приложение вызывает метод LongTask, класс Widget вызывает событие PercentDone каждые MinimumInterval секунд. При возвращении события LongTask, проверяется, задано ли аргументу Cancel значение True.

Необходимо сделать несколько заявлений. Для упрощения задачи в процедуре LongTask предполагается, что время выполнения задачи известно заранее. Так бывает очень редко. Разделение задания на равные части может вызвать трудности, и чаще всего для пользователя самое важное — время, которое пройдет до того, как появятся сведения о происходящем процессе.

В этом примере можно найти еще один недостаток. Свойство Timer возвращает количество секунд, которые прошли с полуночи. Таким образом, приложение зависает, если оно начинает выполняться непосредственно перед полуночью. Для более точного измерения времени следует либо принять во внимание эти ограничения, либо попытаться обойти их, воспользовавшись такими свойствами, как Now.

Теперь класс Widget может порождать события, вы можете перейти к следующему примеру. В Пошаговое руководство. Обработка событий демонстрируется использование WithEvents для связи обработчика событий с событием PercentDone.

См. также

Задачи

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

Практическое руководство. Написание обработчиков событий

Основные понятия

События и обработчики событий

Делегаты и оператор AddressOf

Операторы AddHandler и RemoveHandler

Ссылки

Свойство Timer

WithEvents

Свойство Now

Оператор Event

ByVal

ByRef

Оператор Imports (пространство имен .NET и тип)