我们有一个 TTreeView ,它有很多节点——通常有 20,000 个节点甚至更多。此 TTreeView 用于停靠接口(interface)(DevExpress Docking Library)。当应用程序中的任何窗体停靠或取消停靠时,可停靠窗体的句柄会更改。这反过来导致调用所有窗体和控件的 DestroyWndCreateWnd 过程。

对于 TTreeViewDestroyWnd 将节点保存到流中,然后 CreateWnd 重新加载它们。在我们具有非常大树 View 的应用程序中,这会导致节点流出和流入时的长时间延迟。

我的问题:如何防止这种延迟?我听说很多人对 Virtual TreeView 评价很高,我认为它不是 TTreeView 的后代,它是否避免了这个问题?我们已经尝试了 Developer Express TcxTreeView ,但它是从 TTreeview 继承而来的,因此它遇到了同样的问题。

最佳答案

20,000 个节点太多,无法放入标准 TTreeView 中。使用 TVirtualTreeView 绝对是显示大量节点的方法。主要优点是您的节点数据不存储在 TreeView 本身中。它仅用于显示和用户交互。您将数据存储在内存中的其他位置,因此它不受窗口重新创建的影响,然后 TVirtualTreeView 在任何给定时间只要求您提供它立即需要的数据片段。重新创建 TVirtualTreeView 窗口只是用当前数据重新绘制窗口显示的问题。

与标准的 TTreeView 不同,它将数据存储在 TreeView 本身中。这就是为什么每次重新创建窗口时 TTreeView.DestroyWnd()TTreeView.CreateWnd() 都必须保存和恢复所有节点数据的副本。节点越多,管理该数据的开销就越大。

关于Delphi TreeView DestroyWnd/CreateWnd 慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10220026/

10-08 22:41