Udostępnij za pośrednictwem


event (C++ Component Extensions)

Słowo kluczowe event deklaruje zdarzenie, które jest powiadomieniem do zarejestrowanych abonentów (programy obsługi zdarzeń), że wystąpiło interesujące ich zdarzenie.

Wszystkie środowiska wykonawcze

C++/CX obsługuje określenie zdarzenia członka zdarzenia lub bloku zdarzenia.Element członkowski zdarzenia jest skrótem do deklarowania zdarzenia bloku.Domyślnie, element członkowski zdarzenia deklaruje add(), remove(), i raise() funkcje, które są wyraźnie zadeklarowane w bloku zdarzeń.Aby dostosować funkcje w elemencie członkowskim zdarzeń, zadeklaruj blok zdarzeń, a następnie zastąp nim pożądane funkcje.

Składnia

// event data member
modifier event delegate^ event_name;   

// event block
modifier event delegate^ event_name 
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Parametry

  • modifier
    Modyfikator, który może być używany w zdarzeniu deklaracji lub zdarzeniu metody oceny. Możliwe wartości to static i virtual.

  • delegate
    Obiekt delegowany, z którego podpisem program obsługi zdarzeń musi być zgodny.

  • event_name
    Nazwa zdarzenia.

  • return_value
    Wartość zwracana metody dostępu zdarzeń. Typ zwracany musi być void, aby było możliwe jego zweryfikowanie.

  • parameters
    (opcjonalnie) Parametry dla raise metodę, która odpowiada podpisowi z delegate parametru.

Uwagi

Wydarzenie jest skojarzenie między obiektem delegata, a funkcją członka (Obsługa zdarzeń), który reaguje na wyzwolenie zdarzenia i umożliwia klientom z dowolnej klasy zarejestrować metody, które są zgodne z podpisem i zwrócić typ obiektu delegowanego leżącego u podstaw.

Istnieją dwa rodzaje deklaracji zdarzeń:

  • element danych zdarzenia
    Kompilator automatycznie tworzy magazyn dla zdarzenia w formie członka typu obiektu delegowanego i tworzy wewnętrzne funkcje członkowskie add(), remove() oraz raise().Element członkowski danych zdarzenia musi być zadeklarowany wewnątrz klasy.Typ zwracany typu zwracanego obiektu delegowanego musi odpowiadać typowi zwracanemu modułu obsługi zdarzeń.

  • bloku zdarzeń
    Bloku zdarzeń umożliwia jawne deklarowanie i dostosowanie zachowania add() remove(), i raise() metody.

Aby dodać i usunąć moduł obsługi zdarzeń, możesz użyć operators+= i operator-= lub jawnie wywołać metody add() i remove().

event jest słowem kluczowym uzależnionym od kontekstu; zobacz Kontekstowe słowa kluczowe (C++ Component Extensions) Aby uzyskać więcej informacji.

Środowisko wykonawcze systemu Windows

Uwagi

Aby uzyskać więcej informacji, zobacz zdarzenia (C + +/ CX).

Jeśli zamierzasz dodać, a następnie usunąć program obsługi zdarzeń, musisz zapisać strukturę EventRegistrationToken, który jest zwracany przez operacji dodawania.Następnie w operacji usuwania należy użyć zapisanej struktury EventRegistrationToken, aby zidentyfikować, który moduł obsługi zdarzenia ma zostać usunięty.

Wymagania

Opcja kompilatora: /ZW

Środowisko uruchomieniowe języka wspólnego

Słowo kluczowe event pozwala zadeklarować zdarzenie.Wydarzenie stanowi dla klasy sposób na zapewnienie powiadomienia, gdy zdarzy się coś interesującego.

Składnia

// event data member
modifier event delegate^ event_name; 

// event block
modifier event delegate^ event_name 
{
   modifier return_value add(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

Parametry

  • modifier
    Modyfikator, który może być używany w zdarzeniu deklaracji lub zdarzeniu metody oceny. Możliwe wartości to static i virtual.

  • delegate
    Obiekt delegowany, z którego podpisem program obsługi zdarzeń musi być zgodny.

  • event_name
    Nazwa zdarzenia.

  • return_value
    Wartość zwracana metody dostępu zdarzeń. Typ zwracany musi być void, aby było możliwe jego zweryfikowanie.

  • parameters
    (opcjonalnie) Parametry dla raise metodę, która odpowiada podpisowi z delegate parametru.

Uwagi

Wydarzenie jest skojarzenie między obiektem delegata, a funkcją członka (Obsługa zdarzeń), który reaguje na wyzwolenie zdarzenia i umożliwia klientom z dowolnej klasy zarejestrować metody, które są zgodne z podpisem i zwrócić typ obiektu delegowanego leżącego u podstaw.

Obiekt delegowany może mieć jedną lub kilka metod skojarzonych, które będą wywoływane, jeśli kod wskazuje, że zdarzenie miało miejsce.Zdarzenie w jednym programie może być dostępne dla innych programów, które są zaprojektowane dla Środowiska uruchomienia języka wspólnego .NET Framework.Zob. Rozgłaszanie zdarzenia zdefiniowanego w innym zestawie, aby zapoznać się z przykładem.

Istnieją dwa rodzaje deklaracji zdarzeń:

  • elementy danych zdarzenia
    Magazyn dla zdarzenia, w formie członka typu obiektu delegowanego, jest tworzony przez kompilator dla zdarzeń dotyczących członków danych. Element członkowski danych zdarzenia musi być zadeklarowany wewnątrz klasy.Jest to również nazywane zdarzeniem prostym (zobacz przykładowy kod poniżej).

  • bloki zdarzeń
    Bloki zdarzenia pozwalają dostosować zachowanie Dodaj, Usuń i Metody podwyżki, implementując Dodaj, Usuń i Metody podwyżki.Podpis metody dodaj (add), usuń (remove) i rozgłoś (raise) musi być zgodny z podpisem obiektu delegowanego. Zdarzenia bloku zdarzenia nie są członkami danych, a każde użycie ich jako członków danych spowoduje wygenerowanie błędu kompilatora.Zob. Definiowanie metod dostępu zdarzeń, aby zapoznać się z przykładem.

Typ zwracany modułu obsługi zdarzeń musi odpowiadać zwracanemu typowi obiektu delegowanego.

W.NET Framework można traktować członka danych, jak gdyby był samą metodą (to znaczy Invoke metodą swojego odpowiedniego obiektu delegowanego).Należy wstępnie zdefiniować typ obiektu delegowanego do deklarowania zarządzanego elementu członkowskiego danych zdarzenia.Natomiast metoda zarządzanych zdarzeniami niejawnymi definiuje odpowiednie obiekt delegowany, jeśli nie jest już zdefiniowany. Zob. przykładowy kod na końcu tego tematu.

Podczas deklarowania zdarzenia zarządzanego, można określić metody dostępu add (dodaj) i remove (usuń), które będą wywoływane, gdy programy obsługi zdarzeń będą dodawane lub usuwane przy użyciu operatorów += i -=.Metody dodaj (add), usuń (remove) i rozgłoś (raise) mogą być wywoływane explicite.

Aby utworzyć i używać zdarzeń w programie Visual C++, należy podjąć następujące kroki:

  1. Tworzenie lub identyfikowanie obiektów delegowanych.Jeśli definiujesz własne zdarzenia, musisz również upewnić się, że istnieje obiekt delegowany do użycia wraz z event słowem kluczowym.Jeśli zdarzenie jest wstępnie zdefiniowane na przykład w .NET Framework, wtedy konsumenci zdarzenia potrzebują tylko znać nazwę obiektu delegowanego.

  2. Stworzyć klasę, która zawiera:

    • Zdarzenie utworzone na podstawie obiektu delegowanego.

    • (opcjonalnie) Metoda, która sprawdza, czy wystąpienie pełnomocnika, którego zadeklarowana z eventistnieje słowo kluczowe.W przeciwnym razie logika ta musi zostać zawarta w kodzie, który uruchamia zdarzenie.

    • Metody, które wywołują zdarzenia.Metody te mogą zastępować niektóre podstawowe funkcjonalności klasy.

    Ta klasa definiuje to zdarzenie.

  3. Zdefiniowanie jednej lub kilku klas, które łączą metody ze zdarzeniem.Każda z tych klas skojarzy jedną lub kilka metodami ze zdarzeniem w klasie podstawowej.

  4. Użyj zdarzenia:

    • Stwórz obiektu klasy, która zawiera deklarację zdarzenia.

    • Stwórz obiektu klasy, która zawiera definicję zdarzenia.

Aby uzyskać więcej informacji na temat C++/CLI zdarzeń, zobacz

Wymagania

Opcja kompilatora: /clr

Przykłady

Przykład

Poniższy przykład kodu pokazuje sposób deklarowania par obiektów delegowanych, zdarzeń i procedur obsługi zdarzeń, a także sposób subskrybowania (dodawania) procedur obsługi zdarzeń, wywoływania procedur obsługi zdarzeń oraz wypisywania z subskrypcji (usuwania) procedur obsługi zdarzeń.

// mcppv2_events.cpp
// compile with: /clr
using namespace System;

// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);

// class that defines events
ref class EventSource {
public:
   event ClickEventHandler^ OnClick;   // declare the event OnClick
   event DblClickEventHandler^ OnDblClick;   // declare OnDblClick

   void FireEvents() {
      // raises events
      OnClick(7, 3.14159);
      OnDblClick("Hello");
   }
};

// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
   void OnMyClick(int i, double d) {
      Console::WriteLine("OnClick: {0}, {1}", i, d);
   }

   void OnMyDblClick(String^ str) {
      Console::WriteLine("OnDblClick: {0}", str);
   }
};

int main() {
   EventSource ^ MyEventSource = gcnew EventSource();
   EventReceiver^ MyEventReceiver = gcnew EventReceiver();

   // hook handler to event
   MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);

   // invoke events
   MyEventSource->FireEvents();

   // unhook handler to event
   MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
   MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}

Dane wyjściowe

  
  

Przykład

Poniższy przykład kodu pokazuje logikę stosowaną przy generowaniu metody raise dla zdarzenia prostego: Jeśli zdarzenie ma jeden lub więcej subskrybentów, wywołanie metody raise implicite lub explicite wywołuje obiekt delegowany.Jeżeli obiekt delegowany typu zwracanego nie jest void i jeśli są zerowe zdarzenia subskrybentów, raise metoda zwraca wartość domyślną dla z typu obiektu delegowanego.W przypadku braku subskrybentów zdarzenie, wywoływanie raise metoda po prostu zwraca i nie ma wyjątek.Jeśli obiekt delegowany typu zwracanego nie jest void, typ obiektu delegowanego jest zwracany.

// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
   int i;
   event Del^ MyEvent;

   void FireEvent() {
      i = MyEvent();
   }
};

ref struct EventReceiver {
   int OnMyClick() { return 0; }
};

int main() {
   C c;
   c.i = 687;

   c.FireEvent();
   Console::WriteLine(c.i);
   c.i = 688;

   EventReceiver^ MyEventReceiver = gcnew EventReceiver();
   c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
   Console::WriteLine(c.i);   
}

Dane wyjściowe

0

Zobacz też

Koncepcje

Component Extensions dla platform środowiska uruchomieniowego