Sdílet prostřednictvím


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

  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 mWidget vyberte 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
    

    Pokaždé, když je vyvolána událost PercentDone, procedura události zobrazí procento dokončení v ovládacím prvku Label. 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 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

  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, 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

  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 zastavíte ú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 . 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_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 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í.

Viz také