Overzicht: Gebeurtenissen verwerken (Visual Basic)
Dit is de tweede van twee onderwerpen die laten zien hoe u met gebeurtenissen kunt werken. Het eerste onderwerp, Walkthrough: Gebeurtenissen declareren en genereren, laat zien hoe u gebeurtenissen declareert en genereert. In deze sectie wordt het formulier en de klasse uit die procedure gebruikt om te laten zien hoe gebeurtenissen moeten worden verwerkt wanneer ze plaatsvinden.
In het Widget
klassevoorbeeld worden traditionele instructies voor gebeurtenisafhandeling gebruikt. Visual Basic biedt andere technieken voor het werken met gebeurtenissen. Als oefening kunt u dit voorbeeld wijzigen om de AddHandler
en Handles
instructies te gebruiken.
De percentdone-gebeurtenis van de widgetklasse afhandelen
Plaats de volgende code in
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Het
WithEvents
trefwoord geeft aan dat de variabelemWidget
wordt gebruikt om de gebeurtenissen van een object te verwerken. U geeft het type object op door de naam op te geven van de klasse waaruit het object wordt gemaakt.De variabele
mWidget
wordt gedeclareerdForm1
omdatWithEvents
variabelen klasseniveau moeten zijn. Dit is waar, ongeacht het type klas waarin u ze plaatst.De variabele
mblnCancel
wordt gebruikt om deLongTask
methode te annuleren.
Code schrijven om een gebeurtenis af te handelen
Zodra u een variabele declareert met behulp WithEvents
van, wordt de naam van de variabele weergegeven in de linker vervolgkeuzelijst van de code-editor van de klasse. Wanneer u selecteert mWidget
, worden de gebeurtenissen van de Widget
klas weergegeven in de juiste vervolgkeuzelijst. Als u een gebeurtenis selecteert, wordt de bijbehorende gebeurtenisprocedure weergegeven, met het voorvoegsel mWidget
en een onderstrepingsteken. Alle gebeurtenisprocedures die aan een WithEvents
variabele zijn gekoppeld, krijgen de naam van de variabele als voorvoegsel.
Een gebeurtenis afhandelen
Selecteer
mWidget
in de vervolgkeuzelijst links in de Code-editor.Selecteer de
PercentDone
gebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent demWidget_PercentDone
gebeurtenisprocedure.Notitie
De Code-editor is handig, maar niet vereist voor het invoegen van nieuwe gebeurtenis-handlers. In dit scenario is het meer direct om de gebeurtenis-handlers rechtstreeks naar uw code te kopiëren.
Voeg de volgende code toe aan de
mWidget_PercentDone
gebeurtenis-handler: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
Wanneer de
PercentDone
gebeurtenis wordt gegenereerd, wordt in de gebeurtenisprocedure het percentage voltooid in eenLabel
besturingselement weergegeven. MetDoEvents
de methode kan het label opnieuw worden geschilderd en kan de gebruiker ook op de knop Annuleren klikken.Voeg de volgende code toe voor de
Button2_Click
gebeurtenis-handler:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Als de gebruiker op de knop Annuleren klikt terwijl LongTask
deze wordt uitgevoerd, wordt de Button2_Click
gebeurtenis uitgevoerd zodra de DoEvents
instructie het verwerken van gebeurtenissen toestaat. De variabele mblnCancel
op klasseniveau is ingesteld True
op , en de mWidget_PercentDone
gebeurtenis test deze en stelt het ByRef Cancel
argument in op True
.
een WithEvents-variabele Verbinding maken naar een object
Form1
is nu ingesteld om de gebeurtenissen van een Widget
object af te handelen. Het enige dat overblijft is om een Widget
plek te vinden.
Wanneer u tijdens het ontwerp een variabele WithEvents
declareert, is er geen object aan gekoppeld. Een WithEvents
variabele is net als elke andere objectvariabele. U moet een object maken en er een verwijzing naar toewijzen met de WithEvents
variabele.
Een object maken en er een verwijzing aan toewijzen
Selecteer (Form1 Events) in de vervolgkeuzelijst links in de Code-editor.
Selecteer de
Load
gebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent deForm1_Load
gebeurtenisprocedure.Voeg de volgende code toe voor de
Form1_Load
gebeurtenisprocedure om hetWidget
volgende te maken:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
Wanneer deze code wordt uitgevoerd, maakt Visual Basic een Widget
object en verbindt deze gebeurtenissen met de gebeurtenisprocedures die zijn gekoppeld aan mWidget
. Vanaf dat moment wordt de gebeurtenisprocedure uitgevoerd wanneer de Widget
PercentDone
mWidget_PercentDone
gebeurtenis wordt gegenereerd.
De LongTask-methode aanroepen
Voeg de volgende code toe aan de
Button1_Click
gebeurtenis-handler: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
Voordat de LongTask
methode wordt aangeroepen, moet het label dat het percentage voltooid weergeeft, worden geïnitialiseerd en moet de vlag op klasseniveau Boolean
voor het annuleren van de methode worden ingesteld op False
.
LongTask
wordt aangeroepen met een taakduur van 12,2 seconden. De PercentDone
gebeurtenis wordt eenmaal per derde van een seconde gegenereerd. Telkens wanneer de gebeurtenis wordt gegenereerd, wordt de mWidget_PercentDone
gebeurtenisprocedure uitgevoerd.
Wanneer LongTask
u klaar bent, mblnCancel
wordt getest om te zien of LongTask
het normaal is beëindigd of als het is gestopt omdat mblnCancel
deze is ingesteld op True
. Het percentage voltooid wordt alleen bijgewerkt in het vorige geval.
Het programma uitvoeren
Druk op F5 om het project in de uitvoeringsmodus te plaatsen.
Klik op de knop Taak starten. Telkens wanneer de
PercentDone
gebeurtenis wordt gegenereerd, wordt het label bijgewerkt met het percentage van de taak die is voltooid.Klik op de knop Annuleren om de taak te stoppen. U ziet dat het uiterlijk van de knop Annuleren niet onmiddellijk wordt gewijzigd wanneer u erop klikt. De
Click
gebeurtenis kan pas plaatsvinden als deMy.Application.DoEvents
instructie gebeurtenisverwerking toestaat.Notitie
De
My.Application.DoEvents
methode verwerkt gebeurtenissen niet op exact dezelfde manier als het formulier. In dit scenario moet u bijvoorbeeld tweemaal op de knop Annuleren klikken. Als u wilt dat het formulier de gebeurtenissen rechtstreeks kan verwerken, kunt u multithreading gebruiken. Zie Managed Threading voor meer informatie.
Mogelijk vindt u het instructief om het programma uit te voeren met F11 en de code een regel tegelijk te doorlopen. U kunt duidelijk zien hoe de uitvoering wordt ingevoerd LongTask
en vervolgens kort opnieuw wordt ingevoerd Form1
telkens wanneer de PercentDone
gebeurtenis wordt gegenereerd.
Wat zou er gebeuren als, terwijl de uitvoering terug was in de code van Form1
, de LongTask
methode opnieuw werd aangeroepen? In het slechtste geval kan een stack-overloop optreden als LongTask
deze wordt aangeroepen telkens wanneer de gebeurtenis werd gegenereerd.
U kunt ervoor zorgen dat de variabele mWidget
gebeurtenissen voor een ander Widget
object verwerkt door een verwijzing naar het nieuwe Widget
object toe te mWidget
wijzen. U kunt de code zelfs elke keer op de knop laten klikken Button1_Click
.
Gebeurtenissen voor een andere widget afhandelen
Voeg de volgende coderegel toe aan de
Button1_Click
procedure, direct voorafgaand aan de regel die wordt gelezenmWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Met de bovenstaande code wordt telkens wanneer op de knop wordt geklikt een nieuwe Widget
gemaakt. Zodra de LongTask
methode is voltooid, wordt de verwijzing naar de Widget
vrijgegeven en wordt de Widget
methode vernietigd.
Een WithEvents
variabele kan slechts één objectverwijzing tegelijk bevatten, dus als u een ander Widget
object mWidget
toewijst, worden de gebeurtenissen van het vorige Widget
object niet meer verwerkt. Als mWidget
dit de enige objectvariabele is die een verwijzing naar het oude Widget
bevat, wordt het object vernietigd. Als u gebeurtenissen van verschillende Widget
objecten wilt verwerken, gebruikt u de AddHandler
instructie om gebeurtenissen van elk object afzonderlijk te verwerken.
Notitie
U kunt zoveel WithEvents
variabelen declareren als u nodig hebt, maar matrices van WithEvents
variabelen worden niet ondersteund.