有关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);
就行了!