Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 worden het formulier en de klasse uit die handleiding 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 BooleanHet
WithEventstrefwoord geeft aan dat de variabelemWidgetwordt 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
mWidgetwordt gedeclareerd inForm1omdatWithEventsvariabelen op klasseniveau moeten zijn. Dit is waar, ongeacht het type klas waarin u ze plaatst.De variabele
mblnCancelwordt gebruikt om deLongTaskmethode te annuleren.
Code schrijven om een gebeurtenis af te handelen
Zodra u een variabele declareert met behulp WithEventsvan, 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
mWidgetin de vervolgkeuzelijst links in de Code-editor.Selecteer de
PercentDonegebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent demWidget_PercentDonegebeurtenisprocedure.Opmerking
De Code-editor is handig, maar niet vereist voor het invoegen van nieuwe gebeurtenis-handlers. In deze walkthrough is het directer om de evenementhandlers rechtstreeks in uw code te kopiëren.
Voeg de volgende code toe aan de
mWidget_PercentDonegebeurtenis-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 SubWanneer de
PercentDonegebeurtenis wordt gegenereerd, geeft de gebeurtenisprocedure het percentage voltooid weer in eenLabelbesturingselement. MetDoEventsde 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_Clickgebeurtenis-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 op True, en het mWidget_PercentDone-event test de variabele en stelt het ByRef Cancel-argument in op True.
Een WithEvents-variabele verbinden met een object
Form1 is nu ingesteld om de gebeurtenissen van een Widget object af te handelen. Het enige dat overblijft is om een Widget ergens 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
Loadgebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent deForm1_Loadgebeurtenisprocedure.Voeg de volgende code toe voor de
Form1_Loadprocedure om deWidgette 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, telkens wanneer de Widget zijn PercentDone gebeurtenis verhoogt, wordt de mWidget_PercentDone gebeurtenisprocedure uitgevoerd.
De LongTask-methode aanroepen
Voeg de volgende code toe aan de
Button1_Clickgebeurtenis-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 is afgerond, wordt mblnCancel getest om te zien of LongTask normaal is beëindigd, of dat het is gestopt omdat mblnCancel was ingesteld op True. Het percentage voltooid wordt alleen bijgewerkt in het eerste geval.
Het programma uitvoeren
Druk op F5 om het project in de uitvoeringsmodus te plaatsen.
Klik op de knop Taak starten . Telkens wanneer de
PercentDonegebeurtenis 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
Clickgebeurtenis kan pas plaatsvinden als deMy.Application.DoEventsinstructie gebeurtenisverwerking toestaat.Opmerking
De
My.Application.DoEventsmethode 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 LongTask wordt gestart en vervolgens kort opnieuw Form1 wordt gestart 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 stapeloverloop optreden als LongTask aangeroepen wordt telkens wanneer de gebeurtenis werd opgewekt.
U kunt ervoor zorgen dat de variabele mWidget gebeurtenissen voor een ander Widget object verwerkt door een verwijzing naar het nieuwe Widget toe te wijzen aan mWidget. U kunt de code zelfs zo instellen dat deze elke keer wordt uitgevoerd wanneer u op de knop Button1_Click klikt.
Gebeurtenissen voor een andere widget afhandelen
Voeg de volgende coderegel toe aan de
Button1_Click-procedure, net voor de regel die leestmWidget.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 mWidgettoewijst, worden de gebeurtenissen van het vorige Widget object niet meer verwerkt. Als mWidget dit de enige objectvariabele is die een verwijzing naar het oude Widgetbevat, 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.
Opmerking
U kunt zoveel WithEvents variabelen declareren als u nodig hebt, maar matrices van WithEvents variabelen worden niet ondersteund.