То, о чем вы просите, это возможно с какой-то уродливой TMethod
хакерской атакой, например:
type
TFrmSelfRef = class(TForm)
BtnTest: TButton;
procedure BtnTestClick(Sender: TObject);
private
public
procedure ExternalCaller;
end;
type
TProcType = procedure of object;
type
TSomeObj = class
private
FIdentifier: Integer;
FCaller : TProcType;
public
property Caller : TProcType read FCaller write FCaller;
property Identifier : Integer read FIdentifier write FIdentifier;
end;
...
procedure TFrmSelfRef.BtnTestClick(Sender: TObject);
var
lSomeObj: TSomeObj;
P: TProcType;
begin
lSomeObj := TSomeObj.Create;
try
lSomeObj.Identifier := 200;
//lSomeObj.Caller := ExternalCaller;
P := ExternalCaller;
TMethod(P).Data := lSomeObj;
lSomeObj.Caller := P;
lSomeObj.Caller;
finally
lSomeObj.Free;
end;
end;
procedure TFrmSelfRef.ExternalCaller;
begin
ShowMessage('The Identifier is ' + IntToStr(TSomeObj(Self).Identifier));
end;
Но это очень опасно, если его неправильно использовать. Я не рекомендую этот подход! Я представляю его только для полноты.
Вместо этого используйте решение Питера.
Другое решение - переместить ExternalCaller()
в TSomeObj
, например:
type
TFrmSelfRef = class(TForm)
BtnTest: TButton;
procedure BtnTestClick(Sender: TObject);
private
public
end;
type
TProcType = procedure of object;
type
TSomeObj = class
private
FIdentifier: Integer;
FCaller : TProcType;
public
procedure ExternalCaller;
property Caller : TProcType read FCaller write FCaller;
property Identifier : Integer read FIdentifier write FIdentifier;
end;
...
procedure TFrmSelfRef.BtnTestClick(Sender: TObject);
var
lSomeObj: TSomeObj;
P: TProcType;
begin
lSomeObj := TSomeObj.Create;
try
lSomeObj.Identifier := 200;
lSomeObj.Caller := lSomeObj.ExternalCaller;
lSomeObj.Caller;
finally
lSomeObj.Free;
end;
end;
procedure TSomeObj.ExternalCaller;
begin
ShowMessage('The Identifier is ' + IntToStr(Identifier));
end;