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 jakoObject
– 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žítWithEvents
aniHandles
zpracovat události z objektuStructure
. V obou případech můžete příkazAddHandler
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í AddHandler
s 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í AddHandler
není 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
Související oddíly
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. |