TMenuItem(frmMain.Components[I]).Name  = Trim(FieldByName('moduleName').AsString) 
是frmMain.Components[I]).Name???還是
frmMain.Components[I]).Caption,你自己確定一下

解决方案 »

  1.   

    每选一个菜单,都和数据库中的所有数据比较当然有问题了。
    procedure TfrmMain.InitPower(DataSet: TDataSet);
    var
      I:Cardinal;
    begin
      DataSet.First;
      for I:= 0 to ComponentCount-1 do
       if Components[I] is TMenuItem then
       begin
         if TMenuItem(frmMain.Components[I]).Name  = Trim(FieldByName('moduleName').AsString) then
           TMenuItem(frmMain.Components[I]).Visible := true
         else
           TMenuItem(frmMain.Components[I]).Visible := false;
         Next;
       end;
      end;
    end;  
      

  2.   

    if UpperCase(trim(TMenuItem(frmMain.Components[I]).Name))  = UpperCase(Trim(FieldByName('moduleName').AsString)) then
      

  3.   

    To: zfmich() 
      我觉得你说的有道理。我在delphi6做了一个小程序,检测到确实有统一大小写的必要。
    To:   XZHHAI (星之瀚海)  
      比较是加上UpperCase或LowerCase试一下。
      

  4.   

    供参考::
    //设置子菜单
    Procedure SetSubMenu(MItem:TMenuItem; QX:String);
    Var I:Integer;
    Begin
         For I:=0 To MItem.Count-1 Do
         Begin
              If MItem[I].IsLine Then Continue;
              If Not MItem[I].Visible Then Continue;          If MItem[I].Count>0 Then
                 SetSubMenu(MItem[I],QX)
              Else
                  MItem[I].Enabled:=(Pos('/'+MItem[I].Caption+'/',QX)>0);
         End;
    End;//根据用户权限设置菜单
    Procedure ReSetMenu(AMenu:TMainMenu; QX:String);
    Var I:Integer;
        AMenuItem:TMenuItem;
    Begin
         For I:=0 To AMenu.Items.Count-1 Do
         Begin
              AMenuItem:=AMenu.Items[I];          If AMenuItem.Visible Then
              Begin
                   If AMenuItem.Count>0 Then
                      SetSubMenu(AMenuItem,QX)
                   Else
                       AMenuItem.Enabled:=(Pos('/'+AMenuItem.Caption+'/',QX)>0);
              End;
         End;
    End;
      

  5.   

    procedure TfrmMain.InitPower(DataSet: TDataSet);
    var
      I:Cardinal;
    begin
      for I:= 0 to ComponentCount-1 do
       if Components[I] is TMenuItem then
         With DataSet do
         begin
           first;
           while not Eof do
           begin
           //  ShowMessage(TMenuItem(frmMain.Components[I]).Name );
             if TMenuItem(frmMain.Components[I]).Name  = Trim(FieldByName('moduleName').AsString) then
               begin
                  TMenuItem(frmMain.Components[I]).Visible := true
                  exit;   //找着了就应换下一菜单,不应再continue.
               end
             else
               TMenuItem(frmMain.Components[I]).Visible := false;
             Next;
           end;
         end
      
    end;