Események (Visual Basic)
Bár előfordulhat, hogy egy Visual Studio-projektet egy sorozatban végrehajtott eljárásként vizualizál, a valóságban a legtöbb program eseményvezérelt – vagyis a végrehajtás folyamatát eseményeknek nevezett külső események határozzák meg.
Az esemény egy olyan jelzés, amely tájékoztatja az alkalmazást arról, hogy valami fontos történt. Ha például egy felhasználó egy űrlap vezérlőelemére kattint, az űrlap eseményt Click
indíthat, és meghívhat egy, az eseményt kezelő eljárást. Az események lehetővé teszik a különböző tevékenységek közötti kommunikációt is. Tegyük fel például, hogy az alkalmazás a fő alkalmazástól elkülönítve hajt végre rendezési feladatot. Ha egy felhasználó megszakítja a rendezést, az alkalmazás elküldhet egy megszakítási eseményt, amely a rendezési folyamat leállítására utasítja.
Esemény feltételei és fogalmai
Ez a szakasz a Visual Basic eseményekhez használt kifejezéseket és fogalmakat ismerteti.
Események deklarálása
Az osztályokon, struktúrákon, modulokon és interfészeken belüli eseményeket a Event
kulcsszó használatával deklarálhatja, az alábbi példához hasonlóan:
Event AnEvent(ByVal EventNumber As Integer)
Események emelése
Az esemény olyan, mint egy üzenet, amely arról tájékoztatja, hogy valami fontos történt. Az üzenet közvetítésének a neve az esemény növelése . A Visual Basic az alábbi példához hasonlóan az RaiseEvent
utasítással hozhatja elő az eseményeket:
RaiseEvent AnEvent(EventNumber)
Az eseményeket annak az osztálynak, modulnak vagy struktúrának a hatókörén belül kell emelnie, ahol deklarálva vannak. Egy származtatott osztály például nem képes az alaposztálytól örökölt eseményeket generálni.
Esemény feladói
Minden olyan objektum, amely képes eseményt emelni, esemény feladója, más néven eseményforrás. Az űrlapok, vezérlők és felhasználó által definiált objektumok az esemény feladóinak példái.
Eseménykezelők
Az eseménykezelők olyan eljárások, amelyek a megfelelő események bekövetkezésekor lesznek meghívva. Eseménykezelőként bármely érvényes alrutint használhat egyező aláírással. A függvényt azonban nem használhatja eseménykezelőként, mert nem tud értéket visszaadni az eseményforrásnak.
Visual Basic egy szabványos elnevezési konvenciót használ az eseménykezelőkhöz, amely egyesíti az esemény feladójának nevét, egy aláhúzásjelet és az esemény nevét. Például egy Click
elnevezett button1
gomb eseménye lesz elnevezve Sub button1_Click
.
Megjegyzés
Azt javasoljuk, hogy ezt az elnevezési konvenciót használja az eseménykezelők saját eseményekhez való definiálásakor, de ez nem kötelező; bármilyen érvényes alrutinnevet használhat.
Események társítása eseménykezelőkkel
Mielőtt egy eseménykezelő használhatóvá válik, először társítania kell azt egy eseményhez az vagy AddHandler
az Handles
utasítás használatával.
WithEvents és a Handles záradék
Az WithEvents
utasítás és Handles
a záradék deklaratív módot biztosít az eseménykezelők megadására. A kulcsszóval WithEvents
deklarált objektum által generált eseményeket az eseményre vonatkozó utasítással Handles
rendelkező bármely eljárás kezelheti, az alábbi példában látható módon:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
Az WithEvents
utasítás és a Handles
záradék gyakran a legjobb választás az eseménykezelők számára, mivel az általuk használt deklaratív szintaxis megkönnyíti az eseménykezelést a kód, az olvasás és a hibakeresés szempontjából. Vegye figyelembe azonban a változók használatára WithEvents
vonatkozó alábbi korlátozásokat:
Nem használhat változót
WithEvents
objektumváltozóként. Vagyis nem deklarálhatja a változótObject
– a változó deklarálásakor meg kell adnia az osztály nevét.Mivel a megosztott események nincsenek osztálypéldányokhoz kötve, nem használhatja
WithEvents
a megosztott események deklaratív kezelését. Hasonlóképpen nem használhatjaWithEvents
ésHandles
nem kezelheti az eseményeket egyStructure
adott helyről. Mindkét esetben használhatja az utasítástAddHandler
az események kezelésére.Változók tömbjei
WithEvents
nem hozhatók létre.
WithEvents
a változók lehetővé teszik, hogy egy eseménykezelő egy vagy több eseményt kezeljen, vagy egy vagy több eseménykezelő kezelje ugyanazt az eseménytípust.
Bár a Handles
záradék az események eseménykezelővel való társításának szabványos módja, az eseményeknek az eseménykezelőkkel való társítására korlátozódik a fordításkor.
Bizonyos esetekben, például az űrlapokhoz vagy vezérlőkhöz társított eseményekhez Visual Basic automatikusan kicsonog egy üres eseménykezelőt, és társítja azt egy eseményhez. Ha például tervező módban duplán kattint egy parancsgombra egy űrlapon, Visual Basic létrehoz egy üres eseménykezelőt és egy változót WithEvents
a parancsgombhoz, az alábbi kódhoz hasonlóan:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler és RemoveHandler
Az AddHandler
utasítás hasonló ahhoz a Handles
záradékhoz, amelyben mindkettő lehetővé teszi egy eseménykezelő megadását. A AddHandler
záradéknál RemoveHandler
azonban nagyobb rugalmasságot Handles
biztosít, így dinamikusan hozzáadhatja, eltávolíthatja és módosíthatja az eseményhez társított eseménykezelőt. Ha egy struktúra megosztott eseményeit vagy eseményeit szeretné kezelni, akkor a következőt kell használnia AddHandler
: .
AddHandler
két argumentumot vesz fel: egy esemény feladójától származó esemény nevét, például egy vezérlőt, és egy delegáltnak kiértékelt kifejezést. Nem kell explicit módon megadnia a delegált osztályt, AddHandler
mivel az AddressOf
utasítás mindig a meghatalmazottra mutató hivatkozást ad vissza. Az alábbi példa egy eseménykezelőt társít egy objektum által létrehozott eseményhez:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, amely leválaszt egy eseményt egy eseménykezelőről, ugyanazt a szintaxist használja, mint a AddHandler
. Például:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
Az alábbi példában egy eseménykezelő társítva van egy eseményhez, és az esemény létre lesz hozva. Az eseménykezelő elkapja az eseményt, és megjelenít egy üzenetet.
Ezután az első eseménykezelő el lesz távolítva, és egy másik eseménykezelő van társítva az eseményhez. Az esemény ismételt felvetésekor egy másik üzenet jelenik meg.
Végül a második eseménykezelő el lesz távolítva, és az esemény harmadik alkalommal lesz előállítva. Mivel már nincs eseménykezelő társítva az eseményhez, nem történik művelet.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
Alaposztályból örökölt események kezelése
A származtatott osztályok – azok az osztályok, amelyek az alaposztály jellemzőit öröklik – képesek kezelni az alaposztály által kiváltott eseményeket az Handles MyBase
utasítással.
Alaposztály eseményeinek kezelése
Deklaráljon egy eseménykezelőt a származtatott osztályban úgy, hogy hozzáad egy
Handles MyBase.
eseménynév-utasítást az eseménykezelő eljárás deklarációs sorához, ahol az eseménynév a kezelt alaposztályban lévő esemény neve. Például:Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
Kapcsolódó témakörök
Cím | Leírás |
---|---|
Útmutató: Események deklarálása és növelése | Részletes leírást nyújt arról, hogyan deklarálhat és emelhet eseményeket egy osztály számára. |
Útmutató: Események kezelése | Bemutatja, hogyan írhat eseménykezelő eljárást. |
Útmutató: Egyéni események deklarálása a blokkolás elkerülése érdekében | Bemutatja, hogyan definiálhat olyan egyéni eseményt, amely lehetővé teszi az eseménykezelők aszinkron meghívását. |
Útmutató: Egyéni események deklarálása a memória megőrzéséhez | Bemutatja, hogyan definiálhat olyan egyéni eseményt, amely csak az esemény kezelésekor használ memóriát. |
Örökölt eseménykezelők hibaelhárítása Visual Basic | Felsorolja az örökölt összetevők eseménykezelőivel kapcsolatos gyakori problémákat. |
Események | Áttekintést nyújt az eseménymodellről a .NET-keretrendszer. |
Eseménykezelők létrehozása Windows Forms | Ismerteti, hogyan használható Windows Forms objektumokhoz társított események. |
Delegáltak | Áttekintést nyújt a Visual Basic delegáltjairól. |