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


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

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

Класс мини-приложения

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

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

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

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

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

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

  3. Назовите объекты, как показано в следующей таблице.

    Объект Недвижимость Настройки
    Button1 Text Запуск задачи
    Button2 Text Отменить
    Label (Name), Text lblПроцентВыполнено, 0
  4. В меню "Проект" выберите "Добавить класс ", чтобы добавить класс с именем Widget.vb в проект.

Объявление события для класса Widget

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

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

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

Замечание

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

Событие PercentDone вызывается методом LongTaskWidget класса. 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 класс вызывает событие каждые PercentDoneMinimumInterval секунды. Когда событие возвращается, LongTask проверяет, установлен ли аргумент Cancel в True.

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

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

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

См. также