我的代码如下,为什么无法把mainmenu中的某个item的置为 不可用?
if (trim(edit1.Text)<>'') and (trim(edit2.Text)<>'') then
  begin
    adoquery1.SQL.Clear;
    sqlstr:='select 用户表.username,pwd,names from 用户表,用户权限表1 where 用户表.username=用户权限表1.username and 用户表.username='''+trim(edit1.Text)+''' and pwd='''+trim(edit2.Text)+'''';
    adoquery1.SQL.Add(sqlstr);
    adoquery1.ExecSQL;
    adoquery1.Active:=true;
    if adoquery1.FieldByName('username').Text='' then
    begin
      showmessage('此用户不存在或密码错误,请检查后重新输入!');
      edit1.Clear;
      edit2.Clear;
      edit1.SetFocus;
    end
    else
    begin
      for I:=0 to mainfrm.MainMenu1.Items.Count-1 do
      begin
        str1:=trim(mainfrm.MainMenu1.Items[I].Caption);
        for J:=0 to adoquery1.FieldCount-1 do
        begin
          str2:=trim(adoquery1.Fields[J].AsString);
          if str1=str2 then
          begin
            mainfrm.MainMenu1.Items[I].Visible:=false;
            mainfrm.mainmenu1.Items[I].Enabled:=false;
          end
          else
          begin
            mainfrm.mainmenu1.Items[I].Enabled:=true;
            mainfrm.MainMenu1.Items[I].Visible:=true;
          end;
        end;
      end;
      mainfrm.show;
      Visible:=false;
    end;
  end
  else
  begin
    showmessage('请输入用户名及密码!');
    edit1.Clear;
    edit2.Clear;
    edit1.SetFocus;
  end;

解决方案 »

  1.   

    mainfrm.MainMenu1.Items[I]换成相对应的名称就行了,比如:N1
      

  2.   

    跟踪一下,看看执行了相关代码没有,有可能根本没执行到
    不行放到mainfrm的OnShow事件里吧。
      

  3.   

    mainfrm.MainMenu1.Items[I].Items[J].Enabled := False;I是指菜单的项目,如:File, Edit....Help
    J是指某菜单项的子项,如File菜单下面的Open, Save, Close....
      

  4.   

    to tpmao,fyje
    根据名称来引用,那怎么在循环中引用N1,N2,N3之类的呢?
      

  5.   

    关联ActionManager,通过Action控制
      

  6.   

    我帮你!是这样的,
    如果MainMenu的Item分层的话,用一重循环就无法遍历所有Item
    它是类似多維数组的结构
    也就是要如此循环:
    for i:=0 to MainMenu1.Items.Count-1  do
      begin
        if MainMenu1.Items[i].Count>0 then
          for j:= 0 to MainMenu1.Items[i].Count-1 do
            begin
              if MainMenu1.Items[i][j].Count>0 then  
                for k:=0 to MainMenu1.Items[i][j].Count-1 do具体几层就由你自己来控制了。
    比较麻烦...
      

  7.   

    或者这样:
    for i:=0 to MainMenu1.Items.Count-1  do
    begin
      for j:= 0 to MainMenu1.Items[i].Count-1 do
      begin
        for k:=0 to MainMenu1.Items[i][j].Count-1 do
        begin
        end;
        if adoquery1.Fields[m].AsString=MainMenu1.Items[i][j].Caption then
        begin
        end;
      end;
      if adoquery1.Fields[m].AsString=MainMenu1.Items[i].Caption then
      begin
      end;
    end;
      
      

  8.   

    to heixiu1980
    thanksadoquery1.Fields[m].AsString=MainMenu1.Items[i][j].Caption
    这么行不通的,我原来也这么写,说是数据类型不符,搞不懂了。
      

  9.   

    我猜测你的adoquery1是用来读取用户权限的吧?
    权限是names字段么?
    而且一个权限一条记录?
    那么不能这么循环,应该是:
    while not adoquery1.Eof do
    begin
      ...;  //这里写遍历MainMenu的代码,读取权限为:
            //adoquery1.FieldByName('names').Asstring;
      Adoquery1.Next;
    end;
      

  10.   

    to  heixiu1980(迷茫ing)
    thank you very much :)你说的都对,我先自己编编代码去。