Пошаговое руководство. Объявление и создание событий (Visual Basic)
В этом пошаговом руководстве показано, как объявлять и вызывать события для класса с именем Widget
. После выполнения действий может потребоваться прочитать раздел компаньона, пошаговое руководство. Обработка событий, в котором показано, как использовать события из Widget
объектов для предоставления сведений о состоянии в приложении.
Класс мини-приложения
Предположим, что у вас есть Widget
класс. Класс Widget
имеет метод, который может занять много времени для выполнения, и вы хотите, чтобы приложение могло разместить какой-то индикатор завершения.
Конечно, объект может Widget
показать диалоговое окно "Процент завершения", но затем вы застряли с этим диалоговым окном в каждом проекте, в котором использовался Widget
класс. Хороший принцип проектирования объектов заключается в том, чтобы приложение, использующее объект, обрабатывало пользовательский интерфейс, если только цель объекта не заключается в управлении формой или диалоговым окном.
Цель Widget
заключается в выполнении других задач, поэтому лучше добавить PercentDone
событие и разрешить процедуре, которая вызывает Widget
методы обработки этого события и отображения обновлений состояния. Событие PercentDone
также может предоставить механизм отмены задачи.
Создание примера кода для этого раздела
Откройте новый проект приложения Windows Visual Basic и создайте форму с именем
Form1
.Добавьте две кнопки и метку
Form1
.Присвойте им имена, как показано в следующей таблице.
Object Свойство Параметр Button1
Text
Запуск задачи Button2
Text
Отменить Label
(Name)
,Text
lblPercentDone, 0 В меню "Проект" выберите "Добавить класс", чтобы добавить класс с именем
Widget.vb
в проект.
Объявление события для класса Мини-приложения
Event
Используйте ключевое слово для объявления события вWidget
классе. Обратите внимание, что событие может иметьByVal
иByRef
аргументы, какWidget
PercentDone
показано в событии:Public Event PercentDone(ByVal Percent As Single, ByRef Cancel As Boolean)
Когда вызывающий PercentDone
объект получает событие, Percent
аргумент содержит процент завершенной задачи. Аргумент Cancel
можно задать для True
отмены метода, вызвавшее событие.
Примечание.
Аргументы событий можно объявлять так же, как и аргументы процедур, используя следующие исключения: события не могут иметь Optional
или ParamArray
аргументы, а события не имеют возвращаемых значений.
Событие PercentDone
вызывается методом LongTask
Widget
класса. LongTask
принимает два аргумента: продолжительность времени, когда метод делает работу, и минимальный интервал времени, прежде чем LongTask
приостанавливать PercentDone
событие.
Вызов события PercentDone
Чтобы упростить доступ к
Timer
свойству, используемому этим классом, добавьтеImports
инструкцию в начало раздела объявлений модуля класса над инструкциейClass Widget
.Imports Microsoft.VisualBasic.DateAndTime
Добавьте в класс
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
секунды. Когда событие возвращается, проверка, чтобы узнатьCancel
, LongTask
задан True
ли аргумент.
Здесь необходимо несколько отказов. Для простоты процедура предполагает, LongTask
что вы знаете заранее, сколько времени займет задача. Это почти никогда не так. Разделение задач на блоки даже размера может быть трудно, и часто важно, чтобы большинство пользователей было просто время, которое проходит, прежде чем они получают признаки того, что что-то происходит.
Возможно, вы заметили еще один недостаток в этом примере. Свойство Timer
возвращает количество секунд, прошедших с полуночи, поэтому приложение зависает, если оно запущено непосредственно до полуночи. Более осторожный подход к измерению времени будет принимать такие условия границы, как это, или избежать их в целом, используя такие свойства, как Now
.
Теперь, когда Widget
класс может вызывать события, можно перейти к следующему пошаговому руководству. Пошаговое руководство. Обработка событий демонстрирует, как использовать WithEvents
для связывания обработчика событий с событиемPercentDone
.