Udostępnij za pomocą


Event, instrukcja

Deklaruje zdarzenie zdefiniowane przez użytkownika.

Składnia

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

Części

Część Opis
attrlist Opcjonalny. Lista atrybutów, które mają zastosowanie do tego zdarzenia. Wiele atrybutów jest rozdzielonych przecinkami. Należy ująć listę atrybutów w nawiasach kątowych ("<" i ">").
accessmodifier Opcjonalny. Określa, jaki kod może uzyskać dostęp do zdarzenia. Może być jednym z następujących elementów:

- Publiczny — dowolny kod, który może uzyskać dostęp do elementu, który deklaruje, że może uzyskać do niego dostęp.
- Chronione — tylko kod w swojej klasie lub klasie pochodnej może uzyskać do niego dostęp.
- Przyjaciel — tylko kod w tym samym zestawie może uzyskać do niego dostęp.
- Prywatny — tylko kod w elemecie, który deklaruje, że może uzyskać do niego dostęp.
- Chroniony kod tylko zaprzyjaźniony w klasie zdarzenia, klasie pochodnej lub ten sam zestaw może uzyskać do niego dostęp.
- Prywatny kod chroniony tylko w klasie zdarzenia lub klasie pochodnej w tym samym zestawie może uzyskać do niego dostęp.
Shared Opcjonalny. Określa, że to zdarzenie nie jest skojarzone z określonym wystąpieniem klasy lub struktury.
Shadows Opcjonalny. Wskazuje, że to zdarzenie redecyduje i ukrywa identycznie nazwany element programowania lub zestaw przeciążonych elementów w klasie bazowej. Możesz cieniować dowolny rodzaj zadeklarowanego elementu z dowolnym innym rodzajem.

Element w tle jest niedostępny z klasy pochodnej, która go zaciemnia, z wyjątkiem tego, gdzie element cieniowania jest niedostępny. Jeśli na przykład Private element w tle element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, uzyskuje dostęp Private do elementu klasy bazowej zamiast tego.
eventname To jest wymagane. Nazwa zdarzenia; jest zgodna ze standardową konwencją nazewnictwa zmiennych.
parameterlist Opcjonalny. Lista zmiennych lokalnych reprezentujących parametry tego zdarzenia. Należy ująć listę parametrów w nawiasy.
Implements Opcjonalny. Wskazuje, że to zdarzenie implementuje zdarzenie interfejsu.
implementslist Wymagane w przypadku Implements dostarczenia. Sub Lista wdrożonych procedur. Wiele procedur jest rozdzielonych przecinkami:

implementprocedure [ , implementprocedure ... ]

Każda z nich implementedprocedure ma następującą składnię i części:

interface.definedname

- interface -Wymagane. Nazwa interfejsu, który implementuje ta procedura zawierająca klasę lub strukturę.
- Definedname -Wymagane. Nazwa, za pomocą której procedura jest zdefiniowana w pliku interface. Nie musi to być takie samo jak name, nazwa, której używa ta procedura do zaimplementowania zdefiniowanej procedury.
Custom To jest wymagane. Zdarzenia zadeklarowane jako Custom muszą definiować niestandardowe AddHandlermetody dostępu , RemoveHandleri RaiseEvent .
delegatename Opcjonalny. Nazwa delegata, który określa sygnaturę programu obsługi zdarzeń.
AddHandler To jest wymagane. Deklaruje metodę AddHandler dostępu, która określa instrukcje do wykonania po dodaniu programu obsługi zdarzeń, jawnie przy użyciu instrukcji lub niejawnie przy użyciu AddHandler klauzuli Handles .
End AddHandler To jest wymagane. AddHandler Przerywa blok.
value To jest wymagane. Nazwa parametru.
RemoveHandler To jest wymagane. Deklaruje metodę RemoveHandler dostępu, która określa instrukcje do wykonania po usunięciu programu obsługi zdarzeń przy użyciu instrukcji RemoveHandler .
End RemoveHandler To jest wymagane. RemoveHandler Przerywa blok.
RaiseEvent To jest wymagane. Deklaruje metodę RaiseEvent dostępu, która określa instrukcje do wykonania po wystąpieniu zdarzenia przy użyciu instrukcji RaiseEvent . Zazwyczaj wywołuje to listę delegatów obsługiwanych przez AddHandler metody i RemoveHandler .
End RaiseEvent To jest wymagane. RaiseEvent Przerywa blok.
delegatesignature To jest wymagane. Lista parametrów pasujących do parametrów wymaganych przez delegata delegatename . Należy ująć listę parametrów w nawiasy.
statements Opcjonalny. Instrukcje zawierające elementy AddHandlermetod , RemoveHandleri RaiseEvent .
End Event To jest wymagane. Event Przerywa blok.

Uwagi

Po zadeklarowaniu zdarzenia użyj instrukcji RaiseEvent , aby zgłosić zdarzenie. Typowe zdarzenie może zostać zadeklarowane i podniesione, jak pokazano w następujących fragmentach:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Uwaga / Notatka

Argumenty zdarzeń można zadeklarować tak samo jak argumenty procedur, z następującymi wyjątkami: zdarzenia nie mogą mieć nazwanych argumentów, ParamArray argumentów ani Optional argumentów. Zdarzenia nie mają zwracanych wartości.

Aby obsłużyć zdarzenie, należy skojarzyć je z podroutyną obsługi zdarzeń przy użyciu instrukcji Handles or AddHandler . Podpisy podrouty i zdarzenie muszą być zgodne. Aby obsłużyć zdarzenie udostępnione, należy użyć instrukcji AddHandler .

Można używać Event tylko na poziomie modułu. Oznacza to, że kontekst deklaracji zdarzenia musi być klasą, strukturą, modułem lub interfejsem i nie może być plikiem źródłowym, przestrzenią nazw, procedurą lub blokiem. Aby uzyskać więcej informacji, zobacz Konteksty deklaracji i Domyślne poziomy dostępu.

W większości przypadków można użyć pierwszej składni w sekcji Składnia tego tematu do deklarowania zdarzeń. Jednak niektóre scenariusze wymagają większej kontroli nad szczegółowym zachowaniem zdarzenia. Ostatnia składnia w sekcji Składnia tego tematu, która używa Custom słowa kluczowego, zapewnia tę kontrolkę, umożliwiając definiowanie zdarzeń niestandardowych. W przypadku zdarzenia niestandardowego określasz dokładnie, co ma miejsce, gdy kod dodaje lub usuwa program obsługi zdarzeń do lub ze zdarzenia albo gdy kod zgłasza zdarzenie. Przykłady można znaleźć w temacie How to: Declare Custom Events To Conserve Memory (Instrukcje: deklarowanie zdarzeń niestandardowych w celu uniknięcia blokowania).

Przykład

W poniższym przykładzie użyto zdarzeń, aby odliczyć sekundy z zakresu od 10 do 0. Kod ilustruje kilka metod, właściwości i instrukcji związanych z zdarzeniami. Obejmuje to instrukcję RaiseEvent .

Klasa, która zgłasza zdarzenie, jest źródłem zdarzeń, a metody przetwarzania zdarzenia to programy obsługi zdarzeń. Źródło zdarzeń może mieć wiele procedur obsługi dla generowanych zdarzeń. Gdy klasa zgłasza zdarzenie, to zdarzenie jest wywoływane w każdej klasie, która wybrała obsługę zdarzeń dla tego wystąpienia obiektu.

W przykładzie użyto również formularza (Form1) z przyciskiem (Button1) i polem tekstowym (TextBox1). Po kliknięciu przycisku pierwsze pole tekstowe wyświetla odliczanie z zakresu od 10 do 0 sekund. Po upływie pełnego czasu (10 sekund) pierwsze pole tekstowe wyświetla tekst "Gotowe".

Kod dla Form1 określa początkowe i końcowe stany formularza. Zawiera również kod wykonywany podczas wywoływanych zdarzeń.

Aby użyć tego przykładu, otwórz nowy projekt Windows Forms. Następnie dodaj przycisk o nazwie i pole tekstowe o nazwie Button1TextBox1 do formularza głównego o nazwie Form1. Następnie kliknij prawym przyciskiem myszy formularz i kliknij polecenie Wyświetl kod , aby otworzyć edytor kodu.

Dodaj zmienną WithEvents do sekcji Form1 deklaracji klasy:

Public Class TimerExample
    Private WithEvents mTimer As TimerState

Dodaj następujący kod do kodu dla elementu Form1. Zastąp wszelkie zduplikowane procedury, które mogą istnieć, takie jak Form_Load lub Button_Click.

    Public Sub StartCountdownExample()
        mTimer = New TimerState()
        mTimer.StartCountdown(10.0, 1.0)
    End Sub

    Private Sub mTimer_UpdateTime(ByVal Countdown As Double) Handles mTimer.UpdateTime
        Console.WriteLine("Time remaining: " & Format(Countdown, "##0.0") & " seconds")
    End Sub

    Private Sub mTimer_Finished() Handles mTimer.Finished
        Console.WriteLine("Done")
    End Sub
End Class

Public Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim SoFar As Double = 0
        Do While SoFar < Duration
            System.Threading.Thread.Sleep(CInt(Increment * 1000))
            SoFar += Increment
            RaiseEvent UpdateTime(Duration - SoFar)
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Naciśnij F5, aby uruchomić poprzedni przykład, a następnie kliknij przycisk z etykietą Uruchom. Pierwsze pole tekstowe zaczyna odliczać sekundy. Po upływie pełnego czasu (10 sekund) pierwsze pole tekstowe wyświetla tekst "Gotowe".

Uwaga / Notatka

Metoda My.Application.DoEvents nie przetwarza zdarzeń w taki sam sposób, jak formularz. Aby umożliwić formularzowi obsługę zdarzeń bezpośrednio, możesz użyć wielowątkowość. Aby uzyskać więcej informacji, zobacz Managed Threading (Zarządzanie wątkami).

Zobacz także