14

オブジェクトの単一のイベントに多くのイベント ハンドラーを簡単に割り当てることができるコードを探しています...プラグイン アーキテクチャに非常に必要だったので、その代わりを実装しましたが、そのためのソリューションは好きではありません、だから私はあなたのアイデア/解決策/ヒントを知りたいです...私の解決策は eventName: string; proc: TMyEventProc; 、TMyEventProcがsenderとeventDataの2つの引数を取る場所のようなアイテムのリストです: イベントの名前に応じて、eventData は異なるレコード/オブジェクトを指します。

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

4

4 に答える 4

11

Delphiのほぼすべてのバージョンで機能するこれに対するソリューションを実装しました-以前のバージョンではテストしていませんが、もともとDelphi 7で実装されていました(ただし、Delphi 7を自分で使用している場合は、それだけで十分です知っていますよね?)。:)

iirc これは、Allen Bauer の記事のインスピレーションの少なくとも一部でした。私の実装がいくつかのビデオで示されているのを見て、私のブログからコードをダウンロードできます:

気になる投稿には「マルチキャスト」のタグが付けられています。最終的なコードのダウンロード リンクは、この投稿にあります。

私のアプローチでは、TMultiCastEvent からクラスを派生させます。派生クラスが行う必要があるのは、特定のシグネチャを持つイベントを追加、削除、および呼び出すための単純なタイプ セーフ保護を実装することだけです。

TNotifyEvent の実装 - procedure(Sender: TObject) - は、「作業を開始するため」(最も「有用な」マルチキャスト イベントは単純な通知です) と、特定のマルチキャスト イベント クラスを派生させる方法の例の両方の実装で提供されます。イベント署名。

マルチキャスト イベント クラスを取得したら、通常の「イベント ハンドラー」をマルチキャスト バージョンと交換可能に使用できます。たとえば、マルチキャスト On_Click イベントを含む架空のボタン クラスが与えられます (イベントにアンダースコアを挿入する規則を採用しました)。通常の「ユニキャスト」イベントに対して、マルチキャストとして識別するための名前):

ハンドラーをユニキャスト クリック イベントに割り当てるコード:

  Button.OnClick := MyClickHandler;

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

  MultiCastButton.On_Click.Add(MyClickHandler);

私の実装には、イベントを無効にする機能や、実装オブジェクトが破棄されたときにハンドラーをハンドラーから自動的に削除する機能など、多くの改良点も含まれています (これには、必要に応じて無視できるが、特定の状況下で役立つ可能性のある少量のハウスキーピングが含まれます)。状況)。

これらはすべて、私のブログ投稿で説明および実演されています。

楽しみ。:)

于 2009-09-09T00:37:33.990 に答える
2

Allen Bauer は、役に立つかもしれないマルチキャスト イベントに関するブログ投稿をしています。ただし、Delphi 2009 以降でのみ機能します。

編集: まだ D7 を使用している場合でも、多くの異なるイベント シグネチャが必要なければ、これを機能させることができるかもしれません。Allen のコードを見て、それを非汎用ソリューションに適応できるかどうかを確認してください。

于 2009-09-08T23:04:59.740 に答える
1

プラグイン システムを実装している場合は、イベント ハンドラーをそのまま使用することはできません (マルチキャストであろうとなかろうと)。オブザーバー パターンをご覧になることをお勧めします。マルチキャスト イベントの近くでは少し冗長に聞こえるかもしれませんが、必要な場合は少なくともより柔軟になります。

于 2009-09-09T10:41:36.920 に答える
0

そのためには、オブザーバー デザイン パターンを使用できます。サンプルの Delphi 実装を次に示します: http://blogs.teamb.com/joannacarter/2004/06/30/690

于 2009-09-09T11:16:13.973 に答える