delphi – RTTI可以在设计时从项目代码询问类型吗?

前端之家收集整理的这篇文章主要介绍了delphi – RTTI可以在设计时从项目代码询问类型吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用RTTI在设计时而不是运行时检查项目源文件中包含的类型.

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

这是我的测试例子.它使用一个简单的TListBox后代TMyListBox,它具有一个字符串属性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报告“找不到类型”,这与我对RTTI工作原理的理解是一致的,即在设计时,它只能探索安装在IDE中的包中所包含的类型,而不是项目源文件.

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

解决方法

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

猜你在找的Delphi相关文章