Exemplarische Vorgehensweise: Deklarieren und Auslösen von Ereignissen (Visual Basic)

In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Ereignisse für eine Klasse namens Widget deklariert und ausgelöst werden. Nachdem Sie die Schritte ausgeführt haben, sollten Sie das Begleitthema Exemplarische Vorgehensweise: Behandeln von Ereignissen lesen, in dem gezeigt wird, wie Ereignisse aus Widget-Objekten verwendet werden, um Statusinformationen in einer Anwendung bereitzustellen.

Die Widget-Klasse

Nehmen Sie für den Moment an, dass Sie über eine Widget-Klasse verfügen. Ihre Widget-Klasse verfügt über eine Methode, deren Ausführung sehr lange dauern kann, und Sie möchten, dass Ihre Anwendung eine Art Abschlussindikator erstellen kann.

Natürlich könnten Sie veranlassen, dass das Widget-Objekt ein Dialogfeld mit dem prozentualen Abschlussstatus anzeigt, aber dann hätten Sie dieses Dialogfeld in jedem Projekt, in dem Sie die Widget-Klasse verwendet haben. Ein gutes Prinzip des Objektentwurfs besteht darin, die Anwendung, die ein Objekt verwendet, die Benutzeroberfläche handhaben zu lassen – es sei denn, der gesamte Zweck des Objekts besteht darin, ein Formular oder Dialogfeld zu verwalten.

Der Zweck von Widget besteht darin, andere Aufgaben auszuführen. Daher ist es besser, ein PercentDone-Ereignis hinzuzufügen und die Prozedur, die die Methoden von Widget aufruft, dieses Ereignis verarbeiten und Statusaktualisierungen anzeigen zu lassen. 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 Windows-Anwendungsprojekt in Visual Basic, und erstellen Sie ein Formular mit dem Namen Form1.

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

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

    Object Eigenschaft Einstellung
    Button1 Text Startaufgabe
    Button2 Text Abbrechen
    Label (Name), Text lblPercentDone, 0
  4. Wählen Sie im Menü Projekt die Option Klasse hinzufügen aus, um dem Projekt eine Klasse namens Widget.vb hinzuzufügen.

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

  • Verwenden Sie das Schlüsselwort Event, um ein Ereignis in der Widget-Klasse zu deklarieren. Beachten Sie, dass ein Ereignis das Argument ByValund ByRef aufweisen kann, wie das PercentDone-Ereignis von Widget veranschaulicht:

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

Wenn das aufrufende Objekt ein PercentDone-Ereignis empfängt, enthält das Percent-Argument den Prozentsatz, den die Aufgabe abgeschlossen ist. Das Cancel-Argument kann auf True festgelegt werden, um die Methode abzubrechen, die das Ereignis ausgelöst hat.

Hinweis

Sie können Ereignisargumente deklarieren, wie Sie dies bei Argumenten von Prozeduren machen, und zwar mit den folgenden Ausnahmen: Ereignisse können keine Optional- oder ParamArray-Argumente haben, und Ereignisse haben keine Rückgabewerte.

Das PercentDone-Ereignis wird von der LongTask-Methode der Widget-Klasse ausgelöst. LongTask akzeptiert zwei Argumente: die Zeitspanne, die die Methode vorgibt, Arbeit zu erledigen, 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 am Anfang des Deklarationsabschnitts Ihres Klassenmoduls oberhalb der Class Widget-Anweisung eine Imports-Anweisung hinzu.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Fügen Sie der Widget-Klasse den 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 Ihre Anwendung die LongTask-Methode aufruft, löst die Widget-Klasse das PercentDone-Ereignis alle MinimumInterval Sekunden aus. Wenn das Ereignis zurückgegeben wird, überprüft LongTask, ob das Cancel-Argument auf True festgelegt wurde.

An dieser Stelle sind einige Vorbehalte angebracht. Der Einfachheit halber setzt die Prozedur LongTask voraus, dass Sie im Voraus wissen, wie lange die Aufgabe dauern wird. Dies ist praktisch nie der Fall. Das Aufteilen von Aufgaben in Blöcke gleicher Größe kann schwierig sein, und häufig ist Benutzern lediglich die Zeit am wichtigsten, die vergeht, bis sie einen Hinweis darauf erhalten, dass etwas passiert.

Möglicherweise haben Sie eine weitere Unstimmigkeit in diesem Beispiel erkannt. Die Timer-Eigenschaft gibt die Anzahl der Sekunden zurück, die seit Mitternacht vergangen sind. Daher bleibt die Anwendung hängen, wenn sie ganz kurz vor Mitternacht gestartet wird. Bei einem sorgfältigeren Ansatz zum Messen der Zeit würden Randbedingungen wie diese berücksichtigt oder ganz vermieden, indem Eigenschaften wie Now verwendet würden.

Nachdem die Widget-Klasse nun Ereignisse auslösen kann, können Sie mit der nächsten exemplarischen Vorgehensweise fortfahren. Die Exemplarische Vorgehensweise: Behandeln von Ereignissen veranschaulicht, wie sie WithEvents verwenden, um dem PercentDone-Ereignis einen Ereignishandler zuzuordnen.

Siehe auch