有没有一种方法可以确定对对象过程的引用是否与Pascal中的对象实例相对应?

时间:2020-02-25 10:28:36

标签: pascal freepascal

对于此任务,我的解决方案不是很好,但是有人可以告诉我如何使用标准库或更优雅的方法。当前的解决方案基于以下事实:对对象过程的引用在内存中存储了两个指针,一个指向过程代码的指针和一个指向对象的指针。

function IsObject( const AEvent: TNotifyEvent; const AObject: TObject ): Boolean;
begin
  Result := PointerArray( Pointer( @AEvent )^ )[1] = Pointer( AObject );
end;

1 个答案:

答案 0 :(得分:5)

我将使用在System单元中声明的TMethod记录。记录包含两个类型为Pointer-CodeData的成员字段,使您可以选择方法的两个指针。在您的情况下,您需要Data成员,该成员是方法的主题:

function ObjectIsMethodSubject(AObject: TObject; AEvent: TNotifyEvent): Boolean;
begin
  Result := TMethod(AEvent).Data = AObject;
end;