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.
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 vyřizovat události, když k nim dochází.
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.
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 BooleanKlíčové
WithEventsslovo určuje, že proměnnámWidgetse 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á
mWidgetje deklarovánaForm1, protožeWithEventsproměnné musí být na úrovni třídy. To platí bez ohledu na typ třídy, do které je umístíte.Proměnná
mblnCancelse používá k zrušeníLongTaskmetody.
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
mWidgetvyberte z levého rozevíracího seznamu.PercentDoneVyberte událost z pravého rozevíracího seznamu. Editor kódu otevře procedurumWidget_PercentDoneudá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 SubPokaždé, když je vyvolána událost
PercentDone, procedura události zobrazí procento dokončení v ovládacím prvkuLabel. TatoDoEventsmetoda 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_Clickudálosti:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Pokud uživatel klikne na tlačítko Storno během běhu LongTask, Button2_Click událost se spustí, jakmile příkaz DoEvents umožní zpracování událostí. Proměnná mblnCancel na úrovni třídy je nastavena na True, a událost mWidget_PercentDone ji pak testuje a nastaví argument ByRef Cancel na True.
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 někde najít 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).
LoadVyberte událost z pravého rozevíracího seznamu. Editor kódu otevře proceduruForm1_Loadudálosti.Přidejte následující kód pro proceduru
Form1_Loadudá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 mWidgetk . Od tohoto okamžiku, kdykoli Widget vyvolá PercentDone událost, spustí se 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án 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, zda mblnCancelLongTask skončil normálně, nebo jestliže byl zastaven, protože mblnCancel byl nastaven na True. Procento dokončení se aktualizuje pouze v bývalém případě.
Spusťte program
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í
PercentDoneudálosti se popisek aktualizuje procentem dokončeného úkolu.Kliknutím na tlačítko Storno zastavíte úkol. Všimněte si, že vzhled tlačítka Zrušit se okamžitě po kliknutí nezmění. Událost
Clicknemůže nastat, dokudMy.Application.DoEventspříkaz neumožňuje zpracování událostí.Poznámka:
Metoda
My.Application.DoEventsnezpracová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 . Aby formulář mohl události zpracovávat 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 vstupuje provádění do LongTask, a pak krátce znovu vstoupí do Form1 při každém vyvolání události PercentDone.
Co by se stalo, kdyby se při návratu provádění zpět do kódu Form1 znovu zavolala metoda LongTask? V nejhorším případě může dojít k přetečení zásobníku, pokud LongTask bylo voláno pokaždé, když je událost vyvolána.
Proměnnou mWidget můžete způsobit, aby zpracovávala události pro jiný objekt Widget přiřazením odkazu na nový Widget k objektu mWidget. Ve skutečnosti můžete nastavit kód v Button1_Click, aby toto provedl 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_Clickbezprostř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 metoda LongTask dokončí, uvolní se odkaz na Widget a Widget se zničí.
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ý Widgetobjekt , 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í.