デリゲートはややこしい。
かつて制覇したポインタより複雑怪奇だ。
一体いつ誰が何のためにこんなものを作ったのか。
そこから整理しようではないか。
何のためにあるのか。
そこが見えれば利用方法の推理が立てやすい。
(-_☆)キラーン
それはずばり
自作コンポーネントのイベント通知用だ。
VC#の画面右下にはプロパティがある。
デザイナ画面でForm上のコンポーネントをアクティブにするとイベント一覧が現れる。
そしてクリックすればイベントハンドラのコードが自動でFormに生成される。
誰がいつ使うか分からないコンポーネントのイベントを親フォームに通知するためにデリゲートはある!
間違っているかもしれんがオレはそう認識した!
C++Win32APIでは
親クラスのポインタを受け取っておいて、イベント発生したらそのポインタにメッセージをPostしてた。
正直この方法の方が好きなんだが、確かにデリゲートの方がオブジェクト指向してるし、そもそも強引にメッセージを投げる方法がない(だからデリゲートを修得せざるを得ないんだが)。
というわけで今日成功したことを記念して要点をメモ。
機能は
このコンポーネントがクリックされた場合、マウスの情報を加工して渡す。ものとする。
【メッセージを送る側】
//デリゲートを作る
//こいつはクラスの外側で宣言
public delegate void Hogehoge(Point e);
//デリゲートのインスタンスを作る。いわゆるメンバ変数。
public event Hogehoge myHoge;
//メッセージ内容の定義
protect virtual void OnHoging(Point e);
{
if(myHoge != null)
{
myHoge(e);
}
}
//実際にメッセージを投げる
this.OnHoging(modifiedPos);
|
親に通知したい情報を自作したい場合はEventArgsから派生した独自のクラスを作る必要アリ。
で
受ける側はさっきも言ったが、デザイナ画面でテキトーにクリックすればハンドラが生成されるのでここでは割愛する。
とにかく送る側にこれだけ書いておけばうまくいく。
世のサンプルでは同一クラス内で応答してるから価値が見出せなかったんだよね。
でもオレやったよ!!
彼女はデリゲートって言いたくて頑張ったよ!!!!
( ;゚∀゚)=3フンフン
Posted at 2007/07/26 01:09:27 | |
トラックバック(0) |
プログラム | 日記