Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Написание собственных компонент для диалога FastReport

z8jpzq4lwbg

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

В предпечатном диалоге 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-676870ac805b9715910222/]

Начинаем описывать компонент TfrxDBGridEh, который мы создадим от базового диалогового класса TfrxDialogControl. По сути мы передекларируем свойства базового компонента DBGridEh в компонент для использования в FastReport. Передекларировать можно не все свойства, методы, обработчики событий, а только те, которые нужны для работы.

В разделе private рекомендую обратить особое внимание на следующее:
[crayon-676870ac805c4710412536/]
Остальные методы в этом разделе нужны для чтения/записи свойств DBGridEh, которые будем задавать у frxDBGridEh в диалоге FastReport. Эти методы являются некими посредниками между frxDBGridEh и DBGridEh.

В разделе protected находятся три системных переопределяемых метода для обработки событий, происходящих в дизайнере FastReport: удаление источника данных, который уже подключен в гриду, задание методов для чтения/записи колонок грида в файл шаблона отчета fr3 и обработка задания имени компонента.
[crayon-676870ac805c6511131761/]
В разделе public находятся такие методы как конструктор и деструктор нашего компонента. Внутри конструктора помимо прочего, нужно создать базовый (внутренний) DBGridEh, интерфейс подключения данных (DataSource) для  соединения с гридом и обработчиками событий.

Задаем описание нашего грида, которое будет видно в дизайнере FastReport, а также дополнительные методы для сохранения коллекции колонок грида в виде XML в шаблон отчета fr3. Остальные методы и свойства этого раздела нужны для возможности их программного использования в скрипте отчета.
[crayon-676870ac805ca156123914/]
В разделе published находится свойства и обработчики событий, которые будут видны в инспекторе объектов дизайнера FastReport и которые также можно будет задавать в скрипте отчета.

Обратите внимание на раздел initialization в котором задано:

  1. описание обработчиков событий грида для разных языков программирования скрипта отчета;
  2. регистрация грида в палитре компонентов 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.

Exit mobile version