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
Öffnen Sie ein neues Windows-Anwendungsprojekt in Visual Basic, und erstellen Sie ein Formular mit dem Namen
Form1
.Fügen Sie zwei Schaltflächen und eine Bezeichnung zu
Form1
hinzu.Benennen Sie die Objekte wie in der folgenden Tabelle gezeigt.
Object Eigenschaft Einstellung Button1
Text
Startaufgabe Button2
Text
Abbrechen Label
(Name)
,Text
lblPercentDone, 0 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 derWidget
-Klasse zu deklarieren. Beachten Sie, dass ein Ereignis das ArgumentByVal
undByRef
aufweisen kann, wie dasPercentDone
-Ereignis vonWidget
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
Um den Zugriff auf die von dieser Klasse verwendete
Timer
-Eigenschaft zu vereinfachen, fügen Sie am Anfang des Deklarationsabschnitts Ihres Klassenmoduls oberhalb derClass Widget
-Anweisung eineImports
-Anweisung hinzu.Imports Microsoft.VisualBasic.DateAndTime
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.