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

  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 deklariert Form1 , da WithEvents 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 die LongTask Methode abzubrechen.

Schreiben von Code zum Behandeln eines Ereignisses

Sobald Sie eine Variable mithilfe von WithEventsdeklarieren, 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

  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 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 einem Label-Steuerelement an. Die DoEvents-Methode kann die Beschriftung neu zuordnen und dem Benutzer auch die Möglichkeit geben, auf die Schaltfläche Abbrechen zu klicken.

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

  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 Widget 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 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 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

  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 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 PercentDoneEreignis ausgelöst wird, kurz erneut eintritt. LongTaskForm1

Was würde passieren, wenn die Ausführung wieder im Code der Form1Methode 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 mWidgetzuweisen. 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 wird 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