2011-03-31 5 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에서 컴파일됩니다. 왜 그렇게하고 싶지는 모르겠습니다. –

+1

@ pop33 셀프는 이미 포인터입니다 ... 달성하려는 것은 무엇입니까? – jachguate

+0

@ pop33 : 당신이하고있는 일에 대해 잘 모르겠다면, 아마도 대신'Sender : TMyObject'를 쓰길 원할 것입니다. @jachguate가 가리키는 것처럼, 객체 변수는 본질적으로 이미 "포인터"입니다. –

답변

5

당신은 무엇을하려고합니까? 물론 TMyEvent을 아직 할당하지 않았으므로 FTest으로 전화 할 수 없습니다! 그리고 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

@Arereas 클래스에 비공개 인 유형을 선언하여 범위를 제한하고 네임 스페이스 오염을 피하는 것은 매우 일반적입니다. Delphi는 많은 네임 스페이스 기능을 가지고 있지 않습니다. // 오류가 발생했습니다! 컴파일러 오류를 의미합니다. –

+0

@David : 알아. 나는 오늘 일찍 그 일을했다. 그러나 이벤트 유형이 수업 외부에 있어야한다는 논리에 따라 인상을 받았다. –

+0

@Andreas 개인 형 선언이 마음에 들었고 내 D6 코드베이스가 그 방향으로 움직이고 있습니다. –

관련 문제