この文書の現在のバージョンと選択したバージョンの差分を表示します。
cli:event [2009/01/31 15:09] 192.168.0.63 作成 |
cli:event [2013/12/23 09:08] |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ====== event ====== | ||
- | |||
- | |||
- | eventはその名のとおりイベントを処理するために用意されたものです。イベントソースとなるクラスはeventを定義し、イベントを受け取りたいクライアントはそのクラスのeventに対して、自身の持つ関数を登録します。 | ||
- | |||
- | たとえば、buttonクラスはclickedイベントを持ち、クライアントはOnClick()を定義し、それをbuttonクラスのclickedに登録します。 | ||
- | |||
- | 実際にコードを書くには、まずdelegateでイベント用の関数の型を定義します。イベントソースクラスはそのdelegateのeventを宣言し、クライアントはそのdelegate型の関数を定義し、eventに登録します。 | ||
- | <code cpp> | ||
- | 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; | ||
- | } | ||
- | </code> | ||
- | 上記の例において、buttonクラスの | ||
- | <code cpp> | ||
- | event ClickHandler^ Clicked; | ||
- | </code> | ||
- | は以下のように書いても動作します。 | ||
- | <code cpp> | ||
- | ClickHandler^ Clicked; | ||
- | </code> | ||
- | しかしeventとすることによっていくつかの制約がかかります。一つはClickedのコールはbuttonしかできなくなります。またクライアントがClickedに対して許可された操作は += と -= のみとなり、Clickedに対して、Clicked()したり Clicked = nullptrしたりすることができなくなります。 | ||
- | |||
- | Clickedはいろいろなクライアントが登録するので、勝手に実行したり、nullptrをセットされたりしたらまずいのです。 | ||