我用递归从库表中取记录生成的菜单项,用FindComponent找不到,而手动生成的菜单项就可以 ( 积分: 50 )

  • 主题发起人 主题发起人 kongjieabc
  • 开始时间 开始时间
K

kongjieabc

Unregistered / Unconfirmed
GUEST, unregistred user!
表结构:
权限明细表:
qxid 权限号(字符串型)
cdid 菜单号(数字型)
qx 具体权限(数字型,0表示变亮、1变灰)

动态菜单项代码:
var
NewDS : TADODataSet;
NewItem : TMenuItem;
begin
NewItem := TMenuItem.Create(self);
NewItem.name := 'A'+inttostr(NewDS.Recordset.Fields[0].Value);
NewItem.Caption := NewDS.Recordset.Fields[1].Value;
NewItem.Hint := NewDS.Recordset.Fields[3].Value;
NewItem.OnClick := AddMenuClick;
...
end;

NewDS是从菜单目录中取的菜单记录,第0列是不重复的数字型的(菜单编号)

动态授权代码:
procedure ...
var
SQL:string;
m:string;
MyCom:TComponent;
begin
try
SQL:='select cdid,qx from xt_qxmx where qxid='+quotedstr(权限类型全局变量);
ds.Close;
ds.Recordset:=conn.Execute(SQL);
while not ds.Eof do
begin
m:='A'+ inttostr(ds.Recordset.Fields[0].Value);
MyCom:=FindComponent(m);
if (not( MyCom is TMenuItem)) or (MyCom=nil) then
begin
ShowMessage('出错了!没有这个菜单');
exit;
end;

if ds.Recordset.Fields[1].Value=0 then
TMenuItem(MyCom).Enabled:=true
else
TMenuItem(MyCom).Enabled:=false;

ds.Recordset.MoveNext;
end;
ds.Close;
except
end;
end;

问题如题目,固定写在菜单控件中的项目,按项目名就能将之变灰或变亮,而动态生成的菜单项,就说找不到名称,我用showmessage显示,都显示出来了,但一到MyCom:=FindComponent(m);这步就找不到了,真是要愁死人了。。。。。。。

头一次发帖,大家帮忙啊!
 
表结构:
权限明细表:
qxid 权限号(字符串型)
cdid 菜单号(数字型)
qx 具体权限(数字型,0表示变亮、1变灰)

动态菜单项代码:
var
NewDS : TADODataSet;
NewItem : TMenuItem;
begin
NewItem := TMenuItem.Create(self);
NewItem.name := 'A'+inttostr(NewDS.Recordset.Fields[0].Value);
NewItem.Caption := NewDS.Recordset.Fields[1].Value;
NewItem.Hint := NewDS.Recordset.Fields[3].Value;
NewItem.OnClick := AddMenuClick;
...
end;

NewDS是从菜单目录中取的菜单记录,第0列是不重复的数字型的(菜单编号)

动态授权代码:
procedure ...
var
SQL:string;
m:string;
MyCom:TComponent;
begin
try
SQL:='select cdid,qx from xt_qxmx where qxid='+quotedstr(权限类型全局变量);
ds.Close;
ds.Recordset:=conn.Execute(SQL);
while not ds.Eof do
begin
m:='A'+ inttostr(ds.Recordset.Fields[0].Value);
MyCom:=FindComponent(m);
if (not( MyCom is TMenuItem)) or (MyCom=nil) then
begin
ShowMessage('出错了!没有这个菜单');
exit;
end;

if ds.Recordset.Fields[1].Value=0 then
TMenuItem(MyCom).Enabled:=true
else
TMenuItem(MyCom).Enabled:=false;

ds.Recordset.MoveNext;
end;
ds.Close;
except
end;
end;

问题如题目,固定写在菜单控件中的项目,按项目名就能将之变灰或变亮,而动态生成的菜单项,就说找不到名称,我用showmessage显示,都显示出来了,但一到MyCom:=FindComponent(m);这步就找不到了,真是要愁死人了。。。。。。。

头一次发帖,大家帮忙啊!
 
跟踪一下你在创建菜单时的 NewDS.Recordset.Fields[0].Value 和 findcomponent时的ds.Recordset.Fields[0].Value 是否一致.
 
用MyCom := Self.FindComponent(m);试试看
 
royal1442,好象还一样

duhai_lee,这2句能有什么不一致的吗,我NewDS.Recordset.Fields[0].Value取的是ACCESS中“菜单表”中的自动编号型(长整型),ds.Recordset.Fields[0].Value取的是ACCESS中“权限明细表”中的数字型(也是长整型)
 
创建菜单项的时候,用一个TStrings把所有菜单项的名字(Name)存下来,然后在你需要查找的时候,先看看TStrings里面有没有,如果没有的话,那说明菜单项的名字和你从数据库里面读取的数据中有一个问题。
 
我把菜单项生成时的名称用绝对的字符来赋值,不从数据库中取,还是不行,
我用
for i := 0 to MainMenu1.Items.Count-1 do
begin
showmessage(MainMenu1.Items.Name);
end;
明明看到了具体的我赋的值,但用MyCom:=self.FindComponent(m);就是找不到,奇怪了
 
我把 if (not( MyCom is TMenuItem)) or (MyCom=nil) then 这一句换成下面2句分别试,都报错误“出错了!没有这个菜单”

if not ( MyCom is TMenuItem) then

if MyCom=nil then

是不是我动态创建菜单的语句有什么问题,导致动态菜单项无效,我记得前2天好使啊,怎么突然不好使了呢。。。
 
多人接受答案了。
 
后退
顶部