Есть ли способ определить, соответствует ли ссылка на процедуру объекта экземпляру объекта в Pascal? - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть не очень хорошее решение для этой задачи, но может кто-нибудь сказать мне, как использовать стандартную библиотеку или более элегантный подход. Текущее решение основано на том факте, что ссылка на процедуру объекта хранит в памяти два указателя, указатель на код процедуры и указатель на объект.

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

1 Ответ

5 голосов
/ 25 февраля 2020

Я бы использовал запись TMethod, объявленную в единице System. Запись содержит два поля-члена типа Pointer - Code и Data, которые позволяют вам выбрать два указателя метода. В вашем случае вам нужен элемент Data, который является предметом метода:

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