0

我有一个非常有趣的问题。

背景

我已经使用 TTreeView 多年,但现在才将它与对接库(来自 AutomatedQA)一起使用。我了解到,当更改 TTreeView 的父级时,会重新创建所有句柄。这是对接库在正常活动期间所做的事情。

我一直在使用 TTreeNode 上的 Data 属性来保存一个对象。我还保留了到对象中 TreeNode 的链接。简而言之,使用 TreeNode,我可以获取对象,也可以从对象中获取 TreeNode。

只要树视图的父级从未更改(自动隐藏和显示窗口),我的应用程序就可以完美运行。

问题

我发现一旦父级发生更改,我附加到树节点的 Data 属性的对象现在包含对错误树节点或过时指针的引用。

我尝试了另一种方式“MyTreeViewContainer.Parent:=SomewhereElse”并观察到同样的问题。

用可能数百个对象重新加载树不会很有效。

我不知道我应该如何解决这个问题。长期以来,我一直能够加载树视图并让对象仍然能够轻松找到彼此。这真的可以打破我使用树视图的好“模式”......

感谢您的帮助!

4

3 回答 3

1

从 TTreeView 派生一个新组件并覆盖虚拟 CreateWnd() 和 DestroyWnd() 方法,以便在需要时从临时存储中加载/保存自定义数据。几个 VCL 的本地组件(包括 TTreeView)在内部执行此操作。更改 Parent 属性并不是唯一可以导致重新创建 TreeView 的窗口句柄的操作。

于 2009-07-09T02:11:11.843 回答
0

我想我找到了答案。使用 TTreeView 的 OnAddition 事件重新连接节点和对象,如下所示:

过程 TForm1.TreeView1Addition(发送者:TObject;节点:TTreeNode);开始 TMyObject(Node.Data).TreeNode:=Node; 结尾;

于 2009-02-25T01:27:40.150 回答
0

我通过覆盖 CreateHandle 方法解决了类似的问题:

TMyForm = class(TForm)
protected
  procedure CreateHandle; override;
end;

procedure TMyForm.CreateHandle;
begin
  inherited;
  Regenerate; // rebuild tree structure here
end;
于 2021-07-29T09:45:29.017 回答