Можно ли сделать" неиспользуемые " классы доступными в 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 для добавления элементов во внутренний список.