我的代码如下,为什么无法把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;
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;
不行放到mainfrm的OnShow事件里吧。
J是指某菜单项的子项,如File菜单下面的Open, Save, Close....
根据名称来引用,那怎么在循环中引用N1,N2,N3之类的呢?
如果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具体几层就由你自己来控制了。
比较麻烦...
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;
thanksadoquery1.Fields[m].AsString=MainMenu1.Items[i][j].Caption
这么行不通的,我原来也这么写,说是数据类型不符,搞不懂了。
权限是names字段么?
而且一个权限一条记录?
那么不能这么循环,应该是:
while not adoquery1.Eof do
begin
...; //这里写遍历MainMenu的代码,读取权限为:
//adoquery1.FieldByName('names').Asstring;
Adoquery1.Next;
end;
thank you very much :)你说的都对,我先自己编编代码去。