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ó interface neve. Ennek nem kell megegyeznie name azzal 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 AddHandler Handles 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 AddHandler tartalmazó 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.