Ú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
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
mertWithEvents
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áraLongTask
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
Válasszon
mWidget
a Kódszerkesztő bal oldali legördülő listájából.Válassza ki az eseményt
PercentDone
a jobb oldali legördülő listából. A Kódszerkesztő megnyitja az eseményeljárástmWidget_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.
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ékotLabel
. ADoEvents
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.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 True
van á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
A Kódszerkesztő bal oldali legördülő listájában válassza az (1. űrlapesemények) lehetőséget.
Válassza ki az eseményt
Load
a jobb oldali legördülő listából. A Kódszerkesztő megnyitja az eseményeljárástForm1_Load
.Adja hozzá a következő kódot az
Form1_Load
eseményeljáráshoz aWidget
kö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 False
kell á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
Nyomja le az F5 billentyűt a projekt futási módba helyezéséhez.
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.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 azMy.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 LongTask
a 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ábanForm1
LongTask
? 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 Widget
mWidget
.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ásimWidget.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 mWidget
rendel hozzá, az előző Widget
objektum eseményei már nem lesznek kezelve. Ha mWidget
az egyetlen objektumváltozó, amely a régire Widget
mutató 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.