(问题没这么简单)如何将TreeView上的节点连同其关联的对象存在一个文件里并可以重新装载访问。

forever 2000-01-11 11:35:00
SaveToFile无法保存Node所关联的信息。
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
barton 2000-01-13
  • 打赏
  • 举报
回复
重载SaveToFile不如重载SaveToStream,因为SaveToFile要调用SaveToStream.
重载是必需的,除非专门加一个方法.无论如何,不知道你如何保存你的结点所
要保存的其它信息.
tiger 2000-01-11
  • 打赏
  • 举报
回复
那好, 重载SaveToFile, 把关联的信息也写到文件里
lighttop 2000-01-11
  • 打赏
  • 举报
回复
我想在“旗文”的电子书库程序的源码里可以找到你需要的答案。
Venne 2000-01-11
  • 打赏
  • 举报
回复
我曾经这样来记录我的TREEVIEW,不知道和你的想法是否一致:
{伪代码}
{假设表中有一个TREEVIEW,这里定义一个结构做为节点关联的DATA}
type PitemData=^TItemData;
TItemData=record
data1:string;
data2:integer;
end;
----------------------------------------
建树的过程:
循环:
新建一个PITEMDATA的指针,
为指针的域赋值,
新建一个节点,
节点的DATA=新指针,

保存文件的过程:
创建一个新文件:
得到当前树节点的最顶层节点数,向文件中写节点数,开始循环节点数,遍历每个节点
然后向文件中分别写入是否有子节点,有多少个子节点,每个节点下指针的数据.根据层次的增加可能会使用递归(类似于读目录树一样)将所有数据写入文件.

------------------------------------
导入文件的过程:
打开相应文件,
依照上面保存的方法得到树结构节点数,然后使用导入数的过程,为它们分配指针,填充适当的数据.

记住:在程序退出时,要记得释放为每一个节点分配的指针.
Venne 2000-01-11
  • 打赏
  • 举报
回复
我曾经这样来记录我的TREEVIEW,不知道和你的想法是否一致:
{伪代码}
{假设表中有一个TREEVIEW,这里定义一个结构做为节点关联的DATA}
type PitemData=^TItemData;
TItemData=record
caption:string;
data:integer;
end;
----------------------------------------
建树的过程:
循环:
新建一个PITEMDATA的指针,
为指针的域赋值,
新建一个节点,
节点的DATA=新指针,

保存文件的过程:
创建一个新文件:
得到当前树节点的最顶层节点数,向文件中写节点数,开始循环节点数,遍历每个节点
然后向文件中分别写入是否有子节点,有多少个子节点,每个节点下指针的数据.根据层次的增加可能会使用递归(类似于读目录树一样)将所有数据写入文件.

------------------------------------
导入文件的过程:
打开相应文件,
依照上面保存的方法得到树结构节点数,然后使用导入数的过程,为它们分配指针,填充适当的数据.

记住:在程序退出时,要记得释放为每一个节点分配的指针.其实这个做法和TREEVIEW的SAVETOFILE差不多,但是是以二进制保存,而且相当于使用一个自己定义结构的数据表.

这个虽然不是依照上面意思所做的工作,但是有些类似.
他简单在层次固定,数据格式固定,但是如果要修改,照上面的结构也很容易,如果你愿意告诉我你想记录你的什么样的树图,我可以写源码给你.

//这一段是把文件读出,形成树
procedure TForm1.Button3Click(Sender: TObject);
Var
F:Integer;
i,j:integer;
CurrentNode:TTreeNode;
ChildNode:TTreeNode;
ChildCount:integer;
Nowx,Nowy:integer;
begin
TreeView1.Items.Clear ;
F:=FileOpen('main.RGN',fmOpenRead);
if F<0 then exit;
FileRead(F,RegionCount,sizeof(integer));
for i:=1 to RegionCount do begin
FileRead(F,childcount,sizeof(integer));

//这一段是记录树的数据.
procedure TForm1.Button2Click(Sender: TObject);
Var
F:Integer;
i,j:integer;
CurrentNode:TTreeNode;
ChildNode:TTreeNode;
ChildCount:integer;
begin
F:=FileCreate('main.RGN');
if F<0 then exit;
Filewrite(F,RegionCount,sizeof(integer));
CurrentNode:=TreeView1.Items.GetFirstNode;
for i:=1 to RegionCount do begin
Childcount:=currentNode.Count ;
Filewrite(F,ChildCount,sizeof(integer));
FileWrite(F,PPoint(CurrentNode.data)^.x,sizeof(integer));
FileWrite(F,PPoint(CurrentNode.data)^.y,sizeof(integer));
ChildNode:=CurrentNode.getFirstChild ;
for j:=0 to CurrentNode.Count-1 do begin
fileWrite(F,PPoint(ChildNode.data)^.x,sizeof(integer));
FileWrite(F,PPoint(ChildNode.data)^.y,sizeof(integer));
ChildNode:=childNode.getNextSibling;
end;
CurrentNode:=CurrentNode.getNextSibling ;
end;
FileClose(F);

end;
Fileread(F,Nowx,sizeof(integer));
FileRead(F,Nowy,sizeof(integer));
CurrentNode:=TreeView1.Items.Add(nil,format('x:%d,y:%d',[Nowx,nowy]));
for j:=0 to ChildCount-1 do begin
Fileread(F,Nowx,sizeof(integer));
FileRead(F,Nowy,sizeof(integer));
childNode:=TreeView1.items.Addchild(CurrentNode,format('x:%d,y:%d',[Nowx,nowy]));
end;
end;
FileClose(F);

end;

5,386

社区成员

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

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