首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

生成树目录时,释放指针出有关问题

2012-02-17 
生成树目录时,释放指针出问题procedure tform1.treecreate(parentID:integerParentNode:TTreeNode)//递

生成树目录时,释放指针出问题
procedure tform1.treecreate(parentID:integer;ParentNode:TTreeNode);//递归过程
var
  root_node,cur_node:TTreeNode;
  tmpTBData:array of PTableData;
  i,j:integer;
begin
  adoquery1.close;
  adoquery1.SQL.Clear;
  adoquery1.SQL.Add('select bmmc,pr_id from rlzy_bmfl where pr_parent='''+inttostr(parentID)+'''');
  adoquery1.Open;
  adoquery1.First;
  j:=adoquery1.RecordCount;//获得父接点为parentID的接点个数
  setlength(tmpTBData,j); //定义数组大小
  for i:=0 to j-1 do
  begin
  New(tmpTBData[i]); // 分配内存
  //孩子接点ID
  tmpTBData[i]^.ChildID:= adoquery1.fieldbyname('pr_id').value;
  tmpTBData[i]^.Name:= adoquery1.fieldbyname('bmmc').value;
  //tmpTBData[i]^.ParentID:= adoquery1.fieldbyname('pr_parent').value;
  adoquery1.Next;
  end;
  for i:=0 to j-1 do
  begin
  with treeview1.Items do
  begin
  if ParentID=0 then
  begin
  root_node:=addfirst(nil,tmpTBData[i]^.Name);
  root_node.data:=tmpTBData[i]; //指针赋值
  end
  else begin
  root_node:=addchild(ParentNode,tmpTBData[i]^.Name);
  root_node.data:=tmpTBData[i]; //指针赋值
  end;
  end;
  treecreate(tmpTBData[i]^.ChildID,root_node); //递归,上个孩子接点作父接点
  dispose(tmpTBData[i]); //释放内存;这里一释放,下面的事件就出问题,
  end;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  if node.data<>nil then
  self.label1.caption:= PTableData(node.data)^.Name; //指针类型转换,获取接点Name
end;

帮我看看,谢谢!!!在线

[解决办法]
其实没有必要创建这样一个数组的,直接创建PTableData 将其赋值给root_node.data 就可以了。

而且也这样也不能释放dispose(tmpTBData[i]);
因为root_node.data:=tmpTBData[i]; 是指针赋值,其实你释放tmpTBData[i] 也就是释放了root_node.data,
因为这两个指针指的是同一个内存块。.


要实现这样的功能,直接创建PTableData 将其赋值给root_node.data 就可以了,在tree的delete 和 clear 里面删除节点的时候释放内存。

热点排行