Zdarzenia (Visual Basic)
Chociaż można wizualizować projekt 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ć zdarzenie i wywołać procedurę Click
, 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, co powoduje zatrzymanie procesu sortowania.
Terminy i pojęcia dotyczące zdarzeń
W tej sekcji opisano terminy i pojęcia używane z 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)
Podnoszenie zdarzeń
Zdarzenie jest jak komunikat informujący o tym, że wystąpił coś ważnego. Akt nadawania wiadomości jest nazywany podnoszeniem zdarzenia. W 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ń dziedziczonej z klasy bazowej.
Nadawcy zdarzeń
Każdy obiekt, który może zgłaszać zdarzenie, jest nadawcą zdarzeń, nazywanym również źródłem 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 podprocji z pasującym podpisem jako procedurą 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ń.
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
ma nazwę Sub button1_Click
.
Uwaga
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 podroutyny.
Kojarzenie zdarzeń z procedurami obsługi zdarzeń
Zanim program obsługi zdarzeń stanie się użyteczny, należy najpierw skojarzyć go z zdarzeniem przy użyciu instrukcji Handles
or AddHandler
.
WithEvents i klauzula Handles
Instrukcja i Handles
klauzula WithEvents
zapewniają deklaratywny sposób określania procedur obsługi zdarzeń. Zdarzenie zgłoszone przez obiekt zadeklarowany za WithEvents
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 kodowanie, odczytywanie i debugowanie zdarzeń. 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 go zadeklarować 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ługi zdarzeń udostępnionych. Podobnie nie można używaćWithEvents
aniHandles
obsługiwać zdarzeń z obiektuStructure
. W obu przypadkach można użyć instrukcjiAddHandler
do obsługi tych zdarzeń.Nie można tworzyć tablic
WithEvents
zmiennych.
WithEvents
zmienne umożliwiają jednej procedurze obsługi zdarzeń obsługę co najmniej jednego rodzaju zdarzenia lub co najmniej jednego programu obsługi zdarzeń w celu obsługi tego samego rodzaju zdarzeń.
Chociaż klauzula Handles
jest standardowym sposobem kojarzenia zdarzenia z programem 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 oszołomić pustą procedurę obsługi zdarzeń i kojarzy ją ze zdarzeniem. Na przykład po dwukrotnym kliknięciu przycisku polecenia w formularzu w trybie projektowania 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 jest podobna AddHandler
do klauzuli Handles
w obu przypadkach, która umożliwia określenie procedury obsługi zdarzeń. Jednak , AddHandler
używany z RemoveHandler
programem , zapewnia większą elastyczność niż Handles
klauzula, umożliwiając dynamiczne dodawanie, usuwanie i zmienianie programu obsługi zdarzeń skojarzonego z zdarzeniem. Jeśli chcesz obsłużyć 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 jawnie określać klasy delegata w przypadku używania AddHandler
metody , ponieważ AddressOf
instrukcja 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 odłącza zdarzenie od programu obsługi zdarzeń, używa tej samej składni co AddHandler
. Na przykład:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
W poniższym przykładzie program obsługi zdarzeń jest skojarzony z zdarzeniem, a zdarzenie jest wywoływane. Program obsługi zdarzeń przechwytuje zdarzenie i wyświetla komunikat.
Następnie zostanie usunięta pierwsza procedura obsługi zdarzeń, 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, a zdarzenie zostanie podniesione 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
.
Obsługa zdarzeń z klasy bazowej
Zadeklaruj procedurę obsługi zdarzeń w klasie pochodnej, dodając
Handles MyBase.
instrukcję eventname do wiersza deklaracji procedury obsługi zdarzeń, gdzie eventname jest nazwą zdarzenia w obsługiwanej klasie bazowej. Na 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
Sekcje pokrewne
Tytuł | Opis |
---|---|
Wskazówki: deklarowanie i wywoływanie zdarzeń | Zawiera szczegółowy opis sposobu deklarowania i zgłaszania zdarzeń dla klasy. |
Przewodnik: obsługa zdarzeń | Pokazuje, jak napisać procedurę obsługi zdarzeń. |
Instrukcje: deklarowanie zdarzeń niestandardowych w celu unikania blokowania | Demonstruje sposób definiowania zdarzenia niestandardowego, które umożliwia wywoływanie asynchronicznych procedur obsługi zdarzeń. |
Instrukcje: deklarowanie zdarzeń niestandardowych w celu zachowywania 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 związanych z odziedziczonymi programami obsługi zdarzeń w Visual Basic | Wyświetla listę typowych problemów występujących w programach obsługi zdarzeń w składnikach dziedziczynych. |
Zdarzenia | Omówienie modelu zdarzeń w środowisku .NET Framework. |
Tworzenie programów obsługi zdarzeń w formularzach systemu Windows | Opisuje sposób pracy z zdarzeniami skojarzonymi z obiektami Windows Forms. |
Delegaci | Zawiera omówienie delegatów w Visual Basic. |