Ereignisse (Visual Basic)

Sie können sich ein Visual Studio-Projekt als eine Reihe von Prozeduren vorstellen, die nacheinander ausgeführt werden, doch sind die meisten Programme tatsächlich ereignisgesteuert. Das bedeutet, dass der Ausführungsablauf von externen Vorkommnissen bestimmt wird, die als Ereignisse bezeichnet werden.

Ein Ereignis ist ein Signal, das eine Anwendung darüber informiert, dass etwas Wichtiges geschehen ist. Wenn ein Benutzer beispielsweise auf ein Steuerelement in einem Formular klickt, löst das Formular ein Click-Ereignis aus und ruft eine Prozedur auf, die das Ereignis behandelt. Ereignisse ermöglichen zudem die Kommunikation zwischen separaten Tasks. Beispiel: Die Anwendung führt separat von der Hauptanwendung einen Sortiertask aus. Wenn ein Benutzer den Sortiervorgang abbricht, kann die Anwendung ein Cancel-Ereignis senden, das den Abbruch des Sortiervorgangs veranlasst.

Ereignisse – Begriffe und Konzepte

In diesem Abschnitt werden die in Visual Basic im Zusammenhang mit Ereignissen verwendeten Begriffe und Konzepte erläutert.

Deklarieren von Ereignissen

Ereignisse werden innerhalb von Klassen, Strukturen, Modulen und Schnittstellen mithilfe des Event-Schlüsselworts deklariert, wie im folgenden Beispiel dargestellt:

Event AnEvent(ByVal EventNumber As Integer)

Auslösen von Ereignissen

Ein Ereignis ist mit einer Nachricht vergleichbar, die bekannt gibt, dass etwas Wichtiges geschehen ist. Das Senden der Nachricht wird als Auslösen des Ereignisses bezeichnet. In Visual Basic lösen Sie Ereignisse mit der RaiseEvent-Anweisung aus, wie im folgenden Beispiel veranschaulicht:

RaiseEvent AnEvent(EventNumber)

Ereignisse müssen im Geltungsbereich der Klasse, des Moduls oder der Struktur ausgelöst werden, in der bzw. dem sie deklariert wurden. So kann beispielsweise eine abgeleitete Klasse keine Ereignisse auslösen, die von einer Basisklasse geerbt wurden.

Ereignissender

Jedes Objekt, das in der Lage ist, ein Ereignis auszulösen, ist ein Ereignissender (auch Ereignisquelle genannt). Formulare, Steuerelemente und benutzerdefinierte Objekte sind Beispiele für Ereignissender.

Ereignishandler

Ereignishandler sind Prozeduren, die aufgerufen werden, wenn ein entsprechendes Ereignis eintritt. Jede gültige Unterroutine mit einer übereinstimmenden Signatur kann als Ereignishandler verwendet werden. Funktionen können jedoch nicht als Ereignishandler verwendet werden, da sie keinen Wert an die Ereignisquelle zurückgeben können.

Visual Basic verwendet eine standardmäßige Benennungskonvention für Ereignishandler, die den Namen des Ereignissenders, einen Unterstrich und dem Namen des Ereignisses kombiniert. Das Click-Ereignis einer Schaltfläche mit dem Namen button1 heißt beispielsweise Sub button1_Click.

Hinweis

Beim Definieren von Ereignishandlern für Ihre Ereignisse empfiehlt sich die Verwendung dieser Benennungskonvention, sie ist jedoch nicht erforderlich. Sie können stattdessen auch jeden gültigen Unterroutinennamen verwenden.

Verknüpfen von Ereignissen mit Ereignishandlern

Bevor ein Ereignishandler verwendet werden kann, müssen Sie ihn über die Handles- oder die AddHandler-Anweisung mit einem Ereignis verknüpfen.

WithEvents und die Handles-Klausel

Die WithEvents-Anweisung und die Handles-Klausel bieten die Möglichkeit, Ereignishandler per Deklaration festzulegen. Ein Ereignis, das durch ein mit dem WithEvents-Schlüsselwort deklariertes Objekt ausgelöst wird, kann von einer beliebigen Prozedur mit einer Handles-Anweisung für dieses Ereignis behandelt werden (siehe folgendes Beispiel):

' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.
Sub TestEvents()
    EClass.RaiseEvents()
End Sub

' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
    MsgBox("Received Event.")
End Sub

Class EventClass
    Public Event XEvent()
    Public Event YEvent()
    ' RaiseEvents raises both events.
    Sub RaiseEvents()
        RaiseEvent XEvent()
        RaiseEvent YEvent()
    End Sub
End Class

Die WithEvents-Anweisung und die Handles-Klausel sind häufig die beste Wahl für Ereignishandler, da die hier verwendete Deklarationssyntax das Programmieren, Lesen und Debuggen der Ereignisbehandlung vereinfacht. Beachten Sie jedoch die folgenden Einschränkungen bei der Verwendung von WithEvents-Variablen:

  • Sie können eine WithEvents-Variable nicht als Objektvariable verwenden. Dies bedeutet, dass Sie die Variable nicht als Object deklarieren können, sondern den Klassennamen angeben müssen, wenn Sie die Variable deklarieren.

  • Da freigegebene Ereignisse nicht an Klasseninstanzen gebunden sind, können Sie WithEvents nicht für die deklarative Behandlung freigegebener Ereignisse verwenden. Ebenso können Sie WithEvents oder Handles nicht zum Behandeln von Ereignissen aus einer Structure verwenden. In beiden Fällen können Sie diese Ereignisse mit der AddHandler-Anweisung behandeln.

  • Sie können keine Arrays aus WithEvents-Variablen erstellen.

Mit WithEvents-Variablen kann ein einziger Ereignishandler eine oder mehrere Ereignisarten bzw. einen oder mehrere Ereignishandler zur Behandlung derselben Art von Ereignissen verarbeiten.

Die Handles-Klausel ist zwar das Standardverfahren zum Verknüpfen eines Ereignisses mit einem Ereignishandler, ist aber auf das Verknüpfen von Ereignissen mit Ereignishandlern zur Kompilierzeit beschränkt.

In einigen Fällen, z.B. bei Ereignissen, die Formularen oder Steuerelementen zugeordnet sind, erstellt Visual Basic automatisch einen Stub für einen leeren Ereignishandler und ordnet ihn einem Ereignis zu. Wenn Sie z. B. im Entwurfsmodus auf eine Befehlsschaltfläche doppelklicken, erstellt Visual Basic einen leeren Ereignishandler und eine WithEvents-Variable für die Befehlsschaltfläche, wie im folgenden Code veranschaulicht:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler und RemoveHandler

Die AddHandler-Anweisung ähnelt der Handles-Klausel insofern, als Sie mit beiden einen Ereignishandler angeben können. AddHandler bietet Ihnen jedoch zusammen mit RemoveHandler mehr Flexibilität als die Handles-Klausel, da es ein dynamisches Hinzufügen, Entfernen und Ändern des einem Ereignis zugeordneten Ereignishandlers ermöglicht. Wenn Sie freigegebene Ereignisse oder Ereignisse aus einer Struktur behandeln möchten, müssen Sie AddHandler verwenden.

AddHandler benötigt zwei Argumente: den Namen eines Ereignisses von einem Ereignissender (z.B. einem Steuerelement) und einen Ausdruck, der einen Delegaten ergibt. Wenn Sie AddHandler verwenden, müssen Sie die Delegatklasse nicht explizit angeben, da die AddressOf-Anweisung stets einen Verweis auf den Delegaten zurückgibt. Im folgenden Beispiel wird ein Ereignishandler mit einem Ereignis verknüpft, das durch ein Objekt ausgelöst wird:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

Für RemoveHandler, wodurch ein Ereignis von einem Ereignishandler getrennt wird, wird die gleiche Syntax verwendet wie für AddHandler. Zum Beispiel:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Im folgenden Beispiel ist einem Ereignis ein Ereignishandler zugeordnet, und das Ereignis wird ausgelöst. Der Ereignishandler fängt das Ereignis ab und zeigt eine Meldung an.

Anschließend wird der erste Ereignishandler entfernt, und dem Ereignis wird ein anderer Ereignishandler zugeordnet. Beim erneuten Auslösen des Ereignisses wird eine andere Meldung angezeigt.

Schließlich wird der zweite Ereignishandler entfernt, und das Ereignis wird zum dritten Mal ausgelöst. Da dem Ereignis kein Ereignishandler mehr zugeordnet ist, wird keine Aktion ausgeführt.

Module Module1

    Sub Main()
        Dim c1 As New Class1
        ' Associate an event handler with an event.
        AddHandler c1.AnEvent, AddressOf EventHandler1
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler1
        ' Now associate a different event handler with the event.
        AddHandler c1.AnEvent, AddressOf EventHandler2
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler2
        ' This event will not be handled.
        c1.CauseTheEvent()
    End Sub

    Sub EventHandler1()
        ' Handle the event.
        MsgBox("EventHandler1 caught event.")
    End Sub

    Sub EventHandler2()
        ' Handle the event.
        MsgBox("EventHandler2 caught event.")
    End Sub

    Public Class Class1
        ' Declare an event.
        Public Event AnEvent()
        Sub CauseTheEvent()
            ' Raise an event.
            RaiseEvent AnEvent()
        End Sub
    End Class

End Module

Behandeln von Ereignissen, die von einer Basisklasse geerbt wurden

Abgeleitete Klassen sind Klassen, die Merkmale von einer Basisklasse erben. Sie können mithilfe der Handles MyBase-Anweisung Ereignisse behandeln, die von ihrer Basisklasse ausgelöst wurden.

So behandeln Sie Ereignisse aus einer Basisklasse

  • Deklarieren Sie einen Ereignishandler in der abgeleiteten Klasse, indem Sie der Deklarationszeile der Prozedur für den Ereignishandler eine Handles MyBase.Ereignisname-Anweisung hinzufügen. Dabei ist Ereignisname der Name des zu behandelnden Ereignisses in der Basisklasse. Zum Beispiel:

    Public Class BaseClass
        Public Event BaseEvent(ByVal i As Integer)
        ' Place methods and properties here.
    End Class
    
    Public Class DerivedClass
        Inherits BaseClass
        Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent
            ' Place code to handle events from BaseClass here.
        End Sub
    End Class
    
Titel Beschreibung
Exemplarische Vorgehensweise: Deklarieren und Auslösen von Ereignissen Stellt eine Schritt-für-Schritt-Beschreibung des Deklarierens und Auslösens von Ereignissen für eine Klasse bereit.
Exemplarische Vorgehensweise: Behandeln von Ereignissen Veranschaulicht das Schreiben einer Ereignishandlerprozedur.
Vorgehensweise: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeiden Veranschaulicht die Definition eines benutzerdefinierten Ereignisses, das einen asynchronen Aufruf seiner Ereignishandler zulässt.
How to: Deklarieren von benutzerdefinierten Ereignissen zum Einsparen von Arbeitsspeicher Veranschaulicht die Definition eines benutzerdefinierten Ereignisses, das nur bei der Behandlung des Ereignisses Arbeitsspeicher nutzt.
Problembehandlung für geerbte Ereignishandler in Visual Basic Führt häufige Probleme auf, die bei Ereignishandlern in geerbten Komponenten auftreten können.
Ereignisse Bietet eine Übersicht über das Ereignismodell in .NET Framework.
Erstellen von Ereignishandlern in Windows Forms Beschreibt die Verwendung von Ereignissen, die Windows Forms-Objekten zugeordnet sind.
Delegaten Stellt eine Übersicht über Delegaten in Visual Basic bereit.