イベント

独自のイベント定義

イベントの宣言

event SampleEventHandler^ SampleEvent;

event宣言時にトラッキング ハンドル (^) を付けず、

event SampleEventHandler SampleEvent;

のように宣言すると、「イベントの種類は handle-to-delegate 型である必要があります」としてエラーとなります。

サンプルコード

イベント発生側

delegate void SampleEventHandler(Object^ source, EventArgs^ e);

ref class MyClass
{
public:
    event SampleEventHandler^ CustomEvent;

    void Func()
    {
//      if(CustomEvent != nullptr) // ※1
        {
            CustomEvent(this, EventArgs::Empty);
        }
    }
};

※1 C#とは異なり、イベント発生時にそれが登録されているメソッドの存在を確認できません。nullptrと比較しようとすると、「error C3918: 使用するには、'MyClass::CustomEvent' がデータ メンバーでなければなりません」としてエラーとなります。c++ cli - Does C++/CLI event have any listeners? - Stack Overflow

イベント処理側

ref class Handler
{
public:
    Handler()
    {
        MyClass^ myClass = gcnew MyClass();

        myClass->CustomEvent
            += gcnew SampleEventHandler(this, &Handler::Callback);

        myClass->Func();
    }

    void Callback(Object^ source, EventArgs^ e)
    {
    }
};
Microsoft Learnから検索