Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al salir (https://www.clubdelphi.com/foros/showthread.php?t=9572)

cisterpe 27-04-2004 09:21:00

Error al salir
 
Al salir de la aplicacion me dice

Código:

Exception Eacces violation in module programa.exe at 000CC7E4.
Acces violation at adress 00CC7E4 in module programa.exe.
Read of adress 00C46AF4

Cual es el problema??

¿¿Como puedo averigar donde esta el error?


Gracias

Lepe 27-04-2004 11:30:03

Lo mismo que entiendes tu en ese código es lo mismo que entiendo yo :(

En principio, está accediendo a una zona de memoria que no debería acceder.

Si tienes código en el FormClose o CloseQuery, pon un BreakPoint al inicio de ambas y pulsa F8 para ver en que línea da el error.

Saludos.

cisterpe 27-04-2004 11:40:59

No se como explicarme donde podria estar el error.

Probe lo del breakpoint y el error me aparece ya despues de haber cerrado el programa.

O sea despues de pasar por el "end." del "form1"

Por eso preguntaba si existe alguna manera de poder averiguar donde esta el error con lo que te presenta en pantalla el programa.

Cuando ejecuto el programa en Windows (sin delphi) me aparece un tipico eror de "Programa.exe ha efectuado una operacion no valida y se cerrara".

Cuando le doy a cerrar a esta ventana me aparece la otra que puse anteriormente, con la posibilidad de Aceptar, y aparentemente despues de aceptar no ocurre nada.

Puedo volver a ejecutar la aplicacion sin problema alguno.

Si ejecuto bajo Delphi solo me aparece la ultima ventana

cisterpe 27-04-2004 11:51:01

Añado el event LOG a ver si sirve de algo...

Module Load: SensApi.dll. No Debug Info. Base Address: $60000000. Process Gesnot.exe ($F14EBE9F)
<------------Final Carga Programa------------------->
Cierro Aplicacion

<------------ ERROR -------------------------------> (Aceptar)
Module Unload: OLEPRO32.DLL. Process Gesnot.exe ($F14EBE9F)
Module Unload: idr20009.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: iddbas32.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: bantam.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: idapi32.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: gds32.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: RNR20.dll. Process Gesnot.exe ($F14EBE9F)
Module Unload: MSAFD.dll. Process Gesnot.exe ($F14EBE9F)

cisterpe 27-04-2004 12:13:17

Mas Datos...

Al conectar a la base de datos compruebo si existe un fichero llamado Confgen2.dbf para que elija la base de datos.

Código:

if FileExists('Confgen2.dbf') then
begin

    try
        selbas.ShowModal;
      finally
      FreeAndNil(selbas);
    end;


end
else
begin
Confgen.tablename:='confgen.dbf';
end;

Si elimino la comparacion si que funciona, pero si cambio por esto...

Código:

if FileExists('Confgen2.dbf') then
begin
Confgen.tablename:='confgen2.dbf';

end
else
begin
Confgen.tablename:='confgen.dbf';
end;

Tambien me da error.

Pense que el error podia estar en Confgen2.dbf, pero cuando me sale la pantalla para seleccionar (SelBas) si selecciono confgen.dbf tambien al salir me da error.

jachguate 27-04-2004 16:40:58

Hola.

Todo parece indicar que hay un mal manejo de la destrucción de algun o algunos objetos...

Estas llamando al método free de algun objeto dentro de tu código??

Si lo haces, en que circunstancias lo llamas?? cómo se ha creado el objeto? Mostrá un trozo de código.

Que es selbas?? porque llamas a freeandnil?? cómo lo has creado?

Hasta luego.

;)

vic_ia 27-04-2004 18:42:21

Hola.

A mi me sucedia un error igual, cuando realizaba algunas operaciones y posteriormente eliminaba un form; al parecer las operaciones o el acceso algun dato de algun control no era inmediato, por lo que al llevarse a cabo la eliminación del form, ya no podia accesarlo y eso llevaba al error. Una de esas operaciones que me generaba el error era la eliminación de algunos controles creados por codigo. Espero te sirva de referencia.

__cadetill 27-04-2004 20:52:10

Revísate también el DPR del proyecto, no sea que hagas algo allí con objetos que tengas ya destruidos

cisterpe 28-04-2004 09:18:43

Cita:

Empezado por jachguate
Estas llamando al método free de algun objeto dentro de tu código??

En todos los formularios que creo, cuando los cierro en el evento onclose llevan esto

Código:

Action := caFree;
Selbas:= nil; (Nombre del form)

Cita:

Empezado por jachguate
Que es selbas?? porque llamas a freeandnil?? cómo lo has creado?

Selbas es un formulario normal y corriente que se crea y lleva 2 radio buttons y un button para seleccionar la base de datos que quieran.

----------------------------------------------------------

x Cadetill

Código:

Application.Initialize;
        if FileExists('Confgen.dbf') then
        begin
          Application.CreateForm(TForm1, Form1);
          Application.CreateForm(TDataModule1, DataModule1);
        end
        else
        begin
          Application.CreateForm(TConfig, Config);
          config.show;
        end;
Application.Run;
end.

El DPR del proyecto no lleva nada mas..

No se seguire mirando, pero no entiendo nada, en principio me da el error ahora ya casi siempre incluso en los casos que no me daba error antes, podria ser problema del ordenador donde estoy compilando??

Gracias a todos por la ayuda, a ver si a alguien se le enciene la bombilla da con el problema :(

__cadetill 28-04-2004 11:16:01

Si en cada from haces en el OnClose
Cita:

Empezado por cisterpe
Código Delphi [-]
Action := caFree;
Selbas:= nil; (Nombre del form)

y por otro lado a la que sale de la pantalla haces
Cita:

Empezado por cisterpe
Código Delphi [-]
try
  selbas.ShowModal;
finally
  FreeAndNil(selbas);
end;

Es normal que te de el AccessViolation, ya que intentas llamar a la función Free de un objeto que ya no tienes (le has asignado nil con anterioridad)

cisterpe 28-04-2004 11:40:10

Tengo en todos los Forms y nunca me habia dado problemas...

y en ese caso me daria error cada vez que cierro un form no??


De todas formas he hecho esto, y no se si esta bien del todo...

En el Form1 en el evento ONCLOSE

Pongo lo siguiente


Código:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DataModule1.destroy;
end;

end.

Y ya no me da el error.

No se que he tocado mas pq he tocado muchas cosas. :rolleyes:

jachguate 28-04-2004 18:32:45

Además de lo ya explicado por cadetill... te recomiendo no llamar directamente al método (destructor) Destroy de ningun componente. No veo porque destruyes el DataModule1 alli... si form1 es el form principal, y Application es el owner de DataModule1, eso también provocará un fallo, pues un instante después, Application tratará de destruirlo de nuevo.

En conclusión, quitá la llamada a Destroy.

Por otro lado, si realmente te corresponde a vos destruir el DataModule, mejor usá su método Free, que llamará a Destroy. Es una recomendación de los diseñadores de la VCL que yo me he acostumbrado a seguir.

Hasta luego.

;)

cisterpe 28-04-2004 18:43:53

Gracias por la aclaracion, con Datamodule1.free tampoco me da el error asi que si es una recomendacion tambien la utilizare.

No puedo evitar el destruir y no entiendo pq ya que si lo quito me da el dichoso error.

Muchas gracias

jachguate 28-04-2004 19:08:46

Pues lo único que me queda es recomendarte, en primer lugar, que investigues un poco sobre el tema del owner y la destrucción automática de objetos por parte de este. Luego de haber comprendido como funciona el asunto, que revises minuciosamente tu código, para evitar que el programa sea una caja de pandora que ande dando violaciones de acceso a memoria por alli.

Hasta luego.

;)

cisterpe 28-04-2004 19:20:04

Hombre el programa tiene bastante para ser el primero, y nunca habia tenido este problema.

Seguire tus indicaciones.


Gracias


La franja horaria es GMT +2. Ahora son las 22:02:14.

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