Návod: Zpracování událostí (Visual Basic)
Toto je druhá ze dvou témat, která ukazují, jak pracovat s událostmi. První téma, Návod: Deklarace a vyvolávání událostí, ukazuje, jak deklarovat a vyvolat události. Tato část používá formulář a třídu z tohoto návodu k zobrazení, jak zpracovávat události při jejich provedení.
Příklad Widget
třídy používá tradiční příkazy zpracování událostí. Visual Basic poskytuje další techniky pro práci s událostmi. Jako cvičení můžete tento příklad upravit tak, aby používal příkazy AddHandler
a Handles
příkazy.
Zpracování události PercentDone třídy Widget
Vložte následující kód do
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Klíčové
WithEvents
slovo určuje, že proměnnámWidget
se používá ke zpracování událostí objektu. Typ objektu zadáte zadáním názvu třídy, ze které bude objekt vytvořen.Proměnná
mWidget
je deklarovánaForm1
, protožeWithEvents
proměnné musí být na úrovni třídy. To platí bez ohledu na typ třídy, do které je umístíte.Proměnná
mblnCancel
se používá k zrušeníLongTask
metody.
Psaní kódu pro zpracování události
Jakmile deklarujete proměnnou pomocí WithEvents
, název proměnné se zobrazí v levém rozevíracím seznamu editoru kódu třídy. Když vyberete mWidget
, události předmětu Widget
se zobrazí v pravém rozevíracím seznamu. Výběrem události se zobrazí odpovídající procedura události s předponou mWidget
a podtržítkem. Všechny procedury události přidružené k WithEvents
proměnné mají název proměnné jako předponu.
Zpracování události
V Editoru kódu vyberte
mWidget
z levého rozevíracího seznamu.PercentDone
Vyberte událost z pravého rozevíracího seznamu. Editor kódu otevře procedurumWidget_PercentDone
události.Poznámka:
Editor kódu je užitečný, ale nevyžaduje se pro vkládání nových obslužných rutin událostí. V tomto názorném postupu je přímější jenom zkopírovat obslužné rutiny událostí přímo do kódu.
Do obslužné rutiny události přidejte následující kód
mWidget_PercentDone
:Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
PercentDone
Při každém vyvolání události zobrazí procedura události procento dokončeníLabel
ovládacího prvku. TatoDoEvents
metoda umožňuje popisek překreslit a také dává uživateli možnost kliknout na tlačítko Storno .Přidejte následující kód pro obslužnou rutinu
Button2_Click
události:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Pokud uživatel během běhu klikne na tlačítko LongTask
Storno, Button2_Click
událost se spustí, jakmile DoEvents
příkaz umožní zpracování událostí. Proměnná mblnCancel
na úrovni třídy je nastavena na True
hodnotu a mWidget_PercentDone
událost ji pak testuje a nastaví argument na True
ByRef Cancel
.
Připojení proměnné WithEvents k objektu
Form1
je teď nastavený tak, aby zpracovával události objektu Widget
. Vše, co zbývá, je najít někde Widget
.
Když deklarujete proměnnou WithEvents
v době návrhu, není k ní přidružený žádný objekt. Proměnná WithEvents
je stejně jako jakákoli jiná proměnná objektu. Musíte vytvořit objekt a přiřadit k němu odkaz s proměnnou WithEvents
.
Vytvoření objektu a přiřazení odkazu na něj
V editoru kódu v levém rozevíracím seznamu vyberte (Události formuláře1).
Load
Vyberte událost z pravého rozevíracího seznamu. Editor kódu otevře proceduruForm1_Load
události.Přidejte následující kód pro proceduru
Form1_Load
události pro vytvořeníWidget
:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
Když se tento kód spustí, Visual Basic vytvoří Widget
objekt a připojí jeho události k procedurám událostí přidruženým mWidget
k . Od tohoto okamžiku Widget
se při každém vyvolání PercentDone
události spustí procedura mWidget_PercentDone
události.
Volání metody LongTask
Do obslužné rutiny události přidejte následující kód
Button1_Click
:Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
LongTask
Před zavolání metody musí být inicializován popisek, který zobrazuje procento dokončení, a příznak na úrovni Boolean
třídy pro zrušení metody musí být nastaven na False
.
LongTask
je volána s dobou trvání úkolu 12,2 sekundy. Událost PercentDone
se vyvolá jednou za třetinu sekundy. Při každém vyvolání události se spustí procedura mWidget_PercentDone
události.
Po LongTask
dokončení se testuje, mblnCancel
zda LongTask
skončil normálně, nebo pokud byl zastaven, protože mblnCancel
byl nastaven na True
. Procento dokončení se aktualizuje pouze v bývalém případě.
Spuštění programu
Stisknutím klávesy F5 umístěte projekt do režimu spuštění.
Klikněte na tlačítko Spustit úkol . Při každém vyvolání
PercentDone
události se popisek aktualizuje procentem dokončeného úkolu.Kliknutím na tlačítko Storno zastavte úkol. Všimněte si, že vzhled tlačítka Zrušit se okamžitě po kliknutí nezmění. Událost
Click
nemůže nastat, dokudMy.Application.DoEvents
příkaz neumožňuje zpracování událostí.Poznámka:
Metoda
My.Application.DoEvents
nezpracovává události přesně stejným způsobem jako formulář. Například v tomto názorném postupu musíte dvakrát kliknout na tlačítko Storno . Pokud chcete formulář povolit zpracování událostí přímo, můžete použít vícevláknové zpracování. Další informace najdete v tématu Spravované vlákno.
Můžete najít pokyn ke spuštění programu pomocí klávesy F11 a procházení kódu najednou. Můžete jasně vidět, jak se provádění zadá LongTask
a pak krátce znovu zadá Form1
při každém PercentDone
vyvolání události.
Co by se stalo, když se provádění vrátilo do kódu Form1
, LongTask
metoda byla znovu volána? V nejhorším případě může dojít k přetečení zásobníku, pokud LongTask
byly volány při každém vyvolání události.
Proměnnou mWidget
můžete způsobit zpracování událostí pro jiný Widget
objekt přiřazením odkazu na nový Widget
mWidget
objekt . Ve skutečnosti můžete kód Button1_Click
provést pokaždé, když kliknete na tlačítko.
Zpracování událostí pro jiný widget
Do procedury přidejte následující řádek kódu
Button1_Click
bezprostředně před řádek, který čtemWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Výše uvedený kód vytvoří nový Widget
při každém kliknutí na tlačítko. Jakmile se LongTask
metoda dokončí, uvolní se odkaz na ni Widget
a Widget
zničí se.
Proměnná WithEvents
může obsahovat současně pouze jeden odkaz na objekt, takže pokud přiřadíte jiný Widget
objekt mWidget
, události předchozího Widget
objektu již nebudou zpracovány. Pokud mWidget
je jedinou proměnnou objektu obsahující odkaz na starý Widget
objekt , objekt je zničen. Pokud chcete zpracovat události z několika Widget
objektů, použijte příkaz AddHandler
ke zpracování událostí z každého objektu samostatně.
Poznámka:
Můžete deklarovat tolik WithEvents
proměnných, kolik potřebujete, ale pole proměnných WithEvents
se nepodporují.