你可以做好一个静态的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;

解决方案 »

  1.   

    你也可以作些
    procedure (Sender: TObject) of object;类型的指针
    也就是TNotifyEvent类型的数据

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

  2.   

    问题是MainMenu1.Items[i-1][j-1].onClick:=menuclicks[j]后怎么样才可以运行原来的onclick事件?
      

  3.   

    什么意思,原来菜单已经写好事件,现在要改为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;
      

  4.   

    呵呵,如果你是要还原菜单项以前的事件,即使单击菜单项后执行以前的事件处理程序,而且你又是要批量处理一大堆菜单项的话,你就保存以前的单击事件到数组中吧,如楼上的方法, 如果,你只是在某个过程中想调用一下某个菜单项的以前的事件,那就不用这么麻烦了, 你直接调那个过程就可以了,比如,以前是指向
    MemnItem1Click(Sender: TObject)的,你在你的过程中直接写
    MenuItem1Click(Nil); 就可以调用那个过程了. 呵呵,也就是说,以前的事件处理过程只不过是个过程而矣,你是可以真接调用的!!
      

  5.   

    你可以在Form里定义一个数组(或者直接用TList),在修改 menuitem 的
    OnClick事件函数前,将原来的OnClick事件函数保存到数组(或者TList)
    中,在新的OnClick事件里,再调用原来的OnClick事件函数。
      

  6.   

    有:菜单名称Click(sender: TBoject); 这样的调用方法吗?
    菜单名称当然就是(sender as TMenuItem).name了
    是stirng啊
      

  7.   

    试一试:
    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.