DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

Delphi Win32 で、イベントデリゲートっとっと?


|,,∧    
|゚Д゚彡  
|⊂ミ    Prismイイナ
| ミ
|`J


ということで、ブログ復帰直後で病み上がりっぽい感じで調子が出ないと皆さんが油断しているはずなので、病み上がりっぽくない、ぶっとびコードを紹介しましょう。


.NET 版の Delphi である、Delphi Prism ってなかなか文法的によいと思いません?そんなちょっとイイ文法で.NETに憧れる人もいるに違いありません。

.NETは、Delphiを参考に作られただけあって、いくつかの基本的な面でよく考えられているんですよ。

その一つが、.NETのイベントハンドラ、デリゲートという仕組み。

こいつは、メソッドリストとして、動作して、一つのイベントハンドラに複数のイベントを割り当てる事ができるようになっています。

これは、アスペクト指向とか呼ばれるのコーディング時に役に立つらしいんですよね。(よく知らんけど)

概念としてはこういう感じ

Button1.OnClick = Button1Click;
の後に、
Button1.OnClick += LogWrite;
こんなデバッグコードを入れることができたりします。

Button1.OnClickが呼ばれたら、通常のイベントハンドラとともに、その後に、ログ書き込みメソッドが呼ぶことができたりします。

Button1Clickの内部にログ書き込みメソッドを入れるより、よっぽどコーディングが楽になります。

いいですよね。こういう.NETの機能。


では、Delphiで実装しちゃいましょう。(w


わたし、ブログの過去記事で「メソッドリスト」なんて書いてますよね。覚えています?メソッドリスト。

Delphi メソッドリストで検索してみてください。うちのブログが上位に出てくるはずです。

ブログ記事を書いた当時、ニサンネルあたりでは、「たかがHotKey登録でメソッドリストなど作って喜んでいる奴」なんて、ちょっとした批判も書かれていたようですが、もうニサンネルは見ていないので気になりません。


そのメソッドリストをフルパワーで利用しました。


こういうコードで動かしてみました、いかがでしょう?

────────────────────
procedure TForm1.FormCreate(Sender: TObject);
begin
 Button1ClickManager := TNotifyEventManager.Create;
 Button1ClickManager.EventList.Add(Button1Click1);
 Button1ClickManager.EventList.Add(Button1Click2);
 Button1ClickManager.EventList.Add(Button1Click3);

 Button1.OnClick := Button1ClickManager.EventTrigger;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Button1ClickManager.Free;
end;

procedure TForm1.Button1Click1(Sender: TObject);
begin
 Memo1.Lines.Add('Button1Click1');
end;

procedure TForm1.Button1Click2(Sender: TObject);
begin
 Memo1.Lines.Add('Button1Click2');

 if Button1ClickManager.EventList.Count = 2 then
  with Button1ClickManager.EventList do
   Delete( IndexOf(Button1Click2) );
end;

procedure TForm1.Button1Click3(Sender: TObject);
begin
 Memo1.Lines.Add('Button1Click3');

 with Button1ClickManager.EventList do
  Delete( IndexOf(Button1Click3) );
end;
────────────────────


Button1をクリックすると、実行結果は、
1回目
  Button1Click1
  Button1Click2
  Button1Click3

2回目
  Button1Click1
  Button1Click2

3回目以降
  Button1Click1

と、出力されます。


なんらかのメソッドを呼び出すときは
EventManagerのEventTriggerを呼び出すことで
複数の登録しているメソッドを呼び出すことが自在になるわけ。

この仕組みを作っておけば、設計時にButton1.OnClickを割り当てておいても、横取りしてイベントマネージャーの管理下におくこともできたりするかしらね。


あらまびっくり、これで、Delphiもアスペクト指向言語の仲間入りかしら?

いいすぎ?


実際のTNotifyEventManager実装は…


|,,∧   ・・・オシエテアゲナイヨ
|Д゚彡
|⊂ミ
| ミ    
|''U




|     ジャン!
|  サッ
|)彡
|
|
|


また次回にね。
スポンサーサイト

| 未分類 | 22:43 | comments:1 | trackbacks(-) | TOP↑

COMMENT

つぎは、Delphi Prism require / ensure も Win32で実装しちゃうぞと。

| ミ・д・彡 | 2010/06/29 22:54 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。