おさらい
イベントはアクションの発生を知らせる為に、オブジェクトにより送信されるメッセージです。
イベントはeventキーワードを使用し、イベントにデリゲート型を指定します。
イベントに応答するには、イベント レシーバーのイベント ハンドラ メソッドを定義します。EventHandlerはdelegateで定義されます。
delegate void hoge(int a)->hoge型のメソッドは戻り値無しで引数はintです。
デリゲートはメソッドへの参照を保持する型です。
フォームにボタンを張り付け、ボタンを押下した時の処理→つまりイベントの受け(コールバックメソッド)は下記となります。
private void ボタン_Click(object sender, EventArgs e){}//イベントの処理
この場合、Designers.csを見るとイベントハンドラの追加(上記のボタン_Clickメソッドが呼び出される)が自動生成されています。
this.ボタン.Click += new System.EventHandler(this.ボタン_Click);
さらに、EventHandlerの定義へ移動すると・・・引数が(object sender, EventArgs e)で戻り値が無しであるメソッドのdelegete型である事が分かります。
public delegate void EventHandler(object sender, EventArgs e);
EventHandler型のメソッドは戻り値無しで、引数がobject sender, EventArgs eです。
上記の要素を作成する事によりイベントの処理が書けそうです。
①イベントハンドラー定義
②イベントハンドラの追加
③イベントの処理
用語やガイドライン
ガイドラインに準拠したイベントを発行する (C# プログラミング ガイド)
中身が深すぎます。(ガイドラインに準拠しませんが)簡単なパターンを覚える事にします。
簡単なパターン(データを返さない場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//Formにボタンが付いたクラス public partial class easy : Form { public easy() { InitializeComponent(); } private void easy_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e)//一連の処理のトリガー { イベント発生 イベント発生 = new イベント発生();//(イベント発生)オブジェクトの生成 イベント発生.EventDelegate += new EventHandler(this.イベント受信処理);//イベントハンドラの追加 イベント発生.発生();//イベントの発生 } private void イベント受信処理(object sender, System.EventArgs e)//コールバック { MessageBox.Show("受信");//処理 } } //イベントを発生させるクラス public class イベント発生 { public event EventHandler EventDelegate;//ここでは"EventDelegate"というイベントデリゲートを宣言する public void 発生()//イベント発生メソッド { EventDelegate(this, EventArgs.Empty);//"EventDelegate"イベントの発生 } } |
簡単なパターン(データを返す場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
private void button1_Click(object sender, EventArgs e)//一連の処理のトリガー { イベント発生 イベント発生 = new イベント発生();//(イベント発生)オブジェクトの生成 //イベントハンドラの追加 //イベントが発生したら、コールバック関数を実行する様に記述->this.イベント受信処理を行う事を記述する イベント発生.発生メソッド += new イベント発生.イベントハンドラ(this.イベント受信処理); イベント発生.発生();//イベントの発生 } private void イベント受信処理(int num, string message)//コールバック { label1 .Text ="受信 num =" + num.ToString() + "messgage =" + message;//処理 } //イベントを発生させるクラス public class イベント発生 { //デリゲートの宣言 //戻り値無しで引数をint型、string型とする。 public delegate void イベントハンドラ(int number, string message); //ここでは"EventDelegate"というイベントデリゲートを宣言する public event イベントハンドラ 発生メソッド; public void 発生()//イベント発生メソッド { 発生メソッド(200, "wwwww");//イベントの発生 } } |
プログラム記述の順番
1.イベントを発生させるクラスの記述
1-1.イベントデリゲートを宣言する。・・・戻すデータを考慮してdelegate宣言を行う
1-2.外部からイベント発生要求に応えるメソッドの作成。
1-3.メソッド内にイベント発生を記述する。
2.コールバック部分(イベント発生後処理)を記述する
3.イベントの発生元の記述・・・1-1.と戻すデータ引数を合わせる。
3-1.イベント発生オブジェクトの生成を行う。
3-2.イベントハンドラを追加する。・・・イベント発生時のメソッドにコールバックを対応させる。
4.イベントを発生トリガーを発動させる。
以上で、イベント発生時の待ちをコールバック処理できる様になります。