我想使用 RTTI 在设计时而不是运行时检查项目源文件中包含的类型。
据我所知,这是不受支持的,但评论中的讨论这个问题 https://stackoverflow.com/questions/9046778/class-reference-as-property表明这是可能的,并且已经用于多个 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
- Drop
MyListBox1
onto TForm1
- 保存、编译、运行
Project1
- 关上
Project1
应用程序(但不是项目)
- 在对象检查器集中
MyListBox1.TypeToExplore
to Unit1.TForm1
And the MyListBox1
报告“未找到类型”,这与我对 RTTI 工作原理的理解一致,即在设计时它只能探索安装到 IDE 中的包中包含的类型,而不是项目源文件。
如果 IDE 确实能够检查项目中声明的类型,那么我缺少什么?
我对 RTTI.pas 源代码的阅读使我得出结论:Delphi RTTI 无法检查 IDE 的当前项目。在设计时,RTTI 能够检查 IDE 托管的包内的类型。除此之外它无法进行更多检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)