用treeview建一个树:
表结构是这样:
id (编号)name(名称) parentid(父类编号)
ID NAME     PARENTID
A A第一层      0
A1 A第二层      A
A10 A第三层      A1
A2 A2第三层     A1
..        ..         ..
B B第一层      0
B1 B第二层      B
B10 B第三层       B1
生成效果:
                A2第三层..
A第一层-A第二层-  
                A第三层..
b第一层-Ab第二层- b第三层A2第三层..代码:
procedure TfrmTree.FormCreate(Sender: TObject);
begin
  AddNode('0',nil,TreeView1);
end;
procedure TfrmTree.AddNode(AID:string;ParentNode:TTreeNode;TmpTreeView:TTreeView);
var MyNode:TTreeNode;
begin
  AdoQuery1.Close;
  AdoQuery1.SQL.Clear;
  AdoQuery1.SQL.Add('select * from Test where ParentID=:Parname order by id ');
  AdoQuery1.Parameters.Items[0].Value:=AID;
  AdoQuery1.Open;
  while not AdoQuery1.Eof do
  begin
    MyNode:=TmpTreeView.Items.AddChild(ParentNode,AdoQuery1.FieldByName('Name').AsString);
    AddNode(AdoQuery1.FieldByName('id').AsString,MyNode,TmpTreeView);
    AdoQuery1.Next;
  end;
end;
麻烦大家帮看看,还有AdoQuery1在关闭前总是报错“eof或bof有一个是真,所需操作需要一个当前纪录”,而bde的query就没错,是不是ado没有大补丁的原因!我用的是delphi5.0!!!!

解决方案 »

  1.   

    楼主的程序测试了没?
    我试了下,好像有点问题啊,只能列出
    第一层-A第二层- A第三层..
    这种结果如果最后一层没有子节点,就退出了整个,而没返回到上一级函数!
    也就是说A2第三层..a2第二层都显不出来!
      

  2.   

    在数据库中建立表如下:
    id name parentid level算法描述如下:
    1. 取得第0层的所有节点(level=0的节点)信息。
    2. 作为根节点放入treeview中显示,节点信息中CurrentID赋予当前节点id。
    3. 取得当前数据库中节点的最大层次Maxlevel
    4. for i:=1 to Maxlevel do
    begin
      对于每个第I层的节点 do
      begin
    查找其父节点id
    在treeview中挂到其父节点下显示
    节点信息中CurrentID赋予当前节点id
      end;
    end
    具体实现参考如下程序:
    type
    PMyInt = ^TMyInt;
    TMyInt = record
      CurrentID: string;
    end;procedure TCommInfo.FormCreate(Sender: TObject);
    var
    i,j,Nodes:Integer;
    tmpNode,ParentNode: TTreenode;RootNodeTxt,Maxlevel,NodeTxt,sqlStr,ParentID,CurrentID:String;
    DataPtr:array[0..10000] of PMyInt;beginwith DataModule2 do
    begin   Nodes:=0;
       TreeView.Enabled:=True;
       TreeView.Items.Clear;
       ComTypeQuery.SQL.Clear;
       ComTypeQuery.SQL.Add('select * from 类别 where parentID=0');
       ComTypeQuery.Open;
       while not ComTypeQuery.eof do
       begin
         new(DataPtr[Nodes]);
         DataPtr[Nodes]^.CurrentID:=ComTypeQuery.FieldByName('id').AsString;
         RootNodeTxt:=ComTypeQuery.FieldByName('name').AsString;
         tmpNode:=TreeView.Items.AddObject(nil,RootNodeTxt,DataPtr[Nodes]);
         tmpNode.ImageIndex:=0;
         tmpNode.SelectedIndex:=1;
         Nodes:=Nodes+1;
         ComTypeQuery.Next;
       end;   with ComTypeQuery do
       begin
          sql.Clear;
          sql.Add('select max(level) as maxlevel from 类别');
          open;
          Maxlevel:=FieldByName('Maxlevel').AsString;
          close;
       end;
     //---------------------建树---------------------
    // Nodes:=3;
      for i:=1 to StrtoInt(Maxlevel) do
       begin
          //i:=2;
          with ComTypeQuery do
          begin
             sql.Clear;
             sqlStr:='select * from  类别 where level='+IntToStr(i);
             sql.Add(sqlStr);
             open;
             first;
             while not eof do
             begin
                ParentID:=FieldByName('ParentID').AsString;
                CurrentID:=FieldByName('id').AsString;
                //---------- 查找父结点-----------------------------
                j:=0;
                repeat
                     if PMyInt(Treeview.items[j].data)^.CurrentID = ParentID then
                       begin
                       ParentNode:=TreeView.items[j];
                       break;
                       end;            j:=j+1;
                until j=TreeView.Items.count;            //---------------------------------------            NodeTxt:=FieldByName('name').AsString;
                new(DataPtr[Nodes]);
                DataPtr[Nodes]^.CurrentID:=CurrentID;            tmpNode:=Treeview.Items.AddChildObject(ParentNode,NodeTxt,DataPtr[Nodes]);
                tmpNode.ImageIndex:=0;
                tmpNode.SelectedIndex:=1;
                Nodes:=Nodes+1;
                next;         end; //while
             //ParentNode:=nil;
          end; //with query
       end;//for    end;
    end;