那好, 重载SaveToFile, 把关联的信息也写到文件里

解决方案 »

  1.   

    我曾经这样来记录我的TREEVIEW,不知道和你的想法是否一致:
    {伪代码}
    {假设表中有一个TREEVIEW,这里定义一个结构做为节点关联的DATA}
    type PitemData=^TItemData;
         TItemData=record
         data1:string;
         data2:integer;
    end;
    ----------------------------------------
    建树的过程:
    循环:
      新建一个PITEMDATA的指针,
      为指针的域赋值,
      新建一个节点,
      节点的DATA=新指针,保存文件的过程:
    创建一个新文件:
    得到当前树节点的最顶层节点数,向文件中写节点数,开始循环节点数,遍历每个节点
    然后向文件中分别写入是否有子节点,有多少个子节点,每个节点下指针的数据.根据层次的增加可能会使用递归(类似于读目录树一样)将所有数据写入文件.------------------------------------
    导入文件的过程:
    打开相应文件,
    依照上面保存的方法得到树结构节点数,然后使用导入数的过程,为它们分配指针,填充适当的数据.记住:在程序退出时,要记得释放为每一个节点分配的指针.
      

  2.   

    我曾经这样来记录我的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;
      

  3.   

    重载SaveToFile不如重载SaveToStream,因为SaveToFile要调用SaveToStream.
    重载是必需的,除非专门加一个方法.无论如何,不知道你如何保存你的结点所
    要保存的其它信息.