Can";“未使用”;类在Delphi XE中可用

Can";“未使用”;类在Delphi XE中可用,delphi,delphi-xe,rtti,Delphi,Delphi Xe,Rtti,我在Delphi XE和windows 7中工作 在应用程序中,我希望启用不同的报告类型供用户选择。 为此,我有1个基本报告类和每个报告类型(xml、csv、ppt等)的一个子类 我想做的是使用Rtti检测所有报表类并列出它们的报表类型。 之后,我想使用Rtti创建所选报表类的实例并调用GenerateReport。总而言之,这并不太难实现 但是有一个主要的缺点:我从不硬编码降序类的使用,因此代码不会包含在可执行文件中 有没有合适的方法强制链接器/编译器包含这些类 一个(丑陋的)解决办法是在报告

我在Delphi XE和windows 7中工作

在应用程序中,我希望启用不同的报告类型供用户选择。 为此,我有1个基本报告类和每个报告类型(xml、csv、ppt等)的一个子类

我想做的是使用Rtti检测所有报表类并列出它们的报表类型。 之后,我想使用Rtti创建所选报表类的实例并调用GenerateReport。总而言之,这并不太难实现

但是有一个主要的缺点:我从不硬编码降序类的使用,因此代码不会包含在可执行文件中

有没有合适的方法强制链接器/编译器包含这些类

一个(丑陋的)解决办法是在报告的初始化部分模拟报告的使用,但我不想这样做。 更好的解决方案是使基类持久化并调用“RegisterClass(T*Report);”在初始化部分。这是可行的,但我不认为有任何其他需要使它们持久化,所以我还是不想这样做。另一方面,也许这是唯一的办法


提前感谢。

您可以创建自己版本的RegisterClass。类似RegisterReportClass的东西。在内部,您保留自己的可使用报表类列表。您的注册函数将采用TBaseReport类类型-不需要TPersistent

应该在初始化部分调用RegisterReportClass方法,确保包含这些类


如果查看图形单元,可以看到TFileFormatsList=class(TList)。这个类用于保存不同的图形类型,可以作为创建自己的TReportFormatsList的示例。Delphi使用静态函数TPicture.RegisterFileFormat将项目添加到其内部列表。

您可以使用编译器指令将应用程序的所有符号包含在最终的exe中,请记住,此选项会增加可执行文件的大小,因为可执行文件中包含的RTTI越多。

这是一种方法。关于你的最后一点,与其说是更多的RTTI,不如说是更多的代码。我看到STRONGLINKTYPES的范围是全球性的。你知道本地是否也有可用的等价物吗?只是打开它让我的应用程序检查文件大小的增加。exe从8.3MB增加到9.9MB。虽然这看起来很多,但好处大于我认为的额外大小。@deColaman,恐怕没有一个本地范围与
STRONGLINKTYPES
等效。尽管这确实是可能的,但它基本上是我在最后提到的总和。而且,它会否定我希望通过Rtti实现的动态部分。您仍然可以使用Rtti来处理这些类。但我不知道你为什么要这么做。如果所有东西都有一个公共基类,那么就没有理由使用RTTI。您可以使用内部列表查找类。添加新类时,不需要在使用类列表的代码中更改任何内容。对我来说,跟踪寄存器函数的运行情况比依赖编译器指令更简单。
{Just an illustrating example}
TBaseReport = class
public
  constructor Create;
  procedure GenerateReport; virtual; abstract;
  class function ReportType: string; virtual; abstract;
end;

T*Report = class(TBaseReport);
//Etcetera.