Ttreeview控件小疑点,低手学

Ttreeview控件小问题,高手进,低手学
ID Name ParentID
1 a 0
2 b 1
3 c 1
4 d 1
5 e 2
6 f 2
7 g 3
8 h 3
9 i 3
... ... ...
如上是树表table1的内容,即ID是每条记录的关键字,Name是树节点显示的内容,ParentID是该节点的父节点的ID
让它升成一个树。
要求:不要用递归!!!
求解!!!

------解决方案--------------------
未测试,应该没错

Delphi(Pascal) code
type
  PRecX=^TRecX;
  TRecX=record
   Id,Pid:integer;
   Name:string;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fNode:TTreeNode;
  P:PRecX;

  function FindParentID(PId:Integer):TTreeNode;
  var
    i:Integer;
  begin
    if Pid<>0 then
    with TreeView1.Items do
    for i:=0 to Count-1 do
    if Assigned(Item[i].Data) and (PRecX(Item[i].Data)^.Id=PId) then
    begin
      Result:=Item[i];
      Exit;
    end;

    Result:=nil;
  end;

begin
  with adoquery1 do
  begin
    close;
    sql.text:='select id,ParentID,[Name] from t order by ParentID,ID';
    open;
    while not eof do
    begin
      New(P);
      P^.Id:=FieldByName('id').AsInteger;
      P^.Pid:=FieldByName('ParentID').AsInteger;
      P^.Name:=FieldByName('Name').AsString;
      fNode:=FindParentID(P^.Pid);
      if fNode=nil then
         TreeView1.Items.AddObject(nil,P^.Name,P)
      else
         TreeView1.Items.AddChildObject(fNode,P^.Name,P);
      next;
    end;
  end;
end;

------解决方案--------------------
如果是从数据库读取出来的话,用DEV系列控件CXTREELIST的话不用写一句代码,只需要设置
KeyFields: 子节点ID
 
DisplayFields:节点显示内容
 
ParentFields:父节点ID

就可以了,treeview要实现这个功能的话,网上很多这个例子,