Event-Anweisung
Deklariert ein benutzerdefiniertes Ereignis.
Syntax
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname As delegatename _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _
[ Implements implementslist ]
[ <attrlist> ] AddHandler(ByVal value As delegatename)
[ statements ]
End AddHandler
[ <attrlist> ] RemoveHandler(ByVal value As delegatename)
[ statements ]
End RemoveHandler
[ <attrlist> ] RaiseEvent(delegatesignature)
[ statements ]
End RaiseEvent
End Event
Bestandteile
Teil | Beschreibung |
---|---|
attrlist |
Optional. Liste der Attribute, die für dieses Ereignis gelten. Mehrere Attribute werden durch Kommas getrennt. Sie müssen die Attributliste in spitze Klammern ("< " und "> ") einschließen. |
accessmodifier |
Optional. Gibt an, welcher Code auf dieses Ereignis zugreifen kann. Dabei kann es sich um eine der folgenden Methoden handeln: - Public: Code, der auf das Element zugreifen kann, welches ihn deklariert, hat Zugriff. - Protected: Nur Code innerhalb der entsprechenden Klasse oder einer abgeleiteten Klasse hat Zugriff. - Friend: Nur Code in derselben Assembly hat Zugriff. - Private: Nur Code in dm Element, das ihn deklariert, hat Zugriff. - Protected Friend: Nur Code in der Klasse des Ereignisses, einer abgeleiteten Klasse oder derselben Assembly hat Zugriff. - Private Protected: Nur Code in der Klasse des Ereignisses, einer abgeleiteten Klasse oder in derselben Assembly hat Zugriff. |
Shared |
Optional. Gibt an, dass dieses Ereignis nicht mit einer bestimmten Instanz einer Klasse oder Struktur verknüpft ist. |
Shadows |
Optional. Gibt an, dass dieses Ereignis ein identisch benanntes Programmierelement oder einen Satz überladener Elemente in einen Basisklasse erneut deklariert und ausblendet. Sie können ein Shadowing von jedem deklarierten Element mit einer anderen Art vornehmen. Ein schattiertes Element steht in der abgeleiteten Klasse, die es spiegelt, nicht zur Verfügung, und zwar mit Ausnahme von dem Punkt, wo nicht auf das Shadowing-Element zugriffen werden kann. Wenn beispielsweise ein Private -Element ein Basisklassenelement spiegelt, greift der Code, der nicht über die Berechtigung für den Zugriff auf das Private -Element verfügt, anstelle auf das Basisklassenelement zu. |
eventname |
Erforderlich. Der Name des Ereignisses; folgt standardmäßigen Variablennamenskonventionen. |
parameterlist |
Optional. Liste der lokalen Variablen, die die Parameter dieses Ereignisses darstellen. Sie müssen die Parameterliste in Klammern umschließen. |
Implements |
Optional. Gibt an, dass dieses Ereignis ein Ereignis einer Schnittstelle implementiert. |
implementslist |
Erforderlich, wenn Implements angegeben wird. Liste der zu implementierenden Sub -Prozeduren. Mehrere Prozeduren werden durch Kommas getrennt:implementedprocedure [ , implementedprocedure ... ] Jede implementedprocedure weist folgende Syntax und Bestandteile auf:interface .definedname - interface – Erforderlich. Name einer Schnittstelle, die von der in dieser Prozedur enthaltenen Klasse oder Struktur implementiert wird.- Definedname – Erforderlich. Name, wodurch die Prozedur in interface definiert ist. Hierbei muss es sich nicht um demselben Namen wie name (den Namen, den dieser Prozedur verwendet, um die definierte Prozedur zu implementieren) handeln. |
Custom |
Erforderlich. Als Custom deklarierte Ereignisse müssen benutzerdefinierte AddHandler -, RemoveHandler - und RaiseEvent -Accessoren definieren. |
delegatename |
Optional. Der Name eines Delegaten, der die Signatur des Ereignishandlers angibt. |
AddHandler |
Erforderlich. Deklariert eine AddHandler -Zugriffsmethode, die die auszuführenden Anweisungen angibt, wenn ein Ereignishandler hinzugefügt wird, und zwar entweder explizit mithilfe der AddHandler -Anweisung oder implizit mithilfe der Handles -Klausel. |
End AddHandler |
Erforderlich. Beendet den AddHandler -Block. |
value |
Erforderlich. Parametername. |
RemoveHandler |
Erforderlich. Deklariert einen RemoveHandler -Accessor, der die auszuführenden Anweisungen angibt, wenn ein Ereignishandler mithilfe der RemoveHandler -Anweisung entfernt wird. |
End RemoveHandler |
Erforderlich. Beendet den RemoveHandler -Block. |
RaiseEvent |
Erforderlich. Deklariert einen RaiseEvent -Accessor, der die auszuführenden Anweisungen angibt, wenn ein Ereignis mithilfe der RaiseEvent -Anweisung ausgelöst wird. Für gewöhnlich wird dadurch eine Liste der Delegaten aufgerufen, die durch die AddHandler - und RemoveHandler -Accessoren verwaltet werden. |
End RaiseEvent |
Erforderlich. Beendet den RaiseEvent -Block. |
delegatesignature |
Erforderlich. Liste der Parameter, die mit dem Parametern übereinstimmen, die durch das delegatename -Delegat erforderlich sind. Sie müssen die Parameterliste in Klammern umschließen. |
statements |
Optional. Anweisungen, die die Textteile der Methoden AddHandler , RemoveHandler und RaiseEvent enthalten. |
End Event |
Erforderlich. Beendet den Event -Block. |
Bemerkungen
Verwenden Sie nach erfolgter Deklarierung des Ereignisses die Anweisung RaiseEvent
zum Auslösen des Ereignisses. Ein typisches Ereignis könnte analog zur Darstellung in den folgenden Fragmenten deklariert und ausgelöst werden.
Public Class EventSource
' Declare an event.
Public Event LogonCompleted(ByVal UserName As String)
Sub CauseEvent()
' Raise an event on successful logon.
RaiseEvent LogonCompleted("AustinSteele")
End Sub
End Class
Hinweis
Sie können Ereignisargumente deklarieren, wie Sie dies bei Argumenten von Prozeduren vornehmen, und zwar mit den folgenden Ausnahmen: Ereignisse können nicht über benannte Argumente, ParamArray
- oder Optional
-Argumente verfügen. Ereignisse haben keine Rückgabewerte.
Zum Verarbeiten eines Ereignisses müssen Sie es mithilfe der Anweisung Handles
oder AddHandler
mit einer Ereignishandler-Unterroutine verknüpfen. Die Signaturen der Unterroutine und des Ereignisses müssen übereinstimmen. Zum Verarbeiten eines freigegebenen Ereignisses müssen Sie die Anweisung AddHandler
verwenden.
Sie können Event
nur auf Modulebene verwenden. Der Deklarationskontext für ein Ereignis muss demnach eine Klasse, Struktur, ein Modul oder eine Schnittstelle sein und kann weder Quelldatei, Namespace, Prozedur noch Block sein. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.
In den meisten Fällen können Sie zum Deklarieren von Ereignissen die erste Syntax im Syntaxabschnitt dieses Themas verwenden. In einigen Szenarien ist es jedoch erforderlich, dass Sie mehr Kontrolle über das detaillierte Verhalten des Ereignisses verfügen. Die letzte Syntax im Syntaxabschnitt dieses Themas, die das Schlüsselwort Custom
verwendet, enthält diese Steuerung, indem Ihnen ermöglicht wird, benutzerdefinierte Ereignisse zu definieren. In einem benutzerdefinierten Ereignis geben Sie genau an, was geschieht, wenn ein Ereignishandler mithilfe von Code zum Ereignis hinzugefügt oder daraus entfernt wird oder wenn der Code das Ereignis auslöst. Entsprechende Beispiele finden Sie unter Vorgehensweise: Deklarieren von Ereignissen, um Speicherplatz zu sparen und Vorgehensweise: Deklarieren benutzerdefinierter Ereignisse zum Vermeiden der Blockierung.
Beispiel
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. Dies schließt die RaiseEvent
-Anweisung mit ein.
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 Forms-Projekt. Fügen Sie dem Hauptformular mit dem Namen Form1
anschließend 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
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 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
- RaiseEvent-Anweisung
- Implements-Anweisung
- Ereignisse
- AddHandler-Anweisung
- RemoveHandler-Anweisung
- Ziehpunkte
- Delegate-Anweisung
- How to: Deklarieren von benutzerdefinierten Ereignissen zum Einsparen von Arbeitsspeicher
- Vorgehensweise: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeiden
- Freigegeben
- Schatten