Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как правильно работать с RTTI в Delphi 2007: избегаем путаницы с типами

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

Работа с RTTI (Runtime Type Information) в Delphi позволяет получать информацию о типах и объектах во время выполнения программы, что может быть полезно для интроспекции и динамического программирования. Однако, как показывает пример в вопросе, иногда возникают трудности с правильным определением типа свойства.

Проблема

В Delphi 2007 был создан новый тип строки String40, который используется в классе TPerson как свойство FirstName. При попытке получить имя типа свойства FirstName с помощью RTTI, ожидается, что имя типа будет String40, но фактически получается string.

Пример кода

type
  String40 = string[40]; // Используем правильный синтаксис для определения типа
  TPerson = class(TPersistent)
  private
    FFirstName: String40;
  published
    property FirstName: string40 read FFirstName write FFirstName;
  end;

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  try
    MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
    PropTypeName := MyPropInfo.PropType^.Name;
  finally
    MyPerson.Free;
  end;
  // Вывод: PropTypeName будет 'string', а не 'String40'
end;

Решение

Чтобы правильно получить имя типа свойства с помощью RTTI, необходимо выполнить несколько условий:

  1. Свойство должно быть опубликовано (published).
  2. Использовать ключевое слово type при определении пользовательского типа.
  3. Класс должен наследоваться от TPersistent или использовать директиву компилятора {$M+}, чтобы обеспечить поддержку RTTI.

Исправленный код

program Project1;
uses
  Classes,
  typInfo,
  Dialogs,
  Forms;

{$R *.RES}

type
  String40 = type string[40]; // Правильное определение пользовательского типа
  TPerson = class(TPersistent)
  private
    FFirstName: String40;
  published
    property FirstName: string40 read FFirstName write FFirstName;
  end;

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  try
    MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
    PropTypeName := MyPropInfo.PropType^.TypeName; // Используем TypeName для получения имени типа
    ShowMessage(PropTypeName); // Должно отобразить 'String40' вместо 'string'
  finally
    MyPerson.Free;
  end;
end.

Заключение

При работе с RTTI в Delphi важно правильно определять типы и свойства, а также учитывать необходимость публикации свойств и поддержки RTTI классом. Следуя этим рекомендациям, можно избежать путаницы с типами и корректно использовать RTTI в своих проектах.

Создано по материалам из источника по ссылке.

Вопрос касается правильного использования RTTI в Delphi 2007 для работы с пользовательскими типами свойств, чтобы избежать неверного определения типа при динамическом получении информации о свойствах объекта.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:53:55/0.0031111240386963/0