2009-04-22 220 views
3

在德爾福2007年,我添加了一個新的字符串類型,我的項目:如何獲取自定義屬性的屬性類型名稱?

type 
    String40 = string; 

此屬性是在課堂上使用:

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

在運行時,我想要得到的屬性的名稱名字通過使用RTTI。我期望它是String40:

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

但是,在這個例子中PropTypeName是'string'。我需要做什麼才能獲得正確的屬性類型名稱'String40'?

+0

您的代碼中有一些錯誤:=必須是:,缺少屬性關鍵字。你確定你已經測試過嗎? – 2009-04-22 13:29:23

回答

11

這個作品在Delphi5

type 
    String40 = type string; 

至於你的代碼的其餘部分,有RTTI可用,則應該從TPersistent

  • 繼承TPerson或
  • 使用{$ 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. 
+0

太糟糕了...那不能解決它。 – Birger 2009-04-22 13:26:21

4

你需要做兩件事情:

  1. 製作出版的財產。
  2. 使用type關鍵字。

然後,您可以:

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。