可以在Delphi XE中使用"未使用"类

deC*_*man 7 delphi rtti delphi-xe

我在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.
Run Code Online (Sandbox Code Playgroud)

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

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

有没有一种不错的方法来强制链接器/编译器包含这些类?

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

提前致谢.

Mar*_*der 7

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

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

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


RRU*_*RUZ 5

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