Delen via


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

  1. Plaats de volgende code in Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Het WithEvents trefwoord geeft aan dat de variabele mWidget 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 gedeclareerd Form1 omdat WithEvents variabelen klasseniveau moeten zijn. Dit is waar, ongeacht het type klas waarin u ze plaatst.

    De variabele mblnCancel wordt gebruikt om de LongTask methode 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

  1. Selecteer mWidget in de vervolgkeuzelijst links in de Code-editor.

  2. Selecteer de PercentDone gebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent de mWidget_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.

  3. 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 een Label besturingselement weergegeven. Met DoEvents de methode kan het label opnieuw worden geschilderd en kan de gebruiker ook op de knop Annuleren klikken.

  4. 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 Trueop , 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

  1. Selecteer (Form1 Events) in de vervolgkeuzelijst links in de Code-editor.

  2. Selecteer de Load gebeurtenis in de rechter vervolgkeuzelijst. De code-editor opent de Form1_Load gebeurtenisprocedure.

  3. Voeg de volgende code toe voor de Form1_Load gebeurtenisprocedure om het Widgetvolgende 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 WidgetPercentDonemWidget_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

  1. Druk op F5 om het project in de uitvoeringsmodus te plaatsen.

  2. 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.

  3. 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 de My.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 LongTasken 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 mWidgetwijzen. 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 gelezen mWidget.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.

Notitie

U kunt zoveel WithEvents variabelen declareren als u nodig hebt, maar matrices van WithEvents variabelen worden niet ondersteund.

Zie ook