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