【问题标题】:Enable Delphi XE RTTI only for some classes仅对某些类启用 Delphi XE RTTI
【发布时间】:2011-11-04 08:01:15
【问题描述】:

我正在尝试仅为我的一部分课程启用 RTTI。

原因是对于那些我想要 RTTI 的类,我也想要公共方法上的 RTTI,但如果在项目范围内启用了它,那么来自所有类的所有公共方法都会进入最终的可执行文件。 这基本上关闭了智能链接,因为编译器认为每个公共方法都可以在运行时调用,因此最终编译了几乎所有内容,并且厨房下沉到可执行文件中......

我已经尝试了几件事:

  • 在项目级别使用 {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 关闭 RTTI,然后为相关单元重新启用它会导致 $RTTI 指令在编译时(编译器中某处的 AV)崩溃。
  • 在项目级别关闭 RTTI,然后在逐个类编译时启用它,但在运行时,当尝试访问公开类的 RTII 时,会导致“Rtti.pas”深处出现不合格的 AV
  • 通过嵌入在“.inc”中的 $RTTI 指令控制 RTTI,所有单元在编译时都使用随机 AV 结果(总是在 $RTTI 指令的行,但并不总是针对同一个单元)。

还有其他想法吗?

【问题讨论】:

  • 据我所知,这样做的公认方法是有一个 TMyCustomClass(根本没有发布的项目),然后是一个 TMyClass,其中只有一个列出要显示的项目的已发布部分。 VCL 经常这样做(TCustomForm / TForm 等)。
  • 我的情况有些不同,f.i.您可以在 DWScript 的单元测试中看到它发生的情况:我希望为暴露测试中使用的类公开 RTTI,但不为其他所有内容公开。如果没有这样的过滤器,基于 RTTI 的类展示就会出现问题,因为它会成为暴露所有内容或完全不使用 RTTI 以避免暴露所有内容之间的二元选择......
  • 您正在尝试做的事情和您尝试过的方法对我来说似乎很好。听起来像是编译器或“RTTI 设计”错误。
  • @Brian:您所描述的只是一种更改属性可见性的方法,以便 TMyClass 将在 Object Inspector 中显示其属性,而 TMyCustomClass 可用于派生您自己的类,而无需已发布属性的“负担”。 (在旧的 RTTI 样式中,只有已发布的属性具有 RTTI)。
  • QC 终于响应,添加为 98261

标签: delphi rtti


【解决方案1】:

作为 QC 98261 提交的编译器错误供 Embarcadero 考虑。

运行时 AV 与属性相关,因此解决方法是确保(手动,没有编译器错误或警告)公开类中使用的属性都具有 RTTI,否则您将获得不合格的运行时 AV .

只要在单元的“unit”语句之前使用 $RTTI 指令,编译器 AV 就会发生,如果你把它放在 AV 没有发生并且它工作之后。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2010-09-15
    • 1970-01-01
    • 2014-01-13
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多