Можно ли сделать" неиспользуемые " классы доступными в Delphi XE

Я работаю в 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 для обнаружения всех классов отчетов и перечисления их типов отчетов. После этого я хочу использовать Rtti для создания экземпляра выбранного класса отчета и вызова GenerateReport. В общем, это не так уж и сложно достигать.

однако есть главный недостаток: я никогда не жестко кодирую использование нисходящих классов, поэтому код не включается в исполняемый файл.

есть ли достойный способ заставить компоновщик / компилятор включить эти классы?

a (n ugly) работа вокруг будет имитировать использование отчетов в их разделе инициализации, но я бы предпочел этого не делать. Лучшее решение - сделать базовый класс постоянным и вызвать 'RegisterClass (T * Report);' в разделе инициализации. Это работает, но я не вижу никакой другой необходимости делать их настойчивыми, поэтому я бы предпочел этого не делать. С другой стороны, может быть, это единственный способ сделать это?

спасибо заранее.

2 ответов


можно использовать {$STRONGLINKTYPES ON} директива компилятора, чтобы включить все символы вашего приложения в окончательный exe, помните, что эта опция увеличивает размер исполняемого файла, так как в исполняемый файл включено больше RTTI.


вы можете создать свою собственную версию RegisterClass. Что-то вроде RegisterReportClass. Внутри вы сохраняете свой собственный список классов отчетов, которые можно использовать. Ваша функция регистра будет принимать тип класса TBaseReport - нет необходимости в TPersistent.

ваш метод RegisterReportClass должен быть вызван в разделе инициализации, убедившись, что классы включены.

Если вы посмотрите в графическом блоке, вы можете увидеть TFileFormatsList = class (TList). Это класс, который используется для хранения различных типов графики и может использоваться в качестве примера для создания собственного TReportFormatsList. Delphi использует статическую функцию TPicture.RegisterFileFormat для добавления элементов во внутренний список.