我一直在试图找到一种通用的方法来通知UI控件列表中的更改。例如,当对象被添加到列表中时,我希望它自动添加到列表框中。如果从列表中删除了一个对象,我希望它自动从列表框中删除。
不幸的是,德尔菲的列表之间存在一些令人恼火的不一致: TList<>.Notify很好,但是TStringList.OnChange甚至没有告诉您更改是什么,TList甚至没有任何通知!
我希望LiveBindings能给我一种正确的方法来监控大多数列表中的变化,但到目前为止我还没有看到它。我看到的所有示例都填充了控件,并在列表项和控件项(我的示例中的列表框项)之间设置了绑定。但是,从列表中添加/删除对象并不会影响控件。
有没有人知道我错过了一种机制,或者更广泛地说,这是一种很好的通用方法?
Clarification:,似乎我以前还不够清楚。我之所以需要一种通用的方法,是因为我编写了一个网格控件,它可以连接到各种源,包括一些现有代码。我编写了一个接口,网格接受它作为源,然后编写了许多适配器类来接受一些列表,并将它们作为该接口使用。因为我也需要接受现有的代码,所以重写TList.Notify不是一种选择。而且,由于没有看到更改的事件,这实际上意味着TList没有一个客户端可以使用的通知机制,例如我的适配器类。TStrings也没有,但是TStringList会引发一个简单的OnChange,这意味着适配器类实际上无法确定已经更改了什么。
实际上,我有一个非常好的解决方案,它使用了TVirtualMethodInterceptor,但是它完全停止了在Delphi中的工作,而且它没有在XE2中修复。
发布于 2011-09-13 11:10:48
你错过了TList.Notify机制。
TList有一个受保护的Notify过程,您必须重写它。这就是TObjectList的工作方式。
发布于 2011-10-19 18:47:50
稍晚回答,但通用TList有一个包含添加或删除项的OnNotify。
https://stackoverflow.com/questions/7398862
复制相似问题