PDA

Ver la Versión Completa : access violation


chilenauta
14-12-2004, 04:45:12
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, 10: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, 14: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, 14:37:42
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, 16:33:15
Sólo como comentario, pero hay algunas cosas que no acabo de ver claras.

...estos son mis codigos dsde un form cualquiera que invoca al form de reporte:

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.



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, 17:58:40
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, 18:54:00
me arroja un error runtime 216 o 206, no me acuerdo... que sera?:confused:

Neftali [Germán.Estévez]
14-12-2004, 19:03:12
...
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, 19:36:51
gracias por tus sugerencias, cerregi nuevamente los codigos que mencionaste y ahora estoy intentando ejecutar para ver si arroja el mismo error.


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, 20:26:43
hola,
lamentablemente sigue apareciendo el error de violacionde acceso... alguna idea?
:confused:

chilenauta
15-12-2004, 02:51:33
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, 04:20:20
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


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:


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, 14:34:50
¡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


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:


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, 18:45:32
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:


procedure TForm2.QuickRep1AfterPreview(Sender: TObject);
begin
Close;
end;


// Saludos

chilenauta
15-12-2004, 19:27:57
¡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:


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, 20:45:51
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: