简单问题,请大家支援!(100分)

扳手

Unregistered / Unconfirmed
GUEST, unregistred user!
是根据用户权限控制可使用菜单的问题。
我的主窗体上有约100个菜单项,其中有大约30个须根据用户权限判断其enable属性。
用户表中有这30个菜单的权限,true表示可用,false 表示不可用。
我想这样做,从数据库用户表中读出这30个权限(boolean型)赋给数组qx[0..30],
然后将需控制菜单项赋给数组menu[0..30],例如:menu[0]:=N1;
接下来我想实现类似:n1.enable:=qx这样的方式,但不知道该如何做???
 
主要是你的菜单名字本身要取得有规律,比如MenuItem1,MenuItem2之类的。
然后用循环,FindComponent('MenuItem'+Inttostr(i))...
 
那我能不能把menuitem赋给数组呢?
 
好的,不错,可以定义菜单数组
 
可我不知道之后又该怎么办了,指点一下。
 
当然可以把menuitem赋给数组,这样的话更简单。
但是我估计你可能都做得七七八八了得吧。这样改动是不是太伤筋动骨?
你到底想用哪种方式做?我再和你研究。
 
我就是想把菜单项赋给数组,把用户权限赋给另一个数组,然后一个循环搞定。
遇到了两个主要问题:
一。 const menu_item array[0..29] of tmenuitem =(n1,n2,...n30)
这样做编译不通过,但
var menu_item array[0..29] of tmenuitem;
...
menu_item[0]:=n1;
这样做就可以,可是我的菜单号不连续,这样做显然不方便,还是定义成
常量比较方便,不知该如何解决。
二。 我像这样调用:
menu_item.enable:=qx {qx为数组变量,保存数据表中读出的值}
无法实现,不知道该如何做。
 
to:憔悴
第二个问题已解决,但第一个问题如何解决,其实是个数组的问题。
 
你的思路已经很明了,可以实现。自己写代码就是了。

不过最后是将你需要设为权限的项目的Name搞在一起,这样可以充分利用Sender来节约代
码!
 
我也不知道怎么样Const这个数组。我觉得这样不大可能吧?
我现在有点事,先离去一会儿,呆一会儿想想再回复你。
不过只要能实现一就可以了,二不是问题
 
现在的问题是数组的赋值问题解决不了:
const menu_item array[0..29] of tmenuitem =(n1,n2,...n30)
这个搞不成,应该怎么做?
 
如果 var menu_item array[0..29] of tmenuitem; 就只能用循环对单个数组元素赋值
吗?能不能像const 数组那样赋值?
 
我回来了。
告诉你答案。这个是一个3个菜单的例子,你自己可以改一改。
Procedure XXX;
var
menu_item:array[0..2] of TMenuItem;//=(TMenuItem(a1),TMenuItem(b1));
i:Integer;
MyCom:TComponent;
const
MenuName:array[0..2] of string=('a1','b1','c1');//a1,b1,c1是菜单的name
qx :array[0..2] of Boolean=(False,true,False);
begin
for i:=0 to Length(MenuName)-1 do begin
MyCom:=FindComponent(MenuName);
if (not( MyCom is TMenuItem)) or (MyCom=nil) then begin
ShowMessage('出错了!没有这个菜单');
exit;
end;
menu_item:=TMenuItem(MyCom);
end;

for i:=0 to Length(MenuName)-1 do
menu_item.Enabled:=qx;
end;
 
咦,这个扳手修水管去了?^_^
 
收到,测试中!
 
给分……呵呵
 
定义菜单项的tag
 
居然碰上停电。。。刚上来。
 
你也别数组了,直接把菜单项和用户写到两个表中,不就得了?
 
调试中,please waiting...
 
顶部