【问题标题】:TTreeView node handles freed after TTreeView's parent changed?TTreeView 的父级更改后释放的 TTreeView 节点句柄?
【发布时间】:2009-02-25 00:15:11
【问题描述】:

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

背景

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

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

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

问题

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

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: delphi treeview delphi-2009


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      过程 TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode); 开始 TMyObject(Node.Data).TreeNode:=Node; 结束;

      【讨论】:

        【解决方案3】:

        我通过重写 CreateHandle 方法解决了类似的问题:

        TMyForm = class(TForm)
        protected
          procedure CreateHandle; override;
        end;
        
        procedure TMyForm.CreateHandle;
        begin
          inherited;
          Regenerate; // rebuild tree structure here
        end;
        

        【讨论】:

          猜你喜欢
          • 2022-08-14
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 1970-01-01
          • 2018-06-17
          • 1970-01-01
          • 2014-06-24
          • 1970-01-01
          相关资源
          最近更新 更多