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 Widget
metoderna 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
Öppna ett nytt Visual Basic Windows-programprojekt och skapa ett formulär med namnet
Form1
.Lägg till två knappar och en etikett i
Form1
.Namnge objekten enligt följande tabell.
Objekt Property Inställning Button1
Text
Starta aktivitet Button2
Text
Avbryt Label
(Name)
,Text
lblPercentDone, 0 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 iWidget
klassen. Observera att en händelse kan haByVal
ochByRef
argument, somWidget
händelsenPercentDone
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
För att förenkla åtkomsten till den egenskap som används av den
Timer
här klassen lägger du till enImports
instruktion överst i deklarationsavsnittet i klassmodulen ovanför -instruktionenClass Widget
.Imports Microsoft.VisualBasic.DateAndTime
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.