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 Widget
om 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
Open een nieuw Visual Basic Windows-toepassingsproject en maak een formulier met de naam
Form1
.Voeg twee knoppen en een label toe aan
Form1
.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 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 deWidget
klasse te declareren. Houd er rekening mee dat een gebeurtenis kan hebben enByRef
argumenten kan hebbenByVal
, zoalsWidget
dePercentDone
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
Als u de toegang tot de
Timer
eigenschap die door deze klasse wordt gebruikt, wilt vereenvoudigen, voegt u boven deClass Widget
instructie eenImports
instructie toe boven de sectie Declaraties van uw klassemodule.Imports Microsoft.VisualBasic.DateAndTime
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 Widget
PercentDone
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.