RaiseEvent-Anweisung
Löst ein Ereignis aus, das auf Modulebene in einer Klasse, einem Formular oder einem Dokument deklariert wurde.
RaiseEvent eventname[( argumentlist )]
Teile
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 werdenWenn 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. |
Hinweis |
---|
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 Event-Anweisung. |
Beispiel
Im folgenden Beispiel dienen Ereignisse zum Herunterzählen von Sekunden von 10 bis 0.Im Code werden mehrere der ereignisbezogenen Methoden, Eigenschaften und Anweisungen, einschließlich der RaiseEvent-Anweisung, veranschaulicht.
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() 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 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 Threading (C# und Visual Basic). |
Siehe auch
Referenz
Handles-Klausel (Visual Basic)