以下是俺由陈宽达的<<Delphi深度历险>>的随书代码中 递归用文件实现TTreeView的save和load的算法
改编过来的.并在Delphi 7测试通过.请各位过目.
type
TNodeInfo=record
text:string;
Deep:integer;//节点深度,从1开始
end;
procedure mLoadTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
//使用方法:在form的oncreate中加入:mLoadTreeviewProces(ttreeView1.items,'c:\NodesData.dat')
var
Node,NewNode:TTreeNode;
deep:Integer;
NewNodeInfo:TNodeInfo;
s:string;
F: TextFile;
begin
Node:=nil;
deep:=1;
Assignfile(F, fileName);
reset(F);
treeNodes.Clear; while not eof(F) do
begin
//getNodeInfo(NewNodeInfo);
Read(F,S);
NewNodeInfo.text:=Copy(S,1,Pos(' ',S)-1);
NewNodeInfo.Deep:=StrToInt(copy(S,Pos(' ',S)+1,Length(S)-Pos(' ',S)));
if NewNodeInfo.deep>deep then
begin
newNode:=treeNodes.addchild(Node,NewNodeInfo.text); deep:=deep+1;
Node:=newNode;
Readln(F,s);//moveNext;
end else if NewNodeInfo.deep=deep then
begin
newNode:=treenodes.add(Node,NewNodeInfo.text);
Node:=NewNode;
Readln(F,s);
end else
begin
repeat
Node:=Node.Parent;
deep:=deep-1;
until deep=NewNodeInfo.Deep;
newNode:=treenodes.add(Node,NewNodeInfo.text);
Node:=NewNode;
Readln(F,s);
end;
end; CloseFile(F);
end;procedure mSaveTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
//使用方法:在form的onclose中加入:mSaveTreeviewProcess(ttreeView1.items,'c:\NodesData.dat')
var
tNode,Node:TTreeNode;
deep:integer;
F: TextFile;
newNodeInfo:TNodeInfo;
s:string;
begin
if treeNodes.Count=0 then exit;
Node:=treeNodes.GetFirstNode;
deep:=1;
Assignfile(F, fileName);
rewrite(F); //创建一个新文件 while Node<> nil do
begin
newNodeInfo.text:=Node.Text;
newNodeInfo.Deep:=deep;
// WriteNodeInfo(newNodeInfo);
s:=Trim(newNodeInfo.text)+' '+IntToStr(newNodeInfo.Deep);
Writeln(F,s);//写操作 if Node.HasChildren then
begin
Node:=Node.getFirstChild;
deep:=deep+1;
end else
begin
tNode:=Node;
Node:=tNode.getNextSibling;
while (Node=nil) and (deep>1) do
begin
tNode:=tNode.parent;
Node:=tNode.getNextSibling;
deep:=deep-1;
end;
end;
end;
CloseFile(F);
end;
改编过来的.并在Delphi 7测试通过.请各位过目.
type
TNodeInfo=record
text:string;
Deep:integer;//节点深度,从1开始
end;
procedure mLoadTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
//使用方法:在form的oncreate中加入:mLoadTreeviewProces(ttreeView1.items,'c:\NodesData.dat')
var
Node,NewNode:TTreeNode;
deep:Integer;
NewNodeInfo:TNodeInfo;
s:string;
F: TextFile;
begin
Node:=nil;
deep:=1;
Assignfile(F, fileName);
reset(F);
treeNodes.Clear; while not eof(F) do
begin
//getNodeInfo(NewNodeInfo);
Read(F,S);
NewNodeInfo.text:=Copy(S,1,Pos(' ',S)-1);
NewNodeInfo.Deep:=StrToInt(copy(S,Pos(' ',S)+1,Length(S)-Pos(' ',S)));
if NewNodeInfo.deep>deep then
begin
newNode:=treeNodes.addchild(Node,NewNodeInfo.text); deep:=deep+1;
Node:=newNode;
Readln(F,s);//moveNext;
end else if NewNodeInfo.deep=deep then
begin
newNode:=treenodes.add(Node,NewNodeInfo.text);
Node:=NewNode;
Readln(F,s);
end else
begin
repeat
Node:=Node.Parent;
deep:=deep-1;
until deep=NewNodeInfo.Deep;
newNode:=treenodes.add(Node,NewNodeInfo.text);
Node:=NewNode;
Readln(F,s);
end;
end; CloseFile(F);
end;procedure mSaveTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
//使用方法:在form的onclose中加入:mSaveTreeviewProcess(ttreeView1.items,'c:\NodesData.dat')
var
tNode,Node:TTreeNode;
deep:integer;
F: TextFile;
newNodeInfo:TNodeInfo;
s:string;
begin
if treeNodes.Count=0 then exit;
Node:=treeNodes.GetFirstNode;
deep:=1;
Assignfile(F, fileName);
rewrite(F); //创建一个新文件 while Node<> nil do
begin
newNodeInfo.text:=Node.Text;
newNodeInfo.Deep:=deep;
// WriteNodeInfo(newNodeInfo);
s:=Trim(newNodeInfo.text)+' '+IntToStr(newNodeInfo.Deep);
Writeln(F,s);//写操作 if Node.HasChildren then
begin
Node:=Node.getFirstChild;
deep:=deep+1;
end else
begin
tNode:=Node;
Node:=tNode.getNextSibling;
while (Node=nil) and (deep>1) do
begin
tNode:=tNode.parent;
Node:=tNode.getNextSibling;
deep:=deep-1;
end;
end;
end;
CloseFile(F);
end;
TreeView1.SaveToFile();
TreeView1.LoadFromFile();