表的结构如:Id(int)  PNodeId(int)  MenuName(char)
1        0              一级菜单 
2  1              菜单1
3  1              菜单2
4  1              菜单3
5  1              菜单4
6  1              菜单5
7  1              菜单6
8  1              菜单7
9  1              菜单8
10  1              菜单9
11  1              菜单10
12  1              菜单11
13  1              菜单12
14   2              菜单13
15  2              菜单14
16  2              菜单15
17  15             菜单16
18  15             菜单17我的思路是:根据id查找有多少PNodeId为1的数据,然后构建一级菜单,然后根据这些一级菜单所属的id号查找二级菜单(如第二条数据,id 为2,则查找 PNodeId为2的数据,再递归PNodeId为2的第一条记录,id为14,依次类推)建出来的树的应为:
一级菜单
 |_菜单1
 |  |_菜单13
 |  |_菜单14
 |  |   |_菜单16
 |  |   |_菜单17
 |  |_菜单15
 |_菜单2
 |_菜单3
 |_菜单4
 |_菜单5
 |_菜单6
 |_菜单7
 |_菜单8
 |_菜单9
 |_菜单10
 |_菜单11
 |_菜单12请大家帮帮我,急!!

解决方案 »

  1.   

    我曾写过这种函数,不过是在PHP和JAVASCRIPT这两种的,在DELPHI中不知道你要求最终效果是什么。下面的php代码权当参考://第一步:给二维数组m赋值
    $m[0][0]=1;$m[0][1]=0;$m[0][1]='一级菜单 ';
    ...
    $m[17][0]=18;$m[17][1]=15;$m[17][1]='菜单12 ';//下面是递归函数
    function ShowMenu($id){
     global $str,$spc,$m;
     $spc.=' ';
     for($i=0;$i<sizeof($m);$i++){
      if($m[$i][0]==$id){
        $str.=$spc.$m[$i][2].'<br>';
        ShowMenu($m[$i][1]);//递归调用
      }
    }ShowMenu(1);
    echo $str;
    //代码结束
    当然这段代码只是实现多级菜单的一个主体,实际应用时还要考虑菜单前面的小图片、菜单的打开与隐藏,当你完善这个代码后就可以做得象资源管理器一样实用方便。因为要实现全部功能,代码较长,不便粘贴,请见谅!
      

  2.   

    当然,如果要在DELPHI中实现还要具体看你使用哪种控件,然后改写代码。
    其实先前所贴的代码还可以进行优化,只不过对我来说,递归代码本来可读性就不好,索性就这样简简单单的贴出来
      

  3.   

    其实很简单,每个菜单项上面都有一个叫Tag的备用属性,将它存入ID不就好了。
      

  4.   

    其实你自己都没有把问题说清楚,你是要做资源管理器类型的还是要做下拉菜单,这两种用到的控件不同,代码自然不同了。
    如果你能看懂PHP的话,以上的代码应该很好懂,也很好移植至DELPHI。当算法问题解决了,代码只是水到渠成的哟!
      

  5.   

    procedure Addtree(parentID:integer;mytree:TtreeView:conn:TAdoconnection);
    var
     I:integer;
     qry:TAdoquery;
    begin
      Qry:=Tadoquery.create(nil);
      Qry.connetion:=conn;
      qry.sql.clear;
      qry.sql.add('select * from tablename where PNodeId='+parentID);
      qry.active:=true;
      
      qry.first;
      for i:=0 to qry.recordcount-1 do
      begin
        mytree.addchild()/具体参数忘了,请自己写
      Addtree(qry.fieldbyname('Id').asinteger,mytree,conn);
      end;
      
    qry.free;
    end
      

  6.   

    自己写了一个TMYTREEVIEW组建,可以不编程创建TREE,如果有兴趣,找我[email protected]
      

  7.   

    我的意思是通过
    select * from tablename where PNodeId='parentID' order by PNodeID, ID 
    一次再数据取回来,然后来用递归查找这个数据集建菜单