2011-09-13 34 views
7

我一直在试图找到一个通用的方式来通知UI控件列表中的更改。例如,当一个对象被添加到列表中时,我希望它自动添加到列表框中。如果一个对象从列表中删除,我希望它从列表框中自动删除。使用LiveBindings监控列表

不幸的是,Delphi列表之间存在一些令人生厌的不一致之处:TList <> .Notify很好,但TStringList.OnChange甚至不告诉你改变是什么,TList甚至没有任何通知!

我希望LiveBindings会给我一个正确的方式来监视大多数列表中的变化,但到目前为止我没有看到它。我看到的所有示例都会填充控件,并在列表项和控件项(我的示例中的列表框项)之间建立绑定。但是从列表中添加/删除对象根本不会影响控件。

有没有人知道我错过了一个机制,或者更一般地说,一个很好的通用方法来做到这一点?

澄清: 以前似乎没有足够清楚。我需要一种通用的方式,原因是我写了一个网格控件,可以连接到各种来源,包括一些现有的代码。我编写了一个接口,网格接受这个接口作为源,然后接收许多适配器类来接受一些列表,并使它们可用作该接口。由于我需要接受现有的代码,因此重写TList.Notify不是一种选择。由于没有事件可以查看更改,所以它实际上意味着TList没有可供客户端使用的通知机制,例如我的适配器类。 TStrings也没有,但TStringList引发了一个简单的OnChange,这意味着适配器类实际上不能确定发生了什么变化。

我实际上有一个非常好的解决方案,它使用了TVirtualMethodInterceptor,但是它完全停止了在Delphi XE中的工作,并且它在XE2中没有修复。

+2

TList有通知,但您必须重写受保护的'Notify'方法。 –

+0

@The_Fox这是答案,至少对于TList来说。你应该把它写成答案。 –

回答

3

您错过了TList.Notify机制。

TList有一个受保护的Notify过程,您必须重写。这是TObjectList的工作方式。

+1

谢谢你的答案,The_Fox,但我的问题是我不控制包含列表的代码。因此我无法重写一个虚拟方法来执行我想要的操作,而默认的TList.Notify什么也不做。我需要列表外部的代码才能够监视更改,这就是为什么我希望LiveBindings可以提供可用的机制。我更新了描述以准确地反映我的用例,以及为什么重写虚拟不起作用。 –

0

位迟了答案,但通用TList有一个OnNotify包括添加或删除的项目。