2张表:
客户表(Tbl_Client):
client_id(自增)  client_name   type_id
1                小江          3
2                小李          4客户类型表(Tbl_Client_Type):
type_id(自增)  type_name    parent_id(父类型)
1              国内         -1
2              国外         -1
3              北京          1
4              上海          1现在在DELPHI里放一个树形控件(treeview1)  要求把客户类型表里的数据加到treeview1中  象下面:
-- 客户资料
   --国内
     --北京
     --上海
   --国外
要求:写一个递归调用函数 把客户类型表里的数据加到treeview1中(提示:考虑数据结构中的2叉树和森林树的算法) 
不用递归还能勉强做出来  C没学好  望好心人写下参考答案  THX

解决方案 »

  1.   

    在FormShow中写:
      with ClassADO do begin
        Close;
        SQL.Clear;
        SQL.Add('select * from Class_Table where ParentID=0 order by cl_rank');
        Open;
        if not Eof then begin
          while (not Eof) do begin
            new(MyNode);
            MyNode^.nodeParent:=FieldByName('ParentID').asInteger;
            MyNode^.nodename:=FieldByName('Cl_Title').asstring;
            LoadData(MyNode);
            Next;
          end;
        end else begin
          new(MyNode);
          MyNode^.nodeParent:=0;
          MyNode^.nodename:='请输入第一个频道名';
          Node:=ClassTree.Items.AddChildObject(nil,'请输入第一个频道名',MyNode);  
          Node.ImageIndex:=1;
          Node.SelectedIndex:=1;
        end;
      end;procedure TEditSubClassFrm.ReadNode(ownNode: TTreeNode; NodeId: integer);
    //OwnNode:Pater node  NodeId:self nodeid;
    var
      curNode: TtreeNode;
      adoquery: TAdoQuery;
      mynode: pmyid;
    begin
      adoquery := Tadoquery.create(parent);
      adoquery.Connection := DMFrm.ADOConnection1;
      adoquery.sql.text := 'select * from Class_Table where Parentid=' + intToStr(NodeID)+' order by cl_rank';
      with adoquery do
      begin
        open;
        first;
        while not eof do
        begin
          new(mynode);
          MyNode^.nodeParent:=FieldByName('ParentID').asInteger;
          MyNode^.nodename:=FieldByName('Cl_Title').asstring;
          curNode := ClassTree.Items.AddChildObject(ownNode, mynode.nodename, mynode);
          curNode.SelectedIndex:=2-mynode.nodeshow;
          curNode.ImageIndex:=2-mynode.nodeshow;
          ReadNode(curNode,mynode.nodeid);
          next;
        end;
        close;
        free;
      end;
    //  dispose(mynode);  
    end;
    procedure TEditSubClassFrm.LoadData(MyID:pMyid);
    var
      CurNode:TTreeNode;
    begin
      CurNode:=ClassTree.Items.AddChildObject(nil,Myid.nodename,MyID);  //載入要目錄
      ReadNode(CurNode,MyId.NodeID);
    end;
      

  2.   

    楼上的XD虽然可以  不过跟我想的差一点  最好一次把Tbl_Client_Type表的数据读出来  然后再处理:
    procedure TfrmClientType.Show(...)
    begin
      adosel.close;
      adosel.sql.clear;
      adosel.sql.add('select * from Tbl_Client_Type');
      adosel.open;
      ....
      ....然后这里做处理
    end;
      

  3.   

    这是我特意给你写的,感谢一下吧,今天心情不错procedure TForm1.Button1Click(Sender: TObject);
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := 'select type_id,type_name,parent_id from Tbl_Client_Type order by parent_id';
      ADOQuery1.Open;
      InitTreeView;
    end;procedure TForm1.InitTreeView;
      procedure AddChildrenNode(pnode: TTreeNode);
      var
        i: Integer;
        _node: TTreeNode;
      begin
        //Set the Filter Condition
        ADOQuery1.Filtered := false;
        ADOQuery1.Filter := 'parent_id=' + IntToStr(pnode.OverlayIndex);
        ADOQuery1.Filtered := true;    ADOQuery1.First;    //Restore the rs-index
        
        //Add the Record to the ParentNode
        for i := 0 to ADOQuery1.RecordCount - 1 do  
        begin
          _node := TreeView1.Items.AddChild(pnode, ADOQuery1.FieldByName('type_name').AsString);
          _node.OverlayIndex := ADOQuery1.FieldByName('type_id').AsInteger;
          ADOQuery1.Next;
        end;
        //recursion
        for i := 0 to pnode.Count - 1 do
          AddChildrenNode(pnode.Item[i]);
      end;
    var
      _topNode: TTreeNode;
    begin
      TreeView1.Items.BeginUpdate;
      //---add the top parent node
      _topNode := TreeView1.Items.AddChild(nil,'TopNodeAddByXinhs');
      _topNode.OverlayIndex := -1;  //The casual ward for ParentID
      //end add
      AddChildrenNode(_topNode);
      TreeView1.Items.EndUpdate;
      _topNode.Selected := True;
    end;
      

  4.   

    补充,因为你的顶级节点有多个,我这里只有一个,默认为_topNode.OverlayIndex := -1;所以,你需要稍微修改一下