Události (Visual Basic)

I když můžete vizualizovat projekt Visual Studio jako řadu procedur, které se spouští v posloupnosti, ve skutečnosti je většina programů řízena událostmi – to znamená, že tok provádění je určen externími výskyty nazývanými události.

Událost je signál, který informuje aplikaci, že došlo k něčemu důležitému. Například když uživatel klikne na ovládací prvek ve formuláři, může formulář vyvolat Click událost a volat proceduru, která zpracovává událost. Události také umožňují komunikaci samostatných úkolů. Řekněme například, že vaše aplikace provádí úlohu řazení odděleně od hlavní aplikace. Pokud uživatel řazení zruší, může aplikace odeslat událost zrušení, která dává procesu řazení pokyn, aby se zastavil.

Termíny a koncepty událostí

Tato část popisuje termíny a koncepty používané s událostmi v Visual Basic.

Deklarace událostí

Události v rámci tříd, struktur, modulů a rozhraní deklarujete pomocí klíčového Event slova, jako v následujícím příkladu:

Event AnEvent(ByVal EventNumber As Integer)

Vyvolávání událostí

Událost se podobá zprávě s oznámením, že došlo k něčemu důležitému. Vysílání zprávy se nazývá vyvolání události. V Visual Basic vyvoláte události pomocí RaiseEvent příkazu, jako v následujícím příkladu:

RaiseEvent AnEvent(EventNumber)

Události musí být vyvolány v rámci oboru třídy, modulu nebo struktury, kde jsou deklarovány. Odvozená třída například nemůže vyvolat události zděděné ze základní třídy.

Odesílatelé událostí

Jakýkoli objekt, který může vyvolat událost, je odesílatel události, označovaný také jako zdroj události. Příklady odesílatelů událostí jsou formuláře, ovládací prvky a uživatelem definované objekty.

Obslužné rutiny událostí

Obslužné rutiny událostí jsou procedury, které se volají, když dojde k odpovídající události. Jako obslužnou rutinu události můžete použít libovolný platný podprogram s odpovídajícím podpisem. Funkci nelze použít jako obslužnou rutinu události, protože nemůže vrátit hodnotu do zdroje událostí.

Visual Basic používá standardní konvenci pojmenování pro obslužné rutiny událostí, které kombinuje název odesílatele události, podtržítko a název události. Například Click událost pojmenovaného button1 tlačítka by se jmenovala Sub button1_Click.

Poznámka

Při definování obslužných rutin událostí pro vlastní události doporučujeme použít tuto konvenci vytváření názvů, ale nevyžaduje se; Můžete použít libovolný platný název podprogramu.

Přidružení událostí k obslužným rutinami událostí

Než bude obslužná rutina události použitelná, musíte ji nejprve přidružit k události pomocí příkazu Handles nebo AddHandler příkazu.

WithEvents a klauzule Handles

Příkaz WithEvents a Handles klauzule poskytují deklarativní způsob určení obslužných rutin událostí. Událost vyvolaná objektem deklarovaným pomocí klíčového WithEvents slova lze zpracovat libovolnou procedurou s příkazem pro danou Handles událost, jak je znázorněno v následujícím příkladu:

' 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

Příkaz WithEvents a Handles klauzule jsou často nejlepší volbou pro obslužné rutiny událostí, protože deklarativní syntaxe, kterou používají, usnadňuje zpracování událostí, čtení a ladění. Mějte však na paměti následující omezení týkající se použití proměnných WithEvents :

  • Proměnnou nelze použít jako proměnnou WithEvents objektu. To znamená, že jej nemůžete deklarovat jako Object– při deklaraci proměnné musíte zadat název třídy.

  • Vzhledem k tomu, že sdílené události nejsou svázané s instancemi tříd, nelze použít WithEvents k deklarativnímu zpracování sdílených událostí. Podobně nelze použít WithEvents ani Handles zpracovat události z objektu Structure. V obou případech můžete příkaz AddHandler použít ke zpracování těchto událostí.

  • Nelze vytvořit pole proměnných WithEvents .

WithEvents Proměnné umožňují jedné obslužné rutině události zpracovat jeden nebo více druhů událostí, nebo jeden nebo více obslužných rutin událostí pro zpracování stejného typu události.

Handles I když je klauzule standardním způsobem přidružení události k obslužné rutině události, je omezena na přidružení událostí k obslužným rutinami událostí v době kompilace.

V některých případech, například s událostmi přidruženými k formulářům nebo ovládacím prvkům, Visual Basic automaticky zachytává prázdnou obslužnou rutinu události a přidruží ji k události. Když například dvakrát kliknete na příkazové tlačítko ve formuláři v režimu návrhu, Visual Basic vytvoří prázdnou obslužnou rutinu události a proměnnou WithEvents příkazového tlačítka, jako v následujícím kódu:

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

AddHandler a RemoveHandler

Příkaz AddHandler je podobný klauzuli Handles v tom, že oba umožňují zadat obslužnou rutinu události. Použití AddHandlers RemoveHandler, poskytuje větší flexibilitu než Handles klauzule, což umožňuje dynamicky přidávat, odebírat a měnit obslužnou rutinu události přidruženou k události. Pokud chcete zpracovávat sdílené události nebo události ze struktury, musíte použít AddHandler.

AddHandler Přebírá dva argumenty: název události od odesílatele události, například ovládacího prvku, a výraz, který se vyhodnotí delegátu. Při použití AddHandlernení nutné explicitně zadávat třídu delegáta, protože AddressOf příkaz vždy vrátí odkaz na delegáta. Následující příklad přidruží obslužnou rutinu události k události vyvolané objektem:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, který odpojí událost od obslužné rutiny události, používá stejnou syntaxi jako AddHandler. Příklad:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

V následujícím příkladu je obslužná rutina události přidružena k události a událost je vyvolána. Obslužná rutina události zachytí událost a zobrazí zprávu.

Potom se odebere první obslužná rutina události a k události je přidružena jiná obslužná rutina události. Po opětovném vyvolání události se zobrazí jiná zpráva.

Nakonec se odebere druhá obslužná rutina události a událost se vyvolá po třetí dobu. Protože již neexistuje obslužná rutina události přidružená k události, není provedena žádná akce.

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

Zpracování událostí zděděných ze základní třídy

Odvozené třídy – třídy, které dědí charakteristiky ze základní třídy – mohou zpracovávat události vyvolané jejich základní třídou pomocí Handles MyBase příkazu.

Zpracování událostí ze základní třídy

  • Deklarujte obslužnou rutinu události v odvozené třídě přidáním Handles MyBase. příkazu eventname do řádku deklarace procedury obslužné rutiny události, kde název události je název události v základní třídě, kterou zpracováváte. Příklad:

    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
    
Nadpis Popis
Návod: Deklarace a vyvolávání událostí Poskytuje podrobný popis, jak deklarovat a vyvolat události pro třídu.
Návod: Zpracování událostí Ukazuje, jak napsat proceduru obslužné rutiny události.
Postupy: Deklarování vlastních událostí k zabránění blokování Ukazuje, jak definovat vlastní událost, která umožňuje, aby obslužné rutiny událostí byly volána asynchronně.
Postupy: Deklarování vlastních událostí pro konzervaci paměti Ukazuje, jak definovat vlastní událost, která používá paměť pouze při zpracování události.
Řešení potíží s obslužnými rutinami zděděných událostí v jazyce Visual Basic Uvádí běžné problémy, ke kterým dochází u obslužných rutin událostí v zděděných komponentách.
Události Obsahuje přehled modelu události v rozhraní .NET Framework.
Vytváření obslužných rutin událostí ve Windows Forms Popisuje, jak pracovat s událostmi přidruženými k model Windows Forms objektům.
Delegáti Poskytuje přehled delegátů v Visual Basic.