TMainMenu 里面怎么判断TmenuItem下面是否已经加有TmenuItem;
   象TtreeView 那样可用 isHasChild 来判断?
就是在MItem 没有加任何TmenuItem的时候, 下面的语句
   MItem.Items[0] = nil
提示超出索引了!  其实我就是想实现动态生成菜单!
菜单的“Caption"是从数据库取出来的!
ID    Name   PID  Ishaschild
1      菜单1  0      1
2      菜单2  0      1
3      菜单3  1      0
4      菜单4  1      0
5      菜单5  1      0
6      菜单6  2      0
7      菜单7  2      0
其中 PID 如果是”0“ 表示最定层的菜单
Ishaschild 如果是”1"表示 该菜单下有子菜单
如上表最终在界面的结果是:菜单1    菜单2  
菜单3    菜单6     
菜单4    菜单7     
菜单5 
我想实现的是不管菜有多少层我多能动态添加! 

解决方案 »

  1.   

    通过循环嵌套,实现上面的功能,定义一个函数:
    procedure GenerateMenu(sPID: string; PM: TMenuItem)
    var DestDataSet: TADODataSet;
      sCurID, sCurCap: string;
      M: TMenuItem
    begin
      DestDataSet := TADODataSet.Create(Self);
      ...
      /*先通过SQL取出PID=sPID的记录,然后循环DestDataSet*/  
      while not DataSet.Eof do
      begin
        sCurID := DestDataSet.FieldByName('ID').AsString;
        sCurCap := DestDataSet.FieldByName('Name').AsString;
        M := TMenuItem.Create(Self);
        M.Cap := sCurCap;
        PM.Add(M);
        GenerateMenu(sPID, M);
        DestDataSet.Next;
      end;
      DestDataSet.Free;
    end;定义好上面的函数之后,执行GenerateMenu函数就可以了,上面有点出路,可以自己完善
      

  2.   

    这是俺以前做的:)
    id  name  parentid
    1   n1      0
    2   n1_1    1
    3   n1_2    1
    4   n2      0
    5   n2_1    4
    6   n2_2    4设想生成的菜单为下面的样子(点选n1菜单为n1_1和n1_2,点选n2菜单为n2_1和n2_2) n1      n2
     |       |
    n1_1    n2_1
    n1_2    n2_2=============================================
    procedure TForm1.CMClick(Sender: TObject);
    begin
      ShowMessage((Sender as TMenuItem).Caption);
    end;procedure TForm1.InitMainMenu;
    var
      AItem,AItem1:TMenuItem;
    begin
      Query1.Close;
      Query1.SQL.Text := 'select name from xxxxxx where parentid=0 order by name';
      query1.Open;
      while not query1.Eof do begin
        AItem := TMenuItem.Create(self);
        AItem.Caption := Query1.fieldbyname('name').AsString;
        MainMenu.Items.Add(AItem);
        query2.Close;
        Query2.Close;
        Query2.SQL.Text := 'select name from xxxxxx where name like "'+AItem.Caption+'%" and parentid<>0';
        query2.Open;
        while not query2.Eof do begin
          AItem1 := TMenuItem.Create(self);
          AItem1.Caption := Query2.fieldbyname('name').AsString;
          AItem.Add(AItem1);
          query2.Next;
        end;
        query2.close;
        query1.next;
      end;
      query1.close;
    end;