Zdarzenia (Visual Basic)

Chociaż można wizualizować projekt Visual Studio jako serię procedur wykonywanych w sekwencji, w rzeczywistości większość programów jest sterowanych zdarzeniami, co oznacza, że przepływ wykonywania jest określany przez zewnętrzne wystąpienia nazywane zdarzeniami.

Zdarzenie jest sygnałem, który informuje aplikację o tym, że wystąpił coś ważnego. Na przykład gdy użytkownik kliknie kontrolkę w formularzu, formularz może wywołać zdarzenie i wywołać procedurę, która Click obsługuje zdarzenie. Zdarzenia umożliwiają również komunikację oddzielnych zadań. Załóżmy na przykład, że aplikacja wykonuje zadanie sortowania niezależnie od głównej aplikacji. Jeśli użytkownik anuluje sortowanie, aplikacja może wysłać zdarzenie anulowania z nakazem zatrzymania procesu sortowania.

Terminy i pojęcia dotyczące zdarzeń

W tej sekcji opisano terminy i pojęcia używane ze zdarzeniami w Visual Basic.

Deklarowanie zdarzeń

Zdarzenia w klasach, strukturach, modułach i interfejsach deklaruje się przy użyciu słowa kluczowego Event , jak w poniższym przykładzie:

Event AnEvent(ByVal EventNumber As Integer)

Podnoszenie zdarzeń

Zdarzenie przypomina komunikat informujący o tym, że wystąpiło coś ważnego. Akcją rozgłaszania komunikatu jest wywoływana wywoływanie zdarzenia. W Visual Basic zgłaszasz zdarzenia za pomocą RaiseEvent instrukcji , jak w poniższym przykładzie:

RaiseEvent AnEvent(EventNumber)

Zdarzenia muszą być wywoływane w zakresie klasy, modułu lub struktury, w której są zadeklarowane. Na przykład klasa pochodna nie może zgłaszać zdarzeń dziedziczonych z klasy bazowej.

Nadawcy zdarzeń

Każdy obiekt, który może wyzwalać zdarzenie, jest nadawcą zdarzenia, znanym również jako źródło zdarzenia. Formularze, kontrolki i obiekty zdefiniowane przez użytkownika są przykładami nadawców zdarzeń.

Programy obsługi zdarzeń

Procedury obsługi zdarzeń to procedury wywoływane w przypadku wystąpienia odpowiedniego zdarzenia. Jako procedury obsługi zdarzeń można użyć dowolnej prawidłowej procedury podrzędnej z pasującą sygnaturą. Nie można jednak użyć funkcji jako procedury obsługi zdarzeń, ponieważ nie może ona zwrócić wartości do źródła zdarzeń.

Visual Basic używa standardowej konwencji nazewnictwa dla programów obsługi zdarzeń, która łączy 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

Zalecamy używanie tej konwencji nazewnictwa podczas definiowania programów obsługi zdarzeń dla własnych zdarzeń, ale nie jest to wymagane; Można użyć dowolnej prawidłowej nazwy podroutine.

Kojarzenie zdarzeń z programami obsługi zdarzeń

Zanim program obsługi zdarzeń stanie się użyteczny, należy najpierw skojarzyć go ze zdarzeniem przy użyciu instrukcji Handles lub AddHandler .

WithEvents i klauzula Handles

Instrukcja WithEvents i Handles klauzula zapewniają deklaratywną sposób określania programów obsługi zdarzeń. Zdarzenie zgłoszone przez obiekt zadeklarowany za pomocą słowa kluczowego może być obsługiwane przez dowolną procedurę z instrukcje dla tego zdarzenia, jak pokazano w WithEvents Handles 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 są często najlepszym wyborem dla programów obsługi zdarzeń, ponieważ składnia deklaratywna, z których korzystają, ułatwia kodowanie, odczytywanie WithEvents Handles i debugowanie zdarzeń. Należy jednak pamiętać o następujących ograniczeniach dotyczących WithEvents używania zmiennych:

  • Nie można użyć WithEvents zmiennej jako zmiennej obiektu. Oznacza to, że nie można zadeklarować jej jako — podczas deklarowania zmiennej należy określić Object nazwę klasy.

  • Ponieważ zdarzenia udostępnione nie są powiązane z wystąpieniami klas, nie można użyć do WithEvents deklaratywnej obsługi zdarzeń udostępnionych. Podobnie nie można użyć ani WithEvents do obsługi zdarzeń z Handles 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 obsługi zdarzeń do obsługi jednego lub więcej rodzaju zdarzenia lub co najmniej jeden program obsługi zdarzeń do obsługi tego samego rodzaju zdarzenia.

Mimo że klauzula jest standardowym sposobem kojarzenia zdarzenia z programem obsługi zdarzeń, jest ograniczona do kojarzenia zdarzeń z programami obsługi zdarzeń w Handles czasie kompilacji.

W niektórych przypadkach, takich jak zdarzenia skojarzone z formularzami lub kontrolkami, program Visual Basic automatycznie tworzy wycinki pustej procedury obsługi zdarzeń i kojarzy ją ze zdarzeniem. Na przykład po dwukrotnym kliknięciu przycisku polecenia w formularzu w trybie projektowania program Visual Basic pustą obsługę zdarzeń i zmienną dla przycisku polecenia, jak w poniższym WithEvents 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 Handles klauzuli w tym, że obie umożliwiają określenie procedury obsługi zdarzeń. Jednak , używany z , zapewnia większą elastyczność niż klauzula, umożliwiając dynamiczne dodawanie, usuwanie i zmienianie programu obsługi zdarzeń AddHandler RemoveHandler Handles skojarzonego ze zdarzeniem. Jeśli chcesz obsługiwać zdarzenia udostępnione lub zdarzenia ze struktury, musisz użyć AddHandler .

AddHandler Przyjmuje dwa argumenty: nazwę zdarzenia od nadawcy zdarzenia, taką jak kontrolka, i wyrażenie, które oblicza delegata. Nie trzeba jawnie określać klasy delegata podczas korzystania z klasy , ponieważ instrukcja AddHandler zawsze zwraca odwołanie do AddressOf delegata. Poniższy przykład kojarzy program obsługi zdarzeń ze zdarzeniem wywoływanym przez obiekt :

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, który rozłącza zdarzenie z programem 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 procedura obsługi zdarzeń jest skojarzona ze zdarzeniem i zdarzenie jest wywoływane. Program obsługi zdarzeń przechwytuje zdarzenie i wyświetla komunikat.

Następnie pierwsza procedura obsługi zdarzeń jest usuwana, a z zdarzeniem jest skojarzona inna procedura obsługi zdarzeń. Po ponownie zdarzeniu zostanie wyświetlony inny komunikat.

Na koniec drugi program obsługi zdarzeń jest usuwany, a zdarzenie jest wywoływane po raz trzeci. Ponieważ nie istnieje już procedura obsługi zdarzeń skojarzona ze zdarzeniem, żadna akcja nie jest skojarzona.

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ń dziedziczonych z klasy bazowej

Klasy pochodne — klasy dziedziczące cechy z klasy bazowej — mogą obsługiwać zdarzenia wywoływane przez ich klasę bazową przy użyciu Handles MyBase instrukcji .

Aby obsługiwać zdarzenia z klasy bazowej

  • Zadeklaruj procedurę obsługi zdarzeń w klasie pochodnej, dodając instrukcje eventname do wiersza deklaracji procedury obsługi zdarzeń, gdzie eventname jest nazwą zdarzenia w klasie bazowej, która Handles MyBase. jest obsługi. 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 Przedstawia sposób definiowania zdarzenia niestandardowego, które umożliwia asynchroniczne wywoływanie jego programów obsługi zdarzeń.
Instrukcje: deklarowanie zdarzeń niestandardowych w celu zachowywania pamięci Przedstawia 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 z programami obsługi zdarzeń w dziedziczonych składnikach.
Zdarzenia Omówienie modelu zdarzeń w środowisku .NET Framework.
Tworzenie programów obsługi zdarzeń w formularzach systemu Windows Opisuje sposób pracy ze zdarzeniami skojarzonymi z obiektami Windows Forms.
Delegaci Zawiera omówienie delegatów w Visual Basic.