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
WithEventsjako proměnnou objektu. To znamená, že jej nelze deklarovat jakoObject– 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
WithEventsk deklarativnímu zpracování sdílených událostí. Podobně nemůžete použítWithEventsneboHandlespro zpracování událostí zStructure. V obou případech můžete pomocíAddHandlerpříkazu tyto události zpracovat.Nemůžete vytvořit pole
WithEventspromě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
Související oddíly
| 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. |