在TTreeView的父级更改后,TTreeView节点句柄被释放?

时间:2009-02-25 00:15:11

标签: delphi treeview delphi-2009

我有非常有趣的问题。

背景

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

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

只要树视图永远不会改变它的父级(自动隐藏和显示窗口),我的应用程序就能完美运行。

问题

我发现一旦父改变了,我附加到树节点的Data属性的对象现在包含对错误树节点或陈旧指针的引用。

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

使用可能数百个对象重新加载树将不会非常有效。

我看不出我应该如何解决这个问题。我已经能够加载树视图并让对象保持能够轻松找到彼此。这可能真的打破了我使用树视图的漂亮“模式”...

谢谢你的帮助!

3 个答案:

答案 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;