我想使用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承载的软件包内的类型.它不能进一步检查.