__event
Deklaruje událost.
__event method-declarator;
__event __interface interface-specifier;
__event member-declarator;
Poznámky
Klíčové slovo __event lze použít k deklaraci metody, deklaraci rozhraní nebo k deklaraci datového člena.Klíčové slovo __event však nelze použít pro získání člena vnořené třídy.
V závislosti na tom, zda jsou zdroj a přijímač události nativní C++, komponenta COM nebo spravované (rozhraní .NET Framework), je možné jako události použít následující konstrukce:
Nativní C++ |
COM |
Spravované (rozhraní .NET Framework) |
---|---|---|
Metoda |
— |
metoda |
— |
rozhraní |
— |
— |
— |
datový člen |
Pro přidružení metody obslužné rutiny s metodou událostí lze v příjemci událostí použít __hook.Všimněte si, že po vytvoření události pomocí klíčového slova __event budou všechny obslužné rutiny událostí, které byly následně připojeny k této události volány v době volání události.
Deklarace metody __event nemůže mít definici. Definice je implicitně generována tak, aby mohla být metoda události volána, jako kdyby se jednalo o běžnou metodu.
[!POZNÁMKA]
Třída šablony nebo struktura nemohou obsahovat události.
Nativní události
Nativní události jsou metody.Návratový typ je obvykle HRESULT nebo void, ale může být jakýkoli integrální typ, včetně enum.Používá-li událost integrální návratový typ, je při vrácení nenulové hodnoty obslužnou rutinou, definován chybový stav v případě, kdy vyvolaná událost zavolá ostatní delegáty.
// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);
Ukázkový kód naleznete v tématu Zpracování událostí v nativním C++.
Události modelu COM
Události modelu COM jsou rozhraní.Parametry metody v rozhraní zdrojové událostí by měly být vstupními parametry (není to ale přísně vynucováno), protože výstupní parametr není při vícenásobném přetypování užitečný.Při použití výstupního parametru bude vyvoláno upozornění úrovně 1.
Návratový typ je obvykle HRESULT nebo void, ale může být jakýkoli integrální typ, včetně enum.Používá-li událost integrální návratový typ a obslužná rutina vrátí nenulovou hodnotu, jedná se o chybový stav, při kterém vyvolaná událost přeruší volání ostatních delegátů.Všimněte si, že kompilátor v generované IDL automaticky označí rozhraní zdrojové události jako zdroj.
Klíčové slovo __Interface je pro zdroj události modelu COM vždy požadováno po klíčovém slovu __event.
// Example of a COM event:
__event __interface IEvent1;
Ukázkový kód naleznete v tématu Zpracování událostí v modelu COM.
Spravované události
Informace o událostech kódování v nové syntaxi naleznete v tématu event (rozšíření komponent C++).
Spravované události jsou datoví členové a metody.Při použití v kombinací s události, musí být návratový typ delegáta kompatibilní se specifikací CLS (Common Language Specification).Návratový typ obslužné rutiny událostí se musí shodovat s návratovým typem delegáta.Další informace o delegátech naleznete v tématu __delegate.Je-li spravovaná událost datový člen, musí být její typ ukazatel na 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.Je možné deklarovat hodnotu události jako je OnClick jako událost například takto:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
Při implicitním 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.Je také možné definovat metodu, která volá (vyvolá) událost z vně třídy.
Příklad: Nativní události
// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
Příklad: Události modelu COM
// EventHandling_COM_Event.cpp
// compile with: /c
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];
[ dual, uuid("00000000-0000-0000-0000-000000000002") ]
__interface IEventSource {
[id(1)] HRESULT MyEvent();
};
[ coclass, uuid("00000000-0000-0000-0000-000000000003"), event_source(com) ]
class CSource : public IEventSource {
public:
__event __interface IEventSource;
HRESULT FireEvent() {
__raise MyEvent();
return S_OK;
}
};
Příklad: Spravované události
// EventHandling_Managed_Event.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[event_source(managed)]
public __gc class CPSource {
public:
__event void MyEvent(Int16 nValue);
};
Při použití atributu na událost lze určit, zda bude atribut použit na vytvořené metody nebo na metody vyvolání vytvořeného delegáta. Výchozí stav (event:) je použití atributu na událost.
// EventHandling_Managed_Event_2.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[attribute(All, AllowMultiple=true)]
public __gc class Attr {};
public __delegate void D();
public __gc class X {
public:
[method:Attr] __event D* E;
[returnvalue:Attr] __event void noE();
};