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 WithEventsHandles 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ć jako Object— 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 ani Handles obsługiwać zdarzeń z obiektu Structure. W obu przypadkach można użyć instrukcji AddHandler 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 , AddHandlerużywany z RemoveHandlerprogramem , 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 AddHandlermetody , 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
    
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.