プログラムの概要
プログラムを起動すると1組のカードが裏向きに表示さ れる。開始ボタンをクリックすると、其の場所に、先手と 後手の得点が表示され、タイトル部分に手番が表示されて ゲームを開始する事が出来る。 任意のカードを左クリックして開き、同じ数字のカードを 2枚開くと、其のカードは盤上から取り除かれ、カードを 開いた者の得点と成る。開いた2枚のカードが揃わ無い時 は、右クリックして、カードを閉じる。 2枚のカードが揃えば、続けてカードを開く事が出来、揃 わ無ければ、順番が相手に移る。最終的に14組以上を獲 得した者が勝者と成る。神経衰弱ゲーム
C# 2005 ⑩ □ 標準コントロールの利用(PictureBox、Button、Label) □ プロパティの利用(Size、Location、Image、Tag、Button、Visible、Width、Height) □ イベントの利用(Load、Click、MouseUp) □ メソッドの利用(DrawImage、FromImage、Refresh、Add、SetBounds) □ システム情報の利用(SystemInformation クラス、WorkingArea オブジェクト) □ コントロールの実行時生成(new、Controls.Add、イベントハンドラの追加) □ コントロール配列の利用(コードでインスタンスを生成して配列に格納) □ 乱数の利用(Random オブジェクト、Next メソッド)□ 制御構造構文(条件分岐:if 文、switch 文、ループ処理:for 文) □ 演算子(代入演算子、比較演算子、結合演算子、論理演算子) □ 商と剰余の利用(%演算子、/演算子) 今回の課題項目 □ 実行時のオブジェクト生成(new、Controls.Add、EventHandler) □ 商と剰余の利用(%演算子、/演算子) □ 画像の指定範囲転送(DrawImage) 今回の重点項目 □ 同一のカードを続けてクリックすると、揃った事に成る不具合を修正する。 今回の応用項目
■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name breakdown BackColor Green FormBorderStyle FixedSingle MaximizeBox False Text 神経衰弱 ピクチャーボックス1 Name picBack Image back1.gif(他の画像を使用しても良い) Size 71、96 Visible False ピクチャーボックス2 Name picBase Image cards.gif Size 923, 384 Visible False ラベル1 Name lblFirst AutoSize False Font MS明朝,太字,14 ForeColor Yellow Text 先手: 0組 TextAlign MiddleCenter ラベル2 Name lblSecond AutoSize False Font MS明朝,太字,14 ForeColor Yellow Text 後手: 0組 TextAlign MiddleCenter ボタン Name btnStart Font MS明朝,太字,14 ForeColor Yellow Text 開始 ピクチャーボックス1 コマンドボタン ピクチャーボックス2 ラベル1 ラベル2
■ プログラムリスト ■ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace breakdown {
public partial class breakdown : Form {
// フォームレベルでグローバルな変数の宣言 private int[ ] card = new int[ 52 ]; private byte[ ] score = new byte[ 2 ]; private byte turn, number;
private byte[ ] shows = new byte[ 2 ];
private PictureBox[ ] picCard = new PictureBox[ 52 ]; private Bitmap bback, bbase;
private Random rnd = new Random( ( int )DateTime.Now.Ticks ); public breakdown( ) { InitializeComponent( ); } // フォームが読み込まれた時の処理
private void breakdown_Load( object sender, EventArgs e ) {
int i;
// フォームのサイズ設定
this.Size = new Size( 679, 640 ); // フォームを画面中央に配置
this.Left = ( SystemInformation.WorkingArea.Width - this.Width ) / 2; this.Top = ( SystemInformation.WorkingArea.Height - this.Height ) / 2; // 転送元画像の Bitmap オブジェクトの生成
bback = new Bitmap( picBack.Image ); bbase = new Bitmap( picBase.Image ); // カード用ピクチャボックスの配置 for ( i = 0; i < 52; i++ )
{
picCard[ i ] = new PictureBox( ); picCard[ i ].Size = new Size( 71, 96 );
picCard[ i ].Location = new Point( ( i % 9 ) * 72 + 16, ( i / 9 ) * 97 + 16 ); picCard[ i ].Tag = i;
this.Controls.Add( picCard[ i ] );
picCard[ i ].MouseUp += new MouseEventHandler( picCard_MouseUp ); }
// コントロールの配置
btnStart.SetBounds( 520, 501, 144, 96 ); lblFirst.Location = new Point( 520, 520 ); lblSecond.Location = new Point( 520, 550 ); // ゲームの初期化 GameInit( ); } ネームスペース(名前空間)の使 用を宣言して居る。 此の部分は、エディタが、自動的 に記述して下れる。 クラスを生成する為のコンストラ クタで有る。 此の部分は、エディタが、自動的 に記述して下れる。 此処でPrivate 宣言した変数は同 じフォームモジュール内の総ての サブプロシージャで値の参照と設 定を行う事が出来る。 ピクチャボックスをコントロール 配列と仕て扱う為の変数の宣言。 Size プロパティは、Width プロパ ティと Height プロパティに分け て設定する事も出来る。 SystemInformation ク ラ ス の メ ンバで有る WorkingArea プロパ ティでスクリーンサイズを取得。 ピクチャボックスの Image プロ パティからBitmap オブジェクト を生成して居る。 PictureBox 型の配列にピクチャ ボックスのインスタンスを生成し て、コントロール配列化して居る。 フォームのコレクションに生成し たコントロールを追加して居る。 生成したコントロールのイベント ハンドラを追加して居る。 Location プロパティは、Top プロ パティと Left プロパティに分け て設定する事も出来る。
// ピクチャボックス(カード)がクリックされた時の処理
private void picCard_MouseUp( object sender, MouseEventArgs e ) {
PictureBox p = ( PictureBox ) sender; int n = ( int ) p.Tag; if ( btnStart.Visible ) return; switch ( e.Button ) { case MouseButtons.Left: if ( card[ n ] < 0 ) return; if ( number < 2 ) { CardDisp( n, card[ n ] );
shows[ number ] = ( byte ) n; number++; }
if ( number == 2 ) {
if ( ( card[ shows[ 0 ] ] % 13 ) == ( card[ shows[ 1 ] ] % 13 ) ) {
picCard[ shows[ 0 ] ].Visible = false; picCard[ shows[ 1 ] ].Visible = false;
card[ shows[ 0 ] ] = -1; card[ shows[ 1 ] ] = -1; score[ turn ]++; if ( score[ 0 ] + score[ 1 ] == 26) { if ( score[ 0 ] > 13 ) { this.Text = "神経衰弱 - 先手の勝ちです。"; } else if ( score[ 0 ] < 13 ) { this.Text = "神経衰弱 - 後手の勝ちです。"; } else { this.Text = "神経衰弱 - 引き分けです。"; }
GameInit( ); btnStart.Visible = true; }
else {
ScoreDisp( turn, score[ turn ] ); number = 0; } } } break; case MouseButtons.Right: if ( number == 0 ) return;
BackDisp( shows[ 0 ] ); if ( number == 2 ) BackDisp( shows[ 1 ] ); number = 0; turn = ( byte )( turn ^ 1 );
switch ( turn ) {
case 0: this.Text = "神経衰弱 - 先手の番です。"; break; case 1: this.Text = "神経衰弱 - 後手の番です。"; break; } break; } } 従来のコントロール配列の識別に 使用されたIndex は、イベントを 発生させたコントロールのTag プ ロパティ等で代用する。 マウスの左右のボタンの押下状態 はClick イベントでは感知出来な い為、MouseUp イベントを使用。 %演算子は、剰余(余り)を求め る演算子で有る。 1行に複数のステートメントをセ ミコロンで区切り記述する事が出 来る(マルチステートメント)。 C#には elseif と謂うステートメン トは無く、else 節の中に1つの if 文が有ると謂う形式で有る。 従って、此のelse は、2番目の if 文(if ( score[ 0 ] < 13 ))に対応し て居る事に成る。 引数無しのメソッドの呼出でも必 ず末尾にパーレンが必要で有る。 return ステートメントは、以降の コードを実行せずに直ちに(強制 的に)メソッドを抜け、呼出元に 戻る命令で有る。 変数の取り得る値が0か1で、0 なら1に、1なら0に変更するに は、論理演算子^(排他的論理和) を用いる事が出来る。
// 得点を表示するメソッド(ジェネラルプロシージャ) private void ScoreDisp( byte t, byte s )
{ string z; // スコア表示用文字列の生成 z = " " + s.ToString( ); z = z.Substring( z.Length - 2 ); z = ":" + z + "組"; // スコア表示用文字列に手番を付加して表示 if ( t == 0 ) { z = "先手" + z; lblFirst.Text = z; } else { z = "後手" + z; lblSecond.Text = z; } } // ゲームを初期化するメソッド(ジェネラルプロシージャ) private void GameInit( )
{
int i, k, s, d;
// カードの初期化
for ( i = 0; i < 52; i++ ) card[ i ] = i; // カードのシャッフル for ( i = 0; i < 300; i++ ) { // 2 個の乱数の発生 s = rnd.Next( 0, 52 ); d = rnd.Next( 0, 52 ); // 2 個の乱数に対応するカードのスワップ k = card[ d ]; card[ d ] = card[ s ]; card[ s ] = k; } // 裏面カードの表示
for ( i = 0; i < 52; i++ ) BackDisp( i ); // 開始ボタンの表示 btnStart.Visible = true; // スコアの初期化 score[ 0 ] = 0; score[ 1 ] = 0; // 手番と表札枚数の初期化 turn = 0; number = 0; } 数値の部分を揃える為に、先頭に スペースを付けてから、右から2 文字を切り取り、常に数値が2桁 に成る様に仕て居る。 此の場合のプラス記号は、加算演 算子では無く、文字列結合演算子 で有る。 文字列の結合では、指定した順番 に文字列が結合される。此の場合 は、変数z が表わす文字列の前に 『後手』が付加される。 此れはカードシャッフルの定型と 謂う可き方法で有る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 此の様に、for 文等で、ステートメ ントブロックの中にステートメン トが1つしか無い場合は、ブレス { } を省略する事が出来る。 此処では、Random オブジェクト のNext メソッドで、0 以上 52 未 満の整数値(0,1,2,…,50,51)の乱 数を発生させて居る。 1行に複数の文を記述する事をマ ルチステートメントと謂う。 此処では、変数i の値を、0 から 順に1 宛増加させ、i の値が 52 未 満で有る間、メソッド BackDisp を呼び出して居る。
// カード(表面)を表示するメソッド(ジェネラルプロシージャ) private void CardDisp( int n, int s )
{ int x, y; Graphics g; Rectangle r; // 切り取り範囲の設定 x = ( s % 13 ) * 71; y = ( s / 13 ) * 96; r = new Rectangle( x, y, 71, 96 ); // カードの描画
picCard[ n ].Image = new Bitmap( picCard[n].Width, picCard[n].Height ); g = Graphics.FromImage( picCard[ n ].Image );
g.DrawImage( bbase, 0, 0, r, GraphicsUnit.Pixel ); picCard[ n ].Refresh( );
}
// カード(裏面)を表示するメソッド(ジェネラルプロシージャ) private void BackDisp( int n )
{
Graphics g;
// カードの描画
picCard[ n ].Visible = true;
picCard[ n ].Image = new Bitmap( picCard[ n ].Width, picCard[ n ].Height ); g = Graphics.FromImage( picCard[ n ].Image );
g.DrawImage( bback, 0, 0 ); picCard[n].Refresh( ); }
// ボタン(開始)がクリックされた時の処理
private void btnStart_Click( object sender, EventArgs e ) { // スコアの初期化 ScoreDisp( 0, 0 ); ScoreDisp( 1, 0 ); // 手番の表示 this.Text = "神経衰弱 - 先手の番です。"; // 開始ボタンの非表示 btnStart.Visible = false; } } } 自作メソッドも組込メソッドと同 じ様に呼び出す事が出来る。 必要が有れば、引数を指定する事 で、変数、配列、式等をプロシー ジャに引き渡す事が出来る。 DrawImage メソッドに依り、1 枚の画像から必要な部分丈を切り 出して居る。 Rectangle オブジェクトは、矩形 の左上座標、横幅、高さを保持す るオブジェクトで有る。 描画の後、再描画の為の Refresh メソッドを実行しないと、描画は 反映されない。 Graphics オブジェクトは、描画の 為のオブジェクトで有る。 C#には、整数除算演算子は無いが 整数同士の除算では、結果が整数 に丸められるので、結果的に整数 除算の結果(商)が得られる。
実行時にコントロールの生成 Add メソッド コントロールコレクションにコントロールを追加するメソッド Object.Controls.Add(コントロール) コントロールコレクションにコントロールを追加し、コンテナ化(内包)する。 +=演算子 イベントをイベントハンドラに関連付ける演算子 オブジェクト名.イベント名 += new イベントハンドラデリゲート ( メソッド名 ); オブジェクト名で指定したオブジェクトにイベント名で指定したイベントが発生した時、イ ベントプロシージャ名で指定したイベントプロシージャに分岐する様にする。 実行時にコントロールを生成する手順 実行時にイベントを発生するコントロールを生成し、フォーム等に配置する手順は、下記の通りで有る。 1.生成するコントロールに合わせたデータ型を持つ変数を宣言する。 例:PictureBox p; 2.コントロールのインスタンスを生成し、変数に代入する。 例:p = New PictureBox( ); 3.必要に応じて、生成したコントロールのプロパティを設定する。 例:p.Size = New Size(100, 50);
p.Location = New Point(30, 30);
p.Image = Image.FromFile(“sample.gif”);
4.生成したコントロールをAdd メソッドを使用してコンテナの Controls コレクションに追加する。 例:this.Controls.Add(p)
5.生成したコントロールをイベントプロシージャに関連付ける。
例:p.MouseUp += new MouseEventHandler( PictureBox_MouseUp );
上記の1と2は、PictureBox P = New PictureBox( ); の様に、一つに纏めて記述する事も出来る。
上記の3では、少なく共、Size プロパティと Location プロパティを設定して置く必要が有る。 上記の4では、フォーム丈で無く、グループボックスやパネル等を指定する事が出来る。 上記の5では、予めイベントを処理するメソッド(プロシージャ)を作成して置くと、インテリセンス に表示される。 機 能 書 式 解 説 機 能 書 式 解 説
実行時にイベントハンドラを作成する方法 適切なシグネチャ(メソッド名と引数のデータ型と名前から成る識別子)を持つイベント処理メソッド が、ページに既に存在する場合は、実行時に其れにコントロールイベントを関連付ける事が出来る。此 の手法は、プログラムに依りコントロールを作成する場合に一般的に使用される。 下記の書式に従い、関連付ける先のメソッドのアドレスを引数と仕てイベントハンドラデリゲートのイ ンスタンスを作成し、イベントの発生時に呼び出されるメソッドのリストにデリゲートオブジェクトを 追加する。 オブジェクト名.イベント名 += new イベントハンドラ ( メソッド名 ); 此の処理は、イベントが発生する前に必ず実行される様にする必要が有る。通常の場合、ハンドラは、 ページの初期化中に追加する。
下記に、Button1 コントロールの Click イベントを myEventHandler と謂うメソッドに連結するコー ド例を示す。
Button1.Click += new System.EventHandler( this.myEventHandler );
猶、Visual Studio 統合開発環境(IDE)を使用して居る場合、オブジェクト名の後にドットを入力する と、インテリセンスが表示され、其のコントロールに使用する事の出来るイベント名が表示されるので 其の中から使用するイベントを選択する。 亦、引き続き += と入力すると、適切なイベントハンドラデリゲートの生成文がインテリセンスで表示 されるので、通常は、其の儘Tab キーを押して入力し、メソッド名を記述する丈で良い。 因みに、EventHandler デリゲートは、イベントデータを持たないイベントを処理するメソッドを表し MouseEventHandler デリゲートは、フォーム、コントロール、其他のコンポーネントの MouseDown イベント、MouseUp イベント、MouseMove イベントを処理するメソッドを表す。 参考:Visual Basic を使用して実行時にイベントハンドラを作成する場合 下記の書式に従い、AddHandler ステートメントを追加し、此のステートメントに関連付ける対象 のイベント、及び、呼び出すメソッドのアドレスを渡す。 AddHandler オブジェクト名.イベント名, AddressOf イベントプロシージャ名 此のステートメントは、イベントが発生する前に必ず実行される様にする必要が有る。通常の場合、 ハンドラは、ページの初期化中に追加する。
下記に、Button1 コントロールの Click イベントを myEventHandler と謂うメソッドに連結する コード例を示す。
/演算子に依る整数除算 2つの整数値の商を計算し、結果を整数で返す演算子 数式1 / 数式2 数式1を数式2で除算し、小数部を丸めて、其の商を返す。 /演算子は、除算演算子で、最初のオペランドが 2 番目のオペランドで除算されるが、総ての数値型に定 義済みの除算演算子が有り、両者が整数の場合、結果は、小数を含まない整数と成る。其の為、整数除 算演算子が提供されて居ないC#でも、商を求める事が出来る。 %演算子に依る剰余 2つの数値の除算を行い、其の剰余を返す演算子 数式1 % 数式2 数式1を数式2で除算し、其の剰余(余り)を返す。 %演算子は、引数1を引数2で除算し、其の剰余を返す。例えば、a = 8 % 3 では、変数 a の値は 2 に 成る。 引数1か引数2が浮動小数点数値の場合は、除算が実行され、浮動小数点数の剰余が返される。演算結 果のデータ型は、有効な値の範囲が最も広いデータ型と同じに成る。有効な値の範囲は、byte 型、short 型、int 型、long 型、float 型、double 型、decimal 型の順に広く成る。
^演算子に依る排他的論理和 2つの数値の排他的論理和を返す演算子 数式1 ^ 数式2 数式1と数式2の排他的論理和(互いが異なる時だけ真に成る)を返す。 ^演算子は、論理演算子、及び、ビット演算子と仕て機能する。 Refresh メソッドの依るコントロールの再描画 コントロールを再描画するメソッド Object.Refresh( ) 強制的に、コントロールがクライアント領域を無効化し、直後に其のコントロール自体と其 の子コントロールを再描画する。 Graphics オブジェクトの描画メソッド(DrawImage、DrawLine 等)を用いてピクチャボックスに描 画しても、其の儘では、何も表示されない。Refresh メソッドを用いて、再描画する必要が有る。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
Graphics オブジェクトの FromImage メソッド Image オブジェクトから新しい Graphics オブジェクトを作成するメソッド Object.FromImage(イメージ) 指定したImage オブジェクトの新しい Graphics を返す。 描画(イメージング、ベクタグラフィックス、タイポグラフィ)を行う為に必要な Graphics オブジェ クトを Image オブジェクトから生成する場合に使用する。Image オブジェクトには、ピクチャボック スのImage プロパティも指定する事が出来るが、Bitmap クラスの新しいインスタンスで初期化して置 く必要が有る。ピクチャボックスに描画を行う為の手順は、下記の通りで有る。 1.Graphics オブジェクトを格納する為の変数を宣言する 例:Graphics g; 2.ピクチャボックスのImage プロパティを Bitmap クラスの新しいインスタンスで初期化する。 例:PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height);
3.ピクチャボックスのImage プロパティから Graphics オブジェクトを作成する。 例:g = Graphics.FromImage(PictureBox1.Image); 上記で、ピクチャボックスに、Graphics オブジェクトのメソッドを使用して、描画を行う事が出来る 様に成る。 Graphics オブジェクトの DrawImage メソッド 指定した位置に元のサイズで指定したイメージの指定した部分を描画するメソッド Object.DrawImage(イメージ, X座標, Y座標, 矩形, 単位) 指定した位置に元のサイズで、指定したImage オブジェクトの指定した部分を描画する。 引数のイメージには、描画元と成るImage オブジェクトを指定し、必ず指定する。 引数のX座標には、描画イメージの左上隅のX座標を指定し、必ず指定する。 引数のY座標には、描画イメージの左上隅のY座標を指定し、必ず指定する。 引数の矩形には、描画元と成るImage オブジェクトの範囲を指定し、必ず指定する。 引数の単位には、引数に使用する単位(ピクセル等)を指定し、必ず指定する。
猶、矩形はRectangle 構造体で指定し、単位は GraphicsUnit 列挙体のメンバで指定する。DrawImage メソッドで元画像の指定部分をピクチャボックスに描画する手順を、下記に示す。
1.ピクチャボックスのGraphics オブジェクトを作成する。 例:Graphics g;
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) g = Graphics.FromImage(PictureBox1.Image)
2.元画像のBitmap オブジェクトをピクチャボックスより作成する。 Bitmap b = New Bitmap(PictureBox2.Image)
3.矩形を表すRectangle 構造体を定義する。 Rectangle r = New Rectangle(10, 10, 50, 50)
4.指定した位置に元のサイズで指定したイメージの指定した部分を描画する。 g.DrawImage(b, 0, 0, r, GraphicsUnit.Pixel) 機 能 書 式 解 説 機 能 書 式 解 説
イベントの利用 アプリケーションでイベントを利用するには、イベントに応答してプログラムロジックを実行するイベ ントハンドラ(イベント処理メソッド)を用意し、其のイベントハンドラをイベントソースに登録する 必要が有る。此の処理をイベント接続と呼ぶ。Windows フォーム用と Web フォーム用のビジュアルデ ザイナには、イベント接続の詳細を簡単にしたり、隠したりする為の、RAD(Rapid Application Development)ツールが用意されて居る。 此処では、イベントを処理する一般的なパターンに付いて説明し、Web フォームと Windows フォーム に於けるユーザーインターフェイスイベントの処理の例を示します。 イベントパターン
異なるRAD ツールに依って、異なるレベルのサポートが提供される為、Windows フォームと Web フ ォームでのイベント接続の詳細は異なる。但し、孰れのシナリオも同じイベントパターンに準拠し、次 に示す特徴を持つ。
EventName イベントを発生させるクラスには、次のメンバが属して居る。
C# public event EventNameEventHandler EventName; Visual Basic Public Event EventName As EventNameEventHandler
EventName イベントのイベントデリゲートは、EventNameEventHandler で、此れは次のシグネチャ を持って居る。
C# public delegate void EventNameEventHandler ( object sender, EventNameEventArgs e );
Visual Basic Public Delegate Sub EventNameEventHandler _ ( sender As Object, e As EventNameEventArgs )
EventName イベントを利用するには、イベントハンドラがイベントデリゲートと同じシグネチャを持 って居る必要が有る。
C# void EventHandler( object sender, EventNameEventArgs e ) { } Visual Basic Sub EventHandler( sender As Object, e As EventNameEventArgs )
註:.NET Framework では、イベントデリゲートは、EventNameEventHandler と命名されるが、此 のドキュメントでは、イベントハンドラと謂う用語は、イベント処理メソッドを意味して居る。名前付 け方法の基本的な規則に依り、EventNameEventHandler デリゲートは実際にイベントを処理するイベ ントハンドラ(メソッド)を指す。 イベントが関連付けられたデータを持たない場合、イベントを発生させるクラスでは、デリゲートとし てSystem.EventHandler を使用し、イベント データに System.EventArgs を使用する。関連付けられ たデータを持つイベントは、イベントデータの型の EventArgs から派生したクラスと、其れに対応す るイベントデリゲート型を使用する。例えば、Windows フォームアプリケーションで MouseUp イベン ト を 処 理 す る 場 合 、 イ ベ ン ト デ ー タ ク ラ ス は 、MouseEventArgs で 、 イ ベ ン ト デ リ ゲ ー ト は MouseEventHandler で有る。幾つかのマウスイベントは、イベントデータの代わりと成る共通のクラ
スと、共通のイベントデリゲートを使用する為、其の名前付け方法は、上で説明した規則と正確には一 致しない。マウスイベントの場合、イベントハンドラは、次のシグネチャを持つ必要が有る。
C# void Mouse_Moved( object sender, MouseEventArgs e ){ } Visual Basic Sub Mouse_Moved( sender As Object, e As MouseEventArgs )
sender パラメータとイベント引数パラメータは、イベントハンドラにマウスイベントに付いての詳細情 報を提供する。sender オブジェクトは、イベントの発生元を示し、MouseEventArgs パラメータは、 イベントを発生させたマウス動作に付いての詳細情報を提供する。多くのイベントソースは、イベント の詳細データを提供し、多くのイベントハンドラはイベントを処理する際にイベント固有のデータを使 用する。 註:イベントは、ユーザーインターフェイス(UI:User Interface)以外のコンテキストでも発生する。 実際、.NET Framework には、イベントを発生させる、UI ではないクラスが数多く含まれて居る。但 し、総てのイベントは、此処で説明したパターンに準拠する。
引数(パラメータ)の利用
下記の例を元に、イベントメソッドの引数の利用法を説明する。
private void picCard_MouseUp( object sender, MouseEventArgs e ) { PictureBox p = (PictureBox)sender; int n = (int)p.Tag; switch (e.Button) { case MouseButtons.Left: … case MouseButtons.Right: … } } 上記は、ピクチャボックスでマウスボタンが開放された時のイベント処理メソッドで有る。sender パラ メータには、此のピクチャボックスの参照が格納されて居る。
併し、sender パラメータは、object 型で有る為、PictureBox 型の変数 p に、其の儘、代入する事は出 来ない。PictureBox 型にキャストしてから代入する必要が有る。 参照の代入が完了した変数p に依り、イベント発生元のピクチャボックスのプロパティを参照・設定し たり、メソッドを実行する事が出来る様に成る(変数に代入せずに、直接sender を使用する事も可能)。 亦、e パラメータには、発生したイベントに付いての詳細情報が格納されて居る。其の為、e.Button で 孰れのボタンが開放されたのかを知る事が出来、亦、e.X と e.Y でマウスボタンが開放された位置を知 る事が出来る。