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;
帮我看看,谢谢!!!在线
2 个解决方案
#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 里面删除节点的时候释放内存。
而且也这样也不能释放dispose(tmpTBData[i]);
因为root_node.data:=tmpTBData[i]; 是指针赋值,其实你释放tmpTBData[i] 也就是释放了root_node.data,
因为这两个指针指的是同一个内存块。.
要实现这样的功能,直接创建PTableData 将其赋值给root_node.data 就可以了,在tree的delete 和 clear 里面删除节点的时候释放内存。
#2
谢谢,明白拉不少;
#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 里面删除节点的时候释放内存。
而且也这样也不能释放dispose(tmpTBData[i]);
因为root_node.data:=tmpTBData[i]; 是指针赋值,其实你释放tmpTBData[i] 也就是释放了root_node.data,
因为这两个指针指的是同一个内存块。.
要实现这样的功能,直接创建PTableData 将其赋值给root_node.data 就可以了,在tree的delete 和 clear 里面删除节点的时候释放内存。
#2
谢谢,明白拉不少;