При создании отчета важно не только сделать красивую печатную форму, которая будет выводить нужные пользователю данные, но удобный предпечатный диалог, где пользователь может задать параметры формирования отчета.
В предпечатном диалоге 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 мы объявим компонент:
1 |
TfrxDBGridEhDialogControl = class(TComponent); |
Начинаем описывать компонент TfrxDBGridEh, который мы создадим от базового диалогового класса TfrxDialogControl. По сути мы передекларируем свойства базового компонента DBGridEh в компонент для использования в FastReport. Передекларировать можно не все свойства, методы, обработчики событий, а только те, которые нужны для работы.
В разделе private рекомендую обратить особое внимание на следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
private FDBGridEh :TDBGridEh; // The base component, the properties of which we will set and methods of which we will call FDataSource :TDataSource; // Interface between grid and data source in FastReport // Variables that will store the name of the event handlers FOnGetCellParams :TfrxGetCellParamsEvent; FOnGetBtnParams :TfrxGetBtnParamsEvent; FOnTitleBtnClick :TfrxTitleClickEvent; FOnDrawColumnCell :TfrxDrawColumnCellEvent; FOnColEnter :TfrxColEnterEvent; FOnCellClick :TfrxCellClickEvent; FOnColWidthsChanged :TfrxNotifyEvent; // These system procedures are needed to save and restore grid columns to the fr3 report template. procedure ReadData(Reader: TReader); procedure WriteData(Writer: TWriter); // These three methods are needed to be able to connect a basic data source of the TfrxDBDataset (FastReport) or TDataSet (Delphi) type to the grid. function GetDataSet: TDataSet; procedure SetDataSet(const Value: TDataSet); procedure SetDataSetName(const Value: String); // This is the event handler code procedure DoGetCellParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor; State: TGridDrawState); procedure DoTitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh); procedure DoGetBtnParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor; var SortMarker: TSortMarkerEh; IsDown: Boolean); procedure DoDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState); procedure DoColEnter(Sender: TObject); procedure DoCellClick(Column: TColumnEh); procedure DoColWidthsChanged(Sender: TObject); |
Остальные методы в этом разделе нужны для чтения/записи свойств DBGridEh, которые будем задавать у frxDBGridEh в диалоге FastReport. Эти методы являются некими посредниками между frxDBGridEh и DBGridEh.
В разделе protected находятся три системных переопределяемых метода для обработки событий, происходящих в дизайнере FastReport: удаление источника данных, который уже подключен в гриду, задание методов для чтения/записи колонок грида в файл шаблона отчета fr3 и обработка задания имени компонента.
1 2 3 4 |
protected procedure Notification(AComponent :TComponent; AOperation :TOperation); override; procedure DefineProperties(Filer: TFiler); override; procedure SetName(const AName: TComponentName); override; |
В разделе public находятся такие методы как конструктор и деструктор нашего компонента. Внутри конструктора помимо прочего, нужно создать базовый (внутренний) DBGridEh, интерфейс подключения данных (DataSource) для соединения с гридом и обработчиками событий.
Задаем описание нашего грида, которое будет видно в дизайнере FastReport, а также дополнительные методы для сохранения коллекции колонок грида в виде XML в шаблон отчета fr3. Остальные методы и свойства этого раздела нужны для возможности их программного использования в скрипте отчета.
1 2 3 4 5 6 |
public constructor Create(AOwner: TComponent); override; destructor Destroy; override; class function GetDescription: String; override; procedure WriteNestedProperties(Item: TfrxXmlItem; aAcenstor: TPersistent = nil); override; function ReadNestedProperty(Item: TfrxXmlItem): Boolean; override; |
В разделе 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.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition