2009-09-08 10 views
13

多くのイベントハンドラをオブジェクトの単一のイベントに簡単に割り当てるためのコードを探しています...私はプラグインアーキテクチャに非常に必要でした。しかし、私はそれのための私のソリューションが好きではないので、私はあなたのアイデア/ソリューション/ヒントが何であるかを知りたいのですが...私の解決策は、 eventName: string; proc: TMyEventProc; のような項目を持つリストですTMyEventProcは2つの引数、 eventData:ポインタ。 イベントの名前に応じて、eventDataは異なるレコード/オブジェクトを指します。Delphi VCL for Win32 - 複数のイベントハンドラ

残念ながら、これは引数として渡されるために多くのレコードが宣言されている必要があります。 このメソッドは非常に遅く、「実際の」イベントがヒットしたときに、必要な「コールバック」を呼び出す実装を必要とします。

答えて

10

私は以前のバージョンではテストしていませんでしたが、Delphi 7のどのバージョンでも動作していましたが、これはDelphi 7で初めて実装されました。それはあなたが知る必要があるすべてです、そうですか?)。 :)

iircこれは、少なくとも部分的にアレン・バウアーのポストのインスピレーションでした。私の実装がいくつかのビデオで実演されているのを見て、コードをダウンロードしてください。from my blog

興味のある投稿は「マルチキャスト」とタグ付けされています。最終コードのダウンロードリンクはavailable in this postです。

私のアプローチでは、TMultiCastEventからクラスを派生させます。すべての派生クラスは、特定のシグネチャを持つイベントを追加、削除、呼び出しするための単純な型安全保護を実装するだけです。

TNotifyEvent - procedure(Sender:TObject)の実装には、 "あなたを手に入れる"(ほとんどの "便利な"マルチキャストイベントは簡単な通知である)実装と、マルチキャストを引き出す方法の例として提供されています特定のイベント・シグニチャーのイベント・クラス。

マルチキャストイベントクラスを取得したら、通常の「イベントハンドラ」をマルチキャストバージョンと同じ意味で使用できます。 (イベント名にアンダースコアを挿入してマルチキャスト、通常の「ユニキャスト」イベントを指定するという規約を採用しています)

ユニキャストクリックイベントにハンドラ:

Button.OnClick := MyClickHandler; 

直接イベントを通知し、マルチキャストに同じハンドラを追加することができます。

MultiCastButton.On_Click.Add(MyClickHandler); 
私の実装はまた、このような機能など、改良の数が含まれ

へイベントを無効にし、自動的にハンドラを再設定する実装オブジェクトが破棄されたときにハンドラから移動されます(これは必要に応じて無視することができる少々のハウスキーピングを含みますが、特定の状況下では有効です)。

私のブログの記事では、そのすべてが説明され、実証されています。

お楽しみください。 :)

+2

+1;ところで、これはあなたのマルチキャストイベントの投稿の一覧です:http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

あなたの努力に感謝します。しかし、あなたはサンプルを公開してみませんか?それの使い方? – FLICKER

2

アレン・バウアーは、参考になるかもしれないa blog post about multicast eventsです。ただし、Delphi 2009以降でのみ動作します。

編集:まだD7をお使いの場合は、あまりにも多くの異なるイベントシグネチャを必要としない場合でも、この作業を行うことができます。 Allenのコードを見て、それを非ジェネリックなソリューションに適応できるかどうか確認してください。

+0

残念ながら、私はD7パーソナルを使用しています...私は貧しい学生です;)D2009を買う余裕がない... – migajek

+0

私はあなたを聞いています。私は本当にD2009の個人版を見たいと思っていますが、明らかにDelphi Professionalを販売することはあまりにも多く、Microsoftとは異なり、Embarcaderoには非暴力部門があり、補助金を出すことはありません。 –

+3

質問は長期的には "エンバカデロが「貧しい学生や趣味の人には安いバージョンを持たない」ことができるのですか –

1

プラグインシステムを実装している場合は、マルチキャストであるかどうかにかかわらず、イベントハンドラを手に入れることはできません。私はobserver patternを見ることをお勧めします。マルチキャストイベントの近くで少し冗長すぎるかもしれませんが、必要な時には少なくとも柔軟性があります。

+0

実際に私はそれが名前を知らなかったけれど、それを知っています;とにかく私が必要とするのは、VCLと統合しているときの何らかの自動化です。私は多くのコントロールタイプを持っています。 – migajek

関連する問題