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

时间:2012-01-29 22:21:36

标签: delphi rtti design-time

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

据我所知,这是不受支持的,但this question的评论中的讨论表明它可能并且已经用于几个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.

使用此TMyListBox组件

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

MyListBox1报告&#34;找不到类型&#34;这符合我对RTTI如何工作的理解,即在设计时它只能探索安装在IDE中的包中包含的类型,而不是项目源文件。

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

2 个答案:

答案 0 :(得分:1)

  

问:您能否在设计时查询/利用Delphi IDE中的类型?

答:是的,当然:)

  

问:IDE是否直接使用RTTI?

AFAIK,IDE的类型,方法等“知识”与运行时RTTI是分开的,不同的。 AFAIK,例如Java内省/ Eclipse IDE /调试器或.Net Reflection / MSVS IDE /调试器也是如此。

这篇文章可能有所帮助:

答案 1 :(得分:1)

我对RTTI.pas源码的阅读使我得出结论,Delphi RTTI无法检查IDE的当前项目。在设计时,RTTI能够检查IDE托管的包内的类型。它无法进一步检查。