我一直在试图找到一个通用的方式来通知UI控件列表中的更改。例如,当一个对象被添加到列表中时,我希望它自动添加到列表框中。如果一个对象从列表中删除,我希望它从列表框中自动删除。使用LiveBindings监控列表
不幸的是,Delphi列表之间存在一些令人生厌的不一致之处:TList <> .Notify很好,但TStringList.OnChange甚至不告诉你改变是什么,TList甚至没有任何通知!
我希望LiveBindings会给我一个正确的方式来监视大多数列表中的变化,但到目前为止我没有看到它。我看到的所有示例都会填充控件,并在列表项和控件项(我的示例中的列表框项)之间建立绑定。但是从列表中添加/删除对象根本不会影响控件。
有没有人知道我错过了一个机制,或者更一般地说,一个很好的通用方法来做到这一点?
澄清: 以前似乎没有足够清楚。我需要一种通用的方式,原因是我写了一个网格控件,可以连接到各种来源,包括一些现有的代码。我编写了一个接口,网格接受这个接口作为源,然后接收许多适配器类来接受一些列表,并使它们可用作该接口。由于我需要接受现有的代码,因此重写TList.Notify不是一种选择。由于没有事件可以查看更改,所以它实际上意味着TList没有可供客户端使用的通知机制,例如我的适配器类。 TStrings也没有,但TStringList引发了一个简单的OnChange,这意味着适配器类实际上不能确定发生了什么变化。
我实际上有一个非常好的解决方案,它使用了TVirtualMethodInterceptor,但是它完全停止了在Delphi XE中的工作,并且它在XE2中没有修复。
TList有通知,但您必须重写受保护的'Notify'方法。 –
@The_Fox这是答案,至少对于TList来说。你应该把它写成答案。 –