Частенько у пользователя возникает необходимость распечатать отчёт из базы данных. Естественно, что он начинает просить Вас добавить такую возможность в приложение. Как оказалось, при помощи TQuickRep данную задачу можно очень легко решить.
Итак, приступим. Для начала создайте новую форму, назвав её TGridReport, и поместите на неё TQuickRep. Переименуйте QuickRep в GridRep. Затем сделайте следующию процедуру, которая получает в качестве параметра DBGrid:
procedure TGridReport.Preview(Grid: TDBGrid);
var
i, CurrentLeft, CurrentTop : integer;
BMark: TBookmark;
begin
GridRep.Dataset:=Grid.DataSource.DataSet;
ifnot GridRep.Bands.HasColumnHeader then
GridRep.Bands.HasColumnHeader:=true;
ifnot GridRep.Bands.HasDetail then
GridRep.Bands.HasDetail:=true;
GridRep.Bands.ColumnHeaderBand.Height:=Abs(Grid.TitleFont.Height) + 10;
GridRep.Bands.DetailBand.Height:=Abs(Grid.Font.Height) + 10;
CurrentLeft := 12;
CurrentTop := 6;
{Запись, на которой пользователь останавливается в DBGrid}
BMark:=Grid.DataSource.DataSet.GetBookmark;
{Запретим мерцание грида в процессе работы отчёта}
Grid.DataSource.DataSet.DisableControls;
tryfor i:=0 to Grid.FieldCount - 1 dobeginif (CurrentLeft + Canvas.TextWidth(Grid.Columns[i].Title.Caption)) >
(GridRep.Bands.ColumnHeaderBand.Width) thenbegin
CurrentLeft := 12;
CurrentTop := CurrentTop + Canvas.TextHeight('A') + 6;
GridRep.Bands.ColumnHeaderBand.Height :=
GridRep.Bands.ColumnHeaderBand.Height + (Canvas.TextHeight('A') + 10);
GridRep.Bands.DetailBand.Height :=
GridRep.Bands.DetailBand.Height + (Canvas.TextHeight('A') + 10);
end;
{Создадим заголовок отчёта при помощи QRLabels}with TQRLabel.Create(GridRep.Bands.ColumnHeaderBand) dobegin
Parent := GridRep.Bands.ColumnHeaderBand;
Color := GridRep.Bands.ColumnHeaderBand.Color;
Left := CurrentLeft;
Top := CurrentTop;
Caption:=Grid.Columns[i].Title.Caption;
end;
{Создадим тело отчёта при помощи QRDBText}with TQRDbText.Create(GridRep.Bands.DetailBand) dobegin
Parent := GridRep.Bands.DetailBand;
Color := GridRep.Bands.DetailBand.Color;
Left := CurrentLeft;
Top := CurrentTop;
Alignment:=Grid.Columns[i].Alignment;
AutoSize:=false;
AutoStretch:=true;
Width:=Grid.Columns[i].Width;
Dataset:=GridRep.Dataset;
DataField:=Grid.Fields[i].FieldName;
CurrentLeft:=CurrentLeft + (Grid.Columns[i].Width) + 15;
end;
end;
lblPage.Left := bdTitle.Width - lblPage.Width - 10;
lblDate.Left := bdTitle.Width - lblDate.Width - 10;
{Далее вызовем метод предварительного просмотра из QuickRep}
GridRep.PreviewModal; {либо, если желаете, то PreviewModal}finallywith Grid.DataSource.DataSet dobegin
GotoBookmark(BMark);
FreeBookmark(BMark);
EnableControls;
end;
end;
end;
Код, который вы предоставили, - это метод под названием Preview в форме TGridReport, использующий QuickRep для печати содержимого DBGrid. Метод принимает параметр Grid типа TDBGrid, который является grid, содержащим данные для печати.
Вот разбивка того, что код делает:
Он настраивает компонент QuickRep (GridRep) путем установки его dataset в то же самое, как и datasource Grid.
Он включает заголовки столбцов и деталяные полосы в QuickRep.
Он рассчитывает высоту полосы заголовков столбцов на основе высоты шрифта grid'а title font, а также высоту полосы деталей на основе высоты шрифта grid'а font.
Он инициализирует некоторые переменные (CurrentLeft, CurrentTop) для отслеживания позиции для печати.
Он получает маркер из dataset с помощью GetBookmark и disables controls на dataset с помощью DisableControls.
Он проходит по каждому полю в grid, создавая QRLabels для заголовков столбцов и QRDbText компоненты для полей данных. Caption QRLabel'а устанавливается на заголовок поля, а QRDbText компонента конфигурируется с соответствующим именем поля.
После печати всех полей, он обновляет некоторые метки (lblPage и lblDate) на основе ширины полосы (bdTitle) и настраивает модальное окно для просмотра с помощью PreviewModal.
Наконец, он восстанавливает маркер и включает controls на dataset с помощью GotoBookmark, FreeBookmark и EnableControls.
Код хорошо структурирован и легко понятен, но есть некоторые минорные улучшения, которые можно сделать:
Вместо использования жестких значений, таких как 12, 6 и 15,consider defining them as constants or variables to make the code more readable and maintainable.
Consider using a loop to create QRLabels and QRDbText components instead of repeating similar code for each field. This would reduce code duplication and make it easier to add new fields in the future.
Instead of manually updating the height of bands, consider using a formula or expression to calculate the height based on the font size and other factors.
Consider adding some error handling to catch any potential issues that might occur during printing.
В целом, код выглядит хорошо, и с этими минорными улучшениями он должен быть еще более эффективным и легким для поддержки.
В статье описывается как использовать компонент TQuickRep из Delphi для печати содержимого DBGrid.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.