你想要做什么?当然你不能拨打FTest
,因为你还没有分配任何TMyEvent
!并PMyClass
和TMyEvent
真的应该是TMyClass
的部分?
至少这完美的作品:
type
PMyClass = ^TMyClass;
TMyClass = class;
TMyEvent = procedure(Sender: PMyClass) of object;
TMyClass = class
private
FEvent: TMyEvent;
FSomeValue: string;
public
property OnSomething: TMyEvent read FEvent write FEvent;
property SomeValue: string read FSomeValue write FSomeValue;
procedure Test;
end;
TSomeOtherClass = class
public
class procedure MyEvent(Sender: PMyClass);
end;
...
procedure TForm6.FormCreate(Sender: TObject);
var
o: TMyClass;
begin
o := TMyClass.Create;
o.SomeValue := 'This is a test.';
o.OnSomething := TSomeOtherClass.MyEvent;
o.Test;
end;
{ TMyClass }
procedure TMyClass.Test;
begin
FEvent(@Self);
end;
{ TSomeOtherClass }
class procedure TSomeOtherClass.MyEvent(Sender: PMyClass);
begin
ShowMessage(TMyClass(Sender^).SomeValue);
end;
当然,你也可以有TMyEvent
在相同的对象:
type
TMyClass = class
private type
PMyClass = ^TMyClass;
TMyEvent = procedure(Sender: PMyClass) of object;
private
FEvent: TMyEvent;
FSomeValue: string;
public
procedure TheEventHandler(Sender: PMyClass);
property OnSomething: TMyEvent read FEvent write FEvent;
property SomeValue: string read FSomeValue write FSomeValue;
procedure Test;
end;
...
procedure TForm6.FormCreate(Sender: TObject);
var
o: TMyClass;
begin
o := TMyClass.Create;
o.SomeValue := 'This is a test.';
o.OnSomething := o.TheEventHandler;
o.Test;
end;
{ TMyClass }
procedure TMyClass.Test;
begin
FEvent(@Self);
end;
procedure TMyClass.TheEventHandler(Sender: PMyClass);
begin
ShowMessage(TMyClass(Sender^).SomeValue);
end;
你这样做完全一样的。该代码在我的D2010上编译。我不知道你为什么想要这样做。 – 2011-03-31 19:51:37
@ pop33自己已经是一个指针了......你想达到什么目的? – jachguate 2011-03-31 20:09:13
@ pop33:如果你不确定你在做什么,你可能希望使用'Sender:TMyObject'来代替。正如@jachguate所指出的,一个对象变量本质上已经是一个“指针”。 – 2011-03-31 20:15:12