Как получить имя типа свойства для пользовательских свойств?

В Delphi 2007 я добавил в свой проект новый строковый тип:

type
  String40 = string;

Это свойство используется в классе:

type
  TPerson = class
  private
    FFirstName = String40;
  published
    FirstName: string40 read FFirstName write FFirstName;
  end;

Во время выполнения я хочу получить имя свойства FirstName с помощью RTTI. Я ожидаю, что это будет String40:

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
  PropTypeName := MyPropInfo.PropType^.Name;

Однако в этом примере PropTypeName — «строка». Что мне нужно сделать, чтобы получить правильное имя типа свойства, «String40»?


person Birger    schedule 22.04.2009    source источник
comment
У вас есть несколько ошибок в коде: = должно быть :, отсутствует ключевое слово свойства. Вы уверены, что тестировали его?   -  person Toon Krijthe    schedule 22.04.2009


Ответы (2)


Это работает в Delphi5

type
  String40 = type string;

Что касается остальной части вашего кода, чтобы иметь доступ к RTTI, вы должны

  • наследовать TPerson от TPersistent или
  • используйте директиву компилятора {$M+} для TPerson
  • сделать свойство Firstname опубликованным

Изменить: что произойдет, если вы скомпилируете и запустите этот фрагмент кода?

program Project1;

uses
  Classes,
  typInfo,
  Dialogs,
  Forms;

{$R *.RES}

type
  String40 = type string;
  TPerson = class(TPersistent)
  private
    FFirstName: String40;
  published
    property FirstName: string40 read FFirstName write FFirstName;
  end;

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;

begin
  Application.Initialize;
  MyPerson := TPerson.Create;
  MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
  PropTypeName := MyPropInfo.PropType^.Name;
  ShowMessage(PropTypeName);
end.
person Lieven Keersmaekers    schedule 22.04.2009
comment
очень жаль... это не исправит. - person Birger; 22.04.2009
comment
Да! Добавление директивы компилятора M+ исправило это для меня. Большое спасибо. - person Birger; 22.04.2009

Вам нужно сделать две вещи:

  1. Сделайте свойство опубликованным.
  2. Используйте ключевое слово типа.

Затем вы получаете:

type
  String40 = type string;
  TPerson = class
  private
    FFirstName : String40;
  published
    property FirstName: string40 read FFirstName write FFirstName;
  end;

var
  MyPropInfo: PPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  try
    MyPerson.FirstName := 'My first name';
    MyPropInfo := GetPropInfo(MyPerson, 'FirstName');
    if MyPropInfo<>nil then begin
      PropTypeName := MyPropInfo^.PropType^.Name;
      Memo1.Lines.Add(PropTypeName);
    end;
  finally
    MyPerson.FRee;
  end;
end;

Проверено в D2009.

person Toon Krijthe    schedule 22.04.2009