RaiseEvent-Anweisung

Löst ein Ereignis aus, das auf Modulebene innerhalb einer Klasse, eines Formulars oder eines Dokuments deklariert wurde.

Syntax

RaiseEvent eventname[( argumentlist )]  

Bestandteile

eventname
Erforderlich. Name des Ereignisses, das ausgelöst werden soll.

argumentlist
Optional. Kommagetrennte Liste von Variablen, Arrays oder Ausdrücken. Das argumentlist-Argument muss in Klammern stehen. Sind keine Argumente vorhanden, können werden keine Klammern verwendet werden.

Bemerkungen

Der erforderliche eventname ist der Name eines Ereignisses, das innerhalb des Moduls deklariert wurde. Er folgt den Benennungskonventionen von Visual Basic-Variablen.

Wenn das Ereignis nicht innerhalb des Moduls deklariert wurde, in dem es ausgelöst wird, tritt ein Fehler auf. Das folgende Codefragment veranschaulicht eine Ereignisdeklaration und eine Prozedur, in der das Ereignis ausgelöst wird.

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

Sie können RaiseEvent nicht verwenden, um Ereignisse auszulösen, die nicht explizit im Modul deklariert sind. Beispielsweise erben alle Formulare ein Click-Ereignis von System.Windows.Forms.Form, dieses kann nicht mit RaiseEvent in einem abgeleiteten Formular ausgelöst werden. Wenn Sie ein Click-Ereignis im Formularmodul deklarieren, wird es ein Shadowing für das formulareigene Click-Ereignis durchführen. Sie können das Click-Ereignis des Formulars weiterhin aufrufen, indem Sie die OnClick-Methode aufrufen.

Standardmäßig löst ein in Visual Basic definiertes Ereignis seine Ereignishandler in der Reihenfolge aus, in der die Verbindungen hergestellt werden. Da Ereignisse ByRef-Parameter aufweisen können, kann ein Prozess, der eine späte Verbindung herstellt, Parameter erhalten, die von einem früheren Ereignishandler geändert wurden. Nachdem die Ereignishandler ausgeführt wurden, wird die Steuerung an die Unterroutine zurückgegeben, die das Ereignis ausgelöst hat.

Hinweis

Nicht freigegebene Ereignisse sollten nicht innerhalb des Konstruktors der Klasse ausgelöst werden, in der sie deklariert werden. Obwohl solche Ereignisse keine Laufzeitfehler verursachen, können sie möglicherweise nicht von zugeordneten Ereignishandlern erfasst werden. Verwenden Sie den Shared-Modifizierer, um ein freigegebenes Ereignis zu erstellen, wenn Sie ein Ereignis von einem Konstruktor auslösen müssen.

Hinweis

Sie können das Standardverhalten von Ereignissen ändern, indem Sie ein benutzerdefiniertes Ereignis definieren. Bei benutzerdefinierten Ereignissen ruft die RaiseEvent-Anweisung den RaiseEvent-Accessor des Ereignisses auf. Weitere Informationen zu benutzerdefinierten Ereignissen finden Sie unter Event-Anweisung.

Beispiel 1

Im folgenden Beispiel werden Ereignisse zum Herunterzählen der Sekunden von 10 bis 0 verwendet. Der Code veranschaulicht mehrere der ereignisbezogene Methoden, Eigenschaften und Anweisungen, einschließlich der RaiseEvent-Anweisung.

Die Klasse, die ein Ereignis auslöst, ist die Ereignisquelle, und die Methoden, die das Ereignis verarbeiten, sind die Ereignishandler. Eine Ereignisquelle kann über mehrere Handler für die Ereignisse verfügen, die sie generiert. Wenn die Klasse das Ereignis auslöst, wird dieses Ereignis in jeder Klasse ausgelöst, die das Verarbeiten von Ereignissen für diese Instanz des Objekts ausgewählt hat.

Im Beispiel wird außerdem ein Formular (Form1) mit einer Schaltfläche (Button1) und einem Textfeld (TextBox1) verwendet. Wenn Sie auf die Schaltfläche klicken, zeigt das erste Textfeld einen Countdown von 10 bis 0 Sekunden an. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld „Fertig“ angezeigt.

Der Code für Form1 gibt die Anfangs- und Beendigungsstatus des Formulars an. Er enthält zudem den Code, der ausgeführt wird, wenn Ereignisse ausgelöst werden.

Um dieses Beispiel zu verwenden, öffnen Sie ein neues Windows-Anwendungsprojekt, und fügen Sie dem Hauptformular mit dem Namen Form1 eine Schaltfläche mit dem Namen Button1 und ein Textfeld mit dem Namen TextBox1 hinzu. Klicken Sie dann mit der rechten Maustaste auf das Formular, und klicken Sie auf Code anzeigen, um den Code-Editor zu öffnen.

Fügen Sie eine WithEvents-Variable zum Deklarationsabschnitt der Form1-Klasse hinzu.

Private WithEvents mText As TimerState

Beispiel 2

Fügen Sie den folgenden Code zum Code für Form1 hinzu. Ersetzen Sie ggf. vorhandene doppelte Prozeduren, beispielsweise Form_Load oder Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Drücken Sie F5, um das vorherige Beispiel auszuführen, und klicken Sie auf die Schaltfläche Start. Im ersten Textfeld werden die Sekunden heruntergezählt. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld „Fertig“ angezeigt.

Hinweis

Die My.Application.DoEvents-Methode verarbeitet Ereignisse nicht in genau der gleichen Weise wie das Formular. Damit das Formular die Ereignisse direkt verarbeiten kann, können Sie Multithreading verwenden. Weitere Informationen finden Sie unter Verwaltetes Threading.

Siehe auch