Eseményutasítás

Felhasználó által megadott eseményt deklarál.

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  

Részek

Része Leírás
attrlist Opcionális. Az eseményre vonatkozó attribútumok listája. Több attribútumot vessző választ el egymástól. Az attribútumlistát szögletes zárójelek ("<" és ">") közé kell foglalnia.
accessmodifier Opcionális. Megadja, hogy milyen kód férhet hozzá az eseményhez. A következők egyike lehet:

- Nyilvános – bármely kód, amely hozzáfér a deklarált elemhez, hozzáférhet hozzá.
- Védett – csak az osztályon belüli kód vagy egy származtatott osztály férhet hozzá.
- Barát – csak az ugyanabban a szerelvényben lévő kód férhet hozzá.
- Privát – csak a deklarált elemet tartalmazó kód fér hozzá.
- Az esemény osztályában, származtatott osztályában vagy ugyanahhoz a szerelvényhez csak védett barátkódok férhetnek hozzá.
- Az esemény osztályában vagy az ugyanabban a szerelvényben lévő származtatott osztályban lévő csak privát védett kód hozzáférhet hozzá.
Shared Opcionális. Azt adja meg, hogy ez az esemény nem egy osztály vagy struktúra adott példányához van társítva.
Shadows Opcionális. Azt jelzi, hogy ez az esemény egy azonos nevű programozási elemet vagy túlterhelt elemeket rejt el egy alaposztályban. Bármilyen deklarált elemet bármilyen más típussal árnyékba helyezhet.

Az árnyékolt elem nem érhető el az árnyékoló származtatott osztályon belül, kivéve, ha az árnyékoló elem elérhetetlen. Ha például egy Private elem egy alaposztály-elemet árnyékel, az elem elérésére Private nem jogosult kód ehelyett az alaposztályelemhez fér hozzá.
eventname Szükséges. Az esemény neve; a standard változók elnevezési konvencióit követi.
parameterlist Opcionális. Az esemény paramétereit képviselő helyi változók listája. Zárójelbe kell tennie a paraméterlistát .
Implements Opcionális. Azt jelzi, hogy ez az esemény egy interfész eseményét valósítja meg.
implementslist Implements Ha meg van adva, kötelező megadni. Sub A végrehajtandó eljárások listája. Több eljárás vesszővel van elválasztva:

implementprocedure [ , implementáltprocedure ... ]

Mindegyik implementedprocedure a következő szintaxist és részeket tartalmazza:

interface.definedname

- interface -Szükséges. Annak a felületnek a neve, amelyet az eljárás osztályt vagy struktúrát tartalmaz.
- Definedname -Szükséges. Az eljárás definiáló interfaceneve. Ennek nem kell megegyeznie nameazzal a névvel, amelyet ez az eljárás a meghatározott eljárás megvalósításához használ.
Custom Szükséges. A deklarált Custom eseményeknek meg kell határozniuk az egyéni AddHandler, RemoveHandlerés RaiseEvent a tartozékokat.
delegatename Opcionális. Az eseménykezelő aláírását meghatározó meghatalmazott neve.
AddHandler Szükséges. Deklarál egy kiegészítőt AddHandler , amely megadja az eseménykezelő hozzáadásakor végrehajtandó utasításokat, akár explicit módon, akár implicit módon a AddHandlerHandles záradék használatával.
End AddHandler Szükséges. Leállítja a blokkot AddHandler .
value Szükséges. Paraméter neve.
RemoveHandler Szükséges. Deklarál egy tartozékot RemoveHandler , amely megadja azokat az utasításokat, amelyeket az eseménykezelő eltávolításakor kell végrehajtani az RemoveHandler utasítással.
End RemoveHandler Szükséges. Leállítja a blokkot RemoveHandler .
RaiseEvent Szükséges. Deklarál egy kiegészítőt RaiseEvent , amely meghatározza azokat az utasításokat, amelyeket az esemény az utasítással RaiseEvent való előhozásakor hajt végre. Ez általában meghívja a meghatalmazottak és RemoveHandler a AddHandler tartozékok által karbantartott listáját.
End RaiseEvent Szükséges. Leállítja a blokkot RaiseEvent .
delegatesignature Szükséges. A meghatalmazott által delegatename megkövetelt paramétereknek megfelelő paraméterek listája. Zárójelbe kell tennie a paraméterlistát .
statements Opcionális. A , RemoveHandlerés RaiseEvent metódusok testét AddHandlertartalmazó utasítások.
End Event Szükséges. Leállítja a blokkot Event .

Megjegyzések

Az esemény deklarálása után az RaiseEvent utasítás használatával emelje fel az eseményt. Egy tipikus esemény deklarálható és emelhető az alábbi töredékekben látható módon:

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

Feljegyzés

Az eseményargumentumokat ugyanúgy deklarálhatja, mint az eljárások argumentumait, a következő kivételekkel: az események nem tartalmazhatnak elnevezett argumentumokat, ParamArray argumentumokat vagy Optional argumentumokat. Az események nem rendelkeznek visszatérési értékkel.

Az események kezeléséhez társítania kell azt egy eseménykezelő alrutinnal az vagy AddHandler az Handles utasítás használatával. Az alrutin és az esemény aláírásának egyeznie kell. Megosztott esemény kezeléséhez az utasítást AddHandler kell használnia.

Csak modulszinten használható Event . Ez azt jelenti, hogy egy esemény deklarációs környezetének osztálynak, struktúrának, modulnak vagy interfésznek kell lennie, és nem lehet forrásfájl, névtér, eljárás vagy blokk. További információ: Deklarációs környezetek és alapértelmezett hozzáférési szintek.

A legtöbb esetben a témakör Szintaxis szakaszának első szintaxisát használhatja események deklarálásához. Egyes forgatókönyvek azonban megkövetelik, hogy jobban szabályozható legyen az esemény részletes viselkedése. A témakör Szintaxis szakaszának utolsó szintaxisa, amely a Custom kulcsszót használja, lehetővé teszi az egyéni események definiálását. Egyéni esemény esetén pontosan megadhatja, hogy mi történik, ha a kód hozzáad vagy eltávolít egy eseménykezelőt az eseményhez vagy az eseményből, vagy amikor a kód az eseményt állítja elő. Példák : Útmutató: Egyéni események deklarálása a memória megőrzéséhez és útmutató: Egyéni események deklarálása a blokkolás elkerülése érdekében.

Példa

Az alábbi példa események használatával számolja le a másodperceket 10 és 0 között. A kód számos eseményhez kapcsolódó metódust, tulajdonságot és utasítást szemléltet. Ez magában foglalja az utasítást RaiseEvent .

Az eseményt jelölő osztály az eseményforrás, az eseményt feldolgozó metódusok pedig az eseménykezelők. Az eseményforrásnak több kezelője is lehet az általa létrehozott eseményekhez. Amikor az osztály előhozta az eseményt, az esemény minden olyan osztályon létrejön, amely úgy döntött, hogy kezeli az objektum adott példányának eseményeit.

A példa egy űrlapot (Form1) is használ egy gombot (Button1) és egy szövegdobozt (TextBox1). A gombra kattintva az első szövegmező 10 és 0 másodperc közötti visszaszámlálást jelenít meg. Ha a teljes idő (10 másodperc) eltelt, az első szövegmezőben a "Kész" szöveg jelenik meg.

A kód Form1 megadja az űrlap kezdeti és terminálállapotait. Az események létrehozásakor végrehajtott kódot is tartalmazza.

A példa használatához nyisson meg egy új Windows Forms-projektet. Ezután adjon hozzá egy gombot és Button1 egy, a fő űrlaphoz elnevezett TextBox1 szövegdobozt Form1. Ezután kattintson a jobb gombbal az űrlapra, majd a Kód megtekintése parancsra a kódszerkesztő megnyitásához.

Adjon hozzá egy változót WithEvents az osztály deklarációs szakaszához Form1 :

Private WithEvents mText As TimerState

Adja hozzá a következő kódot a következő kódhoz Form1: Cserélje le az esetlegesen előforduló ismétlődő eljárásokat, például Form_Load a .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

Az előző példa futtatásához nyomja le az F5 billentyűt, majd kattintson a Start feliratú gombra. Az első szövegdoboz elkezdi visszaszámlálni a másodperceket. Ha a teljes idő (10 másodperc) eltelt, az első szövegmezőben a "Kész" szöveg jelenik meg.

Feljegyzés

A My.Application.DoEvents metódus nem ugyanúgy dolgozza fel az eseményeket, mint az űrlapot. Ha engedélyezni szeretné, hogy az űrlap közvetlenül kezelje az eseményeket, használhat többszálú elemet. További információ: Felügyelt szálkezelés.

Lásd még