3

在 Delphi 2007 中,我为我的项目添加了一个新的字符串类型:

type
  String40 = string;

此属性用于类中:

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

在运行时,我想使用 RTTI 获取属性 FirstName 的名称。我希望它是 String40:

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

但是,在此示例中,PropTypeName 是“字符串”。我需要做什么才能获得正确的属性类型名称“String40”?

4

2 回答 2

11

这适用于Delphi5

type
  String40 = type string;

至于您的其余代码,要使 RTTI 可用,您应该

  • 从 TPersistent 继承 TPerson 或
  • 为 TPerson 使用 {$M+} 编译器指令
  • 发布 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.
于 2009-04-22T13:22:55.417 回答
4

你需要做两件事:

  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 中测试。

于 2009-04-22T13:27:18.060 回答