2011-09-13 7 views
7

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

残念ながら、Delphiのリスト間には矛盾した矛盾がいくつかあります。TList <> .Notifyは問題ありませんが、TStringList.OnChangeは変更が何であるかを伝えず、TListにも通知が全くありません。

私は、LiveBindingsがほとんどのリストの変更を監視する適切な方法を提供することを望んでいましたが、これまで見たことはありません。私が見てきたすべての例は、コントロールを塗りつぶし、リストアイテムとコントロールアイテム(私の例ではリストボックスアイテム)間のバインドを設定します。しかし、リストからオブジェクトを追加/削除しても、コントロールには何の影響もありません。

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

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

私は実際にTVirtualMethodInterceptorを使用した非常に素晴らしいソリューションを持っていましたが、それはDelphi XEで動作しなくなり、XE2で修正されませんでした。

+2

TListには通知がありますが、保護された 'Notify'メソッドをオーバーライドする必要があります。 –

+0

@ TheFoxこれは少なくともTListの答えです。あなたはそれを答えとして書くべきです。 –

答えて

3

TList.Notifyメカニズムが見つかりませんでした。

TListには保護されたNotify手順があります。これがTObjectListの仕組みです。

+1

答えThe_Foxをありがとう、しかし私の問題は私がリストを含むコードを制御しないということです。その結果、私は仮想メソッドをオーバーライドすることはできません私が望むことを行うと、デフォルトのTList.Notifyは何もしません。変更を監視できるようにするには、リストの外部にコードが必要です。そのため、LiveBindingが有用なメカニズムを提供することを望んでいたのです。私はユースケースを正確に反映するために説明を更新し、なぜ仮想のオーバーライドは機能しません。 –

0

Bit late回答ですが、一般的なTListには、追加または削除された項目を含むOnNotifyがあります。

関連する問題