Delphiのほぼすべてのバージョンで機能するこれに対するソリューションを実装しました-以前のバージョンではテストしていませんが、もともとDelphi 7で実装されていました(ただし、Delphi 7を自分で使用している場合は、それだけで十分です知っていますよね?)。:)
iirc これは、Allen Bauer の記事のインスピレーションの少なくとも一部でした。私の実装がいくつかのビデオで示されているのを見て、私のブログからコードをダウンロードできます:
気になる投稿には「マルチキャスト」のタグが付けられています。最終的なコードのダウンロード リンクは、この投稿にあります。
私のアプローチでは、TMultiCastEvent からクラスを派生させます。派生クラスが行う必要があるのは、特定のシグネチャを持つイベントを追加、削除、および呼び出すための単純なタイプ セーフ保護を実装することだけです。
TNotifyEvent の実装 - procedure(Sender: TObject) - は、「作業を開始するため」(最も「有用な」マルチキャスト イベントは単純な通知です) と、特定のマルチキャスト イベント クラスを派生させる方法の例の両方の実装で提供されます。イベント署名。
マルチキャスト イベント クラスを取得したら、通常の「イベント ハンドラー」をマルチキャスト バージョンと交換可能に使用できます。たとえば、マルチキャスト On_Click イベントを含む架空のボタン クラスが与えられます (イベントにアンダースコアを挿入する規則を採用しました)。通常の「ユニキャスト」イベントに対して、マルチキャストとして識別するための名前):
ハンドラーをユニキャスト クリック イベントに割り当てるコード:
Button.OnClick := MyClickHandler;
同じハンドラーをマルチキャスト通知イベントに直接追加できます。
MultiCastButton.On_Click.Add(MyClickHandler);
私の実装には、イベントを無効にする機能や、実装オブジェクトが破棄されたときにハンドラーをハンドラーから自動的に削除する機能など、多くの改良点も含まれています (これには、必要に応じて無視できるが、特定の状況下で役立つ可能性のある少量のハウスキーピングが含まれます)。状況)。
これらはすべて、私のブログ投稿で説明および実演されています。
楽しみ。:)