Ver Mensaje Individual
  #4  
Antiguo 26-12-2003
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Reputación: 24
sitrico Va por buen camino
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;
__________________
Sitrico
Responder Con Cita