Händelseuttryck

Deklarerar en användardefinierad händelse.

Syntax

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

Delar

Delvis beskrivning
attrlist Valfritt. Lista över attribut som gäller för den här händelsen. Flera attribut avgränsas med kommatecken. Du måste omsluta attributlistan i vinkelparenteser ("<" och ">").
accessmodifier Valfritt. Anger vilken kod som kan komma åt händelsen. Kan vara något av följande:

- Offentlig – all kod som kan komma åt elementet som deklarerar det kan komma åt det.
- Skyddad – endast kod i dess klass eller en härledd klass kan komma åt den.
- Vän – endast kod i samma sammansättning kan komma åt den.
- Privat – endast kod i elementet som deklarerar att det kan komma åt det.
- Skyddad kod endast för vän i händelsens klass, en härledd klass eller samma sammansättning kan komma åt den.
- Privat kod endast skyddad i händelsens klass eller en härledd klass i samma sammansättning kan komma åt den.
Shared Valfritt. Anger att den här händelsen inte är associerad med en specifik instans av en klass eller struktur.
Shadows Valfritt. Anger att den här händelsen redeclares och döljer ett identiskt namngivet programmeringselement, eller en uppsättning överlagrade element, i en basklass. Du kan skugga alla typer av deklarerade element med någon annan typ.

Ett skuggat element är inte tillgängligt från den härledda klassen som skuggar det, förutom där skuggelementet inte är tillgängligt. Om ett Private element till exempel skuggar ett basklasselement, kommer kod som inte har behörighet att komma åt elementet Private att komma åt basklasselementet i stället.
eventname Obligatoriska. Namnet på händelsen; följer namngivningskonventionerna för standardvariabler.
parameterlist Valfritt. Lista över lokala variabler som representerar parametrarna för den här händelsen. Du måste omsluta parameterlistan inom parenteser.
Implements Valfritt. Anger att den här händelsen implementerar en händelse av ett gränssnitt.
implementslist Krävs om Implements anges. Sub Lista över procedurer som implementeras. Flera procedurer avgränsas med kommatecken:

implementedprocedure [ , implementedprocedure ... ]

Var implementedprocedure och en har följande syntax och delar:

interface.definedname

- interface -Krävs. Namnet på ett gränssnitt som den här proceduren innehåller klass eller struktur implementerar.
- Definedname -Krävs. Namn med vilket proceduren definieras i interface. Detta behöver inte vara samma som name, namnet som den här proceduren använder för att implementera den definierade proceduren.
Custom Obligatoriska. Händelser som deklareras som Custom måste definiera anpassade AddHandler, RemoveHandleroch RaiseEvent accessorer.
delegatename Valfritt. Namnet på ett ombud som anger händelsehanterarsignaturen.
AddHandler Obligatoriska. Deklarerar en AddHandler accessor som anger vilka instruktioner som ska köras när en händelsehanterare läggs till, antingen explicit med hjälp av -instruktionen AddHandler eller implicit med hjälp Handles av -satsen.
End AddHandler Obligatoriska. AddHandler Avslutar blocket.
value Obligatoriska. Parameternamn.
RemoveHandler Obligatoriska. Deklarerar en RemoveHandler accessor som anger vilka instruktioner som ska köras när en händelsehanterare tas bort med hjälp av -instruktionen RemoveHandler .
End RemoveHandler Obligatoriska. RemoveHandler Avslutar blocket.
RaiseEvent Obligatoriska. Deklarerar en RaiseEvent accessor som anger vilka instruktioner som ska köras när händelsen genereras med hjälp av -instruktionen RaiseEvent . Vanligtvis anropar detta en lista över ombud som AddHandler underhålls av och RemoveHandler -åtkomstarna.
End RaiseEvent Obligatoriska. RaiseEvent Avslutar blocket.
delegatesignature Obligatoriska. Lista över parametrar som matchar de parametrar som krävs av ombudet delegatename . Du måste omsluta parameterlistan inom parenteser.
statements Valfritt. Instruktioner som innehåller organen i AddHandlermetoderna , RemoveHandleroch RaiseEvent .
End Event Obligatoriska. Event Avslutar blocket.

Kommentarer

När händelsen har deklarerats använder du -instruktionen RaiseEvent för att skapa händelsen. En typisk händelse kan deklareras och aktiveras enligt följande fragment:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Kommentar

Du kan deklarera händelseargument precis som du gör argument för procedurer, med följande undantag: händelser kan inte ha namngivna argument, ParamArray argument eller Optional argument. Händelser har inga returvärden.

Om du vill hantera en händelse måste du associera den med en underrutin för händelsehanterare med hjälp av instruktionen Handles eller AddHandler . Underrutinens signaturer och händelsen måste matcha. Om du vill hantera en delad händelse måste du använda -instruktionen AddHandler .

Du kan bara använda Event på modulnivå. Det innebär att deklarationskontexten för en händelse måste vara en klass, struktur, modul eller gränssnitt och får inte vara en källfil, ett namnområde, en procedur eller ett block. Mer information finns i Deklarationskontexter och standardåtkomstnivåer.

I de flesta fall kan du använda den första syntaxen i avsnittet Syntax i det här avsnittet för att deklarera händelser. Vissa scenarier kräver dock att du har mer kontroll över händelsens detaljerade beteende. Den sista syntaxen i avsnittet Syntax i det här avsnittet, som använder nyckelordet, ger den Custom kontrollen genom att du kan definiera anpassade händelser. I en anpassad händelse anger du exakt vad som händer när koden lägger till eller tar bort en händelsehanterare till eller från händelsen, eller när koden genererar händelsen. Exempel finns i How to: Declare Custom Events To Preserve Memory (Deklarera anpassade händelser för att spara minne ) och How to: Declare Custom Events To Avoid Blocking (Deklarera anpassade händelser för att undvika blockering).

Exempel

I följande exempel används händelser för att räkna ned sekunder från 10 till 0. Koden illustrerar flera av de händelserelaterade metoderna, egenskaperna och -instruktionerna. Detta inkluderar -instruktionen RaiseEvent .

Klassen som genererar en händelse är händelsekällan och de metoder som bearbetar händelsen är händelsehanterarna. En händelsekälla kan ha flera hanterare för de händelser som genereras. När klassen genererar händelsen utlöses händelsen för varje klass som har valt att hantera händelser för den instansen av objektet.

I exemplet används också ett formulär (Form1) med en knapp (Button1) och en textruta (TextBox1). När du klickar på knappen visar den första textrutan en nedräkning från 10 till 0 sekunder. När heltiden (10 sekunder) har förflutit visar den första textrutan "Klar".

Koden för Form1 anger formulärets inledande tillstånd och terminaltillstånd. Den innehåller också den kod som körs när händelser genereras.

Om du vill använda det här exemplet öppnar du ett nytt Windows Forms-projekt. Lägg sedan till en knapp med namnet Button1 och en textruta med namnet TextBox1 i huvudformuläret med namnet Form1. Högerklicka sedan på formuläret och klicka på Visa kod för att öppna kodredigeraren.

Lägg till en WithEvents variabel i deklarationsavsnittet i Form1 klassen:

Private WithEvents mText As TimerState

Lägg till följande kod i koden för Form1. Ersätt eventuella duplicerade procedurer som kan finnas, till exempel Form_Load eller 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

Tryck på F5 för att köra föregående exempel och klicka på knappen Med etiketten Start. Den första textrutan börjar räkna ned sekunderna. När heltiden (10 sekunder) har förflutit visar den första textrutan "Klar".

Kommentar

Metoden My.Application.DoEvents bearbetar inte händelser på samma sätt som formuläret gör. Om du vill aktivera formuläret för att hantera händelserna direkt kan du använda multitrådning. Mer information finns i Hanterad trådning.

Se även