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 は「string」です。正しいプロパティ タイプ名「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

次の 2 つのことを行う必要があります。

  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 でテスト済み。

于 2009-04-22T13:27:18.060 に答える