Печать содержимого DBGrid через QuickReport
Печать содержимого DBGrid через QuickReport
Печать содержимого DBGrid через QuickReport Автор: Rafael Ribas Aguilу Совместимость: Delphi 3.x (или выше) Частенько у пользователя возникает необходимость распечатать отчёт из базы данных. Естественно, что он начинает просить Вас добавить такую возможность в приложение. Как оказалось, при помощи 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;