如:
 menuitem.intems[i].onclick:='zp11';//当然这样是不行的,有没有其它方法?
其中zp11为已定义好的事件.
procedure zp11(Sender:Tobject);
begin
showmessage('fsa');
...
end;送上100分

解决方案 »

  1.   

    当然可以.onclick其实是一个属性,它是一个object pocedure.你可以跟踪onclick的定义,即可知道其具体类型是什么.(应该是TNotifyEvents一类的),你在程序中写一个和此种类型参数一致的过程,即可赋值,但是,这个过程必须是某个对象的过程.
      

  2.   


    能否具体些?
    我说的我要用String类型来作为事件名赋值.
      

  3.   

    看看这样能否满足你的要求:
      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;
      

  4.   

    思路是:初始化时将所有的名字放到一个字符串列表中,设置每个名字对应的Click函数。
    在程序运行中设置OnClick事件,从对应的名字得到对应的Click事件函数。
      

  5.   

    menuitem.intems[i].onclick = ProcedureName
    直接赋,不要加引号的!
    不过要参数相同!
      

  6.   

    procedure TfrmFCP.CreatHistoryMainMenu(s:String);
    {创建历史菜单}
    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;
    整个方式就是这样。
      

  7.   

    直接赋,不要加引号,,,,不好吗?
    为什么非得加string类型?
      

  8.   

    没发现什么更好的办法。楼主 要的是以string类型参数来定位事件函数,可能是想通过动态增加菜单,设置菜单的名字,或者Hint等就能够动态联结到对应的事件函数。
    好多人没理解楼主的意图。
      

  9.   

    ///////////需要对EventNameList初始化,添加用到的菜单名字'Name1','Name2'
        Setlength(ItemsEvents,Length);此段怎么做?
      

  10.   

    一个StringList,添加名字,很简单。EventNameList:=TStringList.Create;
    EventNameList.Add('Name1');
    EventNameList.Add('Name2');
    ....
      

  11.   

    begin
    ///////////需要对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事件。
      

  12.   

    gzmhero(hihihi) 已经帮你解决了,还不给分?
      

  13.   

    你的方法还不是我想要的.
    ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
    等式左边在指定Name1的情况下与Items.items[i].items[j].onclick有什么区别?
    我要的等式右边最好为字符串格式,这样在特定的情况下才能达到给菜单项换功能.
    有没有其他方法??
      

  14.   

    你没看明白我的代码,这里是初始化的代码,调用的时候这样:
      MainMenu1.Items[1].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name1')]);
      MainMenu1.Items[2].OnClick:=TNotifyEvent(ItemEvents[EventNameList.IndexOf('Name2')]);/////////////以字符串作为参数。先把事件和字符串联结,这样使用的时候通过字符串查找到相应的事件。
      

  15.   

    to:gzmhero(hihihi)
        你的方法好像还是不能达到我的要求.以下几句不是在每个程序窗口中都要写上一串代码?
        如果我在事先不知道程序的菜单与事件时又如何做呢?
        我主要是指开发控件.难不成我要叫用户来自己写以下一串代码?
        有没有自动写的方法?
        这也是我迟迟没有结题的原因,我一直在努力试.    ItemEvents[EventNameList.IndexOf('Name1')]:=OnName1ItemClick;
        ItemEvents[EventNameList.IndexOf('Name2')]:=OnName2ItemClick;
    ////////////设置 String中的菜单字符串名字对应的Item事件。
      

  16.   

    可以通过RTTI实现,否则普通的函数编译后,在执行文件中只有入口地址没有名字~~
    //....
    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;
    //....
      

  17.   

    1、事件句柄是一种特殊属性,对于菜单的事件句柄你可以这样定义:
    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;
      

  18.   

    menuitem.intems[i].onclick:=zp11;
    所有的onclick都zp11;
    然后通过Sender来判断不好吗???
    不知道搂住所谓的字符串是那里得来的
    我觉得应该和Sender有关系的八
    procedure zp11(Sender:Tobject);
    begin
        if Sender.caption='XXX' then
        begin    end;
        if.....end;