ハンドラがメソッドリファレンスであるイベントハンドラのリストを作成しようとしています。 特定のハンドラを削除するには、リスト内で特定する必要があります。 しかし、2つのメソッド参照のコードアドレスを比較するにはどうすればよいですか?2つのメソッド参照が同じメソッドを参照しているかどうかを確認する方法?
type
TEventHandler = reference to procedure;
procedure TestProc;
begin
end;
procedure TForm26.FormCreate(Sender: TObject);
var
Handlers: TList<TEventHandler>;
begin
Handlers := TList<TEventHandler>.create;
try
Handlers.Add(TestProc);
Handlers.Remove(TestProc); { doesn't work }
Assert(Handlers.Count=0); { fails }
Assert(Handlers.IndexOf(TestProc)>=0); { fails }
finally
FreeAndNil(Handlers);
end;
end;
TList <のデフォルト比較者は、メソッド参照を適切に比較しません。 どうすれば比較できますか? TMethodに似た構造がありますが、メソッド参照にはありますか?
TEqualityComparer .Default.Equals(A、B) –
そして、あなた自身の宣言の代わりにTProcを使うことができます... System.SysUtilsを追加するだけです。 –
@ZENs私はTProcについて知っているので、私はできるだけ明確な例を作りようとしました。 TEqualityComparer .Default.Equals(A、B)は機能しません。私はそれをテストしました(そうでなければTList <>。Removeも動作します、デフォルトのcomparerに基づいています)。 –