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

Материал из DRKB

Печать содержимого 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;


Author: Rafael Ribas Aguilу
Source: Взято из http://forum.sources.ru
ID: 03024