7

リストの変更をUIコントロールに通知する一般的な方法を見つけようとしています。たとえば、オブジェクトがリストに追加されたときに、リストボックスに自動的に追加したいとします。オブジェクトがリストから削除された場合、リストボックスから自動的に削除されます。

残念ながら、Delphiのリスト間には厄介な矛盾がいくつかあります。TList<>。Notifyは問題ありませんが、TStringList.OnChangeは変更内容を通知せず、TListにも通知がありません。

LiveBindingsがほとんどのリストの変更を監視する適切な方法を提供してくれることを期待していましたが、今のところそれはわかりません。私が見たすべての例は、コントロールを満たし、リストアイテムとコントロールアイテム(私の例ではリストボックスアイテム)の間にバインディングを設定します。ただし、リストからオブジェクトを追加/削除しても、コントロールにはまったく影響しません。

私が見逃したメカニズム、またはより一般的には、これを行うための優れた一般的な方法を誰かが知っていますか?

明確化: 以前は十分に明確ではなかったようです。一般的な方法が必要な理由は、既存のコードを含むさまざまなソースに接続できるグリッドコントロールを作成したためです。グリッドがソースとして受け入れるインターフェースを作成し、次にいくつかのリストを受け入れてそれらをそのインターフェースとして使用できるようにするためのいくつかのアダプタークラスを作成しました。既存のコードも受け入れる必要があるため、TList.Notifyをオーバーライドすることはできません。また、変更を確認するイベントがないため、事実上、TListには、アダプタークラスなどのクライアントが使用できる通知メカニズムがないことを意味します。TStringsにも1つはありませんが、TStringListは単純なOnChangeを発生させます。これは、アダプタークラスが実際に何が変更されたかを判別できないことを意味します。

私は実際にTVirtualMethodInterceptorを使用した非常に優れたソリューションを持っていましたが、Delphi XEでは完全に機能しなくなり、XE2では修正されませんでした。

4

2 に答える 2

3

TList.Notifyあなたはメカニズムを逃しました。

TListNotifyオーバーライドする必要のある保護されたプロシージャがあります。これがTObjectListの仕組みです。

于 2011-09-13T11:10:48.400 に答える
0

少し遅れた答えですが、一般的なTListには、追加または削除されたアイテムを含むOnNotifyがあります。

于 2011-10-19T18:47:50.727 に答える