PDA

Ver la Versión Completa : erro al cerrar segundo preview mdichild


amurrieta
07-12-2009, 21:28:50
Hola foro, estoy abriendo varias ventanas de reportes con quickreport desde una forma mdi por lo cual mis preview son mdichild. La idea es que el usuario pueda abrir varias ventanas del mismo reporte con parámetros diferentes y poder comparar. Los abro bien y varias veces, el problema es cuando intento cerrar la segunda ventana, me manda error de access violations, supongo que al cerrar el primero cierro los demas aunque sigan visibles o no se que estoy haciendo mal. La forma de abrir los reportes es la siguiente:

...
If not Assigned(RptCte) then
Begin
RptCte := TRptCte.create(FPrincipal)
End;

RptCte.Preview;
...


Estaba poniendo el free después de abrirlos y lo quité pensando que los liberaba antes de cerrarlos pero aún así no me ha funcionado. Supongo que debería crear una instancia por cada llamda de reporte pero no se si sea lo correcto o como lo tendría que hacerlo.

Gracias por su ayuda..

rgstuamigo
08-12-2009, 00:15:28
Si lo dejas asi como estas ,pues te cuento que se te va ir llenando la memoria mas y mas ,por la sencilla razon de que no estas liberando los objetos creados.;)
Por otro lado si abres el reporte en forma Modal,y luego lo destruyes, pues ya no vas a poder abrir (y comparar segun lo que comentas) otro reporte, mientras tengas alguno abierto o estado de Previsualizacion.:rolleyes:... asi que lo unico que se me ocurre que puedas hacer es Personalizar tu reporte (http://www.rinconcitodelphi.com/articulos/QReport/QReport.pdf);), es decir mostrarlo en un formulario diseñado por ti mismo, para que puedas usar el evento OnClose del mismo y decirle a Delphi que destruya el formulario al cerrarlo.;)
procedure MyFormPersonalizado.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;//Hago que se destruya el formulario.
end;

De esa manera podrias abrir el formulario en forma normal(no modal)y evitarias las Fugas de memoria.;)
Saludos...:)

amurrieta
08-12-2009, 20:41:19
Oka, he hecho lo que propones de meter el preview en un formulario y hasta ahí todo bien, he reutilizado el reporte elaborado y sólo en el evento onpreview le mando el qrprinter al objeto preview de la forma para que al mostrar el preview del reporte se muestre en el preview personalizado. Ahora mi problema es cuando quiero volver a lanzar el formulario, ya que como lo había planteado, la idea es que el cliente pueda ver el mismo reporte en diferentes ventanas para comparar datos pues al intentar volver a mostrar el formulario me dice que ya existe y no me deja crearlo. Cómo hago para poder abrir varios formularios sin que me mande error y que se abran en diferentes ventanas, no sólo que se muestren en el formulario que ya se abrió previamente. Lo que tengo en código es:

...
procedure TFPrincipal.TestFormClick(Sender: TObject);
Var
formatest : TFormReporte; // formulario Reporte
begin

formatest := TFormReporte.Create(fprincipal);

If not Assigned(Reporte) then
Begin
Reporte := TReporte.create(self) //QuickReport
End;
Reporte.Preview;

formatest.Show;
End;
...

Qué estoy haciendo mal? cómo puedo abrir varias ventanas del mismo formulario?