Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Печать содержимого TDBGrid через Quick Report

01.01.2007

Автор: Rafael Ribas Aguilу

Частенько у пользователя возникает необходимость распечатать отчёт из базы данных. Естественно, что он начинает просить Вас добавить такую возможность в приложение. Как оказалось, при помощи 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; 

Взято из https://forum.sources.ru