Exemplarische Vorgehensweise: Deklarieren und Auslösen von Ereignissen

Aktualisiert: November 2007

In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Ereignisse für eine Klasse mit der Bezeichnung Widget deklariert und ausgelöst werden. Nachdem Sie die einzelnen Schritte ausgeführt haben, können Sie bei Interesse auch das an diese Thematik anknüpfende Thema (Exemplarische Vorgehensweise: Behandeln von Ereignissen) lesen. Dort wird gezeigt, wie Ereignisse aus Widget-Objekten verwendet werden, um in einer Anwendung Statusinformationen zur Verfügung zu stellen.

Die Widget-Klasse

Nehmen wir für den Moment einfach an, Sie verfügen über eine Widget-Klasse. Diese Widget-Klasse enthält eine Methode, für deren Ausführung einige Zeit beansprucht wird, und Sie möchten nun, dass die Anwendung in der Lage ist, einen Ausführungsindikator zu erstellen.

Sie können das Widget-Objekt natürlich so deklarieren, dass ein Dialogfeld mit einer Statusanzeige angezeigt wird. In diesem Fall ist jedoch in jedem Projekt, in dem die Widget-Klasse verwendet wurde, dieses Dialogfeld vorhanden. Eine nützliche Regel beim Objektentwurf stellt die Festlegung dar, dass die Benutzeroberfläche von der Anwendung, die ein Objekt verwendet, behandelt wird. Dies gilt nicht, wenn der alleinige Zweck des Objekts darin besteht, ein Formular oder Dialogfeld zu verwalten.

Da Widget auch andere Aufgaben ausführt, sollte ein PercentDone-Ereignis hinzugefügt und für die Behandlung dieses Ereignisses und die Statusanzeige die Prozedur verwendet werden, die die Methoden der Widget-Klasse aufruft. Das PercentDone-Ereignis kann auch einen Mechanismus zum Abbrechen der Aufgabe bereitstellen.

So erstellen Sie das Codebeispiel für dieses Thema

  1. Öffnen Sie ein neues Visual Basic-Windows-Anwendungsprojekt, und erstellen Sie ein Formular mit dem Namen Form1.

  2. Fügen Sie Form1 zwei Schaltflächen und eine Bezeichnung hinzu.

  3. Benennen Sie die Objekte wie in der folgenden Tabelle:

    Objekt

    Eigenschaft

    Einstellung

    Button1

    Text

    Start Task

    Button2

    Text

    Cancel

    Label

    (Name), Text

    lblPercentDone, 0

  4. Klicken Sie im Menü Projekt auf Klasse hinzufügen, um dem Projekt die Klasse Widget.vb hinzuzufügen.

So deklarieren Sie ein Ereignis für die Widget-Klasse

  • Verwenden Sie das Event-Schlüsselwort, um in der Widget-Klasse ein Ereignis zu deklarieren. Ereignisse können über das ByVal-Argument und das ByRef-Argument verfügen. Dies wird im PercentDone-Ereignis von Widget veranschaulicht:

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

Wenn das aufrufende Objekt ein PercentDone-Ereignis erhält, enthält das Percent-Argument den Prozentsatz der Aufgabe, die abgeschlossen wurde. Um die Methode abzubrechen, die das Ereignis ausgelöst hat, kann für das Cancel-Argument der Wert True festgelegt werden.

Hinweis:

Sie können Ereignisargumente auf dieselbe Weise wie Argumente von Prozeduren deklarieren, mit den folgenden Ausnahmen: Ereignisse dürfen keine Optional-Argumente oder ParamArray-Argumente haben und haben keine Rückgabewerte.

Das PercentDone-Ereignis wird von der LongTask-Methode der Widget-Klasse ausgelöst. LongTask benötigt zwei Argumente: die Zeitspanne, die für die Ausführung der Methode vorgegeben wird, und das minimale Zeitintervall, bevor LongTask angehalten wird, um das PercentDone-Ereignis auszulösen.

So lösen Sie das PercentDone-Ereignis aus

  1. Um den Zugriff auf die von dieser Klasse verwendete Timer-Eigenschaft zu vereinfachen, fügen Sie im oberen Bereich des Deklarationsabschnitts des Klassenmoduls über der Class Widget-Anweisung eine Imports-Anweisung ein.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Fügen Sie der Widget-Klasse folgenden Code hinzu:

    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
    

Wenn die Anwendung die LongTask-Methode aufruft, löst die Widget-Klasse in einem Intervall, das mit MinimumInterval Sekunden angegeben wird, das PercentDone-Ereignis aus. Wenn das Ereignis beendet wird, überprüft LongTask, ob das Cancel-Argument auf True festgelegt wurde.

An diesem Punkt müssen einige Einschränkungen gemacht werden. Bei der LongTask-Prozedur wird der Einfachheit halber davon ausgegangen, dass Sie bereits im Voraus wissen, wie lange die Ausführung der Aufgabe dauert. Dies ist unter normalen Umständen nur sehr selten der Fall. Die Aufteilung von Aufgaben in Segmente gleicher Größe kann sich als schwierig erweisen. In den meisten Fällen möchten die Benutzer vor allem wissen, wie viel Zeit vergeht, bis sie darauf hingewiesen werden, dass etwas geschieht.

Möglicherweise haben Sie einen weiteren Schwachpunkt in diesem Beispiel entdeckt. Die Timer-Eigenschaft gibt die Anzahl der seit Mitternacht vergangenen Sekunden zurück. Aus diesem Grund bleibt die Anwendung hängen, wenn sie kurz vor Mitternacht gestartet wurde. Bei einem exakteren Ansatz werden derartige Grenzbedingungen in der Zeitmessung in Betracht gezogen oder durch Verwendung einer Eigenschaft, z. B. Now, vollständig vermieden.

Da die Widget-Klasse jetzt Ereignisse auslösen kann, können Sie mit der nächsten exemplarischen Vorgehensweise fortfahren. In Exemplarische Vorgehensweise: Behandeln von Ereignissen wird veranschaulicht, wie mithilfe von WithEvents dem PercentDone-Ereignis ein Ereignishandler zugeordnet wird.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Behandeln von Ereignissen

Gewusst wie: Schreiben von Ereignishandlern

Konzepte

Ereignisse und Ereignishandler

Delegaten und der AddressOf-Operator

AddHandler und RemoveHandler

Referenz

Timer-Eigenschaft

WithEvents

Now-Eigenschaft

<languageKeyword>Event</languageKeyword>-Anweisung

ByVal

ByRef

Imports-Anweisung (.NET-Namespace und Typ)