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

2024-01-11

我想使用 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(使用前将#替换为@)

RTTI 可以在设计时询问项目代码中的类型吗? 的相关文章

  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • Vista 中的文本转语音

    我通过在 2000 NT XP 中使用 Delphi 创建 OLE 对象来做到这一点 如下所示 Voice CreateOLEObject SAPI SpVoice Voice speak 但这在 Vista 中不起作用 我怎样才能让我的程
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • 如何将 Delphi Chromium Embedded (TChromium) 组件的声音静音?

    我需要将某个声音静音TChromium组件来制作无声浏览器 主要问题是在 Windows XP 上 当我将浏览器的声音静音时 它会静音整个系统的声音 有没有办法让电脑静音TChromium成分 我已经成功使用以下代码 procedure C
  • 使用 (Object as TClass) 和 TClass(Object) 进行强制转换有什么区别

    有问题在哪里MyObj classnameis TMyClass classname 是真的并且TMyClass MyObj 有效但是 MyObj as TMyclass doSomething抛出转换错误 我真的不需要任何关于这些垃圾的帮
  • delphi专家中的第三方依赖

    我正在编写一个delphi ide Expert 带有一些第三方依赖项 视觉控件 我的问题是当这个专家将安装在目标机器上时 这台电脑是否也需要安装这些第三方组件 或者组件是embeded在生成的 bpl 内部 它们将依赖于您放置在包的 re
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 如何在Delphi中实现人工神经网络? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要一个人工神经网络 42 个输入神经元 168 个隐藏神经元 7个输出神经元 这个网络就是玩 连四子 的游戏 每场比赛结束时 网络
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该
  • 有没有办法在 TRttiField 中 FieldType 为零的结构中获取 real48 和短字符串变量的 RTTI 提示?

    我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽 可能是故意的 我想转储包含大约 1500 个不同字段的记录类型中的所有字段 是的 认真的 其中一些是 real48 类型 一些是短字符串 对于这两种类型 在运行时这些类型的 F
  • TRichEdit和URL高亮问题

    我正在使用当前代码在 TRichEdit 上突出显示 URL procedure TForm1 WndProc var Message TMessage var p TENLink strURL string begin if Messag
  • 为什么变量被声明为 TStrings 并被创建为 TStringList?

    为什么变量声明为TStrings并创建为TStringList 例如 varsl被声明为TStrings但创建为TStringList var sl TStrings begin sl TStringList Create add stri
  • 以高效的方式将字符串转换为十六进制

    我开发了以下函数将字符串转换为十六进制值 function StrToHex const S String String const HexDigits array 0 15 of Char 0123456789ABCDEF var I I
  • 如果鼠标不在 VirtualTreeView (TVirtualStringTree) 上,如何禁用 MouseWheel

    如果 TVirtualStringTree 获得焦点 则默认情况下它会在鼠标滚轮上滚动 即使鼠标未超出控制范围 除非它位于另一个 TVirtualStringTree 上方 有没有一种快速而优雅的方法来禁用这种行为 我已经这样做了OnMou
  • 在 Delphi 中强制非阻塞临时提示窗口

    我一直在寻找 但找不到解决方案 所以我想也许我应该简单地发布它 这是我想要在 Delphi 2009 中做的事情 在我的应用程序中的某个时刻 我想向用户显示一条消息 这应该是正常的提示窗口 在正常应用程序定义的提示暂停后自动消失 并带有自定
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible

随机推荐

  • Rails 3 迁移:添加参考列?

    如果我创建一个新的 Rails 3 迁移 例如 rails g migration tester title tester user references 一切正常 但是 如果我添加一个列 其中包含以下内容 rails g migratio
  • Apache Spark——使用spark-submit抛出NoSuchMethodError

    要将 Spark 应用程序提交到集群 他们的文档指出 为此 请创建一个包含代码及其依赖项的程序集 jar 或 uber jar sbt 和 Maven 都有汇编插件 创建程序集 jar 时 将 Spark 和 Hadoop 列为提供的依赖项
  • 在 Heroku 上部署 Django 博客期间显示错误

    当我在 heroku 中部署应用程序时显示此错误 remote ERROR Could not find a version that satisfies the requirement apturl 0 5 2 from r tmp bu
  • 使用scrapy+splash返回html

    我正在尝试弄清楚 scrapy 和splash 作为练习 我尝试让闪屏点击以下 javascript 重度网站上的按钮 http thestlbrowns com http thestlbrowns com 然后返回新渲染页面的html 我
  • Xcode Playground 中的自定义字体

    我正在用代码编写界面布局 由于每次我逐像素测试字体大小或视图布局时重新加载应用程序很烦人 所以我开始在操场上这样做 这确实有很大帮助 但我确实很怀念那里的自定义字体 有没有办法向您的游乐场添加自定义字体 首先 将 ttf 文件添加到 Pla
  • Mysql 中 SQL join ON 不相等

    我有两张桌子 两者都包含问题 ID 字段 我想从第一个表中获取第二个表中不存在的所有记录 我不想使用 NOT IN 约束作为具有超过 400000 条记录的第二个表 尝试类似的东西 SELECt t1 FROM Table1 t1 LEFT
  • 还没有适用于 Python 3(或 3.3)的 wxPython 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想开始使用 wxPython 但我发现它没有针对 Python 3 进行更新 我正在使用最新版本的 Python 即 3 3 所以我开始
  • sonarqube 5.2 后台任务有时会失败且没有日志

    似乎有超过一半的时间我尝试使用 Sonar Runner 2 4 对几个不同的项目执行分析 分析成功完成 但发布 通过后台任务 到 SonarQube 失败 我在 SonarQube 服务器上找不到包含失败任务相关信息的日志 至少我找不到任
  • ERROR:ssl_client_socket_openssl.cc(1158)] ChromeDriver Chrome 浏览器和 Selenium 握手失败

    当使用 Chrome 驱动程序运行我的 python selenium 脚本时 每次加载页面时我都会收到以下大约三个错误消息 即使一切正常 有没有办法抑制这些消息 24412 18772 0617 090708 错误 ssl client
  • 激活/停用移动菜单并调整大小后桌面菜单消失

    该网站是响应式网站 您可以通过以下方式复制问题 以桌面宽度加载网站 导航元素加载良好 调整大小为平板电脑或手机大小 菜单转换为带有三栏图标的移动式下拉菜单 打开和关闭移动导航菜单 设置为显示 无 现在 当您调整大小到桌面宽度时 导航栏仍设置
  • 使用 Perl 访问 BerkeleyDB 的正确方法是什么?

    我在使用 BerkeleyDB 时遇到了一些问题 我有相同代码的多个实例指向单个数据库文件存储库 并且一切正常运行 5 32 小时 然后突然出现死锁 命令提示符会在执行 db get 或 db put 或游标创建调用之前停止 所以我只是询问
  • 在selenium webdriver中什么是manage() [driver.manage()]

    我的一个朋友问了我一个问题 下面是最大化窗口的代码 driver manage window maximize what is manage here 据我所知manage 是抽象方法 请任何人解释一下下面这一行的含义 我们如何使用maxi
  • 当我尝试通过控制面板打开 xampp shell 时,应用程序无法正确启动 0xc0000142 错误

    将最新的 Xampp 版本与 PHP 7 结合使用 cmd exe 应用程序无法正确启动 0xc000142 单击 确定 即可关闭应用程序 当我单击shellXAMPP 控制面板中的按钮 我重新安装了 XAMPP 但它不起作用 我将环境表更
  • 谁能解释一下 chrome 扩展的清单文件中的“match_about_blank”有什么用?

    我是 chrome 扩展的新手 但不知道清单文件中 match about blank 属性的使用 谁能用简单的话解释一下 让我首先引用 match about blank 的文档 https developer chrome com ex
  • 导航视图和半透明状态栏

    我遵循了有关如何实现这一目标的所有提示 但到目前为止没有成功 我想要一个半透明 透明 不确定区别 状态栏 2016 年 3 月 25 日更新 我尝试了各种Theme属性都没有进展 更新了我对 v21 样式文件的尝试和Bounty 有人有想法
  • Promise.resolve() 什么时候触发 then() 方法? [复制]

    这个问题在这里已经有答案了 我正在学习js中的Promise 我对此有一些疑问 这是代码 Promise resolve then gt console log 0 return Promise resolve 4 then res gt
  • 如何使用 openssl 验证电子邮件中的 DKIM 签名?

    我已经为我的 postfix 设置了 opendkim 现在所有外发邮件都有 DKIM Signature 标题 我想要做的是手动验证 无需 DNS 和外部实用程序 最好仅使用 openssl 消息是否获得正确的签名 所以作为输入数据我有
  • 嵌套 FOR 循环和 IF 条件的问题

    我有几行文字 然后我有一个包含测试词的列表 我喜欢查找文本的每一行并检查其中是否出现一个测试词 在此之前 这与如下命令配合使用效果很好 IF not stringToTest searchstring stringToTest 但是 现在这
  • 删除MySQL查询中的重复结果

    MySQL 查询检索 totalpoints name 55 John Doe 55 John Doe 55 John Doe 55 John Doe 55 John Doe 21 Jean London 21 Jean London 13
  • RTTI 可以在设计时询问项目代码中的类型吗?

    我想使用 RTTI 在设计时而不是运行时检查项目源文件中包含的类型 据我所知 这是不受支持的 但评论中的讨论这个问题 https stackoverflow com questions 9046778 class reference as