Freigeben über


RaiseEvent-Anweisung

Aktualisiert: November 2007

Löst ein Ereignis aus, das auf Modulebene in einer Klasse, einem Formular oder einem Dokument deklariert wurde.

RaiseEvent eventname[( argumentlist )]

Bestandteile

  • eventname
    Erforderlich. Name des auszulösenden Ereignisses.

  • argumentlist
    Optional. Durch Komma getrennte Liste von Variablen, Arrays und Ausdrücken. Das argumentlist-Argument muss in Klammern eingeschlossen werden. Wenn keine Argumente vorhanden sind, müssen die Klammern weggelassen werden.

Hinweise

Der erforderliche eventname ist der Name eines im Modul deklarierten Ereignisses. Der Wert muss der Visual Basic-Namenskonvention für Variablen entsprechen.

Wenn das Ereignis nicht in dem Modul deklariert wurde, in dem es ausgelöst wird, tritt ein Fehler auf. Im folgenden Codefragment werden eine Ereignisdeklaration und eine Prozedur veranschaulicht, 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

Mit RaiseEvent können keine Ereignisse ausgelöst werden, die nicht explizit im Modul deklariert wurden. Beispielsweise erben alle Formulare ein Click-Ereignis von System.Windows.Forms.Form, und es kann nicht mit RaiseEvent in einem abgeleiteten Formular ausgelöst werden Wenn Sie ein Click-Ereignis im Modul des Formulars deklarieren, führt es für das Click-Ereignis des Formulars Shadowing aus. Sie können dennoch das Click-Ereignis des Formulars aufrufen, indem Sie die OnClick-Methode aufrufen.

Ein in Visual Basic definiertes Ereignis löst standardmäßig seine Ereignishandler in der Reihenfolge aus, in der die Verbindungen erstellt werden. Da Ereignisse ByRef-Parameter besitzen können, kann ein Prozess, der später verbunden wird, unter Umständen Parameter erhalten, die von einem vorherigen 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 im Konstruktor der Klasse ausgelöst werden, in der sie deklariert sind. Zwar generieren solche Ereignisse keine Laufzeitfehler, aber sie werden u. U. von zugeordneten Ereignishandlern nicht abgefangen. Verwenden Sie den Shared-Modifizierer, um ein freigegebenes Ereignis zu erstellen, wenn Sie ein Ereignis in einem Konstruktor auslösen müssen.

Sie können das Standardverhalten von Ereignissen ändern, indem Sie ein benutzerdefiniertes Ereignis definieren. Für benutzerdefinierte Ereignisse ruft die RaiseEvent-Anweisung den RaiseEvent-Accessor des Ereignisses auf. Weitere Informationen über benutzerdefinierte Ereignisse finden Sie unter <languageKeyword>Event</languageKeyword>-Anweisung.

Beispiel

Im folgenden Beispiel wird mithilfe von Ereignissen ein Countdown der Sekunden von 10 bis 0 ausgeführt. Der Code veranschaulicht mehrere ereignisbezogene Methoden, Eigenschaften und Anweisungen, einschließlich der RaiseEvent-Anweisung.

Die Klasse, die ein Ereignis auslöst, ist die Ereignisquelle; die Methoden, die das Ereignis verarbeiten, sind die Ereignishandler. Eine Ereignisquelle kann mehrere Handler für die generierten Ereignisse haben. Löst die Klasse das Ereignis aus, so wird dieses Ereignis für jede Klasse ausgelöst, die Ereignisse für diese Instanz des Objekts verarbeitet.

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, wird im ersten Textfeld ein Countdown von 10 bis 0 Sekunden angezeigt. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld "Done" angezeigt.

Der Code für Form1 gibt den Anfangs- und Endstatus des Formulars an. Darüber hinaus enthält er den Code, der beim Auslösen von Ereignissen ausgeführt wird.

Zum Anwenden dieses Beispiels öffnen Sie ein neues Windows-Anwendungsprojekt und fügen dem Hauptformular Form1 die Schaltfläche Button1 und das Textfeld TextBox1 hinzu. Klicken Sie anschließend mit der rechten Maustaste auf das Formular, und klicken Sie auf Code anzeigen, um den Code-Editor zu öffnen.

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

Private WithEvents mText As TimerState

Fügen Sie dem Code für Form1 den folgenden Code hinzu: Ersetzen Sie eventuelle doppelte Prozeduren, wie Form_Load oder Button_Click.

Private Sub Form1_Load(ByVal sender As Object, _
                       ByVal e As System.EventArgs) _
                       Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          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 Starten. Im ersten Textfeld wird der Countdown der Sekunden gestartet. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld "Done" angezeigt.

Hinweis:

Die My.Application.DoEvents-Methode verarbeitet Ereignisse nicht genau auf die gleiche Weise wie das Formular. Damit das Formular die Ereignisse direkt behandeln kann, können Sie Multithreading verwenden. Weitere Informationen finden Sie unter Multithreading in Visual Basic.

Siehe auch

Aufgaben

Gewusst wie: Hinzufügen von Ereignissen zu einer Klasse

Referenz

<languageKeyword>Event</languageKeyword>-Anweisung

AddHandler-Anweisung

RemoveHandler-Anweisung

Handles

Weitere Ressourcen

Ereignisse in Visual Basic