![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
||||
|
||||
|
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 |
|
#2
|
||||
|
||||
|
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.
|
|
#3
|
|||
|
|||
|
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 |
|
#4
|
||||
|
||||
|
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:
|
|
#5
|
||||
|
||||
|
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 |
|
#6
|
|||
|
|||
|
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 |
|
#7
|
||||
|
||||
|
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 |
|
#8
|
|||
|
|||
|
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 |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|