我想实现如下的树型菜单:
部门1
   员工甲
   员工乙
   
部门2
  员工甲
  员工乙
  
部门名由部门信息表中得出,员工名由员工信息表得出,请教该如何实现。
我的代码如下:
procedure tform6.formcreate(sender: tobject);
var
treenode:ttreenode;
str:string;
begin
query1.sql.add('select name from depart');
query1.open ;
while not query1.recordset.eof do
 begin
 treenode:=treeview1.items.add(nil,query1.fieldbyname('name').asstring);
 query2.close;
 query2.sql.clear ;
 str:=query1.fieldbyname('name').asstring;
 query2.sql.add('select name from manstr where depar='''+str+'''');
 query2.open ;
 while not query2.recordset.eof do
 begin
  treeview1.items.add(treenode,query2.fieldbyname('name').asstring);
  query2.next ;
  end;
   query1.next ;
 end;
end;
上述代码只能显示一个部门信息,循环好象没派上用场,还有显示结果也不对。显示结果是这样:
部门1
员工
员工
请教该如何改一下。

解决方案 »

  1.   

    //treeview1.items.add(treenode,query2.fieldbyname('name').asstring);
    将上面一句改为
    treeview1.items.addChild(treenode,query2.fieldbyname('name').asstring);
      

  2.   

    你可以用一句SQL一起查出来
    'select depart.name,manstr.name from depart,manstr where depart.name=manstr.depar group by depart.name'
    这样,同时查出部门和员工,建树时现建部门节点,再用部门节点作为父节点建立员工子节点,连续两个记录之间不同的话,再建一个新的部门节点,以此类推。
      

  3.   

    写程序一点格式都没有,别人看都看得累:
    procedure TfrmDemoTree.BuildTree(mP_TreeNode: TTreeNode; mPid: integer);
    //用递归一次性生成所有树节点
    var
      idTemp:integer;
      strSQL:string;
      qryTemp:TQuery;
      TrNodeTemp:TTreeNode;
    begin
      TrNodeTemp := mP_TreeNode;
      qryTemp := TQuery.Create(self);
      try
        strSQL := ' select id,name '
                + ' from Tcity '
                + ' where Parentid='+inttostr(mpid);
        ExecQry(strSQL,qryTemp,true);   //执行SQL
        while not qryTemp.Eof do
        begin
          idTemp := qryTemp.fieldbyname('id').AsInteger;
          tvDemoTree.Selected := tvDemoTree.Items.AddChild(TrNodeTemp,qryTemp.fieldbyname('name').AsString);
          BuildTree(tvDemoTree.Selected,idTemp);
          qryTemp.Next;
        end;
      finally
        qryTemp.Free;         //释放资源
      end;
    end;