如:
menuitem.intems[i].onclick:='zp11';//当然这样是不行的,有没有其它方法?
其中zp11为已定义好的事件.
procedure zp11(Sender:Tobject);
begin
showmessage('fsa');
...
end;送上100分
menuitem.intems[i].onclick:='zp11';//当然这样是不行的,有没有其它方法?
其中zp11为已定义好的事件.
procedure zp11(Sender:Tobject);
begin
showmessage('fsa');
...
end;送上100分
能否具体些?
我说的我要用String类型来作为事件名赋值.
TForm1=class(TForm) ....... private
procedure OnName1ItemClick(Sender:TObject);
procedure OnName2ItemClick(Sender:TObject);
....................var
EventNameList:TStringList;////存放名字的字符串列表
ItemEvents : Array of TNotifyEvent;////存放事件的列表。procedure TForm1.OnName1ItemClick(sender:TObject);
begin
end;procedure TForm1.OnName2ItemClick(sender:TObject);
begin
end;procedure TForm1.InitEvents;
begin
///////////需要对EventNameList初始化,添加用到的菜单名字'Name1','Name2'
Setlength(ItemsEvents,Length);
ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
ItemEvents[EventNameList.IndexOf('Name2')]:=OnName2ItemClick;
////////////设置 String中的菜单字符串名字对应的Item事件。
end;procedure TForm1.Button1Click(Sender: TObject);
begin
MainMenu1.Items[1].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name1')]);
MainMenu1.Items[2].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name2')]);
///////////设置菜单对应的事件,以名字做参数
end;
在程序运行中设置OnClick事件,从对应的名字得到对应的Click事件函数。
直接赋,不要加引号的!
不过要参数相同!
{创建历史菜单}
var
his :TMenuItem ;
begin
if fileexists(s) then
begin
his := TMenuItem.Create(Self);
his.Caption:=s;
n188.Add(his);
his.OnClick:=HistoryMainMenuClick;//在此定义菜单点击要执行的操作
end;
end;
procedure TfrmFCP.HistoryMainMenuClick(Sender: TObject);
{历史菜单点击事件}
var
s:string;
begin
with Sender as TMenuItem do
begin
s:=Caption;
if fileExists(s) then
LoadNewFile(s)
else
sender.Destroy;
end;
end;
整个方式就是这样。
为什么非得加string类型?
好多人没理解楼主的意图。
Setlength(ItemsEvents,Length);此段怎么做?
EventNameList.Add('Name1');
EventNameList.Add('Name2');
....
///////////需要对EventNameList初始化,添加用到的菜单名字'Name1','Name2'
EventNameList:=TStringList.Create;
EventNameList.Add('Name1');
EventNameList.Add('Name2');
....
Setlength(ItemsEvents,EventNameList.Count);
ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
ItemEvents[EventNameList.IndexOf('Name2')]:=OnName2ItemClick;
....
////////////设置 String中的菜单字符串名字对应的Item事件。
ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
等式左边在指定Name1的情况下与Items.items[i].items[j].onclick有什么区别?
我要的等式右边最好为字符串格式,这样在特定的情况下才能达到给菜单项换功能.
有没有其他方法??
MainMenu1.Items[1].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name1')]);
MainMenu1.Items[2].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name2')]);/////////////以字符串作为参数。先把事件和字符串联结,这样使用的时候通过字符串查找到相应的事件。
你的方法好像还是不能达到我的要求.以下几句不是在每个程序窗口中都要写上一串代码?
如果我在事先不知道程序的菜单与事件时又如何做呢?
我主要是指开发控件.难不成我要叫用户来自己写以下一串代码?
有没有自动写的方法?
这也是我迟迟没有结题的原因,我一直在努力试. ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
ItemEvents[EventNameList.IndexOf('Name2')]:=OnName2ItemClick;
////////////设置 String中的菜单字符串名字对应的Item事件。
//....
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
published //必须放在published部分才可以用MethodAddress方法找到
procedure TempClick(Sender: TObject);
end;
//....
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := Format('%p', [MethodAddress('TempClick')]);
end;procedure TForm1.TempClick(Sender: TObject);
begin
//....
end;
//....
Type
TMenuClk=procedure(Sender:TObject)of Object;
2、你期望动态给菜单的OnClick赋值,而且这些赋值是多选择的,建议你定义一个静态数组:
Const
Array[0..5] of TMenuClk=(Click0,Click1,Click2,Click3,Click4);
3、在TForm1的Public部分编写对应的菜单项响应句柄
TForm1=class(TForm)
....
public
procedure Click0(Sender:TObject);
.....
end;
所有的onclick都zp11;
然后通过Sender来判断不好吗???
不知道搂住所谓的字符串是那里得来的
我觉得应该和Sender有关系的八
procedure zp11(Sender:Tobject);
begin
if Sender.caption='XXX' then
begin end;
if.....end;