Tal y como prometí he hecho una función que genera un quickreport simple
en tiempo de ejecución a partir de una tabla (mejor dicho un dbGrid).
Funciona de un modo parecido a QRCreateList pero permite mayor control
sobre las columnas que se imprimen.Ya se que es francamente mejorable,
pero para lo que yo necesitaba hacer es suficiente. Entre las posibles
mejoras tenemos: añadir bandas de grupos, totales, fecha y hora de impresión opcional,...
En fin que espero que a alguién le sea útil. Salu2!
Código:
procedure ImprimirTabla(Tabla: TDBGrid;sTitulo:string);
var
qr:TQuickRep;
bandaCabecera:TQRCustomBand;
bandaPie:TQRCustomBand;
bandaTitulos:TQRCustomBand;
bandaDetalle:TQRCustomBand;
i:integer;
iDistancia:integer;
begin
qr := TQuickRep.Create(nil);
try
//Definicion de las propiedades del listado
qr.ReportTitle := sTitulo;
qr.PreviewInitialState :=wsMaximized;
qr.Page.Orientation := poLandscape;
qr.Page.LeftMargin := 10;
qr.Page.RightMargin := 10;
qr.Page.TopMargin := 10;
qr.Page.BottomMargin := 10;
qr.Page.PaperSize := A4;
qr.DataSet := Tabla.DataSource.DataSet;
qr.DataSet.Active := true;
//Creacion de bandas
qr.Bands.HasColumnHeader := true;
qr.bands.HasPageHeader := true;
qr.bands.HasPageFooter := true;
qr.Bands.HasDetail := true;
bandaCabecera := qr.bands.PageHeaderBand;
bandaPie := qr.Bands.PageFooterBand;
bandaTitulos := qr.Bands.ColumnHeaderBand;
bandaDEtalle := qr.Bands.DetailBand;
bandaTitulos.Height := 25;
bandaDetalle.Height := 20;
//TITULO
with TQrSysData.create(nil) do
begin
Data := qrsReportTitle;
Autosize := false;
Alignment := taCenter;
Font.Color := clBlack;
Font.Size := 12;
Font.Style := [fsBold];
Width := bandaCabecera.width;
Parent := bandaCabecera;
end;
//TITULOS COLUMNAS
iDistancia := 0;
for i:=0 to Tabla.Columns.Count-1 do
begin
if Tabla.Columns[i].Visible then
begin
with TQRLabel.Create(nil) do
begin
AutoSize := false;
caption := Tabla.Columns[i].Title.Caption;
Font.Style := [fsBold,fsUnderline];
Font.Size := 10;
Alignment := taCenter;
Width := Tabla.Columns[i].width + 10 ;
Top := 2;
left := iDistancia;
iDistancia := Left+ Width + 5;
Parent := bandaTitulos;
end;
end;
end;
//DETALLE DEL LISTADO
iDistancia := 0;
for i:=0 to Tabla.Columns.Count-1 do
begin
if Tabla.Columns[i].Visible then
begin
with TQRDBText.Create(nil) do
begin
AutoSize := false;
DataSet := Tabla.DataSource.DataSet;
DataField := Tabla.Fields[i].FieldName;
Font.Size := 10;
alignment := Tabla.Columns[i].Alignment;
width := Tabla.Columns[i].width +10;
Top := 2;
left := iDistancia;
case Tabla.Fields[i].DataType of
ftFloat: mask := '#,##0.00';
ftDateTime: mask := 'dd/mm/yyyy';
end;
iDistancia := Left+ Width + 5;
Parent := bandaDetalle;
end;
end;
end;
//PIE
with TQRExpr.create(nil) do
begin
expression := QuotedStr('Pág. ') + ' +PAGENUMBER';
Autosize := false;
Alignment := taRightJustify;
Font.Color := clBlack;
Font.Size := 10;
Font.Style := [];
Width := bandaPie.width;
Parent := BandaPie;
end;
qr.Preview;
finally
qr.Free;
end;
end;