Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
EAccessViolation

Hola a todo el mundo,

llevo ya algunos dias peleandome con una aplicación que me da el error de EAccesViolation al salir. Estuve mirando distintos foros y siguiendo los consejos que leí pero no consigo solucionar el problema. Parece ser que el error me lo da en el End final, pero no se que está intentando hacer.

Os explico un poco como tengo montada la aplicación, a ver si alguien puede decirme que hago mal:

- La aplicación tiene como formulario principal un login y a partir de este carga un formulario de menus con el menu personalizado para cada usuario.
- También contiene un datamodule que cargo al iniciar la aplicación.
- No cierro manualmente el datamodule, deduzco que lo hará él al finalizar la aplicación.
- En el evento onclose de todos los formularios, incluido el frlogin incluyo la instruccion "action:=cafree".

El código para iniciar el programa es el siguiente:

Begin
Application.Initialize;
Application.Title := 'Top Cable';
Application.CreateForm(Tfrdadesglobals, frdadesglobals);
Application.CreateForm(Tfrlogin, frlogin);
Application.Run;
End;

A ver si alguien me puede decir algo, por que este error me está poniendo nerviosa

Ester
Responder Con Cita
  #2  
Antiguo 08-09-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿En qué línea se te produce este AccessViolation?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 08-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Como muy bien dices, no es necesario cerrar el Datamodulo, aunque como te dice Federico, tienes que dar algún dato más, estos errores suelen producirse por tratar de acceder a componentes o que aún no han sido creados o que ya han sido destruidos......

También convendría que pusieras el mensaje de error que te da completo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 08-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
El error me sale justo cuando pasa por el End de la aplicación:

begin

Application.Initialize;
Application.Title := 'Gestión';
Application.CreateForm(Tfrdadesglobals, frdadesglobals);
Application.CreateForm(Tfrlogin, frlogin);
Application.Run;

end. --> en esta linea

y el mensaje de error es el siguiente:


Application Error

Exception EAccessViolation in module Gestion.exe at 000B661A.
Access violation at address 004B661A in module 'Gestion.exe'. Read of address 0181EDEC.
Responder Con Cita
  #5  
Antiguo 08-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Te recomiendo revisar los eventos "de salida" de tus forms y demás componentes. OnExit, OnClose, OnDestroy, etc. En alguno estas haciendo referencia a un objeto que seguramente ya ha sido destruido durante el proceso de salida de la aplicación.

De ahi el access violation.

Ahora que me fijo un poco mas... si el formulario principal es el frLogin, y al cerrarlo lo destruis, la aplicación no correrá, pues al cerrarse este, provoca el cierre de la aplicación completa. Aunque esto dicho, claro, no coincide con el código que publicas, donde el formulario frdadesglobals seria el principal de la aplicación.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 08-09-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Si no me equivoco en el End se ejecutan todos los Finalizations de las units... ¿Tenes posibilidad de debuguerlo?... ¿Utilizas algun objeto que se crea automáticamente (Por ejemplo Clipboard, Printer...)?

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 08-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
El formulario principal no es el 'frdadesglobals', este es un datamodule y lo necesito al abrir el login, por eso lo creo antes.
He probado de quitar el action:=cafree del frlogin pero el error me sale igual.

En cuanto a los 'onclose' no los he repasado todos por que tengo unos 350 formularios. Lo que he hecho es poner puntos de interrupcion en los cierres de los cinco o seis formularios que se crean des del login, pero no me ha servido de nada por que cuando abro el login y lo vuelvo a cerrar sin acceder a ningun otro formulario no pasa por ningun otro formclose y el error me lo da igualmente.

Del tema de objetos automáticos no tengo ninguno.

Una cosa curiosa que si he observado es que cuando reconstruyo el proyecto (con el build) el ejecutable que me crea no da el error al salir, en canvio si seguidamente al build intento ejecutar el proyecto des del codigo fuente si me vuelve a salir el error. ¿?¿?¿?¿?

Y haciendo pruebas veo que añadiento el siguiente codigo despues del application.run me da el error en el destroy del dadesglobals, pero el del login parece que lo hace bien:
frlogin.destroy;
frdadesglobals.destroy;

Pero añadiendolo al revés también me da el error en destroy del dadesglobals:
frdadesglobals.destroy;
frlogin.destroy;

Ester
Responder Con Cita
  #8  
Antiguo 08-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si los formularios ya contienen:
Action:=CaFree;

Al cerrarse estos se destruyen por lo tanto si luego llamas desde otro formulario al método Destroy de alguno de los que acabas de cerrar te darán error porque esos formularios ya no existen......?

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 08-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Una sugerencia:

Si el debugger se detiene en la línea del end final es, como ya han indicado, porque la excepción se produce en el código de finalización de alguna unidad y el haberse detenido ahí y no en el código mencionado es porque no tienes acceso a los archivos fuente en dode se produce el error. Si el error se está produciendo en alguna unidad de la VCL (cosa que no sabemos) entonces asegúrate de marcar la opción "Use debug DCUs" en Project|Options|Compiler.

Si resulta que el error sí se está generando en la VCL entonces el debugger se parará ahora en la línea exacta del código de la unidad en donde realmente se genera la excepción.

Esto por sí sólo no sirve de mucho ya que el error aunque aparezca en una unidad de la VCL, dificilmente estará causado por código ahí. Pero a partir de ese momento puedes usar la opción View|Debug Windows CallStack para ver el curso de llamadas a procedimientos que se han seguido hasta que se genera la excepción y comenzar a poner puntos de ruptura en dichos lugares.

// Saludos
Responder Con Cita
  #10  
Antiguo 08-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
En realidad en todo el proyecto no tengo ningun destroy, pero es que ya no se me ocurre nada mas para probar y el error me sale de todos modos, con destroy o sin ellos.

También hé probado de marcar la opción "Use debug DCUs" pero se sigue parando en el end. no veo ningun otro codigo.

Solo puedo hacer una observacion: des del inicio del proyecto este error me havia salido contadas veces y siempre lo solucionava jugando con el objeto TSession que esta definido en 'frdadesglobals'. Si cambiaba alguna propiedad de ese objecto (como el private dir), compilaba, la volvia a dejar como al principio y volvia a compilar siempre me funcionaba y desaparecia el error. Pero ahora aunque lo haga diez veces no se soluciona. Podria ser que el error viniese de ese objeto, que tenga mal definida alguna propiedad??? O quizás era solo casualidad...

Por si acaso, las propiedades están de la siguiente manera:

False
False
False
Session1
C:\
D:\FONTSDELPHI
SSMain
True
0


Muchas grácias,

Ester
Responder Con Cita
  #11  
Antiguo 08-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Detállanos un poco más el proceso mínimo para generar el error. Esto es, mencionas que aun abriendo el formulario del Login y cerrándolo sin hacer nada te causa el error. Pero también mencionas cinco o seis formularios creados desde el Login. Detalla en qué momentos se crean y/o destruyen estos formularios. Estos formularios ¿también tienen componentes de bases de datos? ¿Hay eventos asociados a dichos controles (inlcuidos los del Login) que de alguna forma manipulen los datasets?

Digo esto porque me ha pasado que, por ejemplo, en un control DBEdit hay un evento OnChange en el que se modifica alguna propiedad de un dataset. Estos eventos pueden producirse en momentos inesperados, quizá al cerrarse el formulario, y el problema es que para cuando se produce tal evento ya se han cerrado las bases o mejor dicho destruido el datamodule y de ahí el Access Violation.

En fin, la idea es minimizar las acciones que se hacen para poder reproducir el error. Por ejemplo, no crear algunos de los formularios desde el login y ver si al hacr ersto desaparece la excepción. Si en alguno desaparece sabrá entonces con mayor exactitud por donde va el problema.

// Saludos
Responder Con Cita
  #12  
Antiguo 09-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
Ok, os detallo los pasos que sigue el programa antes de dar el error:

begin

Application.Initialize;

Application.Title := 'Top Cable';

Application.CreateForm(Tfrdadesglobals, frdadesglobals);
[este es un modulo de datos y solo hay declararciones de variables]

Application.CreateForm(Tfrlogin, frlogin);
[cbidioma.ItemIndex:=0;
frdadesglobals.bd.connected:=False;
if frdadesglobals.Session1.Active then
frdadesglobals.Session1.Active:=False;]

Application.Run;
[wuserterminal:=frmrutines1.Recupera_usuario();]
(la funcion recupera_usuario devuelve el username de windows con un windows.getusername)

Aqui le doy al boton de cancelar que me hace un close del formulario:

procedure Tfrlogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin

qrusua.Close;
qrvalidaciones.Close;
qrusua1.Close;

frdadesglobals.bd.Close;
frdadesglobals.bd.Connected:=False;
frdadesglobals.Session1.Active:=false;
if frdadesglobals.wglbdirbloq <> '' then
if directoryexists(frdadesglobals.wglbdirbloq) then
if not removedir(frdadesglobals.wglbdirbloq) then
raise Exception.Create('No se ha podido eliminar el directorio de bloqueo: ' + frdadesglobals.wglbdirbloq);

action:=cafree;

end;

Y después ya viene el End. de la applicacion que es donde me da el error.


Ester
Responder Con Cita
  #13  
Antiguo 09-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola Ester.

Creo que el punto donde puede estar dando el problema es demasiado confuso por ahora. El hecho que ocurra en el End. implica, como ya se ha dicho antes, que el error seguramente ocurra durante el proceso de finalización de las unidades.

Dado que el proyecto es grande, es dificil, con solo eso, y con ver unas cuantas lineas de código, ayudarte. El hecho que el error ocurriera desde el inicio del proyecto implica que hay algo mal hecho desde el principio, y que al no atenderse, solo se ha vuelto confuso con todo el proyecto montado.

Ya que aparentemente es imposible detectar en que línea se produce el error (cosa que no me parece posible) lo que yo haria en tu lugar, es hacer una copia del proyecto en su estado actual, y comenzar por quitarle todos los formularios, excepto el formulario de login y el módulo de datos.

A partir de alli, y probando detenidamente cada paso, comenzaria a integrar los formularios, hasta reproducir el error. Una vez el error esté ocurriendo, revisar detenidamente las operaciones de ese formulario. Principalmente si destruye algún objeto que luego otra parte de la aplicación, o la misma VCL espera que exista. Lo que te digo es que es seguro que el error no se elevará desde ese formulario, pero que el error proviene de una operación realizada alli.

Es probable también que no se trate de la destrucción de un objeto, pero que se trate de una asignación a un objeto que posteriormente es destruido, o que se trate de forma descuidada un puntero, y que este quede apuntando a donde nunca ha habido nada.

Es largo, complicado y tedioso... pero a la larga vas a perder mas tiempo tratando de simplemente adivinar donde está el problema, y si queres encontrar y deshacerte del error, es un método que te llevará a buen puerto.

Comento por último, que nunca he visto a un TSession generar una excepción como esta. Claro, me cuido siempre de no destruir nada que yo no haya creado, y quizas por alli vayan los tiros.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #14  
Antiguo 10-09-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Había un Link en los foros para mostrar excepciones con la línea exacta donde se producía, haciendo un parser del archivo .map que crea delphi al hacer un Build. ¿Alguien encuentra ese link?

Si dá el error en la VCL, quizás no le sirva de algo, pero mejor probarlo antes de meterse de lleno en modificar todo el programa.

Saludos
Responder Con Cita
  #15  
Antiguo 10-09-2004
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
Hola de nuevo,

segui el consejo de quitar todos los formularios y los fui añadiendo poco a poco para saber cual era el que daba el error. Al final descubri que son dos y el problema está en el orden que los pongo en el uses del proyecto. Si los dos los declaro al principio me da el error al salir, si los declaro los ultimos no da el error. Os pongo un trozo de código para que lo veais mejor:

Program Gestion;
uses
...
frmgestprov in 'frmgestprov.pas' {frgestprov},
frmgestprve in 'frmgestprve.pas' {frgestprve},
frmgestrecepenvgrupo in 'frmgestrecepenvgrupo.pas' {frgestrecepenvgrupo},
frmconsalb6 in 'frmconsalb6.pas' {frconsalb6},
frmgestrecepenvgruposga in 'frmgestrecepenvgruposga.pas' {frgestrecepenvgruposga},
frmconscorrespalb in 'frmconscorrespalb.pas' {frconscorrespalb};
frmgestrepr in 'frmgestrepr.pas' {frgestrepr},
frmgestreservasbobi in 'frmgestreservasbobi.pas' {frgestreservasbobi},
...
--> en este orden me daria el error


Program Gestion;
uses
...
frmgestprov in 'frmgestprov.pas' {frgestprov},
frmgestprve in 'frmgestprve.pas' {frgestprve},
frmgestrecepenvgrupo in 'frmgestrecepenvgrupo.pas' {frgestrecepenvgrupo},
frmgestrecepenvgruposga in 'frmgestrecepenvgruposga.pas' {frgestrecepenvgruposga},
frmconsalb6 in 'frmconsalb6.pas' {frconsalb6},
frmgestrepr in 'frmgestrepr.pas' {frgestrepr},
frmconscorrespalb in 'frmconscorrespalb.pas' {frconscorrespalb};
frmgestreservasbobi in 'frmgestreservasbobi.pas' {frgestreservasbobi},
...
--> en cambio asi no me da el error (solo he canviado el orden de los dos formularios conflictivos)

Hé estado repasando estos cinco o seis formularios y en principio no tienen ningún tipo de relación entre ellos, pero es muy raro supongo que se me escapa algo.

De momento voy a dejarlo asi, pero seguiré investigando ya que no me parece una solucion muy limpia.

Muchas grácias a todos/as.

Ester
Responder Con Cita
  #16  
Antiguo 10-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Pues me alegra que vaya funcionando... pero creo que esto merece una revisión mas a conciencia...
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #17  
Antiguo 10-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Como dice jachguate, de cualquier forma es recomendable haer una revisión a fondo pero ya tienes una muy buena pista pues sabes que el problema está en alguna de las unidades que cambias de orden. Alguna de ellas espera algo de la otra que está o no dependiendo del orden en que se ejecuta el proceso de finalización. Aunque éste cambio de orden puede solventar el problema sería bueno que logres encontrar por qué importa este orden. Posiblemente una unidad espere la existencia de un objeto que ya está destruido en la otra.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:59:34.


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
Copyright 1996-2007 Club Delphi