本人打算声明一个普通的procedure,然后将其指针赋予菜单项MenuItem的OnClick事件(TNotifyEvent指针),编译报“类型无效”;尝试用一个Form的方法(响应该Form的某菜单项的OnClick事件)赋予原来那个菜单项的OnClick,倒是可以实现。
不知那位大侠能帮我把程序再提高一些?就是实现用普通的过程指针转换成TNotifyEvent指针?

解决方案 »

  1.   

    没有问题
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        fdgg1: TMenuItem;
        procedure ff(sender:tobject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.ff(sender: tobject);
    begin
      showmessage('ffff');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       fdgg1.OnClick := ff;
    end;end.
    请大家去 http://www.new7wonders.com/c/voting.php 投长城一票
      

  2.   

    楼上可能没理解清楚.
    应该这样
    var
      Form1: TForm1;mm:TNotifyEvent ;implementation{$R *.dfm}procedure mmm(Sender: TObject);
    begin
    showmessage('  ');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    @mm:=pointer(@mmm);
    button1.OnClick := mm;
    end;
      

  3.   

    var
      Form1: TForm1;
      mm:TNotifyEvent ;implementation{$R *.dfm}
    procedure TForm1.OnFormCreate(Sender: TObject);
    var
    item:tmenuitem;
    begin
      mm:=test;
      item:=tmenuitem.create(self);
      item.onclick:=mm;
      mainitem1.add(item);
    end;
    procedure TForm1.test(Sender: TObject);
    begin
      showmessage(tmenuitem(sender).caption);
    end;
      

  4.   

    实现这个功能,你用TNotufyevent干什么?舍近求远呀!
    直接来:
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.OnFormCreate(Sender: TObject);
    var
    item:tmenuitem;
    begin
      item:=tmenuitem.create(self);
      item.onclick:=test;
      mainitem1.add(item);
    end;
    procedure TForm1.test(Sender: TObject);
    begin
      showmessage(tmenuitem(sender).caption);
    end;
      

  5.   

    TNotifyenent其实就是一个指针类型。mm:TNotifyEvent ;这句就是定义一个指针。当然初始化为空了。如果你给mm负值指向一个procedure 的话,可以这样使用:
    var
    obj:tobject;
    begin
    mm(obj);
    end;
      

  6.   

    感谢Del_C_Sharp的发表!!
    不过@取出来的函数的入口点没必要再用Pointer转化,直接可以复制给另一个函数入口点。
    另外两位没理解我的意思,恕不能给分了,抱歉!