Freigeben über


Anleitung: 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 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

  1. Platzieren Sie den folgenden Code in Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Das WithEvents Schlüsselwort gibt an, dass die Variable mWidget 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 in Form1 deklariert, da WithEvents-Variablen auf Klassenebene sein müssen. Dies gilt unabhängig von der Art der Klasse, in der Sie sie platzieren.

    Die Variable mblnCancel wird verwendet, um die LongTask Methode 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

  1. Wählen Sie mWidget aus der linken Dropdownliste im Code-Editor aus.

  2. Wählen Sie das PercentDone Ereignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet die mWidget_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.

  3. Fügen Sie dem mWidget_PercentDone Ereignishandler 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 Sub
    

    Jedes Mal, wenn das PercentDone Ereignis ausgelöst wird, zeigt die Ereignisprozedur den Prozentsatz der Fertigstellung in einem Label Steuerelement an. Die Methode DoEvents ermöglicht es, die Beschriftung neu zu zeichnen und dem Benutzer die Möglichkeit zu geben, auf die Schaltfläche "Abbrechen" zu klicken.

  4. Fügen Sie den folgenden Code für den Button2_Click Ereignishandler 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

  1. Wählen Sie (Form1-Ereignisse) aus der linken Dropdownliste im Code-Editor aus.

  2. Wählen Sie das Load Ereignis aus der rechten Dropdownliste aus. Der Code-Editor öffnet die Form1_Load Ereignisprozedur.

  3. Fügen Sie den folgenden Code für die Form1_Load Ereignisprozedur hinzu, um folgendes Widgetzu 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_Click Ereignishandler 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

  1. Drücken Sie F5, um das Projekt im Ausführungsmodus zu platzieren.

  2. 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.

  3. 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 die My.Application.DoEvents- Ereignisverarbeitung zulässt.

    Hinweis

    Die My.Application.DoEvents Methode 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_Click hinzu, unmittelbar vor der Zeile, die lautet mWidget.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.

Siehe auch