如果释放所有treeview节点的所有子节点DATA,并删除所有子节点?

yshuui 2010-03-11 12:07:56
如果释放所有treeview节点的所有子节点DATA,并删除所有子节点?
不用遍历可以吗?
...全文
261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQLDebug_Fan 2010-03-11
  • 打赏
  • 举报
回复
方法有两种:一种是在OnDeletion释放节点指针内容,代码:

procedure TForm1.tv1Deletion(Sender: TObject; Node: TTreeNode);
begin
Dispose(指针定义(Node.Data));
end;

这样你在用tv1.Items.Clear会全部释放所有内存;
另外一种是遍历所有节点,逐一释放节点的内存,代码:

var
i: Integer;
begin
for i := 0 to tv1.Items.Count - 1 do
begin
Dispose(指针定义(tv1.Items[i].Data));
end;
tv1.Items.Clear;
end;

另外如果节点是指针类型,也可以用FreeMem来释放内存。
yshuui 2010-03-11
  • 打赏
  • 举报
回复
大家注意,是所有子节点。
TreeView.Items.Clear;可以删除子节点,但是节点指针类型数据并没有删除。
这样再重新点击节点是会出内存错误。
yshuui 2010-03-11
  • 打赏
  • 举报
回复
节点DATA是指针类型
SQLDebug_Fan 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luxuewei5214 的回复:]
可以
TreeNode := TreeView.Items[0];
while TreeNode <> nil do
begin
Dispose(PProdTypeRec(TreeNode.Data)); //PProdTypeRec改为你自己的类型
TreeNode.Data := nil;
TreeNode.Delete;//这句没测过,临时加的
TreeNode := TreeNode.GetNext;
end;
[/Quote]
从代码上来说,你这也循环了。
IDWB 2010-03-11
  • 打赏
  • 举报
回复
TreeView.Items.Clear;
有没有完全释放data就没有深入研究过,反正是删除了所有节点
dd_zhouqian 2010-03-11
  • 打赏
  • 举报
回复
可以不用遍历Deletion(Sender: TObject; Node: TTreeNode);
bdmh 2010-03-11
  • 打赏
  • 举报
回复
如果data为指针类型,必须循环Dispose
luxuewei5214 2010-03-11
  • 打赏
  • 举报
回复
可以
TreeNode := TreeView.Items[0];
while TreeNode <> nil do
begin
Dispose(PProdTypeRec(TreeNode.Data)); //PProdTypeRec改为你自己的类型
TreeNode.Data := nil;
TreeNode.Delete;//这句没测过,临时加的
TreeNode := TreeNode.GetNext;
end;
SQLDebug_Fan 2010-03-11
  • 打赏
  • 举报
回复
必须要遍历的,否则怎么知道每个点Data

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧