给你一个递归: procedure TRForm.FillTreeD; var Node:TTreeNode; begin //这个函数很倒霉:明明是最先调用,到头来却最后结束----谁让你调用递归呢? with Query do begin Close; CommandText:='SELECT * FROM TableName ORDER BY Parent_Id'; Open; end; Node:=TreeD.Items.Add(nil,'这是第一层'); while not Query.Eof do begin if (Query.FieldByName('Parent_Id').IsNull) or (Query.FieldByName('Parent_Id').AsString='') then begin Node:=TreeD.Items.Add(Node,Query.FieldByName('Name').AsString); Node.SelectedIndex:=StrToInt(Query.FieldByName('id').AsString); //调用递归 GetTop(Node,Query.FieldByName('id').AsString); end; Query.next; end; end;procedure TRForm.GetTop(N:Ttreenode;TopId:string); var TempData:TQuery; M:TtreeNode;//定义这个变量真无奈,在递归里,它本身的变量N都无法"变" begin //令我厌恶的是:递归里的变里不能是全局变量,但幸好我的内存还够大... TempData:=TQuery.Create(Self); with TempData do begin DataBaseName:=***; Close; CommandText:='SELECT * FROM TableName WHERE Parent_Id='''+TopId+''''; Open; end; while not TempData.Eof do begin M:=TreeD.Items.AddChild(N,TempData.FieldByName('name').AsString); M.SelectedIndex:=StrToInt(TempData.FieldByName('id').AsString); GetTop(M,TempData.FieldByName('id').AsString); TempData.Next; end; Tempdata.Free; end;
procedure TRForm.FillTreeD;
var Node:TTreeNode;
begin
//这个函数很倒霉:明明是最先调用,到头来却最后结束----谁让你调用递归呢?
with Query do
begin
Close;
CommandText:='SELECT * FROM TableName ORDER BY Parent_Id';
Open;
end;
Node:=TreeD.Items.Add(nil,'这是第一层');
while not Query.Eof do
begin
if (Query.FieldByName('Parent_Id').IsNull) or (Query.FieldByName('Parent_Id').AsString='') then
begin
Node:=TreeD.Items.Add(Node,Query.FieldByName('Name').AsString);
Node.SelectedIndex:=StrToInt(Query.FieldByName('id').AsString);
//调用递归
GetTop(Node,Query.FieldByName('id').AsString);
end;
Query.next;
end;
end;procedure TRForm.GetTop(N:Ttreenode;TopId:string);
var TempData:TQuery;
M:TtreeNode;//定义这个变量真无奈,在递归里,它本身的变量N都无法"变"
begin
//令我厌恶的是:递归里的变里不能是全局变量,但幸好我的内存还够大...
TempData:=TQuery.Create(Self);
with TempData do
begin
DataBaseName:=***;
Close;
CommandText:='SELECT * FROM TableName WHERE Parent_Id='''+TopId+'''';
Open;
end;
while not TempData.Eof do
begin
M:=TreeD.Items.AddChild(N,TempData.FieldByName('name').AsString);
M.SelectedIndex:=StrToInt(TempData.FieldByName('id').AsString);
GetTop(M,TempData.FieldByName('id').AsString);
TempData.Next;
end;
Tempdata.Free;
end;
不然像楼上的,如果有x00,或x000条记录,等死人那速度.
对树的展开,如果子节点较少的情况下,使用中值排序基数法比较合适,速度比较快
实现也方便;
如果子节点比较多的情况下,使用父子数据结构,展开时采用逐层展开比较合适
也就是说,Create时展开一级子树,以后对每级子树进行展开时,添加其节点