Návod: Zpracování událostí (Visual Basic)
Jedná se o 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. V této části se používá formulář a třída z tohoto návodu k zobrazení, jak zpracovávat události, když dojde k jejich provedení.
WidgetPříklad třídy používá tradiční příkazy pro 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 AddHandler Handles příkazy a.
Zpracování události PercentDone třídy widgetu
Vložte následující kód do
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanWithEventsKlíčové slovo určuje, že proměnnámWidgetslouží ke zpracování událostí objektu. Typ objektu určíte zadáním názvu třídy, ze které bude objekt vytvořen.Proměnná
mWidgetje deklarována v,Form1protožeWithEventsproměnné musí být na úrovni třídy. To platí bez ohledu na typ třídy, ve které je umístíte.Proměnná
mblnCancelslouží ke zrušeníLongTaskmetody.
Psaní kódu pro zpracování události
Jakmile deklarujete proměnnou pomocí WithEvents , bude název proměnné zobrazen v levém rozevíracím seznamu editoru kódu třídy. Když vyberete mWidget , zobrazí se Widget události třídy 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šem procedurám události přidruženým k WithEvents proměnné je dán název proměnné jako předpona.
Postup zpracování události
mWidgetV editoru kódu vyberte v rozevíracím seznamu vlevo.PercentDoneV rozevíracím seznamu vyberte událost. Editor kódu otevřemWidget_PercentDoneproceduru události.Poznámka
Editor kódu je užitečný, ale není povinný pro vkládání nových obslužných rutin událostí. V tomto návodu je jednodušší pouze kopírovat obslužné rutiny událostí přímo do kódu.
Do
mWidget_PercentDoneobslužné rutiny události přidejte následující kód: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 SubPři každém
PercentDonevyvolání události zobrazuje procedura události v ovládacím prvku procentuální hodnotu dokončeníLabel.DoEventsMetoda umožňuje popisku překreslit a také uživateli nabízí možnost kliknout na tlačítko Storno .Přidejte následující kód pro
Button2_Clickobslužnou rutinu 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 klikne na tlačítko Storno LongTask , když je spuštěn, Button2_Click událost se spustí, jakmile DoEvents příkaz umožní, aby bylo provedeno zpracování události. Proměnná na úrovni třídy mblnCancel je nastavena na hodnotu True a mWidget_PercentDone událost pak otestuje a nastaví ByRef Cancel argument na True .
Připojení proměnné WithEvents k objektu
Form1 je nyní nastaveno na zpracování Widget událostí objektu. Vše, co zbývá, je najít Widget někde.
Pokud deklarujete proměnnou WithEvents v době návrhu, k ní není přidružen žádný objekt. WithEventsProměnná je stejně jako jakákoli jiná proměnná objektu. Musíte vytvořit objekt a přiřadit k němu odkaz s WithEvents proměnnou.
Vytvoření objektu a přiřazení odkazu na něj
Z levého rozevíracího seznamu v editoru kódu vyberte (události Form1) .
LoadV rozevíracím seznamu vyberte událost. Editor kódu otevřeForm1_Loadproceduru události.Přidejte následující kód pro
Form1_Loadproceduru 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 spustí tento kód, Visual Basic vytvoří Widget objekt a připojí své události k procedurám události přidruženým k mWidget . Od tohoto okamžiku, kdykoli Widget vyvolá PercentDone událost, mWidget_PercentDone je provedena procedura události.
Volání metody LongTask
Do
Button1_Clickobslužné rutiny události přidejte následující kód: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
Před LongTask voláním metody musí být inicializován popisek, který zobrazuje procento dokončení, a příznak na úrovni třídy Boolean pro zrušení metody musí být nastaven na False .
LongTask je volána s dobou trvání úlohy 12,2 sekund. PercentDoneUdálost se vyvolá jednou za každou třetinu sekundy. Při každém vyvolání události se mWidget_PercentDone spustí procedura události.
V případě, že je LongTask provedena, mblnCancel je Testováno pro zjištění, zda LongTask skončila normálně nebo pokud bylo zastaveno, protože mblnCancel bylo nastaveno na True . Procentuální hodnota dokončení je aktualizována pouze v bývalém případě.
Spuštění programu
Stisknutím klávesy F5 vložte projekt do režimu spuštění.
Klikněte na tlačítko Spustit úlohu . Pokaždé
PercentDone, když se událost vyvolá, popisek se aktualizuje o procento dokončené úlohy.Kliknutím na tlačítko Storno úlohu zastavte. Všimněte si, že se vzhled tlačítka Zrušit nemění hned po kliknutí na něj.
ClickUdálost nemůže nastat, dokudMy.Application.DoEventspříkaz nepovolí zpracování událostí.Poznámka
My.Application.DoEventsMetoda nezpracovává události přesně stejným způsobem jako formulář. Například v tomto návodu musíte dvakrát kliknout na tlačítko Zrušit . Chcete-li, aby formulář mohl zpracovávat události přímo, můžete použít multithreading. Další informace najdete v tématu spravovaná vlákna.
Může se stát, že vám dá pokyn spustit program pomocí klávesy F11 a krokovat kód po řádku. Můžete zřetelně vidět, jak se spuštění spouští LongTask , a pak krátce znovu zadat Form1 pokaždé, když PercentDone se událost vyvolá.
Co se stane, když při provádění bylo vráceno v kódu Form1 , LongTask metoda byla volána znovu? V nejhorším případě může dojít k přetečení zásobníku, pokud LongTask bylo voláno při každém vyvolání události.
Můžete způsobit, že proměnná mWidget zpracovává události pro jiný Widget objekt přiřazením odkazu k novému Widget mWidget . V takovém případě můžete vytvořit kód Button1_Click pokaždé, když kliknete na tlačítko.
Zpracování událostí pro různé pomůcky
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 pokaždé, když se klikne na tlačítko. Jakmile se LongTask Metoda dokončí, odkaz na se Widget uvolní a dojde k jejímu Widget zničení.
WithEventsProměnná může současně obsahovat pouze jeden odkaz na objekt, takže pokud přiřadíte jiný Widget objekt k mWidget , Widget události předchozího objektu již nebudou zpracovány. Pokud mWidget je jedinou proměnnou objektu obsahující odkaz na starou Widget , je objekt zničen. Pokud chcete zpracovávat události z několika Widget objektů, použijte AddHandler příkaz pro 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 WithEvents proměnných nejsou podporována.