Delen via


RaiseEvent-instructie

Hiermee wordt een gebeurtenis geactiveerd die is gedeclareerd op moduleniveau binnen een klasse, formulier of document.

Syntaxis

RaiseEvent eventname[( argumentlist )]  

generator

eventname
Vereist. Naam van de gebeurtenis die moet worden geactiveerd.

argumentlist
Optioneel. Door komma's gescheiden lijst met variabelen, matrices of expressies. Het argumentlist argument moet tussen haakjes staan. Als er geen argumenten zijn, moeten de haakjes worden weggelaten.

Opmerkingen

De vereiste eventname is de naam van een gebeurtenis die in de module is gedeclareerd. Het volgt naamconventies voor Visual Basic-variabelen.

Als de gebeurtenis niet is gedeclareerd in de module waarin deze wordt gegenereerd, treedt er een fout op. Het volgende codefragment illustreert een gebeurtenisdeclaratie en een procedure waarin de gebeurtenis wordt gegenereerd.

' Declare an event at module level.
Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)
    ' Raise the event.
    RaiseEvent LogonCompleted(UserName)
End Sub

U kunt niet gebruiken RaiseEvent om gebeurtenissen te genereren die niet expliciet zijn gedeclareerd in de module. Alle formulieren nemen bijvoorbeeld een Click gebeurtenis over van System.Windows.Forms.Form, deze kan niet worden gegenereerd met behulp van RaiseEvent een afgeleide vorm. Als u een Click gebeurtenis declareert in de formuliermodule, wordt de eigen Click gebeurtenis van het formulier geschaduwd. U kunt de gebeurtenis van Click het formulier nog steeds aanroepen door de methode aan te OnClick roepen.

Standaard genereert een gebeurtenis die is gedefinieerd in Visual Basic de gebeurtenis-handlers in de volgorde waarin de verbindingen tot stand worden gebracht. Omdat gebeurtenissen parameters kunnen hebben ByRef , kan een proces dat te laat is verbonden parameters ontvangen die zijn gewijzigd door een eerdere gebeurtenis-handler. Nadat de gebeurtenis-handlers zijn uitgevoerd, wordt het besturingselement teruggezet naar de subroutine die de gebeurtenis heeft gegenereerd.

Notitie

Niet-gedeelde gebeurtenissen mogen niet worden gegenereerd binnen de constructor van de klasse waarin ze worden gedeclareerd. Hoewel dergelijke gebeurtenissen geen runtimefouten veroorzaken, kunnen ze mogelijk niet worden onderschept door gekoppelde gebeurtenis-handlers. Gebruik de Shared wijzigingsfunctie om een gedeelde gebeurtenis te maken als u een gebeurtenis van een constructor moet genereren.

Notitie

U kunt het standaardgedrag van gebeurtenissen wijzigen door een aangepaste gebeurtenis te definiƫren. Voor aangepaste gebeurtenissen roept de RaiseEvent instructie de accessor van RaiseEvent de gebeurtenis aan. Zie Gebeurtenisinstructie voor meer informatie over aangepaste gebeurtenissen.

Voorbeeld 1

In het volgende voorbeeld worden gebeurtenissen gebruikt om seconden van 10 tot en met 0 af te tellen. De code illustreert verschillende gebeurtenismethoden, eigenschappen en instructies, waaronder de RaiseEvent instructie.

De klasse die een gebeurtenis genereert, is de gebeurtenisbron en de methoden die de gebeurtenis verwerken, zijn de gebeurtenis-handlers. Een gebeurtenisbron kan meerdere handlers hebben voor de gebeurtenissen die worden gegenereerd. Wanneer de klasse de gebeurtenis genereert, wordt deze gebeurtenis gegenereerd voor elke klasse die ervoor heeft gekozen gebeurtenissen voor dat exemplaar van het object af te handelen.

In het voorbeeld wordt ook een formulier (Form1) met een knop (Button1) en een tekstvak (TextBox1) gebruikt. Wanneer u op de knop klikt, wordt in het eerste tekstvak een aftelling van 10 tot 0 seconden weergegeven. Wanneer de volledige tijd (10 seconden) is verstreken, wordt in het eerste tekstvak 'Gereed' weergegeven.

De code voor Form1 het specificeert de begin- en terminalstatussen van het formulier. Het bevat ook de code die wordt uitgevoerd wanneer er gebeurtenissen worden gegenereerd.

Als u dit voorbeeld wilt gebruiken, opent u een nieuw Windows-toepassingsproject, voegt u een knop toe met de naam Button1 en een tekstvak met de naam TextBox1Form1aan het hoofdformulier. Klik vervolgens met de rechtermuisknop op het formulier en klik op Code weergeven om de Code-editor te openen.

Voeg een WithEvents variabele toe aan de declaratiesectie van de Form1 klasse.

Private WithEvents mText As TimerState

Voorbeeld 2

Voeg de volgende code toe aan de code voor Form1. Vervang eventuele dubbele procedures, zoals Form_Load, of Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Druk op F5 om het vorige voorbeeld uit te voeren en klik op de knop met het label Start. Het eerste tekstvak begint met het aftellen van de seconden. Wanneer de volledige tijd (10 seconden) is verstreken, wordt in het eerste tekstvak 'Gereed' weergegeven.

Notitie

De My.Application.DoEvents methode verwerkt gebeurtenissen niet op exact dezelfde manier als het formulier. Als u wilt dat het formulier de gebeurtenissen rechtstreeks kan verwerken, kunt u multithreading gebruiken. Zie Managed Threading voor meer informatie.

Zie ook