Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 Handles-satser.
Hantera händelsen PercentDone för widgetklassen
Placera följande kod i
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanNyckelordet
WithEventsanger att variabelnmWidgetanvä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
mWidgetdeklareras iForm1eftersomWithEventsvariabler måste vara på klassnivå. Detta gäller oavsett vilken typ av klass du placerar dem i.Variabeln
mblnCancelanvänds för att avbrytaLongTaskmetoden.
Skriva kod för att hantera en händelse
Så snart du deklarerar en variabel med hjälp av WithEventsvisas variabelnamnet i den vänstra listrutan i klassens kodredigerare. När du väljer mWidgetWidget 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
mWidgeti den vänstra listrutan i kodredigeraren.Välj händelsen
PercentDonei den högra listrutan. Kodredigeraren öppnar händelseprocedurenmWidget_PercentDone.Anmärkning
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_PercentDonehä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 SubNär händelsen
PercentDoneutlöses visar händelseproceduren färdigtal i procent på enLabelkontroll. MetodenDoEventsgö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_Clickhä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.
Ansluta 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
Loadi den högra listrutan. Kodredigeraren öppnar händelseprocedurenForm1_Load.Lägg till följande kod för händelseproceduren
Form1_Loadfö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å, varje gång Widget påkallar sin PercentDone-händelse, körs mWidget_PercentDone-proceduren.
Anropa Metoden LongTask
Lägg till följande kod i
Button1_Clickhä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
Innan LongTask-metoden anropas måste etiketten som visar slutförandets procentandel initieras och klassens Boolean-flagga 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 har slutförts, testas mblnCancel för att se om LongTask avslutades normalt, eller om det stoppades eftersom mblnCancel var inställt på True. Avslutande procentandel uppdateras endast i det första 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
PercentDoneutlö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
Clickkan inte inträffa förrän instruktionenMy.Application.DoEventstillåter händelsebearbetning.Anmärkning
Metoden
My.Application.DoEventsbearbetar 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 går in i LongTask och sedan kort går in igen i Form1 varje gång händelsen PercentDone aktiveras.
Vad skulle hända om, när körningen var tillbaka i koden för Form1, metoden LongTask anropades igen? I värsta fall kan ett stacköverflöd inträffa om LongTask anropades varje gång händelsen höjdes.
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. När metoden LongTask slutförs frigörs referensen till Widget, och Widget förstörs.
En WithEvents variabel kan bara innehålla en objektreferens i taget, så om du tilldelar ett annat Widget objekt till mWidgethanteras inte längre föregående Widget objekts händelser. Om mWidget är den enda objektvariabeln som innehåller en referens till den gamla Widgetfö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.
Anmärkning
Du kan deklarera så många WithEvents variabler som du behöver, men matriser med WithEvents variabler stöds inte.