动态生成的菜单,而菜单的OnClick事件也是动态生成的,可以吗?(100分)

  • 主题发起人 主题发起人 ciliwin
  • 开始时间 开始时间
C

ciliwin

Unregistered / Unconfirmed
GUEST, unregistred user!
注:我想的是无所谓什么菜单, 即使一个简单的按钮,怎样在点击的时候
触发OnClick事件,而这事件是即时生成的,总觉得有点行不通![^]
 

可以的,事件同样能赋值。
 
当然可以 ,现定义一个菜单中的一个项,并出现click 事件(注意事件不要包含具体的
部件,而应该使用比如Tmenuitem(sender)之类的东西),

然后在再创建的新菜单的事件中启用以上的事件 。

如果想要例城,请发邮件
 
//简单例子

procedure TfrmMain.NewMenuItem;
var
SQLText:string;
rst:_Recordset;
tmpMenuName:string;
tmpMenuItem:TMenuItem;
i:integer;
begin
Popupmenu3.Items.Clear;
for i:=0 to 5 do
begin
tmpMenuItem:=TMenuItem.Create(nil);
tmpMenuName:='MenuItem'+inttostr(i);
tmpMenuItem.Caption :=tmpMenuName;
tmpMenuItem.OnClick :=ViewClick;
Popupmenu3.Items.Add(tmpMenuItem);
end;
end;

procedure TfrmMain.ViewClick(Sender: TObject);
var
tmp:string;
begin
if SystemInited=False then Exit;
tmp:=(Sender as TMenuItem).Caption;
showmessage(tmp);
end;
 
对把一个事件类型赋给menu的事件属性就可以了
 
{点击事件,触发打开子窗体}
procedure TfrmMainWindow.MainMenuClick(Sender: TObject);
var
Item:TMenuItem;
begin
Item:=Sender as TMenuItem;
OpenForm(Item);
end;
procedure TfrmMainWindow.CreateMenu;
var
Item:array[0..100] of TMenuItem;
i:Integer;
begin
for i:=MainMenu.Items.Count-3 downto 1 do
MainMenu.Items.Destroy;
for i:=0 to 99 do
Item:=TMenuItem.Create(Self);
if ModuleList<>nil then ModuleList.Destroy;//
ModuleList:=TStringList.Create;
ClientDataSet1.Close;
ClientDataSet1.CommandText:='Select Round(Sort/10000,0) as Sort1,'+
'Round(Sort/100,0)-Round(Sort/10000,0)*100 as Sort2,'+
'Sort-Round(Sort/100,0)*100 as Sort3,'+
'ModuleName,ModuleCaption,Sign From '+
'ModuleList order by Sort';
ClientDataSet1.Open;
for i:=0 to ClientDataSet1.RecordCount-1 do
begin
Item.Name:=ClientDataSet1.Fields[3].AsString;
Item.Caption:=ClientDataSet1.Fields[4].AsString;
if ClientDataSet1.Fields[5].AsInteger=1 then
begin
Item.OnClick:=MainMenuClick;
{获取模块列表}
ModuleList.Add(Trim('frm'+ClientDataSet1.Fields[3].AsString)+
'='+Trim(ClientDataSet1.Fields[4].AsString));
end;//end of if
if (ClientDataSet1.Fields[1].AsInteger=0) and
(ClientDataSet1.Fields[2].AsInteger=0) then
MainMenu.Items.Insert(MainMenu.Items.Count-2,Item)
else if ClientDataSet1.Fields[2].AsInteger=0 then
MainMenu.Items[MainMenu.Items.Count-3].Add(Item)
else MainMenu.Items[MainMenu.Items.Count-3].Items[MainMenu.Items[MainMenu.Items.Count-3].Count-1].Add(Item);
ClientDataSet1.Next;
end;//end of While not
end;
这是我编写的,里面当然不只是简单的创建菜单了。
不过你的功能就包含在里面了。自己研究研究,应该可以明白的。
 

Similar threads

D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
945
DelphiTeacher的专栏
D
后退
顶部