Delen via


Overzicht: Gebeurtenissen declareren en genereren (Visual Basic)

In dit scenario ziet u hoe u gebeurtenissen kunt declareren en genereren voor een klasse met de naam Widget. Nadat u de stappen hebt voltooid, kunt u het bijbehorende onderwerp lezen, Walkthrough: Gebeurtenissen verwerken, waarin wordt uitgelegd hoe u gebeurtenissen van Widget objecten kunt gebruiken om statusinformatie in een toepassing op te geven.

De widgetklasse

Stel dat u een Widget klas hebt. Uw Widget klasse heeft een methode die lang kan duren om uit te voeren en u wilt dat uw toepassing een soort voltooiingsindicator kan instellen.

Natuurlijk kunt u ervoor zorgen dat het Widget object een dialoogvenster percentage voltooid weergeeft, maar dan blijft u vastzitten aan dat dialoogvenster in elk project waarin u de Widget klasse hebt gebruikt. Een goed principe van objectontwerp is om de toepassing die gebruikmaakt van een object de gebruikersinterface te laten verwerken, tenzij het hele doel van het object is om een formulier of dialoogvenster te beheren.

Het doel is Widget om andere taken uit te voeren, dus het is beter om een PercentDone gebeurtenis toe te voegen en de procedure die de methoden aanroept Widgetom die gebeurtenis af te handelen en statusupdates weer te geven. De PercentDone gebeurtenis kan ook een mechanisme bieden voor het annuleren van de taak.

Het codevoorbeeld voor dit onderwerp maken

  1. Open een nieuw Visual Basic Windows-toepassingsproject en maak een formulier met de naam Form1.

  2. Voeg twee knoppen en een label toe aan Form1.

  3. Geef de objecten een naam, zoals wordt weergegeven in de volgende tabel.

    Object Eigenschappen Instelling
    Button1 Text Taak starten
    Button2 Text Annuleren
    Label (Name), Text lblPercentDone, 0
  4. Kies Klasse toevoegen in het menu Project om een klasse met de naam Widget.vb aan het project toe te voegen.

Een gebeurtenis declareren voor de widgetklasse

  • Gebruik het Event trefwoord om een gebeurtenis in de Widget klasse te declareren. Houd er rekening mee dat een gebeurtenis kan hebben en ByRef argumenten kan hebbenByVal, zoals Widgetde PercentDone gebeurtenis demonstreert:

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

Wanneer het aanroepende object een PercentDone gebeurtenis ontvangt, bevat het Percent argument het percentage van de taak die is voltooid. Het Cancel argument kan worden ingesteld om de methode die de gebeurtenis heeft gegenereerd, te True annuleren.

Notitie

U kunt gebeurtenisargumenten op dezelfde wijze declareren als argumenten van procedures, met de volgende uitzonderingen: Gebeurtenissen kunnen geen argumenten hebben Optional of ParamArray argumenten en gebeurtenissen hebben geen retourwaarden.

De PercentDone gebeurtenis wordt gegenereerd door de LongTask methode van de Widget klasse. LongTask heeft twee argumenten: de tijdsduur die de methode doet alsof het werk doet, en het minimale tijdsinterval voordat LongTask de pauze wordt onderbroken om de PercentDone gebeurtenis te verhogen.

De PercentDone-gebeurtenis verhogen

  1. Als u de toegang tot de Timer eigenschap die door deze klasse wordt gebruikt, wilt vereenvoudigen, voegt u boven de Class Widget instructie een Imports instructie toe boven de sectie Declaraties van uw klassemodule.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Voeg de volgende code toe aan de klasse Widget:

    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
    

Wanneer uw toepassing de LongTask methode aanroept, wordt de gebeurtenis elke MinimumInterval seconden gegenereerd door de WidgetPercentDone klasse. Wanneer de gebeurtenis wordt geretourneerd, LongTask controleert u of het Cancel argument is ingesteld op True.

Hier zijn enkele disclaimers nodig. Voor het gemak LongTask wordt ervan uitgegaan dat u van tevoren weet hoe lang de taak duurt. Dit is bijna nooit het geval. Het verdelen van taken in segmenten van zelfs grootte kan lastig zijn en vaak is wat het belangrijkst is voor gebruikers, simpelweg de hoeveelheid tijd die verloopt voordat ze een indicatie krijgen dat er iets gebeurt.

Mogelijk hebt u een andere fout in dit voorbeeld gezien. De Timer eigenschap retourneert het aantal seconden dat is verstreken sinds middernacht. De toepassing blijft dus hangen als deze net voor middernacht wordt gestart. Een meer zorgvuldige benadering van het meten van de tijd zou rekening houden met grensvoorwaarden zoals deze, of ze helemaal vermijden, met behulp van eigenschappen zoals Now.

Nu de Widget klas gebeurtenissen kan genereren, kunt u naar de volgende procedure gaan. Walkthrough: Het verwerken van gebeurtenissen laat zien hoe WithEvents u een gebeurtenis-handler koppelt aan de PercentDone gebeurtenis.

Zie ook