{{indexmenu_n>19}} ====== event ====== eventはその名のとおりイベントを処理するために用意されたものです。イベントソースとなるクラスはeventを定義し、イベントを受け取りたいクライアントはそのクラスのeventに対して、自身の持つ関数を登録します。 たとえば、buttonクラスはclickedイベントを持ち、クライアントはOnClick()を定義し、それをbuttonクラスのclickedに登録します。 実際にコードを書くには、まずdelegateでイベント用の関数の型を定義します。イベントソースクラスはそのdelegateのeventを宣言し、クライアントはそのdelegate型の関数を定義し、eventに登録します。 using namespace System; delegate void ClickHandler(); ref class button { public: event ClickHandler^ Clicked; button() { btnForTest = this; } public: void someoneclicked() { Clicked(); } static button^ btnForTest; }; ref class Client { private: button^ btn; public: Client() { btn = gcnew button; btn->Clicked += gcnew ClickHandler(this, &Client::OnClick); } private: void OnClick() { Console::WriteLine("someone clicked."); } }; int main() { Client^ client = gcnew Client; button::btnForTest->someoneclicked(); return 0; } 上記の例において、buttonクラスの event ClickHandler^ Clicked; は以下のように書いても動作します。 ClickHandler^ Clicked; しかしeventとすることによっていくつかの制約がかかります。一つはClickedのコールはbuttonしかできなくなります。またクライアントがClickedに対して許可された操作は += と -= のみとなり、Clickedに対して、Clicked()したり Clicked = nullptrしたりすることができなくなります。 Clickedはいろいろなクライアントが登録するので、勝手に実行したり、nullptrをセットされたりしたらまずいのです。