2011-03-31 47 views
0
type 
    TMyClass = class 
    type 
    PMyClass = ^TMyClass; 
    TMyEvent = procedure(Sender: PmyClass) of object; 
    public 
    FTest: TMyEvent; 
    procedure Test; 
    end; 

procedure TMyClass.Test; 
begin 
    FTest(@Self); //error! 
end; 

我该怎么做?指向自我,如何?

+0

你这样做完全一样的。该代码在我的D2010上编译。我不知道你为什么想要这样做。 – 2011-03-31 19:51:37

+1

@ pop33自己已经是一个指针了......你想达到什么目的? – jachguate 2011-03-31 20:09:13

+0

@ pop33:如果你不确定你在做什么,你可能希望使用'Sender:TMyObject'来代替。正如@jachguate所指出的,一个对象变量本质上已经是一个“指针”。 – 2011-03-31 20:15:12

回答

5

你想要做什么?当然你不能拨打FTest,因为你还没有分配任何TMyEvent!并PMyClassTMyEvent真的应该是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; 
+1

@Andreas声明类的私有类型以限制其范围并避免命名空间污染是非常正常的。 Delphi没有太多的名字空间功能。我拿走了//错误!意味着编译器错误。 – 2011-03-31 19:59:40

+0

@David:我知道。你知道,我今天早些时候做过这件事。但我得到的印象是逻辑规定事件类型应该在课堂之外。 – 2011-03-31 20:00:42

+0

@Andreas我喜欢私人类型声明,而我的旧D6代码库正朝着这个方向发展。 – 2011-03-31 20:01:30