Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Chociaż można wizualizować projekt programu Visual Studio jako serię procedur wykonywanych w sekwencji, w rzeczywistości większość programów jest sterowana zdarzeniami — co oznacza, że przepływ wykonywania jest określany przez wystąpienia zewnętrzne nazywane zdarzeniami.
Zdarzenie jest sygnałem informującym aplikację o tym, że wystąpiło coś ważnego. Na przykład gdy użytkownik kliknie kontrolkę w formularzu, formularz może zgłosić Click
zdarzenie i wywołać procedurę, która obsługuje zdarzenie. Zdarzenia umożliwiają również komunikację oddzielnych zadań. Załóżmy na przykład, że aplikacja wykonuje zadanie sortowania oddzielnie od głównej aplikacji. Jeśli użytkownik anuluje sortowanie, aplikacja może wysłać zdarzenie anulowania, nakazując zatrzymanie procesu sortowania.
Terminy i pojęcia dotyczące zdarzeń
W tej sekcji opisane są terminy i pojęcia związane ze zdarzeniami w Visual Basic.
Deklarowanie zdarzeń
Zdarzenia są deklarowane w klasach, strukturach, modułach i interfejsach przy użyciu słowa kluczowego Event
, jak w poniższym przykładzie:
Event AnEvent(ByVal EventNumber As Integer)
Wywoływanie zdarzeń
Zdarzenie jest jak komunikat informujący, że wystąpiło coś ważnego. Czynność nadawania komunikatu nazywa się wywołaniem wydarzenia. W języku Visual Basic zdarzenia są wywoływane za pomocą instrukcji RaiseEvent
, jak w poniższym przykładzie:
RaiseEvent AnEvent(EventNumber)
Zdarzenia muszą być zgłaszane w zakresie klasy, modułu lub struktury, w której są deklarowane. Na przykład klasa pochodna nie może zgłaszać zdarzeń dziedziczonych z klasy bazowej.
Nadawcy zdarzeń
Każdy obiekt, który może zgłaszać zdarzenie, jest nadawcą zdarzeń, znanym również jako źródło zdarzeń. Formularze, kontrolki i obiekty zdefiniowane przez użytkownika to przykłady nadawców zdarzeń.
Programy obsługi zdarzeń
Procedury obsługi zdarzeń to procedury wywoływane po wystąpieniu odpowiedniego zdarzenia. Możesz użyć dowolnej prawidłowej podprocedury z pasującym podpisem jako procedury obsługi zdarzeń. Nie można jednak użyć funkcji jako procedury obsługi zdarzeń, ponieważ nie może zwrócić wartości do źródła zdarzeń.
Program Visual Basic używa standardowej konwencji nazewnictwa dla programów obsługi zdarzeń, które łączą nazwę nadawcy zdarzeń, podkreślenie i nazwę zdarzenia. Na przykład Click
zdarzenie przycisku o nazwie button1
będzie miało nazwę Sub button1_Click
.
Uwaga / Notatka
Zalecamy użycie tej konwencji nazewnictwa podczas definiowania procedur obsługi zdarzeń dla własnych zdarzeń, ale nie jest to wymagane; można użyć dowolnej prawidłowej nazwy procedury.
Kojarzenie zdarzeń z procedurami obsługi zdarzeń
Zanim program obsługi zdarzeń stanie się użyteczny, należy najpierw skojarzyć go ze zdarzeniem przy użyciu instrukcji Handles
or AddHandler
.
WithEvents oraz klauzula Handles
Instrukcja WithEvents
i klauzula Handles
dostarczają deklaratywny sposób określania obsług zdarzeń. Zdarzenie zgłoszone przez obiekt zadeklarowany WithEvents
za pomocą słowa kluczowego może być obsługiwane przez dowolną procedurę z instrukcją Handles
dla tego zdarzenia, jak pokazano w poniższym przykładzie:
' 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
Instrukcja i klauzula WithEvents
Handles
są często najlepszym wyborem dla programów obsługi zdarzeń, ponieważ składnia deklaratywna, której używają, ułatwia obsługę zdarzeń, odczytywanie i debugowanie. Należy jednak pamiętać o następujących ograniczeniach dotyczących używania WithEvents
zmiennych:
Nie można użyć zmiennej
WithEvents
jako zmiennej obiektu. Oznacza to, że nie można zadeklarować jej jakoObject
— należy określić nazwę klasy podczas deklarowania zmiennej.Ponieważ zdarzenia udostępnione nie są powiązane z wystąpieniami klas, nie można używać
WithEvents
do deklaratywnego obsługiwania zdarzeń udostępnionych. Podobnie nie można używaćWithEvents
aniHandles
aby obsługiwać zdarzenia zStructure
. W obu przypadkach można użyć instrukcjiAddHandler
do obsługi tych zdarzeń.Nie można utworzyć tablic
WithEvents
zmiennych.
WithEvents
zmienne umożliwiają pojedynczemu programowi obsługi zdarzeń obsługę co najmniej jednego rodzaju zdarzenia albo co najmniej jednego programu obsługi zdarzeń w celu obsługi tego samego rodzaju zdarzenia.
Chociaż klauzula Handles
jest standardowym sposobem kojarzenia zdarzenia z procedurą obsługi zdarzeń, jest ograniczona do kojarzenia zdarzeń z procedurami obsługi zdarzeń w czasie kompilacji.
W niektórych przypadkach, takich jak zdarzenia skojarzone z formularzami lub kontrolkami, Visual Basic automatycznie generuje pusty program obsługi zdarzeń i skojarzy go ze zdarzeniem. Na przykład po dwukrotnym kliknięciu przycisku polecenia w formularzu w trybie projektowania program Visual Basic tworzy pustą procedurę obsługi zdarzeń i zmienną WithEvents
dla przycisku polecenia, jak w poniższym kodzie:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler i RemoveHandler
Instrukcja AddHandler
jest podobna do klauzuli Handles
w tym, że obie umożliwiają określenie obsługi zdarzeń. Jednak AddHandler
, używany z RemoveHandler
, zapewnia większą elastyczność niż klauzula Handles
, umożliwiając dynamiczne dodawanie, usuwanie i zmienianie obsługi zdarzeń związanej z wydarzeniem. Jeśli chcesz obsługiwać zdarzenia udostępnione lub zdarzenia ze struktury, musisz użyć polecenia AddHandler
.
AddHandler
przyjmuje dwa argumenty: nazwę zdarzenia od nadawcy zdarzeń, takiego jak kontrolka, i wyrażenie, które daje wartość delegatowi. Nie trzeba wyraźnie określać klasy delegata w przypadku używania AddHandler
, ponieważ instrukcja AddressOf
zawsze zwraca odwołanie do delegata. Poniższy przykład kojarzy procedurę obsługi zdarzeń z zdarzeniem zgłoszonym przez obiekt:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, który rozłącza zdarzenie z programu obsługi zdarzeń, używa tej samej składni co AddHandler
. Przykład:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
W poniższym przykładzie program obsługi zdarzeń jest skojarzony ze zdarzeniem, a zdarzenie jest zgłaszane. Program obsługi zdarzeń przechwytuje zdarzenie i wyświetla komunikat.
Następnie pierwsza procedura obsługi zdarzeń zostanie usunięta, a inna procedura obsługi zdarzeń jest skojarzona ze zdarzeniem. Po ponownym wyświetleniu zdarzenia zostanie wyświetlony inny komunikat.
Na koniec drugi program obsługi zdarzeń zostanie usunięty i zdarzenie zostanie zgłoszone po raz trzeci. Ponieważ program obsługi zdarzeń nie jest już skojarzony ze zdarzeniem, nie jest podejmowana żadna akcja.
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
Obsługa zdarzeń dziedziczona z klasy bazowej
Klasy pochodne — klasy dziedziczące charakterystykę z klasy bazowej — mogą obsługiwać zdarzenia zgłaszane przez klasę bazową przy użyciu instrukcji Handles MyBase
.
Aby obsługiwać zdarzenia z klasy bazowej
Zadeklaruj program obsługi zdarzeń w klasie pochodnej, dodając instrukcję
Handles MyBase.
eventname do wiersza deklaracji procedury obsługi zdarzeń, gdzie eventname jest nazwą zdarzenia w obsługiwanej klasie bazowej. Przykład: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
Powiązane sekcje
Nazwa | Opis |
---|---|
Przewodnik: deklarowanie i zgłaszanie zdarzeń | Zawiera szczegółowy opis sposobu deklarowania i zgłaszania zdarzeń dla klasy. |
Przewodnik: obsługa zdarzeń | Przedstawia sposób pisania procedury obsługi zdarzeń. |
Instrukcje: deklarowanie zdarzeń niestandardowych w celu uniknięcia blokowania | Demonstruje, jak zdefiniować zdarzenie niestandardowe, które pozwala na asynchroniczne wywoływanie jego programów obsługi. |
Instrukcje: deklarowanie zdarzeń niestandardowych w celu zaoszczędzenie pamięci | Demonstruje sposób definiowania zdarzenia niestandardowego, które używa pamięci tylko wtedy, gdy zdarzenie jest obsługiwane. |
Rozwiązywanie problemów z dziedziczymi procedurami obsługi zdarzeń w języku Visual Basic | Wyświetla listę typowych problemów występujących w programach obsługi zdarzeń w składnikach dziedziczynych. |
Wydarzenia | Zawiera omówienie modelu zdarzeń w programie .NET Framework. |
Tworzenie programów obsługi zdarzeń w formularzach Windows | Opisuje sposób pracy ze zdarzeniami skojarzonymi z obiektami windows Forms. |
Delegaci | Zawiera omówienie delegatów w Visual Basic. |