有没有办法确定对对象过程的引用是否对应于 Pascal 中的对象实例?

jro*_*ovs 2 pascal freepascal

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

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

Dav*_*nan 5

我会使用单元中TMethod声明的记录System。该记录包含两个类型为Pointer-Code和 的成员字段Data,它们允许您挑选出该方法的两个指针。在您的情况下,您需要Data成员,这是方法的主题:

function ObjectIsMethodSubject(AObject: TObject; AEvent: TNotifyEvent): Boolean;
begin
  Result := TMethod(AEvent).Data = AObject;
end;
Run Code Online (Sandbox Code Playgroud)