Gracias por la ayuda, ya logre crear y generar el reporte, pero ahora tengo el problema que al cerrar el reporte se me genera una "Operación de Puntero Invalida" y el reporte no se destruye apropiadamente. (El Reporte está construido en un TQuickRep no en un TForm)
Aqui está el Código en cuestión:
Código:
procedure TfSA3710.QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
Var
fCons : TfSA1000;
Begin
FCons := TfSA1000(fSA0000.ActiveMDIChild);
dba.TableName := fCons.dbArancel.TableName;
CrearColumnas;
dbA.Open;
end;
procedure TfSA3710.QuickRepAfterPrint(Sender: TObject);
Var
i : Integer;
begin
// For i := 0 to fSa3700.DBGridArancel.Columns.Count-1 do
// Begin
// lbs[i].Free;
// fld[i].Free;
// End;
For i := SizeOf(lbs) DownTo 0 do
lbs[i].Free;
For i := SizeOf(fld) DownTo 0 do
fld[i].Free;
dbA.Close;
end;
procedure TfSA3710.CrearColumnas;
Const
Sep = 5;
Var
i,px,ATot,Ancho : Integer;
begin
aTot := 0;
For i := 0 to fSa3700.DBGridArancel.Columns.Count-1 do
ATot := ATot + fSa3700.DBGridArancel.Columns.Items[i].Width;
px := 0;
// Definir el tamaño del Array;
SetLength(lbs,fSa3700.DBGridArancel.Columns.Count-1);
SetLength(fld,fSa3700.DBGridArancel.Columns.Count-1);
For i := 0 to fSa3700.DBGridArancel.Columns.Count-1 do
Begin
Ancho :=(Titulos.Width * fSa3700.DBGridArancel.Columns.Items[i].Width) div ATot;
// Encabezados
lbs[i] := TQRLabel.Create(Titulos);
With lbs[i] do
Begin
Parent := Titulos;
Top := 1;
Left := px;
AutoSize := False;
Width := Ancho - Sep;
Visible := fSa3700.DBGridArancel.Columns.Items[i].Visible;
If Visible Then
begin
Alignment := fSa3700.DBGridArancel.Columns.Items[i].Alignment;
Caption := fSa3700.DBGridArancel.Columns.Items[i].Title.Caption;
End;
End;
// Campos
fld[i] := TQRDBText.Create(detalle);
With Fld[i] do
begin
Parent := Detalle;
Top := 1;
Left := px;
AutoSize := False;
Width := Ancho - Sep;
Visible := lbs[i].Visible;
If Visible Then
Begin
Alignment := lbs[i].Alignment;
DataSet := dbA;
DataField := fSa3700.DBGridArancel.Columns.Items[i].FieldName;
WordWrap := True;
AutoStretch := True;
End;
End;
// Posicion X del proximo
px := px + Ancho;
End;
end;
Para crear el reporte uso
Código:
Var
Rep : TFsa3710;
begin
Rep := TFsa3710.Create(Self);
Try
rep.PrinterSetup;
If rep.Tag = 0 then
rep.Preview;
// rep.Print;
Finally
rep.Free;
End;
end;
y aun así no se completa el free del reporte (pese al finally)
Las declaraciones de los arreglos y el metodo crear columnas las puse como publicas y privadas.
Código:
lbs : Array of TQRLabel;
fld : Array of TQRDBText;
Procedure CrearColumnas;
Si alguien sabe que ocurre, agradezco cualquier sugerencia.
PD Uso delphi 7 con QReport 3.5.1 (descargado de QuSoft)
el error me lo genera en la unidad System
Código:
function _FreeMem(P: Pointer): Integer;
{$IF Defined(DEBUG) and Defined(LINUX)}
var
Signature: PLongInt;
{$IFEND}
begin
if P <> nil then
begin
{$IF Defined(DEBUG) and Defined(LINUX)}
Signature := PLongInt(LongInt(P) - 4);
if Signature^ <> 0 then
Error(reInvalidPtr);
Signature^ := FreeMemorySignature;
Result := MemoryManager.Freemem(Pointer(Signature));
{$ELSE}
Result := MemoryManager.FreeMem(P);
{$IFEND}
if Result <> 0 then
Error(reInvalidPtr); // <- - - - - - - - - - - - Linea de error
end
else
Result := 0;
end;