【发布时间】: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