gpt4 book ai didi

delphi - RTTI 可以在设计时询问项目代码中的类型吗?

转载 作者:行者123 更新时间:2023-12-03 14:42:13 25 4
gpt4 key购买 nike

我想使用 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组件I

  • 编译并安装到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 - RTTI 可以在设计时询问项目代码中的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9057312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com