我想让程序历遍所有的菜单项~~~要怎么写?就是mainmenu1.items.items[i].name=''可是这样程序只会循环主菜单,而不循环子菜单~~怎么回事?

解决方案 »

  1.   

    for i:=0 to MainMenu1.Items.Count-1 do
      begin
        MainMenu1.Items[i].Enabled:=False;
        for j:=0 to MainMenu1.Items[i].Count-1 do
          begin
            //ShowMessage(MainMenu1.Items[i].Items[j].Caption+','+IntToStr(MainMenu1.Items[i].Items [j].Tag ) );
            MainMenu1.Items[i].Items [j].Enabled:=False;
          end;
      end;
          for i:=0 to MainMenu1.Items.Count-1 do
          begin
            if MainMenu1.Items[i].Tag=tagz then//判断是否具有使用权限-----
            MainMenu1.Items[i].Enabled:=True;
            for j:=0 to MainMenu1.Items[i].Count-1 do
            begin
              //ShowMessage(MainMenu1.Items[i].Items[j].Caption+','+IntToStr(MainMenu1.Items[i].Items [j].Tag ) );
              if MainMenu1.Items[i].Items [j].Tag =tagz then
              MainMenu1.Items[i].Items [j].Enabled:=True;
            end;
          end;
      

  2.   

    楼上的大哥~好像我的程序有错帮我看看行不?
       adoquery1.Close;
       ADOQuery1.Parameters.ParamByName('user_name').Value:=user_name;
       adoquery1.Open;
       while not adoquery1.Eof do
       begin
        mode_id:=trim(adoquery1.FieldByName('mode_id').AsString);
        if adoquery1.FieldByName('Examine_cadre').AsString='0' then  //权限判断
         begin
          for i:=0 to MainMenu1.Items.Count-1 do
            begin
               MainMenu1.Items[i].Enabled:=true;
                 for j:=0 to MainMenu1.Items[i].Count-1 do
                  begin
                     if mainmenu1.items[i].items[j].name=mode_id then
                        MainMenu1.Items[i].Items [j].Enabled:=False;
                  end;
            end;
         end
        else
         begin
          for i:=0 to MainMenu1.Items.Count-1 do
            begin
               MainMenu1.Items[i].Enabled:=true;
                 for j:=0 to MainMenu1.Items[i].Count-1 do
                  begin
                     if mainmenu1.items[i].items[j].name=mode_id then  
                     MainMenu1.Items[i].Items [j].Enabled:=False;
                  end;
            end;
         end;
         end;
        adoquery1.Next;
    end;
      

  3.   

    不是有错~运行起来所有的菜单都为不可用状态,不知道怎么回事,如果将
    MainMenu1.Items[i].Enabled:=true;去掉则该程序不起作用
      

  4.   

    mode_id:=trim(adoquery1.FieldByName('mode_id').AsString);
    是不是和菜单名完全一样哦,如果一样的话,应该全部都为不可能
      

  5.   

    对呀,我就是要取得这条记录中的菜单名称,然后再进行判断,比如说记录中的mode_id='N18' ,这条记录的权限为false,那我就要将这个菜单(N18)设为false,要怎么实现?
      

  6.   

    先把所有的菜单Enabled设为false  for i:=0 to MainMenu1.Items.Count-1 do
      begin
        MainMenu1.Items[i].Enabled:=False;
        for j:=0 to MainMenu1.Items[i].Count-1 do
          begin
            MainMenu1.Items[i].Items [j].Enabled:=False;
          end;
      end;
    把菜单名和数据库里存的对比,有的就设Enabled为True  
      ADQ.open
      while not ADQ.Eof do
      begin
        tagz:=ADQ.FieldByName('FunctionNo').AsString ;
        for i:=0 to MainMenu1.Items.Count-1 do
          begin
            if MainMenu1.Items[i].name=tagz then
            MainMenu1.Items[i].Enabled:=True;
            for j:=0 to MainMenu1.Items[i].Count-1 do
            begin
              if MainMenu1.Items[i].Items [j].name =tagz then
              MainMenu1.Items[i].Items [j].Enabled:=True;
            end;
          end;
          ADQ.Next;
        end;
      

  7.   

    嗯~~但是我不要先将所有的菜单都设为false 因为只有少数的菜单有权限限制.在表中也没有存放所有的菜单名称.可不可以先进行判断菜单是否等于当前记录中的菜单名称,然后再跟进权限字段进行决定是否要显示,以下是我改过后的代码,可是不知怎么回事那个菜单一直不会变,即J的值不会变:
       while not adoquery1.Eof do
       begin
        mode_id:=trim(adoquery1.FieldByName('mode_id').AsString);
           for i:=0 to MainMenu1.Items.Count-1 do
             begin
               MainMenu1.Items[i].Enabled:=False;
               for j:=0 to MainMenu1.Items[i].Count-1 do
                begin
                   if mainmenu1.Items[i].Items[j].Name=mode_id then
                    begin
                      if adoquery1.FieldByName('Examine_cadre').AsString='0' then
                         MainMenu1.Items[i].Items [j].Enabled:=False
                      else
                         MainMenu1.Items[i].Items [j].Enabled:=true;
                    end;
                end;
             end;
         end;
       adoquery1.Next;
    end;
      

  8.   

    MainMenu1.Items[i].Enabled:=False;
    你把这句去掉试试
      

  9.   

    你检查一下你的
    adoquery1.Next;
    位置写对没有。写成这样
       while not adoquery1.Eof do
       begin
        mode_id:=trim(adoquery1.FieldByName('mode_id').AsString);
        for i:=0 to MainMenu1.Items.Count-1 do
          begin
            MainMenu1.Items[i].Enabled:=False;
            for j:=0 to MainMenu1.Items[i].Count-1 do
            begin
              if mainmenu1.Items[i].Items[j].Name=mode_id then
                begin
                  if adoquery1.FieldByName('Examine_cadre').AsString='0' then
                    MainMenu1.Items[i].Items [j].Enabled:=False
                  else
                    MainMenu1.Items[i].Items [j].Enabled:=true;
                 end;
                end;
             end;
             ADOQuery1.Next;
           end;
         end;
      

  10.   

    嗯~~不会死循环了~~可是怎么没有一点效果??当前记录中就有一个菜单是没有权限的,可是还是为true 可显示的
      

  11.   

    while not adoquery1.Eof do
       begin
        mode_id:=trim(adoquery1.FieldByName('mode_id').AsString);
        for i:=0 to MainMenu1.Items.Count-1 do
          begin
            for j:=0 to MainMenu1.Items[i].Count-1 do
            begin
              if mainmenu1.Items[i].Items[j].Name=mode_id then
                begin
                  if adoquery1.FieldByName('Examine_cadre').AsString='0' then
                    MainMenu1.Items[i].Items [j].Enabled:=False
                 end;
                end;
             end;
             ADOQuery1.Next;
           end;
         end;
      

  12.   

    谢谢楼上的大哥了~问题解决了~是那个 
    if adoquery1.FieldByName('Examine_cadre').AsString='0' 的原因,因为表中该字段是boolean
    类型的,改成.asboolean就可以判断了~~~