Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取自定义属性的属性类型名称?_Delphi_Rtti - Fatal编程技术网

Delphi 如何获取自定义属性的属性类型名称?

Delphi 如何获取自定义属性的属性类型名称?,delphi,rtti,Delphi,Rtti,在Delphi 2007中,我在我的项目中添加了一个新的字符串类型: type String40 = string; 此属性在类中使用: type TPerson = class private FFirstName = String40; published FirstName: string40 read FFirstName write FFirstName; end; 在运行时,我希望使用RTTI获取属性FirstName的名称。我希望是40: v

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

type
  String40 = string;
此属性在类中使用:

type
  TPerson = class
  private
    FFirstName = String40;
  published
    FirstName: string40 read FFirstName write FFirstName;
  end;
在运行时,我希望使用RTTI获取属性FirstName的名称。我希望是40:

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
  PropTypeName := MyPropInfo.PropType^.Name;
但是,在本例中,PropTypeName是“string”。要获得正确的属性类型名称“String40”,我需要做什么?

这在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.

你需要做两件事:

  • 发布属性
  • 使用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;
    
    类型
    String40=类型字符串;
    TPerson=类
    私有的
    FFirstName:String40;
    出版
    属性名:string40读取FFirstName写入FFirstName;
    结束;
    变量
    MyPropInfo:PPropInfo;
    PropTypeName:字符串;
    我的人:特珀森;
    开始
    MyPerson:=TPerson.Create;
    尝试
    MyPerson.FirstName:=“我的名字”;
    MyPropInfo:=GetPropInfo(MyPerson,'FirstName');
    如果是MyPropInfonil,则开始
    PropTypeName:=MyPropInfo^.PropType^.Name;
    备注1.行。添加(PropTypeName);
    结束;
    最后
    MyPerson.FRee;
    结束;
    结束;
    

    在D2009中测试。

    太糟糕了。。。这不能解决问题,是的!添加M+编译器指令为我修复了它。非常感谢。您的代码中有一些错误:=必须是:,缺少属性关键字。你确定你已经测试过了吗?