При создании отчета важно не только сделать красивую печатную форму, которая будет выводить нужные пользователю данные, но удобный предпечатный диалог, где пользователь может задать параметры формирования отчета.
В предпечатном диалоге FastReport уже имеется некоторое число компонент,
например, Label, Edit, Button, Memo. Но иногда этого недостаточно и приходится писать свои диалоговые компоненты для FastReport. По сути они являются аналогами обычных Delphi-компонент, которые можно использовать в диалоговых формах FastReport. Соответственно в этой статье и пойдет речь о написании такого компонента.
В качестве дополнительной документации рекомендуем почитать документацию
по FastScript и руководства разработчика и программиста по FastReport VCL.
Для отображения данных из базы в данной статье используется компонент DBGridEh из библиотеки EhLib VCL, который будет интегрирован в диалог FastReport. В качестве среды разработки использована Delphi 10.4.2, но все описанное далее будет подходить и для любых других Delphi начиная с версии 7 (с поправкой на версию).
Создаем новый пакет (dpk) и задаем ему имя frxDBGridEh27. В него добавляем новый файл frxDBGridEhControl.pas, который будет основой нашего грида.
В этом файле для регистрации в Delphi мы объявим компонент:
[crayon-673f67b5cc088683564249/]
Начинаем описывать компонент TfrxDBGridEh, который мы создадим от базового диалогового класса TfrxDialogControl. По сути мы передекларируем свойства базового компонента DBGridEh в компонент для использования в FastReport. Передекларировать можно не все свойства, методы, обработчики событий, а только те, которые нужны для работы.
В разделе private рекомендую обратить особое внимание на следующее:
[crayon-673f67b5cc090794405536/]
Остальные методы в этом разделе нужны для чтения/записи свойств DBGridEh, которые будем задавать у frxDBGridEh в диалоге FastReport. Эти методы являются некими посредниками между frxDBGridEh и DBGridEh.
В разделе protected находятся три системных переопределяемых метода для обработки событий, происходящих в дизайнере FastReport: удаление источника данных, который уже подключен в гриду, задание методов для чтения/записи колонок грида в файл шаблона отчета fr3 и обработка задания имени компонента.
[crayon-673f67b5cc092453156620/]
В разделе public находятся такие методы как конструктор и деструктор нашего компонента. Внутри конструктора помимо прочего, нужно создать базовый (внутренний) DBGridEh, интерфейс подключения данных (DataSource) для соединения с гридом и обработчиками событий.
Задаем описание нашего грида, которое будет видно в дизайнере FastReport, а также дополнительные методы для сохранения коллекции колонок грида в виде XML в шаблон отчета fr3. Остальные методы и свойства этого раздела нужны для возможности их программного использования в скрипте отчета.
[crayon-673f67b5cc094223156864/]
В разделе published находится свойства и обработчики событий, которые будут видны в инспекторе объектов дизайнера FastReport и которые также можно будет задавать в скрипте отчета.
Обратите внимание на раздел initialization в котором задано:
- описание обработчиков событий грида для разных языков программирования скрипта отчета;
- регистрация грида в палитре компонентов FastReport.
Теперь добавим в наш пакет еще один модуль frxDBGridEhColumnsEditor (это код плюс форма). В этом модуле используются возможности FastReport по визуальной работе с коллекциями в дизайнере. На данном этапе создаём редактор колонок грида аналогичный редактору колонок в Delphi. В разделе initialization регистрируем этот редактор в среде FastReport для визуального редактирования набора колонок frxDBGridEh.
В этом модуле есть два класса: TfrxDBGridEhColumnsEditorForm — форма редактора колонок с необходимым функционалом и TfrxDBGridEhEditor для подключения (возможности вызова) нашего редактора из дизайнера FastReport.
Далее добавляем в пакет еще один файл frxDBGridEhEditor в который мы поместим редакторы свойств грида. В первую очередь добавим свойство для редактирования колонок, связав Columns :TDBGridColumnsEh с нашим редактором.
Теперь создаём редактор для выбора источника данных. А благодаря тому, что методы SetDataSet и SetDataSetName мы сделали более универсальными, чем, например, в штатном frxDBLookupComboBox, то в качестве источника данных можно использовать как наследников TDataSet (Delphi), так и наследников TfrxDBDataset (FastReport). Напоследок добавляем редактор для выбора поля для колонки грида.
Последним модулем в наш пакет добавим файл frxDBGridEhRTTI, где реализуем класс TFunctions = class(TfsRTTIModule), внутри которого добавим для скрипта отчета (FastScript) классы, методы и свойства, которые мы захотим из него программно вызывать. Например, методы для программного добавления/удаления колонок и для сохранения состояния колонок грида.
Конечным шагом является создание файла frxDBGridEh.dcr с иконкой нашего компонента для отображения в палитре компонент Delphi и файла frxDBGridEh.res с иконкой нашего компонента для отображения в палитре компонент FastReport.
По ссылке вы можете найти полный код компонента TfrxDBGridEh.