我动态创建了菜单,但是怎么给菜单添加事件呀?在baidu搜索了一下,只有少数的例子,但太简单了,因为我创建的菜单要求调用一个函数(有两个参数),这两个参数在动态创建菜单的时候指定,请问我该怎么做?谢谢大家!!!

解决方案 »

  1.   

    需要捕捉WM_COMMAND(对应普通菜单及弹出菜单)或WM_SYSCOMMAND(对应系统菜单)事件
    例如在系统菜单插入一个项目
    type
      TForm1 = class(TForm)
       ......
       ......
    private
        procedure WMSysCommand(var Msg:TWMSysCommand);Message WM_SYSCOMMAND;
    end;
    .....
    .....
    implementationprocedure TForm1.FormCreate(Sender: TObject);
    var
    SysMenu:HMENU;
    begin
    SysMenu:=GetSystemMenu(Self.Handle,False);
    AppendMenu(SysMenu,MF_SEPARATOR,0,''); //插入分割线
    AppendMenu(SysMenu,MF_UNCHECKED,20303,Pchar('TEST')); //插入了TEST项
    end;procedure TForm1.WMSysCommand(var Msg:TWMSysCommand);
    begin
       case Msg.CmdType of
         20303:;//事件在这里捕捉
       else
        inherited
       end;
    end;
      

  2.   

    TO:SonicX(SonicX),
    谢谢您,这种方法我知道,但是就是不会弄怎么处理参数问题,因为我的菜单要响应一个自写函数(带两个参数),请帮忙
      

  3.   

    直接调用函数不就得了
    procedure msgbox(sMsg:string);
    begin
    showmessage(sMsg);
    endprocedure TForm1.WMSysCommand(var Msg:TWMSysCommand);
    begin
       case Msg.CmdType of
         20303:msgbox('你好');//事件在这里捕捉
       else
        inherited
       end;
    end;
      

  4.   

    问题是我不能用case去一个一个判断呀,因为我不知道要传入的参数到底是什么,怎么去判断?再说如果用case去处理,那我还用动态创建菜单吗?那还不如直接写上去
      

  5.   

    我的要求是这样的:我用循环的方法从外部取得数据,每个数据项有两个字段,然后去创建菜单,创建的菜单将来点击后要响应一个函数,这个函数有两个参数,这两个参数就是数据项里的那两个字段。关键是创建菜单用的外部数据是变化的,我不知道具体是什么,所以无法用case去判断处理,只能用函数直接去处理。我在网上查了一下,发现用自定义事件可以解决,但是给的例子都没参数,而且响应的事件执行的是相同的动作,根本就不实际,我想每人去创建多个菜单去执行一个功能吧
      

  6.   

    数据项
    data1=TStringList.Create;
    data2=TStringList.Create;
    i := 0;
    while ...
     读入数据项;
      data1.Add(数据1);
      data2.Add(数据2);
      NewItem := TMenuItem.Create(Self);
      NewItem.Tag := i;
      NewItem.OnClick=doClick;
      ...
      Inc(i);
    ...procedure doClick(Sender:TObject);
    begin
      i := (Sender as TMenuItem).Tag;
      自定义函数(data1[i],data2[i]);
    end;