我有非常有趣的问题。
背景
我已经使用了TTreeView多年,但现在只使用它与对接库(来自AutomatedQA)。我已经了解到,当更改TTreeView的父级时,将重新创建所有句柄。这是对接库在正常活动期间所做的事情。
我一直在使用TTreeNode上的Data属性来保存一个对象。我还保持了与对象中TreeNode的链接。简而言之,使用TreeNode,我可以获取对象,我也可以从对象中获取TreeNode。
只要树视图永远不会改变它的父级(自动隐藏和显示窗口),我的应用程序就能完美运行。
问题
我发现一旦父改变了,我附加到树节点的Data属性的对象现在包含对错误树节点或陈旧指针的引用。
我尝试了另一种方式“MyTreeViewContainer.Parent:= SomewhereElse”并观察到同样的问题。
使用可能数百个对象重新加载树将不会非常有效。
我看不出我应该如何解决这个问题。我已经能够加载树视图并让对象保持能够轻松找到彼此。这可能真的打破了我使用树视图的漂亮“模式”...
谢谢你的帮助!
答案 0 :(得分:1)
从TTreeView派生新组件并覆盖虚拟CreateWnd()和DestroyWnd()方法,以便在需要时从/向临时存储加载/保存自定义数据。 VCL的几个本机组件(包括TTreeView)在内部执行此操作。更改Parent属性不是唯一可以导致重新创建TreeView窗口句柄的操作。
答案 1 :(得分:0)
我想我找到了答案。使用TTreeView的OnAddition事件重新连接节点&对象如下:
procedure TForm1.TreeView1Addition(Sender:TObject; Node:TTreeNode); 开始 TMyObject(Node.Data).TreeNode:=节点; 端;
答案 2 :(得分:0)
我通过覆盖 CreateHandle 方法解决了类似的问题:
TMyForm = class(TForm)
protected
procedure CreateHandle; override;
end;
procedure TMyForm.CreateHandle;
begin
inherited;
Regenerate; // rebuild tree structure here
end;