Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Печать содержимого DBGrid через QuickReport

Delphi , ОС и Железо , Принтеры и Печать

Печать содержимого DBGrid через QuickReport

Частенько у пользователя возникает необходимость распечатать отчёт из базы данных. Естественно, что он начинает просить Вас добавить такую возможность в приложение. Как оказалось, при помощи TQuickRep данную задачу можно очень легко решить.

Итак, приступим. Для начала создайте новую форму, назвав её TGridReport, и поместите на неё TQuickRep. Переименуйте QuickRep в GridRep. Затем сделайте следующию процедуру, которая получает в качестве параметра DBGrid:


procedure TGridReport.Preview(Grid: TDBGrid);
var
  i, CurrentLeft, CurrentTop : integer;
  BMark: TBookmark;
begin
  GridRep.Dataset:=Grid.DataSource.DataSet;

  if not GridRep.Bands.HasColumnHeader then
    GridRep.Bands.HasColumnHeader:=true;

  if not 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;
  try
    for i:=0 to Grid.FieldCount - 1 do
    begin
      if (CurrentLeft + Canvas.TextWidth(Grid.Columns[i].Title.Caption)) >
      (GridRep.Bands.ColumnHeaderBand.Width) then
      begin
        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) do
      begin
        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) do
      begin
        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}

  finally
    with Grid.DataSource.DataSet do
    begin
      GotoBookmark(BMark);
      FreeBookmark(BMark);
      EnableControls;
    end;
  end;
end;

Код, который вы предоставили, - это метод под названием Preview в форме TGridReport, использующий QuickRep для печати содержимого DBGrid. Метод принимает параметр Grid типа TDBGrid, который является grid, содержащим данные для печати.

Вот разбивка того, что код делает:

  1. Он настраивает компонент QuickRep (GridRep) путем установки его dataset в то же самое, как и datasource Grid.
  2. Он включает заголовки столбцов и деталяные полосы в QuickRep.
  3. Он рассчитывает высоту полосы заголовков столбцов на основе высоты шрифта grid'а title font, а также высоту полосы деталей на основе высоты шрифта grid'а font.
  4. Он инициализирует некоторые переменные (CurrentLeft, CurrentTop) для отслеживания позиции для печати.
  5. Он получает маркер из dataset с помощью GetBookmark и disables controls на dataset с помощью DisableControls.
  6. Он проходит по каждому полю в grid, создавая QRLabels для заголовков столбцов и QRDbText компоненты для полей данных. Caption QRLabel'а устанавливается на заголовок поля, а QRDbText компонента конфигурируется с соответствующим именем поля.
  7. После печати всех полей, он обновляет некоторые метки (lblPage и lblDate) на основе ширины полосы (bdTitle) и настраивает модальное окно для просмотра с помощью PreviewModal.
  8. Наконец, он восстанавливает маркер и включает 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Принтеры и Печать ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:21:16/0.0033907890319824/0