Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 werden das Formular und die Klasse aus der Schritt-für-Schritt-Anleitung 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 es 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 BooleanDas
WithEventsSchlüsselwort gibt an, dass die VariablemWidgetverwendet 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
mWidgetwird inForm1deklariert, daWithEvents-Variablen auf Klassenebene sein müssen. Dies gilt unabhängig von der Art der Klasse, in der Sie sie platzieren.Die Variable
mblnCancelwird verwendet, um dieLongTaskMethode abzubrechen.
Schreiben von Code zum Behandeln eines Ereignisses
Sobald Sie eine Variable mithilfe WithEventsdeklarieren, wird der Variablenname in der linken Dropdownliste des Code-Editors der Klasse angezeigt. Wenn Sie diese Option auswählen mWidget, 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
mWidgetaus der linken Dropdownliste im Code-Editor aus.Wählen Sie das
PercentDoneEreignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet diemWidget_PercentDoneEreignisprozedur.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_PercentDoneEreignishandler den 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 SubJedes Mal, wenn das
PercentDoneEreignis ausgelöst wird, zeigt die Ereignisprozedur den Prozentsatz der Fertigstellung in einemLabelSteuerelement an. Die MethodeDoEventsermöglicht es, die Beschriftung neu zu zeichnen und dem Benutzer die Möglichkeit zu geben, auf die Schaltfläche "Abbrechen" zu klicken.Fügen Sie den folgenden Code für den
Button2_ClickEreignishandler 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 der Ausführung auf die Schaltfläche LongTask" klickt, wird das Button2_Click Ereignis ausgeführt, sobald die DoEvents Anweisung die Ereignisverarbeitung zulässt. Die auf Klassenebene definierte Variable mblnCancel ist auf True gesetzt, und das mWidget_PercentDone-Ereignis testet sie und legt das ByRef Cancel-Argument auf True fest.
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
LoadEreignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet dieForm1_LoadEreignisprozedur.Fügen Sie den folgenden Code für die
Form1_LoadEreignisprozedur hinzu, um folgendesWidgetzu 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 zugeordnet sind mWidget. Ab diesem Zeitpunkt wird die Ereignisprozedur ausgeführt, Widget wenn das PercentDone Ereignis ausgelöst mWidget_PercentDone wird.
So rufen Sie die LongTask-Methode auf
Fügen Sie dem
Button1_ClickEreignishandler den 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 Falsewerden.
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 erledigt ist, wird mblnCancel getestet, um festzustellen, ob LongTask normal beendet wurde oder ob es gestoppt wurde, weil mblnCancel auf True gesetzt wurde. Der Prozentsatz der Fertigstellung wird nur im ersteren 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
PercentDoneEreignis 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.DoEventsMethode verarbeitet Ereignisse nicht auf genau die gleiche 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 "Verwalteter 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 in LongTask eintritt und dann bei jedem Auslösen des Form1-Ereignisses kurz wieder in PercentDone eintritt.
Was würde passieren, wenn während der Ausführung zurück im Code von Form1 die Methode LongTask erneut aufgerufen würde? Im schlimmsten Fall kann ein Stapelüberlauf auftreten, wenn LongTask jedes Mal aufgerufen wird, wenn das Ereignis ausgelöst wird.
Sie können die Variable mWidget dazu bringen, Ereignisse für ein anderes Widget-Objekt zu behandeln, indem Sie einen Verweis auf das neue Widget-Objekt mWidget zuweisen. Tatsächlich können Sie bewirken, dass der Code in Button1_Click jedes Mal ausgeführt wird, 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_Clickhinzu, unmittelbar vor der Zeile, die lautetmWidget.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 mWidgetzuweisen, 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 Widgetenthä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.