我给Popupmenu1动态地添加菜单,现在要动态地响应菜单条目的Onclick事件,该如何写呢?

解决方案 »

  1.   

    事件你要先写好的,
    procedure myClick(Sender: TObject);
    begin
      showmessage('hellow');
    end;其后popupmenu1.onclick:=myclick
      

  2.   

    问题是TPopupmenu1没有onclick事件。只有Tmenuitem有。我动态添加的菜单的条目数是不确定的。???
      

  3.   

    就是对TMENUITEM的ONCLICK事件. for i := 0 to   PopupMenu1.Items.Count -1 do
        PopupMenu1.Items[i].onclick := myclick;
      

  4.   

    再給TPopupmenu1增加一个TMenuItem的时候,把已经写好的click事件赋给创建后的TMenuItem的onclick,如楼上的同志。另外再写onclick的时候可以使用参数的形式进行传递,由于你动态创建的TPopupmenu下的MenuItem的事件肯定是已经写好的了。如下:
    Procedure TForm1.MyClick(MenuItemName : String);
    begin
      if MenuItemName = 'Item1' then
      begin
        do something;
      end;
      if MenuItemName = 'Item2' then
      begin
        do something;
      end;
    end;然后在创建tmenuitem的时候:
      popumenu1.items.onclike := MyClick('Item1');ok finish
      

  5.   

    再问。如果myclick带除了sender以外的其他参数程序如何写?
      

  6.   

    土方法, 可以将参数都放到 TMenuItem.Tag 中去....
      

  7.   

    procedure Trbdy.FormShow(Sender: TObject);
    var
     sqlstr:string;
     t:TMenuItem;
     i:integer;  
    with query1 do
      begin
        close;
        sql.clear;
        sqlstr:='select * from tb'+ywq+'_saleway order by swno';
        sql.add(sqlstr);
        open;
        while not eof do
        begin
          t:= TMenuItem.Create(PopupMenu1);
          t.Caption := fieldbyname('swname').value;
          PopupMenu1.Items.Add(T);
          next;
        end;
      end;
      t:=tmenuitem.create(popupmenu1);
      t.caption:='合计';
      popupmenu1.items.add(t);
      for i:=0 to popupmenu1.Items.Count-1 do
      begin
        popupmenu1.Items[i].OnClick:=myclick(i);
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这句编译不过,我不知如何声明myclick,敬请指点
      end;
    end;
    编译无法通过,错误如下:
    [Error] rbdyu.pas(349): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'
    [Fatal Error] xsbb.dpr(27): Could not compile used unit 'rbdyu.pas'
      

  8.   

    我的Myclick声明为一个过程,在type里如何加语句使之编译通过,敬请指点
      

  9.   

    在PRIVATE里面写吧!把自己写的PROCEDURE赋给popupmenu1.Items[i].OnClick的事件就可以了999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    99999999999B@B@B@BBBMMMM999999999999999999999999999
    999999999999M+:.:+9999M:999999999999999999999999999
    9999999999999MM9+99MMM:9999999999999999999999999999
    99999999999999M+.+99M:99999999999999999999999999999
    99999999999999B:.++9M:99999999999999999999999999999
    99999999999999B+.+99M:9999AAAAAA9999999999999999999
    99999999999999B:.++9M:9AAA++++:+AAA9999999999999999
    99999999999999B+.+99M:A+9+A:+++++9AA999999999999999
    99999999999999B:.++9:A+@+A:,:++9+A9@M99999999999999
    99999999999999B+.+9:A+A,,,,,,+A+A9@A@M9999999999999
    99999999999999B:.++A+A+,,.,,+A9A9@A@M@M999999999999
    99999999999999B+.+9AA+,,...,++A9@A@A@MM999999999999
    99999999999999B:.+:A+++,,.,,++9@A@A@M@M999999999999
    99999999999999B+.+A+@+,,,,,+9A@A+@@M@M@M99999999999
    99999999999999B:.+A@+++,+,+9A9A++@M@M@MM99999999999
    99999999999999B+.+A+@++++++A9A++9M@M@M@M99999999999
    99999999999999B:.+A@+@+:+9A9A9A9M@M@M@9M99999999999
    0A999999999999B+.+A+@+@+@+@+@A@A@9@9@9@M99999999999
    99999999999999B:.+A@+@+@+@+@+@A@M@9@9@9M99999999999
    99999999999999B+.+:A@+@+@+@+@A@M@9@9@9M999999999999
    99999999999999B:.+:A9@+@+@+@9@A@M@9@9@M999999999999
    99999999993333333333M9@9@9@9@9@M@9@9@9M999999999999
    99999999993.........MAA99@9@9@M@9@9@9M9999999999999
    99999999993...MMMM..MM@9@9@9@9@M@9@9M99999999999999
    99999999993....MMM..M:M@9@9@9@9@9@9M999999999999999
    99999999993...MMMM..M:9MMM@9@9@9MMM9999999999999999
    99999999993..MMM.M..M:9999MMMMMM9999999999999999999
    99999999993..MM.....M:99999999999999999999999999999
    99999999993..M......M:99999999999999999999999999999
    99999999993...M.....MM:9999999999999999999999999999
    99999999993.........M9M:999999999999999999999999999
    9999999999MMMMMMMMMMMMMM:99999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    99999999999999999999.9999999.9999999999999999999999
    9999999....999999999.9999999.99999.999999..99999999
    9999999.999.99999999.9999999.99999999999.9999999999
    9999999.9999.99...99.9....99....99.9999.99999999999
    9999999.9999.9.999.9.9.999.9.999.9.9999....99999999
    9999999.9999.9.....9.9.999.9.999.9.9999.999.9999999
    9999999.9999.9.99999.9.999.9.999.9.9999.999.9999999
    9999999.999.99.999.9.9.999.9.999.9.9999.999.9999999
    9999999....9999...99.9....99.999.9.99999...99999999
    9999999999999999999999.9999999999999999999999999999
    9999999999999999999999.9999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
    999999999999999999999999999999999999999999999999999
      

  10.   

    TForm1 = class(TForm)
      ...
    private
      ...
      procedure MyClick(Sender: TObject):
      ...
    end;procedure TForm1.MyClick(Sender: TObject);
    begin
      case (Sender as TMenuItem).Tag of
      1://Do Something here
      ...
      end;
    end;procedure TForm1.FormShow(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to popupmenu1.Items.Count-1 do
        popupmenu1.Items[i].OnClick:=MyClick;
    end;