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

  1. Vložte následující kód do Form1 :

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    WithEventsKlíčové slovo určuje, že proměnná mWidget slouží 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á mWidget je deklarována v, Form1 protože WithEvents proměnné musí být na úrovni třídy. To platí bez ohledu na typ třídy, ve které je umístíte.

    Proměnná mblnCancel slouží ke zrušení LongTask metody.

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

  1. mWidgetV editoru kódu vyberte v rozevíracím seznamu vlevo.

  2. PercentDoneV rozevíracím seznamu vyberte událost. Editor kódu otevře mWidget_PercentDone proceduru 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.

  3. Do mWidget_PercentDone obsluž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 Sub
    

    Při každém PercentDone vyvolá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 .

  4. Přidejte následující kód pro Button2_Click obsluž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

  1. Z levého rozevíracího seznamu v editoru kódu vyberte (události Form1) .

  2. LoadV rozevíracím seznamu vyberte událost. Editor kódu otevře Form1_Load proceduru události.

  3. Přidejte následující kód pro Form1_Load proceduru 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_Click obsluž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

  1. Stisknutím klávesy F5 vložte projekt do režimu spuštění.

  2. Klikněte na tlačítko Spustit úlohu . Pokaždé PercentDone , když se událost vyvolá, popisek se aktualizuje o procento dokončené úlohy.

  3. 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, dokud My.Application.DoEvents pří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ý čte mWidget.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.

Viz také