Sdílet prostřednictvím


event (rozšíření komponent C++)

Klíčové slovo event deklaruje událost, což je oznámení registrovaným odběratelům (obslužným rutinám události), že došlo k něčemu zajímavému.

Všechny moduly runtime

C++/CX podporuje deklarace členů události nebo bloku událostí.Člen události je rychlejší způsob deklarace bloku událostí.Člen události automaticky deklaruje funkce add(), remove() a raise() funkce deklarované explicitně v bloku událostí.Chcete-li si přizpůsobit funkce v členu události, deklarujte namísto něj blok událostí a přepište požadované funkce.

Syntax

// 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
    Modifikátor, který lze použít buď při deklaraci události, nebo pro přístupovou metodu události. Možnými hodnotami je static a virtual.

  • delegate
    Delegát, s jehož signaturou se musí shodovat obslužná rutina události.

  • event_name
    Název události.

  • return_value
    Návratová hodnota přístupové metody události. Pro ověřitelnost musí být návratový typ void.

  • parameters
    (volitelné) Parametry raise metodu, která bude odpovídat podpisu delegate parametr.

Poznámky

Událost je vztah mezi delegátem a členskou funkcí (obslužnou rutinou události), která reaguje na spuštění události a umožňuje klientům z libovolné třídy zaregistrovat metody odpovídající signatuře a návratovému typu daného delegáta.

Existují dva druhy deklarace událostí:

  • datový člen události
    Kompilátor automaticky vytvoří úložiště pro událost ve formě členu typu delegáta a vnitřní členské funkce add(), remove() a raise().Datový člen události musí být deklarován uvnitř třídy.Návratový typ delegáta se musí shodovat s návratovým typem obslužné rutiny události.

  • blok událostí
    Blok událostí umožňuje explicitně deklarovat metody add(), remove() a raise() a přizpůsobit jejich chování.

Chcete-li přidat nebo odebrat obslužnou rutinu události, lze použít operátory operators+= nebo operator-= nebo explicitně volat metody add() či remove().

Klíčové slovo event je slovo citlivé na kontext; další informace naleznete v tématu Kontextově závislá klíčová slova (rozšíření komponent C++).

prostředí Windows Runtime

Poznámky

Další informace naleznete v tématu události (C + +/ CX).

Chcete-li přidat a poté odebrat obslužnou rutinu události, je zapotřebí uložit strukturu EventRegistrationToken vrácenou operací Add.Poté v operaci Remove je nezbytné použití uloženou strukturu EventRegistrationToken pro identifikaci obslužné rutiny, které má být odstraněna.

Požadavky

Možnost kompilátoru: /ZW

Common Language Runtime

Klíčové slovo event umožňuje deklarovat událost.Událost je způsob, jakým třída může poskytovat oznámení o tom, že se událo něco zajímavého.

Syntax

// 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
    Modifikátor, který lze použít buď při deklaraci události, nebo pro přístupovou metodu události. Možnými hodnotami je static a virtual.

  • delegate
    Delegát, s jehož signaturou se musí shodovat obslužná rutina události.

  • event_name
    Název události.

  • return_value
    Návratová hodnota přístupové metody události. Pro ověřitelnost musí být návratový typ void.

  • parameters
    (volitelné) Parametry raise metodu, která bude odpovídat podpisu delegate parametr.

Poznámky

Událost je vztah mezi delegátem a členskou funkcí (obslužnou rutinou události), která reaguje na spuštění události a umožňuje klientům z libovolné třídy zaregistrovat metody odpovídající signatuře a návratovému typu daného delegáta.

Delegát může mít jednu nebo více přidružených metod, které budou zavolány, pokud kód indikuje vznik události.Událost jednoho programu může být přístupná jiným programům cílených na modul CLR rozhraní .NET Framework.Ukázku naleznete v tématu týkajícím se vyvolání události definované v jiném sestavení.

Existují dva druhy deklarace událostí:

  • datové členy události
    Úložiště pro událost je pro události datových členů vytvořeno kompilátorem a má podobu členu typu delegáta. Datový člen události musí být deklarován uvnitř třídy.To je také známo jako triviální událost (viz ukázka kódu níže.)

  • bloky událostí
    Bloky událostí umožňují přizpůsobit chování metod add, remove a raise jejich implementací.Signatura metod add, remove a raise se musí shodovat se signaturou delegáta. Události bloku událostí nejsou datové členy a jakékoliv použití jako datových členů vygeneruje chybu kompilátoru.Ukázku naleznete v tématu týkajícím se definování přístupových metod události.

Návratový typ obslužné rutiny událostí se musí shodovat s návratovým typem delegáta.

V rozhraní .NET Framework lze používat datový člen, jako by byl sám metodou (tedy metoda Invoke odpovídajícího delegáta).Chcete-li deklarovat spravovaný datový člen události, je nezbytné předdefinovat typ delegáta.Naproti tomu spravovaná metoda události implicitně definuje odpovídajícího spravovaného delegáta, není-li již definován. Příklad lze nalézt v ukázce kódu na konci tohoto tématu.

Při deklarování spravované události lze zadat přístupové objekty add a remove, které budou volány ve chvíli, kdy dojde k přidání nebo odstranění obslužné rutiny události pomocí operátorů += a -=.Metody add, remove a raise mohou být volány explicitně.

Chcete-li vytvořit a používat události v jazyce Visual C++, musí být provedeny následující kroky:

  1. Vytvořte nebo určete delegáta.Definujete-li svou vlastní událost, je také zapotřebí zajistit, aby existoval delegát pro použití s klíčovým slovem event.Je-li událost předdefinována, například v rozhraní .NET Framework, potřebují příjemci události znát pouze název delegáta.

  2. Vytvořte třídu, která obsahuje:

    • Událost vytvořenou z delegáta.

    • (volitelné) Metodu, která ověří, že instance delegáta deklarovaného s klíčovým slovem event existuje.Jinak musí být tato logika umístěna do kódu, který vyvolá událost.

    • Metody, které volají událost.Tyto metody mohou být přepisy některé funkcionality základní třídy.

    Tato třída definuje událost.

  3. Definujte jednu nebo více tříd, které připojují metody k události.Každá z těchto tříd přiřadí jednu nebo více metod k události v základní třídě.

  4. Použijte událost:

    • Vytvořte objekt třídy obsahující deklaraci události.

    • Vytvořte objekt třídy obsahující definici události.

Další informace o událostech jazyka C++/CLI naleznete v tématech

Požadavky

Možnost kompilátoru: /clr

Příklady

Příklad

Následující příklad kódu ukazuje deklarující dvojice delegátů, událostí a obslužných rutin událostí; přihlášení (přidání) obslužných rutin událostí; vyvolání obslužných rutin událostí; a poté odhlášení (odebrání) obslužných rutin událostí.

// 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);
}

Výsledek

  
  

Příklad

Následující příklad kódu ukazuje logiku použitou ke generování metody raise triviální události: má-li metoda jednoho nebo více odběratelů, volání metody raise implicitně nebo explicitně volá delegáta.Není-li delegátův návratový typ void a neexistuje-li žádný odběratel, metoda raise vrací výchozí hodnotu typu delegáta.Neexistují-li žádní odběratelé události, volání metody raise je jednoduše ukončeno a není vyvolána žádná výjimka.Není-li delegátův návratový typ void, je vrácen typ delegáta.

// 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);   
}

Výsledek

0

Viz také

Koncepty

Rozšíření komponent pro platformy běhového prostředí