掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
通知先が2カ所以上あるような複数イベントの処理 (ID:13650)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
にしのさんとお話しするのはおもしろいですね。純粋にこのテーマ自体もおもしろいですし。 C# のデリゲートでは、マルチキャストできるんですけど、Delphi のイベントはできないん ですよね。それでいろいろ考えたことがありました。 最初にわたしも単にオブジェクトのリストを保持するプロパティーでいいんじゃないか、と 考えたんです。でも、元質問の中の > またClassAはFormA、FormBともに参照できません。 ことから、リスト中のオブジェクトのクラスを予め想定するような実装はまずいように思い ました。共通の上位クラスを使うにしても、メソットを呼び出すときには具体的な下位クラス にキャストしなければなりませんし。したがって、オブジェクトのリストを保持するようでは 予め呼び出すメソッドが全て固定、そして予めオブジェクトがどんなクラスのインスタンスで あるか分かっている必要があります。TCollection を使う場合でもそうです。それに対して メソッドそのもののリストでは、暗黙のオブジェクト参照が渡されるため、明示的にその メソッドが属するオブジェクトを参照する必要がありません。ハンドラの型だけが一致していれ ばOKです。ところが SizeOf(TNotifyEvent) としてみれば分かりますように、8バイトなので 単純なポインタのリスト TList ではダメです。上では、PNotifyEvent を定義して、New() と Dispose() で追加削除していますので、ちょっと変わった実装になっています。 > メソッドポインタのリストを保持した場合の注意点として、オブジェクトの開放時にメソッド > ポインタが無効となる点があると思います。 そうですね。Add() したら、解放時に Delete() する必要があるのは、Delphi の常道だと 思いますけど。二重に登録したり、登録してないのに Delete() しても無害になるように 実装してあります。例として出した TClassA は、本当は純粋なリストオブジェクトとすべき で、新たにつくられるクラスに has されるようにするのが理想ですけど、そこまではしてい ません。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.