Печать содержимого 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;
Вот собственно и всё :)
|