Exemplarische Vorgehensweise: Behandeln von Ereignissen (Visual Basic)
Dies ist die zweite von zwei Themen, die veranschaulichen, wie sie mit Ereignissen arbeiten. Das erste Thema, Exemplarische Vorgehensweise: Deklarieren und Auslösen von Ereignissen, zeigt, wie Ereignisse deklariert und ausgelöst werden. In diesem Abschnitt wird das Formular und die Klasse aus dieser exemplarischen Vorgehensweise verwendet, um zu zeigen, wie Ereignisse behandelt werden, wenn sie stattfinden.
Im Widget
-Klassenbeispiel werden herkömmliche Ereignisbehandlungsanweisungen verwendet. Visual Basic bietet weitere Techniken zum Arbeiten mit Ereignissen. Als Übung können Sie dieses Beispiel so ändern, dass sie die AddHandler
- und Handles
-Anweisungen verwendet.
So behandeln Sie das PercentDone-Ereignis der Widget-Klasse
Platzieren Sie den folgenden Code in
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Das
WithEvents
-Schlüsselwort gibt an, dass die VariablemWidget
verwendet wird, um die Ereignisse eines Objekts zu behandeln. Sie geben die Art des Objekts an, indem Sie den Namen der Klasse angeben, aus der das Objekt erstellt wird.Die Variable
mWidget
wird deklariertForm1
, daWithEvents
Variablen Klassenebene sein müssen. Dies gilt unabhängig von der Art der Klasse, in der Sie sie platzieren.Die Variable
mblnCancel
wird verwendet, um dieLongTask
Methode abzubrechen.
Schreiben von Code zum Behandeln eines Ereignisses
Sobald Sie eine Variable mithilfe von WithEvents
deklarieren, wird der Variablenname in der linken Dropdownliste des Code-Editors der Klasse angezeigt. Wenn Sie mWidget
auswählen, werden die Ereignisse der Widget
-Klasse in der rechten Dropdownliste angezeigt. Wenn Sie ein Ereignis auswählen, wird die entsprechende Ereignisprozedur mit dem Präfix mWidget
und einem Unterstrich angezeigt. Alle einer WithEvents
-Variablen zugeordneten Ereignisprozeduren erhalten den Variablennamen als Präfix.
So behandeln Sie ein Ereignis
Wählen Sie
mWidget
aus der linken Dropdownliste im Code-Editor aus.Wählen Sie das
PercentDone
-Ereignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet diemWidget_PercentDone
Ereignisprozedur.Hinweis
Der Code-Editor ist nützlich, aber nicht erforderlich, um neue Ereignishandler einzufügen. In dieser exemplarischen Vorgehensweise ist es direkter, die Ereignishandler direkt in Ihren Code zu kopieren.
Fügen Sie dem
mWidget_PercentDone
-Ereignishandler folgenden Code hinzu:Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
Jedes Mal, wenn das
PercentDone
-Ereignis ausgelöst wird, zeigt die Ereignisprozedur den Prozentsatz abgeschlossen in einemLabel
-Steuerelement an. DieDoEvents
-Methode kann die Beschriftung neu zuordnen und dem Benutzer auch die Möglichkeit geben, auf die Schaltfläche Abbrechen zu klicken.Fügen Sie dem
Button2_Click
-Ereignishandler folgenden Code hinzu.Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Wenn der Benutzer, während LongTask
ausgeführt wird, auf die Schaltfläche Abbrechen klickt, wird das Button2_Click
-Ereignis ausgeführt, sobald die DoEvents
-Anweisung die Ereignisverarbeitung zulässt. Die Variable mblnCancel
auf Klassenebene ist auf True
festgelegt, und das mWidget_PercentDone
-Ereignis testet sie und legt das ByRef Cancel
-Argument auf True
.
Verbinden einer WithEvents-Variablen mit einem Objekt
Form1
ist jetzt für die Behandlung von Ereignissen eines Widget
-Objekts eingerichtet. Alles, was bleibt, ist es, irgendwo Widget
zu finden.
Wenn Sie eine Variable WithEvents
zur Entwurfszeit deklarieren, ist kein Objekt damit verknüpft. Eine WithEvents
-Variable ist wie jede andere Objektvariable. Sie müssen ein Objekt erstellen und ihm einen Verweis mit der WithEvents
-Variablen zuweisen.
So erstellen Sie ein Objekt und weisen ihm einen Verweis zu
Wählen Sie (Form1-Ereignisse) aus der linken Dropdownliste im Code-Editor aus.
Wählen Sie das
Load
-Ereignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet dieForm1_Load
-Ereignisprozedur.Fügen Sie den folgenden Code für die
Form1_Load
Ereignisprozedur hinzu, umWidget
zu erstellen:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
Wenn dieser Code ausgeführt wird, erstellt Visual Basic ein Widget
Objekt und verbindet seine Ereignisse mit den Ereignisprozeduren, die mWidget
zugeordnet sind. Ab diesem Zeitpunkt wird die Ereignisprozedur ausgeführt, mWidget_PercentDone
wenn das Widget
Ereignis ausgelöst PercentDone
wird.
So rufen Sie die LongTask-Methode auf
Fügen Sie dem
Button1_Click
-Ereignishandler folgenden Code hinzu:Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
Bevor die LongTask
-Methode aufgerufen wird, muss die Beschriftung, die den Prozentsatz abgeschlossen anzeigt, initialisiert werden, und das Flag auf Klassenebene Boolean
zum Abbrechen der Methode muss auf festgelegt False
werden.
LongTask
wird mit einer Vorgangsdauer von 12,2 Sekunden aufgerufen. Das PercentDone
Ereignis wird einmal alle ein Drittel einer Sekunde ausgelöst. Jedes Mal, wenn das Ereignis ausgelöst wird, wird die mWidget_PercentDone
Ereignisprozedur ausgeführt.
Wenn LongTask
dies abgeschlossen ist, wird getestet, um festzustellen, mblnCancel
ob LongTask
sie normal beendet wurde oder ob sie beendet wurde, weil mblnCancel
sie auf . True
Der Prozentsatz abgeschlossen wird nur im früheren Fall aktualisiert.
So führen Sie das Programm aus
Drücken Sie F5, um das Projekt im Ausführungsmodus zu platzieren.
Klicken Sie auf die Schaltfläche Aufgabe starten. Jedes Mal, wenn das
PercentDone
-Ereignis ausgelöst wird, wird die Bezeichnung mit dem Prozentsatz der abgeschlossenen Aufgabe aktualisiert.Klicken Sie auf die Schaltfläche Abbrechen, um die Aufgabe zu beenden. Beachten Sie, dass sich das Erscheinungsbild der Schaltfläche Abbrechen nicht sofort ändert, wenn Sie darauf klicken. Das
Click
-Ereignis kann erst ausgeführt werden, wenn die Anweisung dieMy.Application.DoEvents
- Ereignisverarbeitung zulässt.Hinweis
Die
My.Application.DoEvents
-Methode verarbeitet Ereignisse nicht in genau der gleichen Weise wie das Formular. In dieser exemplarischen Vorgehensweise müssen Sie beispielsweise zweimal auf die Schaltfläche Abbrechen klicken. Damit das Formular die Ereignisse direkt verarbeiten kann, können Sie Multithreading verwenden. Weitere Informationen finden Sie unter Verwaltetes Threading.
Sie finden es möglicherweise anweisend, das Programm mit F11 auszuführen und den Code jeweils in einer Zeile zu durchlaufen. Sie können deutlich sehen, wie die Ausführung eintritt, und dann jedes Mal, wenn das PercentDone
Ereignis ausgelöst wird, kurz erneut eintritt. LongTask
Form1
Was würde passieren, wenn die Ausführung wieder im Code der Form1
Methode LongTask
aufgerufen wurde? Im schlimmsten Fall kann ein Stapelüberlauf auftreten, wenn jedes Mal aufgerufen wird, wenn LongTask
das Ereignis ausgelöst wurde.
Sie können dazu führen, dass die Variable mWidget
Ereignisse für ein anderes Widget
Objekt behandelt, indem Sie einen Verweis auf das neue Widget
Objekt mWidget
zuweisen. Tatsächlich können Sie den Code Button1_Click
jedes Mal ausführen, wenn Sie auf die Schaltfläche klicken.
So behandeln Sie Ereignisse für ein anderes Widget
Fügen Sie der Prozedur die folgende Codezeile
Button1_Click
hinzu, unmittelbar vor der Zeile, die gelesen wirdmWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Der obige Code erstellt jedes Mal, wenn auf die Schaltfläche geklickt wird, ein neues Widget
. Sobald die LongTask
Methode abgeschlossen ist, wird der Verweis auf die Widget
Veröffentlichung freigegeben und der Widget
Vorgang zerstört.
Eine WithEvents
Variable kann jeweils nur einen Objektverweis enthalten. Wenn Sie also ein anderes Widget
Objekt mWidget
zuweisen, werden die Ereignisse des vorherigen Widget
Objekts nicht mehr behandelt. Wenn mWidget
es sich um die einzige Objektvariable handelt, die einen Verweis auf das alte Widget
enthält, wird das Objekt zerstört. Wenn Sie Ereignisse aus mehreren Widget
Objekten behandeln möchten, verwenden Sie die AddHandler
Anweisung, um Ereignisse von jedem Objekt separat zu verarbeiten.
Hinweis
Sie können beliebig viele WithEvents
Variablen deklarieren, Arrays von WithEvents
Variablen werden jedoch nicht unterstützt.