Dela via


Genomgång: Deklarera och höja händelser (Visual Basic)

Den här genomgången visar hur du deklarerar och genererar händelser för en klass med namnet Widget. När du har slutfört stegen kanske du vill läsa det tillhörande ämnet Genomgång : Hantera händelser, som visar hur du använder händelser från Widget objekt för att tillhandahålla statusinformation i ett program.

Widgetklassen

Anta för tillfället att du har en Widget klass. Klassen Widget har en metod som kan ta lång tid att köra och du vill att programmet ska kunna sätta upp någon form av slutförandeindikator.

Du kan naturligtvis göra så Widget att objektet visar en dialogruta för procent färdigt, men sedan fastnar du med den dialogrutan i varje projekt där du använde Widget klassen. En bra princip för objektdesign är att låta programmet som använder ett objekt hantera användargränssnittet, såvida inte hela syftet med objektet är att hantera ett formulär eller en dialogruta.

Syftet med Widget är att utföra andra uppgifter, så det är bättre att lägga till en PercentDone händelse och låta proceduren som anropar Widgetmetoderna hantera händelsen och visa statusuppdateringar. Händelsen PercentDone kan också ge en mekanism för att avbryta uppgiften.

Skapa kodexemplet för det här ämnet

  1. Öppna ett nytt Visual Basic Windows-programprojekt och skapa ett formulär med namnet Form1.

  2. Lägg till två knappar och en etikett i Form1.

  3. Namnge objekten enligt följande tabell.

    Objekt Property Inställning
    Button1 Text Starta aktivitet
    Button2 Text Avbryt
    Label (Name), Text lblPercentDone, 0
  4. På projektmenyn väljer du Lägg till klass för att lägga till en klass med namnet Widget.vb i projektet.

Deklarera en händelse för widgetklassen

  • Använd nyckelordet Event för att deklarera en händelse i Widget klassen. Observera att en händelse kan ha ByVal och ByRef argument, som Widgethändelsen PercentDone visar:

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

När det anropande objektet tar emot en PercentDone händelse Percent innehåller argumentet procentandelen av den slutförda aktiviteten. Argumentet Cancel kan ställas in på för att True avbryta metoden som skapade händelsen.

Kommentar

Du kan deklarera händelseargument precis som du gör argument för procedurer, med följande undantag: Händelser kan inte ha Optional eller ParamArray argument och händelser har inte returvärden.

Händelsen PercentDone genereras av LongTask klassens Widget metod. LongTask tar två argument: hur lång tid metoden låtsas utföra arbete och det minsta tidsintervallet innan LongTask pauser för att skapa PercentDone händelsen.

Så här höjer du händelsen PercentDone

  1. För att förenkla åtkomsten till den egenskap som används av den Timer här klassen lägger du till en Imports instruktion överst i deklarationsavsnittet i klassmodulen ovanför -instruktionen Class Widget .

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Lägg till följande kod i Widget klassen:

    Public Sub LongTask(ByVal Duration As Single,
                        ByVal MinimumInterval As Single)
        Dim Threshold As Single
        Dim Start As Single
        Dim blnCancel As Boolean
    
        ' The Timer property of the DateAndTime object returns the seconds
        ' and milliseconds that have passed since midnight.
        Start = CSng(Timer)
        Threshold = MinimumInterval
    
        Do While CSng(Timer) < (Start + Duration)
            ' In a real application, some unit of work would
            ' be done here each time through the loop.
            If CSng(Timer) > (Start + Threshold) Then
                RaiseEvent PercentDone(
                Threshold / Duration, blnCancel)
                ' Check to see if the operation was canceled.
                If blnCancel Then Exit Sub
                Threshold = Threshold + MinimumInterval
            End If
        Loop
    End Sub
    

När programmet anropar LongTask metoden Widget genererar PercentDone klassen händelsen varje MinimumInterval sekund. När händelsen returneras LongTask kontrollerar du om Cancel argumentet har angetts till True.

Här krävs några ansvarsfriskrivningar. För enkelhetens skull förutsätter proceduren LongTask att du i förväg vet hur lång tid uppgiften tar. Detta är nästan aldrig fallet. Att dela upp uppgifter i segment av jämn storlek kan vara svårt, och ofta är det som är viktigast för användarna helt enkelt den tid som går innan de får en indikation på att något händer.

Du kan ha upptäckt en annan brist i det här exemplet. Egenskapen Timer returnerar antalet sekunder som har passerat sedan midnatt. Därför fastnar programmet om det startas strax före midnatt. En mer noggrann metod för att mäta tid skulle ta hänsyn till gränsförhållanden som detta, eller undvika dem helt och hållet, med hjälp av egenskaper som Now.

Nu när Widget klassen kan skapa händelser kan du gå vidare till nästa genomgång. Genomgång: Hantering av händelser visar hur du använder WithEvents för att associera en händelsehanterare med PercentDone händelsen.

Se även