7

我在Delphi XE,Windows 7中工作。

在应用程序中,我想为我的用户选择不同的报告类型。为此,我有 1 个基本报告类和每个报告类型(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。总而言之,这并不太难实现。

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

有没有一种体面的方法可以强制链接器/编译器包含这些类?

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

提前致谢。

4

2 回答 2

7

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

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

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

于 2012-09-22T23:39:23.760 回答
5

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

于 2012-09-23T00:21:01.707 回答