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;帮我看看,谢谢!!!在线

解决方案 »

  1.   

    其实没有必要创建这样一个数组的,直接创建PTableData 将其赋值给root_node.data 就可以了。而且也这样也不能释放dispose(tmpTBData[i]);         
    因为root_node.data:=tmpTBData[i];  是指针赋值,其实你释放tmpTBData[i] 也就是释放了root_node.data,
    因为这两个指针指的是同一个内存块。.
    要实现这样的功能,直接创建PTableData 将其赋值给root_node.data 就可以了,在tree的delete 和 clear 里面删除节点的时候释放内存。