首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

有关TNotifyEvent的有关问题,谢谢了

2012-03-11 
有关TNotifyEvent的问题,多谢了下面的代码可以正常运行,功能是动态生成控件,并给控件赋予onclick事件.我现

有关TNotifyEvent的问题,多谢了
下面的代码可以正常运行,功能是动态生成控件,并给控件赋予onclick事件.

我现在想把
procedure f(Sender: TObject);
begin
showmessage('s');
end;

加参数, 变成
procedure f(Sender: TObject;s:string);
begin
showmessage(s);
end;

但是代码编译不了,求各位大侠给指点一下
=========================================================================
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure f(Sender: TObject);
begin
showmessage('s');
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  KEYPRESSEvent : TNotifyEvent;
  button:Tbutton;
begin
  button := Tbutton.Create(self);
  with button do begin
  Name:='button1';
  Parent := form1; Left := 46; Width:=280;
  Top := 6; caption := 'test';
  end;
  //KEYPRESSEvent :=nil;
  @KEYPRESSEvent:=@f;
  button.Onclick :=KEYPRESSEvent;

end;
end.


[解决办法]
看这里有详细的分析
http://www.cnpack.org/showdetail.php?id=628&lang=zh-cn

因为Delphi的类默认传递了一个self指针,这个指针在eax中,所以如果你的函数在类的外面,你应该补齐这个self参数,也就是会多第一个参数
procedure MyClick(Self: TObject; Sender: TObject);
begin
// 第一个参数是虚拟的
ShowMessage(Format('Self: %d, Sender: %s', [Integer(Self), Sender.ClassName]));
end;


procedure ReSetObjEvent(OldEventAddr: pointer;NewEventValue: pointer;ReSetObject: TObject);
begin
TMethod(OldEventAddr^).Code := NewEventValue;
TMethod(OldEventAddr^).Data := ReSetObject;
end;

之后用
ReSetObjEvent(@@Button1.OnClick,@MyClick,Button1);
就行了!

热点排行