自己写的一个有关树形结构的函数,与大家共享.
procedure MakeTreeEx(Query: TadoQuery; TreeView: TTreeView;
DisplayName:string;Id:string;pid:string);
type
recNode=record
Id:string;
Name:string;
PId:string;
end;
PRecNode=^recnode;
{递归算法要有终止的条件}
procedure AppendChild(var treeview:TTreeView;node:TTreeNode;
var strlst:TStringList);
var
strTmp:string;
i:Integer;
nodeTmp:TTreeNode; {子结点}
ps:pstring;
begin
//ShowMessage(strlst.Text+'要查找的PID是:'+pstring(node.Data)^);
while strlst.IndexOf(trim(pstring(node.Data)^))<>-1 do
begin
i:=strlst.IndexOf(pstring(node.Data)^);
ps:=NewStr(precnode(strlst.Objects[i])^.Id);
nodetmp:=TreeView.Items.AddChildObject(node,precnode(strLst.Objects[i])^.Name,
ps);
Dispose(precnode(strlst.objects[i]));
strlst.Delete(i);
{原先此处误写成node,让我调试了半天,郁闷}
AppendChild(treeview,nodetmp,strlst);
end;
end;
var
List: TStringList;
Node: TTreeNode;
Index: Integer;
ps:pstring;//指针
prec:PRecNode;
i:Integer;
begin
TreeView.Items.BeginUpdate;
try
TreeView.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
{此句非常重要,默认为dupIgnore,如有重复记录则忽略}
list.Duplicates:=dupAccept;
{先遍历一边query,获取所有记录}
Query.First;
while not Query.Eof do
begin
{保存数据}
New(prec); {每删除一条记录时,要保证将其保存的数据也一同删除}
prec^.Id:=Query.fieldbyname(Id).AsString;
prec^.PId:=Query.fieldbyname(pid).asstring;
prec^.Name:=Query.fieldbyname(DisplayName).asstring;
List.AddObject(Query.FieldByName(pid).AsString,TObject(prec));
Query.Next;
end;
showint(list.count);
while List.IndexOf('0')<>-1 do
begin
i:=List.IndexOf('0');
ps:=NewStr(Trim(precnode(List.Objects[i])^.Id));
node:=TreeView.Items.AddChildObject(nil,precnode(List.Objects[i])^.Name,
ps);
Dispose(precnode(List.Objects[i]));
List.Delete(i);
AppendChild(TreeView,node,list);
//AppendChild(list,node);
end;
finally
for i:=0 to List.Count-1 do
begin
Dispose(precnode(List.objects[i]));
end;
List.Free;
end;
finally
TreeView.Items.EndUpdate;
end;
end;