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 további technikákat is biztosít az események kezelésére. Gyakorlatként módosíthatja ezt a példát a AddHandler és Handles 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 mWidget változó Form1 deklarálva van, mert a WithEvents 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 LongTask törlésére 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 .

    Megjegyzés:

    A Kódszerkesztő hasznos, de nem kötelező az új eseménykezelők beszúrásához. Ebben az útmutatóban egyszerűbb, ha közvetlenül a kódba másolja az eseménykezelőket.

  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 kiváltódik, az eseményeljárás megjeleníti a készültségi százalékot a Label vezérlőelemben. 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ó a futása közben a LongTask gombra kattint, az Button2_Click esemény azonnal végrehajtásra kerül, amint a DoEvents utasítás lehetővé teszi az 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ó csatlakoztatása objektumhoz

Form1 most már be van állítva egy Widget objektum eseményeinek kezelésére. Már csak annyi van hátra, hogy találjon egy Widget valahol.

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. Attól kezdve, hogy az Widget elindítja a PercentDone eseményt, a mWidget_PercentDone eseményeljárás végrehajtásra kerül.

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 feladatidőtartammal lett meghívva. A PercentDone esemény minden egyharmad másodpercben megtörténik. Minden alkalommal, amikor az esemény elő van állítva, az mWidget_PercentDone eseményeljárás végrehajtása történik.

Amikor LongTask elkészül, a rendszer azt ellenőrzi, hogy mblnCancel normálisan fejeződött-e be, vagy leállt-e, mert LongTaskmblnCancel értékre lett állítva. 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 előfordulásakor frissül a címke, amely a tevékenység befejezésének százalékos arányát mutatja.

  3. Kattintson a Mégse gombra a feladat leállításához. Vegye észre, hogy amikor rákattint a Mégse gombra, annak megjelenése nem változik azonnal. 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.

    Megjegyzés:

    A My.Application.DoEvents metódus nem ugyanúgy dolgozza fel az eseményeket, mint az űrlap. Például ebben az útmutatóban 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.

Hasznos lehet, ha a programot az F11-el futtatja, és soronként haladva lép végig a kódon. Világosan láthatja, hogyan lép be LongTask a végrehajtás, majd rövid időre újra belép Form1 minden alkalommal, amikor az PercentDone esemény történik.

Mi történne, ha a végrehajtás a Form1 kódjában lenne, és újra meghívnák a LongTask metódust? Legrosszabb esetben stack túlcsordulás fordulhat elő, ha LongTask minden egyes alkalommal meghívásra kerül, amikor az esemény bekövetkezik.

Az új mWidget-re való hivatkozás Widget-hoz rendelésével a változó kezelheti egy másik Widget objektum eseményeit. Tulajdonképpen a Button1_Click kód minden alkalommal végrehajtódik, 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 eljárás befejeződik, a Widget hivatkozás felszabadul, és a Widget megsemmisül.

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.

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