Události (Visual Basic)

i když můžete Visual Studio projekt vizualizovat jako řadu procedur, které jsou spouštěny v sekvenci, ve skutečnosti je u většiny programů řízený událost, což 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ějaké důležitosti. Například když uživatel klikne na ovládací prvek ve formuláři, může formulář vyvolat Click událost a zavolat proceduru, která událost zpracovává. Události také umožňují komunikaci mezi různými úkoly. Řekněme například, že vaše aplikace provádí řazení úkolů odděleně od hlavní aplikace. Pokud uživatel zruší řazení, může aplikace odeslat událost zrušení pokynu k zastavení procesu řazení.

Výrazy a koncepty událostí

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

Deklarace událostí

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

Event AnEvent(ByVal EventNumber As Integer)

Vyvolávání událostí

Událost je jako zpráva oznamující, že došlo k nějaké důležitosti. Zpráva o vysílání zprávy se nazývá vyvolání události. v Visual Basic události vyvoláte pomocí RaiseEvent příkazu, jako v následujícím příkladu:

RaiseEvent AnEvent(EventNumber)

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

Odesílatelé událostí

Libovolný objekt schopný vyvolání události 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é jsou volány při výskytu odpovídající události. Můžete použít jakoukoli platnou podprogram s vyhovující signaturou jako obslužnou rutinu události. Funkci nelze použít jako obslužnou rutinu události, protože ale nemůže vrátit hodnotu do zdroje událostí.

Visual Basic používá standardní zásady vytváření názvů pro obslužné rutiny událostí, které kombinují jméno odesílatele události, podtržítko a název události. Například Click Událost tlačítka s názvem button1 by měla být pojmenována Sub button1_Click .

Poznámka

Doporučujeme používat tyto zásady vytváření názvů při definování obslužných rutin událostí pro vlastní události, ale není to nutné. můžete použít libovolný platný název subrutiny.

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

Předtím, než může být obslužná rutina události použitelná, je nutné ji nejprve přidružit k události Handles pomocí AddHandler příkazu nebo.

WithEvents a klauzule Handles

WithEventsPříkaz a Handles klauzule poskytují deklarativní způsob určení obslužných rutin událostí. Událost aktivovaná objektem deklarovaným pomocí WithEvents klíčového slova může být zpracována jakýmkoli postupem s Handles příkazem pro danou 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

WithEventsPříkaz a Handles klauzule jsou často nejlepší volbou pro obslužné rutiny událostí, protože deklarativní syntaxe, kterou používají, zjednodušuje kód, číst a ladit. Mějte ale na paměti následující omezení pro použití WithEvents proměnných:

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

  • Vzhledem k tomu, že sdílené události nejsou svázány s instancemi třídy, nelze použít WithEvents k deklarativnímu zpracování sdílených událostí. Podobně nemůžete použít WithEvents nebo Handles pro zpracování událostí z Structure . V obou případech můžete pomocí AddHandler příkazu tyto události zpracovat.

  • Nemůžete vytvořit pole WithEvents proměnných.

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

I když Handles je klauzule standardní způsob, jak přidružit událost k obslužné rutině události, je omezena na přidružení událostí s obslužnými rutinami události 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 odblokovat prázdnou obslužnou rutinu události a přidruží ji k události. například když 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 WithEvents proměnnou pro příkazové tlačítko, jak je uvedeno 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

AddHandlerPříkaz je podobný Handles klauzuli v tom, že umožňuje zadat obslužnou rutinu události. Nicméně AddHandler , používá se s RemoveHandler , poskytuje větší flexibilitu než Handles klauzule, což vám umožní dynamicky přidávat, odebírat a měnit obslužné rutiny událostí přidružené k události. Pokud chcete zpracovávat sdílené události nebo události ze struktury, je nutné použít AddHandler .

AddHandler přebírá dva argumenty: název události od odesílatele události, jako je například ovládací prvek, a výraz, který je vyhodnocen jako delegát. Třídu delegáta není nutné explicitně určovat při použití AddHandler , protože AddressOf příkaz vždy vrací 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ý odpojuje událost od obslužné rutiny události, používá stejnou syntaxi jako AddHandler . Napří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.

Pak je první obslužná rutina události odebrána 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 druhá obslužná rutina události odebere a událost se vygeneruje po dobu třetího času. Vzhledem k tomu, že k události již není přidružena obslužná rutina 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í vlastnosti 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 příkazu Handles MyBase. EventName do řádku deklarace procedury obslužné rutiny události, kde EventName je název události v základní třídě, kterou zpracováváte. Napří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 způsobu, 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álosti byly volány asynchronně.
Postupy: Deklarování vlastních událostí pro konzervaci paměti Ukazuje, jak definovat vlastní událost, která používá paměť pouze v případě, že je událost zpracována.
Řešení potíží s obslužnými rutinami zděděných událostí v jazyce Visual Basic Uvádí běžné problémy, které vznikají u obslužných rutin událostí ve zděděných součástech.
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 objektům model Windows Forms.
Delegáti Poskytuje přehled o delegátech v Visual Basic.