Genomgång: Hantera händelser (Visual Basic)
Det här är det andra av två ämnen som visar hur du arbetar med händelser. Det första avsnittet, Walkthrough: Declaring and Raising Events, visar hur du deklarerar och genererar händelser. I det här avsnittet används formuläret och klassen från den genomgången för att visa hur du hanterar händelser när de äger rum.
I Widget
klassexemplet används traditionella händelsehanteringsinstruktioner. Visual Basic tillhandahåller andra tekniker för att arbeta med händelser. Som en övning kan du ändra det här exemplet för att använda AddHandler
- och-instruktioner Handles
.
Hantera händelsen PercentDone för widgetklassen
Placera följande kod i
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Nyckelordet
WithEvents
anger att variabelnmWidget
används för att hantera ett objekts händelser. Du anger typen av objekt genom att ange namnet på den klass som objektet ska skapas från.Variabeln
mWidget
deklareras iForm1
eftersomWithEvents
variabler måste vara på klassnivå. Detta gäller oavsett vilken typ av klass du placerar dem i.Variabeln
mblnCancel
används för att avbrytaLongTask
metoden.
Skriva kod för att hantera en händelse
Så snart du deklarerar en variabel med hjälp av WithEvents
visas variabelnamnet i den vänstra listrutan i klassens kodredigerare. När du väljer mWidget
Widget
visas klassens händelser i den högra listrutan. Om du väljer en händelse visas motsvarande händelseprocedur, med prefixet mWidget
och ett understreck. Alla händelseprocedurer som är associerade med en WithEvents
variabel får variabelnamnet som prefix.
Hantera en händelse
Välj
mWidget
i den vänstra listrutan i kodredigeraren.Välj händelsen
PercentDone
i den högra listrutan. Kodredigeraren öppnar händelseprocedurenmWidget_PercentDone
.Kommentar
Kodredigeraren är användbar, men krävs inte, för att infoga nya händelsehanterare. I den här genomgången är det mer direkt att bara kopiera händelsehanterarna direkt till din kod.
Lägg till följande kod i
mWidget_PercentDone
händelsehanteraren: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
När händelsen
PercentDone
utlöses visar händelseproceduren procent färdigt i enLabel
kontroll. MetodenDoEvents
gör att etiketten kan målas om och ger även användaren möjlighet att klicka på knappen Avbryt .Lägg till följande kod för
Button2_Click
händelsehanteraren:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Om användaren klickar på knappen Avbryt medan LongTask
den körs Button2_Click
körs händelsen så snart instruktionen DoEvents
tillåter att händelsebearbetning sker. Variabeln mblnCancel
på klassnivå är inställd på True
, och mWidget_PercentDone
händelsen testar den och anger ByRef Cancel
argumentet till True
.
Anslut en WithEvents-variabel till ett objekt
Form1
har nu konfigurerats för att hantera ett Widget
objekts händelser. Allt som återstår är att hitta en Widget
någonstans.
När du deklarerar en variabel WithEvents
vid designtillfället associeras inget objekt med den. En WithEvents
variabel är precis som alla andra objektvariabler. Du måste skapa ett objekt och tilldela en referens till det med variabeln WithEvents
.
Skapa ett objekt och tilldela en referens till det
Välj (Formulär1-händelser) i den vänstra listrutan i kodredigeraren.
Välj händelsen
Load
i den högra listrutan. Kodredigeraren öppnar händelseprocedurenForm1_Load
.Lägg till följande kod för händelseproceduren
Form1_Load
för att skapaWidget
:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
När den här koden körs skapar Visual Basic ett Widget
objekt och ansluter dess händelser till de händelseprocedurer som är associerade med mWidget
. Från och med då körs händelseproceduren Widget
mWidget_PercentDone
när händelsen höjsPercentDone
.
Anropa Metoden LongTask
Lägg till följande kod i
Button1_Click
händelsehanteraren: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
Innan metoden anropas måste etiketten som visar procent färdigt initieras och flaggan på klassnivå Boolean
för att avbryta metoden måste vara inställd på False
.
LongTask
anropas med en aktivitetsvaraktighet på 12,2 sekunder. Händelsen PercentDone
utlöses en gång var tredje sekund. Varje gång händelsen utlöses körs händelseproceduren mWidget_PercentDone
.
När LongTask
är klar mblnCancel
, testas för att se om LongTask
avslutades normalt, eller om det stoppades eftersom mblnCancel
var inställt på True
. Procent färdigt uppdateras endast i det tidigare fallet.
Så här kör du programmet
Tryck på F5 för att placera projektet i körningsläge.
Klicka på knappen Starta aktivitet . Varje gång händelsen
PercentDone
utlöses uppdateras etiketten med procentandelen av aktiviteten som är klar.Klicka på knappen Avbryt för att stoppa uppgiften. Observera att utseendet på knappen Avbryt inte ändras omedelbart när du klickar på den. Händelsen
Click
kan inte inträffa förrän instruktionenMy.Application.DoEvents
tillåter händelsebearbetning.Kommentar
Metoden
My.Application.DoEvents
bearbetar inte händelser på exakt samma sätt som formuläret gör. I den här genomgången måste du till exempel klicka på knappen Avbryt två gånger. Om du vill att formuläret ska kunna hantera händelserna direkt kan du använda multitrådning. Mer information finns i Hanterad trådning.
Det kan vara lärorikt att köra programmet med F11 och gå igenom koden en rad i taget. Du kan tydligt se hur körningen LongTask
anger och sedan kort anger varje gång händelsen PercentDone
aktiverasForm1
.
Vad skulle hända om metoden anropades igen när körningen var tillbaka i koden Form1
LongTask
för ? I värsta fall kan ett stackspill inträffa om LongTask
det anropas varje gång händelsen aktiverades.
Du kan göra så att variabeln mWidget
hanterar händelser för ett annat Widget
objekt genom att tilldela en referens till den nya Widget
till mWidget
. Faktum är att du kan göra koden i Button1_Click
göra detta varje gång du klickar på knappen.
Hantera händelser för en annan widget
Lägg till följande kodrad i proceduren
Button1_Click
, omedelbart före raden som läsermWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Koden ovan skapar en ny Widget
varje gång knappen klickas. LongTask
När metoden har slutförts släpps referensen Widget
till och förstörsWidget
.
En WithEvents
variabel kan bara innehålla en objektreferens i taget, så om du tilldelar ett annat Widget
objekt till mWidget
hanteras inte längre föregående Widget
objekts händelser. Om mWidget
är den enda objektvariabeln som innehåller en referens till den gamla Widget
förstörs objektet. Om du vill hantera händelser från flera Widget
objekt använder du -instruktionen AddHandler
för att bearbeta händelser från varje objekt separat.
Kommentar
Du kan deklarera så många WithEvents
variabler som du behöver, men matriser med WithEvents
variabler stöds inte.