你可以做好一个静态的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;
for j:=1 to MainMenu1.Items[i-1].Count do
MainMenu1.Items[i-1][j-1].onClick:=mainmenu1.items[0].onclick;
procedure (Sender: TObject) of object;类型的指针
也就是TNotifyEvent类型的数据
如
menuclicks:array of TNotifyEvent;
然后为这每一个指针写一个过程
在程序员可以
MainMenu1.Items[i-1][j-1].onClick:=menuclicks[j],来调用,
也可以写成两维的。
试试看
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;
MemnItem1Click(Sender: TObject)的,你在你的过程中直接写
MenuItem1Click(Nil); 就可以调用那个过程了. 呵呵,也就是说,以前的事件处理过程只不过是个过程而矣,你是可以真接调用的!!
OnClick事件函数前,将原来的OnClick事件函数保存到数组(或者TList)
中,在新的OnClick事件里,再调用原来的OnClick事件函数。
菜单名称当然就是(sender as TMenuItem).name了
是stirng啊
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.