Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Projekt sady Visual Studio sice můžete vizualizovat jako řadu procedur, které se spouští v posloupnosti, ale většina programů je řízená 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 oddělený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í s pokynem, aby se proces řazení zastavil.
Termíny a koncepty událostí
Tato část popisuje termíny a koncepty používané s událostmi v jazyce 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 je jako zpráva 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 jazyce 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í
Libovolný objekt schopný vyvolat událost je odesílatel události, označovaný také jako zdroj události. Příkladem odesílatelů událostí jsou formuláře, ovládací prvky a uživatelem definované objekty.
Handlery 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álosti.
Visual Basic používá standardní zásady vytváření názvů pro obslužné rutiny událostí, které kombinuje název odesílatele události, podtržítko a název události. Například událost tlačítka Click pojmenovaného button1 by byla nazvána 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 pojmenování, ale nevyžaduje se; můžete použít libovolný platný název podprogramu.
Asociování událostí s obslužnými rutinami
Než bude obslužná rutina události použitelná, musíte ji nejprve přidružit k události pomocí Handles příkazu nebo příkazu AddHandler .
WithEvents a příkaz 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 Handles pro tuto 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 klauzule Handles jsou často nejlepší volbou pro obslužné rutiny událostí, protože deklarativní syntaxe, kterou používají, usnadňuje kódování, čtení a ladění zpracování událostí. Mějte však na paměti následující omezení týkající se použití proměnných WithEvents :
Proměnnou
WithEventsnelze použít jako objektovou proměnnou. To znamená, že nemůžete deklarovat jakoObject– při deklaraci proměnné je nutné zadat název třídy.Vzhledem k tomu, že sdílené události nejsou svázané s instancemi třídy, nelze použít
WithEventsk deklarativnímu zpracování sdílených událostí. Podobně nelze použítWithEventsaniHandleszpracovat události z objektuStructure. V obou případech můžete tento příkaz použítAddHandlerke 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řiřazení události k obslužné rutině události, je omezená na přiřazení událostí k obslužným rutinám událostí v době kompilace.
V některých případech, například u událostí spojených s formuláři nebo ovládacími prvky, Visual Basic automaticky vytvoří prázdnou obslužnou rutinu události a spojí ji s událostí. 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. Nicméně použití AddHandler spolu s RemoveHandler poskytuje větší flexibilitu než příkaz Handles, což umožňuje dynamicky přidávat, odebírat a měnit obslužnou rutinu událostí 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řijímá dva argumenty: název události od odesílatele události, jako je například ovládací prvek, a výraz, který se vyhodnotí jako delegát. Při použití AddHandlernení nutné explicitně zadávat třídu delegáta, 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ý odpojí 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 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 se přidružuje 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 je vyvolána potřetí. Vzhledem k tomu, že k události již není přidružená 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.
Jak zpracovat události ze základní třídy
Deklarujte obslužnou rutinu události v odvozené třídě přidáním
Handles MyBase.příkazu eventname na řádek 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
| Titulek | 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 pro obsluhu události. |
| Postupy: Deklarace vlastních událostí, aby se zabránilo blokování | Ukazuje, jak definovat vlastní událost, která umožňuje, aby její obslužné rutiny událostí byly volány asynchronně. |
| Postupy: Deklarace vlastních událostí pro zachování paměti | Ukazuje, jak definovat vlastní událost, která používá paměť pouze při zpracování události. |
| řešení potíží s zděděnými obslužnými rutinami 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 | Poskytuje přehled modelu událostí 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 Modelu Windows Forms. |
| delegáti | Poskytuje přehled delegátů v jazyce Visual Basic. |