可以在Delphi XE中使用“未使用”类

时间:2012-09-22 21:38:45

标签: delphi delphi-xe rtti

我在Delphi XE,Windows 7中工作。

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

{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.

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

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

是否有一种不错的方法可以强制链接器/编译器包含这些类?

一个(丑陋的)解决方法是在初始化部分模拟报告的使用,但我宁愿不这样做。 更好的解决方案是使基类持久化并调用'RegisterClass(T * Report);'在初始化部分。它有效,但我没有看到任何其他需要使它们持久化,所以再次,我宁愿不这样做。另一方面,也许这是唯一的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:7)

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

应该在Initialization部分调用RegisterReportClass方法,确保包含类。

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

答案 1 :(得分:5)

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