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

В этом пошаговом руководстве показано, как объявить и вызвать события для класса с именем Widget.This walkthrough demonstrates how to declare and raise events for a class named Widget. После выполнения этих действий может потребоваться прочитать сопутствующий раздел Пошаговое руководство. Обработка событий, в которой показано, как использовать события из Widget объектов для предоставления сведений о состоянии в приложении.After you complete the steps, you might want to read the companion topic, Walkthrough: Handling Events, which shows how to use events from Widget objects to provide status information in an application.

Класс WidgetThe Widget Class

Предположим, что в момент, когда у вас есть Widget класс.Assume for the moment that you have a Widget class. Класс Widget содержит метод, выполнение которого может занять много времени, и вы хотите, чтобы приложение могло поместить какой-либо индикатор завершения.Your Widget class has a method that can take a long time to execute, and you want your application to be able to put up some kind of completion indicator.

Конечно, можно сделать так, чтобы объект Widget отображал диалоговое окно «процент завершения», но это диалоговое окно будет зависнуть в каждом проекте, где использовался класс Widget.Of course, you could make the Widget object show a percent-complete dialog box, but then you would be stuck with that dialog box in every project in which you used the Widget class. Хорошим принципом проектирования объектов является предоставление приложению, использующему объект, обработку пользовательского интерфейса, если только цель объекта не заключается в управлении формой или диалоговым окном.A good principle of object design is to let the application that uses an object handle the user interface—unless the whole purpose of the object is to manage a form or dialog box.

Целью Widget является выполнение других задач, поэтому лучше добавить событие PercentDone и позволить процедуре, вызывающей Widgetметоды, обменять это событие и отображать обновления состояния.The purpose of Widget is to perform other tasks, so it is better to add a PercentDone event and let the procedure that calls Widget's methods handle that event and display status updates. Событие PercentDone может также предоставлять механизм отмены задачи.The PercentDone event can also provide a mechanism for canceling the task.

Создание примера кода для этого разделаTo build the code example for this topic

  1. Откройте новый проект приложения Windows Visual Basic и создайте форму с именем Form1.Open a new Visual Basic Windows Application project and create a form named Form1.

  2. Добавьте две кнопки и метку для Form1.Add two buttons and a label to Form1.

  3. Присвойте им имена, как показано в следующей таблице.Name the objects as shown in the following table.

    ObjectObject СвойствоProperty ПараметрSetting
    Button1 Text Задача запускаStart Task
    Button2 Text ОтменаCancel
    Label (Name), Text(Name), Text Лблперцентдоне, 0lblPercentDone, 0
  4. В меню проект выберите команду Добавить класс , чтобы добавить класс с именем Widget.vb в проект.On the Project menu, choose Add Class to add a class named Widget.vb to the project.

Объявление события для класса WidgetTo declare an event for the Widget class

  • Используйте ключевое слово Event для объявления события в классе Widget.Use the Event keyword to declare an event in the Widget class. Обратите внимание, что событие может иметь ByVal и ByRef аргументов, как событие PercentDone Widgetдемонстрируется следующим образом:Note that an event can have ByVal and ByRef arguments, as Widget's PercentDone event demonstrates:

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

Когда вызывающий объект получает событие PercentDone, аргумент Percent содержит процент завершенной задачи.When the calling object receives a PercentDone event, the Percent argument contains the percentage of the task that is complete. Аргумент Cancel может иметь значение True, чтобы отменить метод, вызвавший событие.The Cancel argument can be set to True to cancel the method that raised the event.

Примечание

Аргументы событий можно объявлять точно так же, как аргументы процедур, со следующими исключениями: события не могут иметь Optional или ParamArray аргументов, а события не имеют возвращаемых значений.You can declare event arguments just as you do arguments of procedures, with the following exceptions: Events cannot have Optional or ParamArray arguments, and events do not have return values.

Событие PercentDone вызывается методом LongTask класса Widget.The PercentDone event is raised by the LongTask method of the Widget class. LongTask принимает два аргумента: время, в течение которого метод должен выполнять работу, и минимальный интервал времени до приостановки LongTask для вызова события PercentDone.LongTask takes two arguments: the length of time the method pretends to be doing work, and the minimum time interval before LongTask pauses to raise the PercentDone event.

Вызов события PercentDoneTo raise the PercentDone event

  1. Чтобы упростить доступ к свойству Timer, используемому этим классом, добавьте оператор Imports в верхнюю часть раздела объявлений модуля класса, над инструкцией Class Widget.To simplify access to the Timer property used by this class, add an Imports statement to the top of the declarations section of your class module, above the Class Widget statement.

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

    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 секунд.When your application calls the LongTask method, the Widget class raises the PercentDone event every MinimumInterval seconds. При возвращении события LongTask проверяет, установлено ли для аргумента Cancel значение True.When the event returns, LongTask checks to see if the Cancel argument was set to True.

Здесь требуется несколько отказов от ответственности.A few disclaimers are necessary here. Для простоты LongTask процедура предполагает, что вы заранее понимаете, сколько времени займет задача.For simplicity, the LongTask procedure assumes you know in advance how long the task will take. Это практически не так.This is almost never the case. Разделение задач на фрагменты даже размера может быть трудной задачей, и часто самое важное для пользователей — просто время, прошедшего до того, как получится, что что-то происходит.Dividing tasks into chunks of even size can be difficult, and often what matters most to users is simply the amount of time that passes before they get an indication that something is happening.

Возможно, вы заметили другой изъян в этом примере.You may have spotted another flaw in this sample. Свойство Timer возвращает число секунд, прошедших с полуночи; Поэтому приложение зависает, если оно запускается непосредственно перед полуночью.The Timer property returns the number of seconds that have passed since midnight; therefore, the application gets stuck if it is started just before midnight. Более аккуратный подход к измерению времени приведет к рассмотрению таких условий, как это необходимо для рассмотрения, или избежать их вообще, используя такие свойства, как Now.A more careful approach to measuring time would take boundary conditions such as this into consideration, or avoid them altogether, using properties such as Now.

Теперь, когда класс Widget может создавать события, можно перейти к следующему пошаговому руководству.Now that the Widget class can raise events, you can move to the next walkthrough. Пошаговое руководство. Обработка событий демонстрирует использование WithEvents для связывания обработчика событий с событием PercentDone.Walkthrough: Handling Events demonstrates how to use WithEvents to associate an event handler with the PercentDone event.

См. такжеSee also