PR

 日経ソフトウエアは2004年7月号で6周年を迎えたが,これまで結構,Delphiを扱っているのだ。古くは創刊まもない1998年10月号から3回「Delphi活用講座」が連載されていた。1999年1月号から「Delphiかんたんソフト工房」はロングランで18回に渡り連載された。2000年7月号からは「Delphiへおいでよ!」が開始され,2001年6月号まで続いた。その他にも,時折,特集が掲載されているので,全号の半分くらいはDelphiが扱われているのである。最近,連載記事がないことがさみしいが,CマガジンやdotNETマガジンにくらべ,日経ソフトウエア誌はDelphi好きだったのである。

 その中で,凛太郎さんが書いておられた「Delphiへおいでよ!」の1回目が特に興味深かった。18回連載された「Delphiかんたんソフト工房」に続いての新連載とはいえ,タイトルが「最初に極めるべきは,イベントとイベント・ハンドラだ」と来る。えっ,1回目から,こんな難しい内容をあつかうのと思いながら読み始めた。

 もちろん,最初の数ページはコメントの書き方や構文規則など,初めてDelphiに触れた人向けの解説も書いてある。

 半分くらい読み進むと,「イベントとイベント・ハンドラの関係は固定されたものではない」というサブタイトルに出くわす。「ほうっ」と興味を惹かれ,読み進める。

 Windowsのアプリケーションの処理はイベント・ドリブンで実行される。たとえば,あるボタンを押したら,ある処理が実行されるようになっている。「ボタンを押した」がイベント(出来事)で,その出来事に応じて処理を行うのがイベント・ハンドラ(イベントを扱うもの)である。ストレートな関係なら ,以下のようになる。

 フォームにボタンを3つと,メモを配置して,押されたボタンに応じた文字がメモに表示されるようになっている。

---------------------------------------------------------------
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
  Memo1.Text := 'Button1Click';
 end;
 
 procedure TForm1.Button2Click(Sender: TObject);
 begin
  Memo1.Text := 'Button2Click';
 end;
 
 procedure TForm1.Button3Click(Sender: TObject);
 begin
  Memo1.Text := 'Button3Click';
 end;

---------------------------------------------------------------
 各ボタン・クリック時に対応する処理を記述した。イベントとイベント・ハンドラはタイトな関係にある。

---------------------------------------------------------------
 
 procedure TForm1.ButtonClickHandler(Sender: TObject);
 begin
  memo1.Text := TButton(Sender).name + 'Click';
 end;

---------------------------------------------------------------
 次に,各ボタンのクリック時の処理を全部削除して1つだけプロシージャを記述した。そして,

のように各ボタンのクリック時イベントに,このプロシージャを指定する。
(注釈.その前に,クラス定義を次のように記述しておく必要があります。具体的には,ButtonやMemoの定義のあとに(1)のコードを追加します。)

---------------------------------------------------------------
 
 type
  TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Memo1: TMemo;
   procedure ButtonClickHandler(Sender: TObject);・・・(1)

---------------------------------------------------------------
 こうすると実行結果は,最初のプログラムと同じになる。
memo1.Text := TButton(Sender).name + 'Click';
のSenderが,イベントの発生元を示す。ボタン型のオブジェクトとして受け取り,nameプロパティを参照することで,「Button2Click」と表示できるのである。

 この凛太郎さんの記事を読んで,「Delphiはいいなあ」とはまってしまった。枝葉末節を解説するのではなく,連載1回目から「いいところ」を紹介する進め方に思わず「メモメモ」であった。