运行时期在menuitem中加入事件

befree 2002-06-11 12:02:08
for i:=1 to MainMenu1.Items.Count do
for j:=1 to MainMenu1.Items[i-1].Count do
MainMenu1.Items[i-1][j-1].onClick:=track;

procedure track(sender: TObject);
begin
//do someting
//??怎样再运行原来的onclick事件?
end;
...全文
81 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
befree 2002-06-12
  • 打赏
  • 举报
回复
虽不中也不远
搞掂了
谢谢大家
结贴
dreamfan 2002-06-11
  • 打赏
  • 举报
回复
up
befree 2002-06-11
  • 打赏
  • 举报
回复
有没更好的方法?
surfguy 2002-06-11
  • 打赏
  • 举报
回复
你可以做好一个静态的MainMenu1.Items,如mainmenu1.items[0],设为不可见,在它的onclick事件中写上你要的代码,然后:

for i:=1 to MainMenu1.Items.Count do
for j:=1 to MainMenu1.Items[i-1].Count do
MainMenu1.Items[i-1][j-1].onClick:=mainmenu1.items[0].onclick;
lizhenjia 2002-06-11
  • 打赏
  • 举报
回复
试一试:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
MainMenu1: TMainMenu;
a1: TMenuItem;
aa1: TMenuItem;
bb1: TMenuItem;
cc1: TMenuItem;
procedure aa1Click(Sender: TObject);
procedure bb1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure track(sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MyClick:array[0..100,0..100] of TNotifyEvent;
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.aa1Click(Sender: TObject);
begin
showmessage('aa');
end;

procedure TForm1.bb1Click(Sender: TObject);
begin
showmessage('bb');
end;
procedure TForm1.track(sender: TObject);
var
i,j:integer;
OldClick:array[0..100,0..100] of TNotifyEvent;
begin
Showmessage('Click');
//////////////////////////////////////////////////////////
i:=1;
j:=(Sender as TMenuItem).MenuIndex+1;
OldClick[i,j]:=(Sender as TMenuItem).onclick;
(Sender as TMenuItem).onclick:=MyClick[i,j];
(Sender as TMenuItem).click;
(Sender as TMenuItem).onclick:= OldClick[i,j];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to MainMenu1.Items.Count do
for j:=1 to MainMenu1.Items[i-1].Count do
begin
MyClick[i,j]:=MainMenu1.Items[i-1][j-1].onClick;
MainMenu1.Items[i-1][j-1].onClick:=track;
end;
end;
end.
befree 2002-06-11
  • 打赏
  • 举报
回复
有:菜单名称Click(sender: TBoject); 这样的调用方法吗?
菜单名称当然就是(sender as TMenuItem).name了
是stirng啊
jishiping 2002-06-11
  • 打赏
  • 举报
回复
你可以在Form里定义一个数组(或者直接用TList),在修改 menuitem 的
OnClick事件函数前,将原来的OnClick事件函数保存到数组(或者TList)
中,在新的OnClick事件里,再调用原来的OnClick事件函数。
spidertan 2002-06-11
  • 打赏
  • 举报
回复
up!
weizhi 2002-06-11
  • 打赏
  • 举报
回复
呵呵,如果你是要还原菜单项以前的事件,即使单击菜单项后执行以前的事件处理程序,而且你又是要批量处理一大堆菜单项的话,你就保存以前的单击事件到数组中吧,如楼上的方法,

如果,你只是在某个过程中想调用一下某个菜单项的以前的事件,那就不用这么麻烦了, 你直接调那个过程就可以了,比如,以前是指向
MemnItem1Click(Sender: TObject)的,你在你的过程中直接写
MenuItem1Click(Nil); 就可以调用那个过程了. 呵呵,也就是说,以前的事件处理过程只不过是个过程而矣,你是可以真接调用的!!
qybao 2002-06-11
  • 打赏
  • 举报
回复
什么意思,原来菜单已经写好事件,现在要改为track,然后再改回原来的事件,是吗?
试试看
for i:=1 to MainMenu1.Items.Count do
for j:=1 to MainMenu1.Items[i-1].Count do
MainMenu1.Items[i-1][j-1].onClick:=track;

procedure track(sender: TObject);
begin
//do someting
菜单名称Click(sender: TBoject); //菜单名称Click是原来的事件
end;

befree 2002-06-11
  • 打赏
  • 举报
回复
问题是MainMenu1.Items[i-1][j-1].onClick:=menuclicks[j]后怎么样才可以运行原来的onclick事件?
netlib 2002-06-11
  • 打赏
  • 举报
回复
你也可以作些
procedure (Sender: TObject) of object;类型的指针
也就是TNotifyEvent类型的数据

menuclicks:array of TNotifyEvent;
然后为这每一个指针写一个过程
在程序员可以
MainMenu1.Items[i-1][j-1].onClick:=menuclicks[j],来调用,
也可以写成两维的。

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧