Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   access violation (https://www.clubdelphi.com/foros/showthread.php?t=16838)

chilenauta 14-12-2004 03:45:12

access violation
 
hola foristas,
trabajo con delphi 5.0 enterprise.
hago preview a dos query, master y detail... luego de previsualizar, cierro la ventana con el boton "close" y aleatoriamente me manda un mensaje de error de "access violation xxx..."
he leido los comentarios con las soluciones, probe con todos ellos, pero no hay igual me manda el mismo error, ya no se que hacer... solo me falta por actualizar el delphi... jajaja...
trabajo en win xp.
:confused:

Neftali [Germán.Estévez] 14-12-2004 09:42:58

¿Tienes algo de código en el formulario?
¿Has programado algo en los eventos de OnClose/OnDestroy?

Si es así pon el código.

¿Exactamente qué tienes en el form?

Si no das algo más de información es muy difícil.:confused:

chilenauta 14-12-2004 13:29:05

hola foristas,
estos son mis codigos dsde un form cualquiera que invoca al form de reporte:

frmRptF.Free;
frmRptF := TfrmRptF.Create(Self);
try
frmRptF.Previsualizar(letra.asString, nv);
frmRptF.Close;
finally
FreeAndNil(frmRptF);
end;

y los codigos para la previsualizacion en el form de reporte son:

const
ENV_TEMP: pchar = 'TEMP';
ENV_TMP: pchar = 'TMP';
DIR_TEMP: pchar = 'c:\temp';
DIR_TMP: pchar = 'c:\tmp';
...
procedure TfrmRptF.FormCreate(Sender: TObject);
begin
SetEnvironmentVariable(ENV_TEMP, DIR_TEMP);
SetEnvironmentVariable(ENV_TMP, DIR_TMP);
end;
...
procedure TfrmRptF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
qr.QRPrinter := nil;
Action := caFree;
end;
...
procedure TfrmRptF.Previsualizar(letra: string; nv: integer);
begin
lblC1.Caption := '*** Son: ' + letra + ' ***';
qryMaster.Close;
qryDetail.Close;
qryMaster.ParamByName('nv').asFloat := nv;
qryMaster.Open;
qryDetail.Open;
qr.Prepare;
qr.Preview;
end;
...

estos codigos son para imprimir una factura a un impresora matriz de punto okidata ml-320 turbo.

he sacado y puesto codigo, pero no hay caso.
atte
yanko hsieh

chilenauta 14-12-2004 13:37:42

Será un problema de windows xp?
 
hola foristas,
como ven ya he hecho las pruebas necesarias que ahora empiezo a dudar si es un problema de winxp profesional??? :confused:

Neftali [Germán.Estévez] 14-12-2004 15:33:15

Sólo como comentario, pero hay algunas cosas que no acabo de ver claras.

Cita:

Empezado por chilenauta
...estos son mis codigos dsde un form cualquiera que invoca al form de reporte:
Código Delphi [-]
frmRptF.Free; (1)
frmRptF := TfrmRptF.Create(Self); (2)
try
frmRptF.Previsualizar(letra.asString, nv);
frmRptF.Close; 
finally
FreeAndNil(frmRptF); (3)
end;

Si éste formulario lo creas correctamente (2) y lo liberas correctamente (3), liberarlo antes de crearlo (1) creo que te va a dar problemas.

Cita:

Empezado por chilenauta
Código Delphi [-]
procedure TfrmRptF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
qr.QRPrinter := nil;
Action := caFree; (4)
end;

Si éste formulario es el mismo de antes, el liberarlo con caFree (4) también te dará problemas con la liberación vista anteriormente (3), ya que la intentarás hacer en dos sitios distintos.


EDITADO:
NOTA: La próxima vez puedes utilizar los TAGs , de esa forma el código se puede leer mejor.

chilenauta 14-12-2004 16:58:40

ya habia probado segun tus comentarios
 
hola,

formname.free; // no arroja error segun el help de delphi, a diferencia de .destroy;:( por lo que poniendo el codigo o sacando el codigo, lo he probado de las dos formas e igual aparece el error de violacion de acceso.
al igual que el evento on close del formulario de reporte la action caFree tampoco da error, sino ya me hubera dado cuenta... en fin, no se que otra cosa podria ser.
probe segun tu sugerencia e igual me arroja error despues de imprimir en una impresora okidata ml 320 turbo.
sera por el bug de quickreport? o es un problema de comunicacion entre xp/sistema hecho en delphi e impresora?
atte y gracias por tus comentarios.
yanko hsieh

chilenauta 14-12-2004 17:54:00

error runtime 216
 
me arroja un error runtime 216 o 206, no me acuerdo... que sera?:confused:

Neftali [Germán.Estévez] 14-12-2004 18:03:12

Cita:

Empezado por chilenauta
...
formname.free; // no arroja error segun el help de delphi, a diferencia de .destroy;:( por lo que poniendo el codigo o sacando el codigo, lo he probado de las dos formas e igual aparece el error de violacion de acceso.
al igual que el evento on close del formulario de reporte la action caFree tampoco da error, sino ya me hubera dado cuenta... en fin, no se que otra cosa podria ser...

Ojo, que no siempre los errores "saltan" cuando se ejecuta la línea incorrecta, más cuando son problemas de memoria. En tu caso, la primera instrucción de liberación nunca fallará, la segunda puede ser que sí o puede ser que no, lo que es seguro es que no está liberando algo correcto.

chilenauta 14-12-2004 18:36:51

a la espera del nuevo error
 
gracias por tus sugerencias, cerregi nuevamente los codigos que mencionaste y ahora estoy intentando ejecutar para ver si arroja el mismo error.


Cita:

Empezado por Neftali
Ojo, que no siempre los errores "saltan" cuando se ejecuta la línea incorrecta, más cuando son problemas de memoria. En tu caso, la primera instrucción de liberación nunca fallará, la segunda puede ser que sí o puede ser que no, lo que es seguro es que no está liberando algo correcto.


chilenauta 14-12-2004 19:26:43

no es la solucion
 
hola,
lamentablemente sigue apareciendo el error de violacionde acceso... alguna idea?
:confused:

chilenauta 15-12-2004 01:51:33

Encontre la solucion parche
 
hola foristas,
:D ya encontre una solucion de menor costo para evitar el desagradable error de "access violation". el truco es el siguiente:

en vez de hacer:

formRpt.qreport.preview;

hay que hacer esto:

formRpt.qreport.previewmodal;
if (messagedlg(...) = ...) then
formRpt.qreport.print;

algo pasa con "xxx.preview;" que sigue ejecutando las instrucciones posteriores... asi que habria que usar "previewmodal", pero el previewmodal no me muestra los botones "print", asi que habria que codigicar a mano la posibilidad de impresion.

sera esta la solucion? no lo se... pero por lo menos, ya no me sale el error de violacion de acceso... salud!!!!
espero comentario!!!

roman 15-12-2004 03:20:20

Cita:

Empezado por chilenauta
algo pasa con "xxx.preview;" que sigue ejecutando las instrucciones posteriores...

¡Pues claro que sigue ejecutando las instrucciones posteriores!; éste es el comportamiento normal a menos- como ya has notado -que muestres el reporte con PreviewModal ya que entonces sí se detiene la ejecución hasta que no cierres el formulario. En tu código original

Código Delphi [-]
frmRptF.Free;
frmRptF := TfrmRptF.Create(Self);
try
  frmRptF.Previsualizar(letra.asString, nv);
  frmRptF.Close; 
finally
  FreeAndNil(frmRptF);
end;

luego de la llamada a frmRptF.Previsualizar (que internamente llama a qr.Preview) el formualrio se destruye mietras aún está visible.

Lo único que tienes que hacer es:

Código Delphi [-]
frmRptF := TfrmRptF.Create(Self);
frmRptF.Previsualizar(letra.asString, nv);

y dejar el Action := caFree en el evento OnClose del formulario del reporte.

// Saludos

chilenauta 15-12-2004 13:34:50

evento OnClose???
 
Cita:

Empezado por roman
¡Pues claro que sigue ejecutando las instrucciones posteriores!; éste es el comportamiento normal a menos- como ya has notado -que muestres el reporte con PreviewModal ya que entonces sí se detiene la ejecución hasta que no cierres el formulario. En tu código original

Código Delphi [-]
frmRptF.Free;
frmRptF := TfrmRptF.Create(Self);
try
frmRptF.Previsualizar(letra.asString, nv);
frmRptF.Close; 
finally
FreeAndNil(frmRptF);
end;

luego de la llamada a frmRptF.Previsualizar (que internamente llama a qr.Preview) el formualrio se destruye mietras aún está visible.

Lo único que tienes que hacer es:

Código Delphi [-]
frmRptF := TfrmRptF.Create(Self);
frmRptF.Previsualizar(letra.asString, nv);

y dejar el Action := caFree en el evento OnClose del formulario del reporte.

// Saludos

hola, gracias por tus sugerencias...
pero el evento OnClose no se activa con el boton "close" de la previsualizacion..., en ese caso, donde debo poner el codigo???
gracias

roman 15-12-2004 17:45:32

Cita:

Empezado por chilenauta
el evento OnClose no se activa con el boton "close" de la previsualizacion..., en ese caso, donde debo poner el codigo???

¡Oh vaya! Pues mira qué razón tienes. El punto es que la vista preliminar se presenta en realidad en otro formulario, no en aquél donde se haya colocado el QuickRep.

Mira, no lo he visto con detalle, pero en una prueba rápida parece que podría servirte el evento AfterPreview del QuickRep:

Código Delphi [-]
procedure TForm2.QuickRep1AfterPreview(Sender: TObject);
begin
  Close;
end;

// Saludos

chilenauta 15-12-2004 18:27:57

lo probare
 
Cita:

Empezado por roman
¡Oh vaya! Pues mira qué razón tienes. El punto es que la vista preliminar se presenta en realidad en otro formulario, no en aquél donde se haya colocado el QuickRep.

Mira, no lo he visto con detalle, pero en una prueba rápida parece que podría servirte el evento AfterPreview del QuickRep:

Código Delphi [-]
procedure TForm2.QuickRep1AfterPreview(Sender: TObject);
begin
Close;
end;

// Saludos

hola,
gracias por el dato,
lo probare inmediato a ver si con eso se resuelve el problema.

chilenauta 15-12-2004 19:45:51

solucion fallida de caFree
 
hola,
ya probe con tus comentarios, aun asi arroja error... creo que la unica forma de hacer esto es por previewmodal, como planteaba yo anteriormente... no se que otra forma se puede hacer con preview...
atte
:confused:


La franja horaria es GMT +2. Ahora son las 12:17:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi