Megosztás a következőn keresztül:


Útmutató: Események kezelése (Visual Basic)

Ez a második olyan témakör, amely bemutatja, hogyan lehet együttműködni az eseményekkel. Az első témakör, útmutató: Események deklarálása és emelése, bemutatja, hogyan deklarálhat és emelhet eseményeket. Ez a szakasz az útmutató űrlapjának és osztályának használatával mutatja be, hogyan kezelheti az eseményeket, amikor azok történnek.

Az Widget osztály példája hagyományos eseménykezelési utasításokat használ. A Visual Basic más technikákat is kínál az eseményekhez. Gyakorlatként módosíthatja ezt a példát az és Handles az AddHandler utasítások használatára.

A Widget osztály PercentDone eseményének kezelése

  1. Helyezze a következő kódot a következő helyre Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    A WithEvents kulcsszó azt határozza meg, hogy a változó mWidget egy objektum eseményeinek kezelésére szolgál. Az objektum típusának megadásához adja meg annak az osztálynak a nevét, amelyből az objektum létrejön.

    A változó mWidget azért deklarálva van, Form1 mert WithEvents a változóknak osztályszintűnek kell lenniük. Ez az osztály típusától függetlenül igaz.

    A változó mblnCancel a metódus megszakítására LongTask szolgál.

Kód írása egy esemény kezeléséhez

Amint deklarál egy változót a használatával WithEvents, a változó neve megjelenik az osztály Kódszerkesztőjének bal oldali legördülő listájában. Ha kiválasztja mWidget, az Widget osztály eseményei megjelennek a jobb oldali legördülő listában. Az esemény kiválasztásakor megjelenik a megfelelő eseményeljárás az előtaggal mWidget és az aláhúzásjellel. A változóhoz WithEvents társított eseményeljárások előtagként kapják meg a változó nevét.

Esemény kezelése

  1. Válasszon mWidget a Kódszerkesztő bal oldali legördülő listájából.

  2. Válassza ki az eseményt PercentDone a jobb oldali legördülő listából. A Kódszerkesztő megnyitja az eseményeljárást mWidget_PercentDone .

    Feljegyzés

    A Kódszerkesztő hasznos, de nem kötelező az új eseménykezelők beszúrásához. Ebben az útmutatóban közvetlenebb az eseménykezelők közvetlenül a kódba másolása.

  3. Adja hozzá a következő kódot az mWidget_PercentDone eseménykezelőhöz:

    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
    

    Amikor az PercentDone esemény létre van hozva, az eseményeljárás egy vezérlőelemben megjeleníti a készültségi százalékot Label . A DoEvents módszer lehetővé teszi a címke újrafestését, és lehetőséget ad a felhasználónak a Mégse gombra való kattintásra is.

  4. Adja hozzá a következő kódot az Button2_Click eseménykezelőhöz:

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Ha a felhasználó futás közben LongTask a Mégse gombra kattint, a rendszer azonnal végrehajtja az Button2_Click eseményt, amint az utasítás lehetővé teszi az DoEvents események feldolgozását. Az osztályszintű változó mblnCancel a következőre Truevan állítva, majd az mWidget_PercentDone esemény teszteli, és az argumentumot a ByRef Cancel következőre Trueállítja.

WithEvents változó objektumba való Csatlakozás

Form1 most már be van állítva egy Widget objektum eseményeinek kezelésére. Csak az marad, hogy találjon egy Widget helyet.

Ha a tervezéskor deklarál egy változót WithEvents , azzal nincs objektum társítva. A WithEvents változók ugyanolyanok, mint bármely más objektumváltozó. Létre kell hoznia egy objektumot, és hozzá kell rendelnie egy hivatkozást a WithEvents változóhoz.

Objektum létrehozása és hivatkozás hozzárendelése

  1. A Kódszerkesztő bal oldali legördülő listájában válassza az (1. űrlapesemények) lehetőséget.

  2. Válassza ki az eseményt Load a jobb oldali legördülő listából. A Kódszerkesztő megnyitja az eseményeljárást Form1_Load .

  3. Adja hozzá a következő kódot az Form1_Load eseményeljáráshoz a Widgetkövetkező létrehozásához:

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

A kód végrehajtásakor a Visual Basic létrehoz egy Widget objektumot, és összekapcsolja az eseményeket a kapcsolódó eseményeljárásokkal mWidget. Ettől a ponttól kezdve minden alkalommal, amikor az Widget esemény bekövetkezik PercentDone , végrehajtja az mWidget_PercentDone eseményeljárást.

A LongTask metódus meghívása

  • Adja hozzá a következő kódot az Button1_Click eseménykezelőhöz:

    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
    

A metódus meghívása LongTask előtt inicializálni kell a készültségi szintet megjelenítő címkét, és a metódus megszakítására szolgáló osztályszintű Boolean jelzőt a következőre Falsekell állítani: .

LongTask 12,2 másodperces tevékenységhosszúságú. Az PercentDone esemény a másodperc minden egyharmada után létre lesz hozva. Minden alkalommal, amikor az esemény elő van állítva, az mWidget_PercentDone eseményeljárás végrehajtása történik.

Ha LongTask elkészült, a rendszer ellenőrzi, mblnCancel hogy LongTask a művelet a szokásos módon végződik-e, vagy leállt-e, mert mblnCancel a beállítás értéke True. A készültségi szint csak a korábbi esetben frissül.

A program futtatása

  1. Nyomja le az F5 billentyűt a projekt futási módba helyezéséhez.

  2. Kattintson a Feladat indítása gombra. Az esemény minden egyes PercentDone eseményekor a címke frissül a befejezett tevékenység százalékos arányával.

  3. Kattintson a Mégse gombra a feladat leállításához. Figyelje meg, hogy a Mégse gomb megjelenése nem változik azonnal, amikor rákattint. Az Click esemény csak akkor történhet meg, ha az utasítás engedélyezi az My.Application.DoEvents események feldolgozását.

    Feljegyzés

    A My.Application.DoEvents metódus nem ugyanúgy dolgozza fel az eseményeket, mint az űrlap. Ebben az útmutatóban például kétszer kell a Mégse gombra kattintania. Ha lehetővé szeretné tenni, hogy az űrlap közvetlenül kezelje az eseményeket, többszálú elemet használhat. További információ: Felügyelt szálkezelés.

Lehet, hogy tanulságos, hogy futtassa a programot az F11 és lépés végig a kódot egy sorban egy időben. Világosan láthatja, hogyan lép be LongTaska végrehajtás, majd rövid időre újra beírhatja Form1 az PercentDone esemény minden egyes eseményét.

Mi történne, ha a végrehajtás vissza lett hívva a metódus kódjábanForm1LongTask? Legrosszabb esetben a verem túlcsordulása akkor fordulhat elő, ha LongTask minden alkalommal meghívják, amikor az esemény létrejött.

A változó egy másik Widget objektum eseményeinek kezelését okozhatja úgy, hogy egy hivatkozást rendel hozzá az újhoz WidgetmWidget.mWidget Valójában ezt a kódot Button1_Click minden alkalommal elvégezheti, amikor a gombra kattint.

Egy másik widget eseményeinek kezelése

  • Adja hozzá a következő kódsort az Button1_Click eljáráshoz, közvetlenül az olvasási mWidget.LongTask(12.2, 0.33)sor előtt:

    mWidget = New Widget
    ' Create a new Widget object.
    

A fenti kód minden kattintáskor létrehoz egy újat Widget . Amint a LongTask módszer befejeződött, a hivatkozás Widget a kiadásra, és a Widget megsemmisített.

A WithEvents változók egyszerre csak egy objektumhivatkozást tartalmazhatnak, így ha egy másik Widget objektumot mWidgetrendel hozzá, az előző Widget objektum eseményei már nem lesznek kezelve. Ha mWidget az egyetlen objektumváltozó, amely a régire Widgetmutató hivatkozást tartalmaz, az objektum megsemmisül. Ha több Widget objektum eseményeit szeretné kezelni, az AddHandler utasítás használatával külön-külön dolgozza fel az egyes objektumok eseményeit.

Feljegyzés

Annyi változót deklarálhat WithEvents , amennyit csak szeretne, de a változótömbök WithEvents nem támogatottak.

Lásd még