RTTI可以在设计时从项目代码中查询类型吗?

Lac*_*anG 10 delphi design-time rtti

我想使用RTTI在设计时而不是运行时检查项目源文件中包含的类型.

据我所知,这是不受支持的,但是这个问题的评论中的讨论表明它可能并且已经有几个Delphi版本.这是我第一次听说这个功能可用但是我一直无法为自己重现它.

这是我的测试示例.它使用一个简单的TListBox后代TMyListBox,它具有一个string属性TypeToExplore,该属性在设置时使用输入的限定类型名称的属性填充列表框.

unit MyListBox;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

type
  TMyListBox = class(TListBox)
  private
    FTypeToExplore : string;
    procedure SetTypeToExplore(const inValue: string);
    procedure FillWithTypeDetails;
  published
    property TypeToExplore : string read FTypeToExplore write SetTypeToExplore;
  end;

procedure Register;

implementation

uses
  RTTI, TypInfo;

procedure TMyListBox.SetTypeToExplore(const inValue: string);
begin
  if inValue = FTypeToExplore then
    Exit;

  FTypeToExplore := inValue;
  Clear;
  FillWithTypeDetails;
end;

procedure TMyListBox.FillWithTypeDetails;
var
  context : TRTTIContext;
  theType : TRttiType;
  properties : TArray<TRttiProperty>;
  prop : TRttiProperty;
begin
  theType := context.FindType(FTypeToExplore);
  if Assigned(theType) then begin
    properties := theType.GetProperties;
    for prop in properties do
      Items.Add(prop.Name);
  end else
    Items.Add('No type found');
end;

procedure Register;
begin
  RegisterComponents('Samples', [TMyListBox]);
end;

end.
Run Code Online (Sandbox Code Playgroud)

使用这个TMyListBox组件我

  • 编译并将其安装到Delphi XE IDE中
  • 将组件DCU位置添加到IDE库路径
  • 重新启动IDE只是为了确保
  • 创建一个新的空 Project1
  • 下降MyListBox1TForm1
  • 保存,编译和运行 Project1
  • 关闭Project1应用程序(但不是项目)
  • 在对象检查器中设置MyListBox1.TypeToExploreUnit1.TForm1

MyListBox1报告"未发现型",这是我的RTTI是如何工作的理解一致,即在设计时,只能探索包含安装到IDE中,而不是项目源文件包中的类型.

如果IDE确实能够检查项目中声明的类型我缺少什么?

Dav*_*nan 1

我对 RTTI.pas 源代码的阅读使我得出结论:Delphi RTTI 无法检查 IDE 的当前项目。在设计时,RTTI 能够检查 IDE 托管的包内的类型。除此之外它无法进行更多检查。