把树型结构存储到文件

时间:2022-07-07 17:57:24
有一树型结构我要把它节点的位置关系及其节点的属性信息存储到一个文件中,要求我要可以根据文件建树

10 个解决方案

#1


1lou

#2


如果用VirtualTree(一个第三方TreeView)就很容易了。

#3


我看看

#4


TREEVIEW 不是有SAVETOFILE 方法吗?
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息

#5


我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性

#6


关于树的生成和保存是大家平时用的最多的功能了。是不应该将它总结一下,用一种通用的模式来解决呢?

   以前每一次都是重新写,这几天想将它总结一下。
   
   一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。

  如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
  看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
   
   大家有什么好的实现模式吗?
    

#7


>>>>我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性

------------------------------------------------

节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。

type
  PMyRec = ^TMyRec;
  TMyRec = record
    ID : Integer;
    Caption: String;
  end;
....

procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Data: PMyRec;
  s : String;
  l : Integer;
begin
  with Sender do
  begin
    Data := GetNodeData(Node);
    s:=Data.Caption;
    l:=Length(s);
    Stream.WriteBuffer(Data.Id,Sizeof(Integer));
    Stream.WriteBuffer(l,Sizeof(Integer));
    Stream.WriteBuffer(s[1],l);
  end;
end;

procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Data: PMyRec;
  s : String;
  l : Integer;
begin
  with Sender do
  begin
    Data := GetNodeData(Node);
    Stream.ReadBuffer(l,Sizeof(Integer));
    Data.Id:=l;
    Stream.ReadBuffer(l,Sizeof(Integer));
    SetLength(s,l);
    Stream.ReadBuffer(s[1],l);
    Data.Caption:=s;
  end;

end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
  VST.SaveToFile('a.VT');
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  VST.LoadFromFile('a.VT');
end;

#8


回去看看..谢先

#9


如果你熟悉了树,你就知道怎么处理这种问题了

#10


好像是可以直接save 的

#1


1lou

#2


如果用VirtualTree(一个第三方TreeView)就很容易了。

#3


我看看

#4


TREEVIEW 不是有SAVETOFILE 方法吗?
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息

#5


我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性

#6


关于树的生成和保存是大家平时用的最多的功能了。是不应该将它总结一下,用一种通用的模式来解决呢?

   以前每一次都是重新写,这几天想将它总结一下。
   
   一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。

  如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
  看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
   
   大家有什么好的实现模式吗?
    

#7


>>>>我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性

------------------------------------------------

节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。

type
  PMyRec = ^TMyRec;
  TMyRec = record
    ID : Integer;
    Caption: String;
  end;
....

procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Data: PMyRec;
  s : String;
  l : Integer;
begin
  with Sender do
  begin
    Data := GetNodeData(Node);
    s:=Data.Caption;
    l:=Length(s);
    Stream.WriteBuffer(Data.Id,Sizeof(Integer));
    Stream.WriteBuffer(l,Sizeof(Integer));
    Stream.WriteBuffer(s[1],l);
  end;
end;

procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Data: PMyRec;
  s : String;
  l : Integer;
begin
  with Sender do
  begin
    Data := GetNodeData(Node);
    Stream.ReadBuffer(l,Sizeof(Integer));
    Data.Id:=l;
    Stream.ReadBuffer(l,Sizeof(Integer));
    SetLength(s,l);
    Stream.ReadBuffer(s[1],l);
    Data.Caption:=s;
  end;

end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
  VST.SaveToFile('a.VT');
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  VST.LoadFromFile('a.VT');
end;

#8


回去看看..谢先

#9


如果你熟悉了树,你就知道怎么处理这种问题了

#10


好像是可以直接save 的