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

  1. 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ána Form1 , protože WithEvents 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

  1. V Editoru kódu vyberte mWidget z levého rozevíracího seznamu.

  2. PercentDone Vyberte událost z pravého rozevíracího seznamu. Editor kódu otevře proceduru mWidget_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.

  3. 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. Tato DoEvents metoda umožňuje popisek překreslit a také dává uživateli možnost kliknout na tlačítko Storno .

  4. 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 Truehodnotu a mWidget_PercentDone událost ji pak testuje a nastaví argument na TrueByRef 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

  1. V editoru kódu v levém rozevíracím seznamu vyberte (Události formuláře1).

  2. Load Vyberte událost z pravého rozevíracího seznamu. Editor kódu otevře proceduru Form1_Load události.

  3. 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 mWidgetk . 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

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

  2. 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.

  3. 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, dokud My.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á LongTaska 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ý WidgetmWidgetobjekt . 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ý čte mWidget.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ý 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í.

Viz také