Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как объявлять и вызывать события для класса с именем Widget
. После выполнения действий может потребоваться прочитать раздел компаньона, пошаговое руководство. Обработка событий, в котором показано, как использовать события из Widget
объектов для предоставления сведений о состоянии в приложении.
Класс мини-приложения
Предположим, что у вас есть Widget
класс. Класс Widget
имеет метод, который может занять много времени для выполнения, и вы хотите, чтобы приложение могло разместить какой-то индикатор завершения.
Конечно, вы могли бы сделать так, чтобы объект Widget
показывал диалоговое окно "Процент завершения", но тогда вам пришлось бы использовать это диалоговое окно в каждом проекте, в котором вы использовали класс Widget
. Хороший принцип проектирования объектов заключается в том, чтобы приложение, использующее объект, обрабатывало пользовательский интерфейс, если только цель объекта не заключается в управлении формой или диалоговым окном.
Цель Widget
заключается в выполнении других задач, поэтому лучше добавить событие PercentDone
и разрешить процедуре, которая вызывает методы Widget
, обрабатывать это событие и отображать обновления состояния. Событие PercentDone
также может предоставить механизм отмены задачи.
Создание примера кода для этого раздела
Откройте новый проект приложения Windows Visual Basic и создайте форму с именем
Form1
.Добавьте две кнопки и метку
Form1
.Назовите объекты, как показано в следующей таблице.
Объект Недвижимость Настройки Button1
Text
Запуск задачи Button2
Text
Отменить Label
(Name)
,Text
lblПроцентВыполнено, 0 В меню "Проект" выберите "Добавить класс ", чтобы добавить класс с именем
Widget.vb
в проект.
Объявление события для класса Widget
Используйте ключевое
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
секунды. Когда событие возвращается, LongTask
проверяет, установлен ли аргумент Cancel
в True
.
Здесь необходимо сделать несколько оговорок. Для простоты процедура предполагает, LongTask
что вы знаете заранее, сколько времени займет задача. Это почти никогда не так. Разделение задач на блоки равного размера может быть трудно, и часто важно, что для пользователей наиболее значимо просто то количество времени, которое проходит, прежде чем они получат сигнал, что что-то происходит.
Возможно, вы заметили еще один недостаток в этом примере. Свойство Timer
возвращает количество секунд, прошедших с полуночи, поэтому приложение зависает, если оно запущено непосредственно до полуночи. Более осторожный подход к измерению времени будет учитывать такие граничные условия, как это, или полностью избегать их, используя свойства, такие как Now
.
Теперь, когда Widget
класс может вызывать события, можно перейти к следующему пошаговому руководству.
Пошаговое руководство. Обработка событий демонстрирует, как использовать WithEvents
для связывания обработчика событий с событием PercentDone
.