Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как определить, является ли метод потомком TNotifyEvent

Delphi , Компоненты и Классы , RTTI

Как определить, является ли метод потомком TNotifyEvent

Автор: Jack Sudarev
WEB-сайт: http://www.lmc-mediaagentur.de

If I am given a TPersistent object, and a method name, is there a way to determine if the name is an event of TNotifyEvent type? For example, given a TPersistent lMyObj and an event name, "OnDataChanged", how can I determine if OnDataChanged is a TNotifyEvent?

function IsNotifyEvent(Sender: TObject; const Event: string): Boolean;
var
  PropInfo: PPropInfo;
  Method: TNotifyEvent;
begin
  Result := False;
  PropInfo := GetPropInfo(Sender.ClassInfo, Event);
  if not Assigned(PropInfo) then
    Exit;
  if PropInfo.PropType^.Kind <> tkMethod then
    Exit;
  Method := TNotifyEvent(GetMethodProp(Sender, PropInfo));
  Result := Assigned(Method);
end;

Here is the translation of the text into Russian:

Код, который вы предоставили, является хорошим стартом для определения типа события TNotifyEvent. Однако, есть несколько проблем с ним.

Сначала метод GetPropInfo используется для получения информации о свойстве в классе объекта. Но этот метод возвращает PPropInfo, содержащий информацию о любом свойстве, а не только о методе. Поэтому вам нужно проверить, является ли это свойство действительно методом перед попыткой преобразовать его в TNotifyEvent.

Вторично, при вызове GetMethodProp (используемый для получения метода-свойства) объект, передаваемый как аргумент, должен быть сам объект (Sender) а не его класс-информация.

Вот как вы можете исправить эти проблемы:

function IsNotifyEvent(Sender: TObject; const Event: string): Boolean;
var
  PropInfo: PPropInfo;
begin
  Result := False;
  PropInfo := GetPropInfo(Sender.ClassInfo, Event);
  if not Assigned(PropInfo) then
    Exit;
  if PropInfo^.PropType^.Kind <> tkMethod then
    Exit;
  Result := PropInfo^.PropType = TClass(TNotifyEvent);
end;

В этом коде GetPropInfo используется для получения информации о свойстве в класс-информации объекта. Затем проверяется, является ли это свойство методом. Если это так, то сравниваются типы свойства и TNotifyEvent. Если они равны, то событие типа TNotifyEvent, и функция возвращает True.

Обратите внимание, что этот код предполагает, что класс-информация объекта имеет событие с тем же именем, которое передается в функцию. Если объект не имеет такого события, или если он имеет свойство с тем же именем, но не типа TNotifyEvent, то функция вернет False.

В статье описывается функция IsNotifyEvent, которая determines whether a given method name is an event of type TNotifyEvent by checking if the property with that name exists and its value is a TNotifyEvent method.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: RTTI ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-19 17:53:24
2024-05-19 19:48:00/0.0031118392944336/0