Dela via


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

  1. Placera följande kod i Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Nyckelordet WithEvents anger att variabeln mWidget 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 i Form1 eftersom WithEvents 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 avbryta LongTask metoden.

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

  1. Välj mWidget i den vänstra listrutan i kodredigeraren.

  2. 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.

  3. 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 en Label kontroll. Metoden DoEvents gör att etiketten kan målas om och ger även användaren möjlighet att klicka på knappen Avbryt .

  4. 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

  1. Välj (Formulär1-händelser) i den vänstra listrutan i kodredigeraren.

  2. Välj händelsen Load i den högra listrutan. Kodredigeraren öppnar händelseprocedurenForm1_Load.

  3. Lägg till följande kod för händelseproceduren Form1_Load för att skapa Widget:

    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 WidgetmWidget_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

  1. Tryck på F5 för att placera projektet i körningsläge.

  2. Klicka på knappen Starta aktivitet . Varje gång händelsen PercentDone utlöses uppdateras etiketten med procentandelen av aktiviteten som är klar.

  3. 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 instruktionen My.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 LongTaskanger 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 Form1LongTask 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äser mWidget.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 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.

Kommentar

Du kan deklarera så många WithEvents variabler som du behöver, men matriser med WithEvents variabler stöds inte.

Se även