我想使用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
组件
Project1
MyListBox1
放到TForm1
Project1
Project1
应用程序(但不是项目)MyListBox1.TypeToExplore
设置为Unit1.TForm1
MyListBox1
报告&#34;找不到类型&#34;这符合我对RTTI如何工作的理解,即在设计时它只能探索安装在IDE中的包中包含的类型,而不是项目源文件。
如果IDE确实能够检查项目中声明的类型,我缺少什么?
答案 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托管的包内的类型。它无法进一步检查。