读书人

请问关于菜单的禁止和可用-为什么小弟

发布时间: 2012-06-22 16:16:32 作者: rapoo

请教关于菜单的禁止和可用---为什么我的代码有问题?
折腾了一周了,大虾帮看看看.

偶要实现的功能是,如果用户没权限操作这个菜单MainMenu1里的菜单项,那这个菜单项就会暗(不可用).

而数据库表userAuthor 里,保存的就是每个用户,能操作哪个菜单的记录,格式如下:
id username MenuName
---------------------------
1 小张 人员管理
2 小张 供应商管理
......


现在,问题是,为什么我的代码,除了管理员,在换用户后,菜单的权限还是一样和上一个用户一样.

我的CheckMenu是放在主窗口的FormActivate里的,系统切换登陆用户时,
会把主窗口MainForm隐藏,再显示,但调试时发现是会执行到CheckMenu这个函数的,
可为什么菜单的明暗(可用/禁止)状态还是没变?
如何解决?

还有,这代码效率太低..晕死..


Delphi(Pascal) code
//禁止不能用的菜单procedure TMainForm.CheckMenu;var    i,j,k,x:Integer;    str1,str2,Mstr:string;begin            if LoginPower='系统管理员' then  Exit;    //取得所有子菜单   {for j:=0 to ComponentCount-1 do    begin        if (Components[j].classtype=TMenuItem)   then        begin            TMenuItem(Components[j]).Enabled:=True;                   end;        Next;    end; }        try       //循环整个菜单项        for i := 0 to MainMenu1.Items.Count-1 do        begin            if i=1 then Continue;{特殊标记退出}            if i=10 then Continue;            //循环子菜单                    for j := 0 to MainMenu1.Items.items[i].Count-1 do            begin                if MainMenu1.Items[I].Items[J].Caption='-' THEN Continue;{特殊标记退出}                if MainMenu1.Items[I].Items[J].Tag=111 then Continue;                                str1:='';                str1:=GetSql('MenuName','Select MenuName from userAuthor where UserNAme='''+LoginUser+''' and MenuName='''+StringReplace(trim(MainMenu1.Items[I].Items[J].Caption),'新增','',[rfReplaceAll,rfIgnoreCase])+''' ');//取得当前登陆用户对该菜单的操作权限是否存在                if str1<>'' then                                                                                                               MainMenu1.Items[I].Items[J].Enabled:=true                else                    if MainMenu1.Items[I].Items[J].Count<=0 then//过滤掉有子菜单的菜单被禁止的情况                        MainMenu1.Items[I].Items[J].Enabled:=False;                                       for k := 0 to MainMenu1.Items.Items[i].Items[j].Count-1 do                begin                     str2:='';                                                                                                                  if MainMenu1.Items[I].Items[J].Items[K].Caption='-' THEN Continue;                     if MainMenu1.Items[I].Items[J].Items[K].Tag=111 then Continue;                                          str2:=GetSql('MenuName','Select MenuName from userAuthor where UserName='''+LoginUser+''' and MenuName='''+StringReplace(trim(MainMenu1.Items[I].Items[J].Items[K].Caption),'新增','',[rfReplaceAll,rfIgnoreCase])+''' ');                     if str2<>'' then                        MainMenu1.Items[I].Items[J].Items[K].Enabled:=true                     else                        if MainMenu1.Items[I].Items[J].Items[K].Count<=0 then                            MainMenu1.Items[I].Items[J].Items[K].Enabled:=false;                     next;                                     end;                next;                            end;             next;        end;    except            end;                 end;


[解决办法]
每一个菜单都重新去查询,当然慢了

可以改成,程序启动就查询出所有用户权限,换用户时,就用locate定位,会快些
[解决办法]
菜单变灰不安全,很容易使变灰的菜单恢复可用。例如我可以另外写个程序取得你的软件菜单句柄,然后遍历都让它可用。

读书人网 >.NET

热点推荐