[Lazarus-es] EXC_BAD_ACCESS al hacer un close de un form

Giuseppe Luigi Punzi glpunzi en lordzealon.com
Jue Jun 25 15:05:02 CEST 2009


El jue, 25-06-2009 a las 14:21 +0200, JoshyFun escribió:

> Hello Giuseppe,
> 
> Thursday, June 25, 2009, 8:20:56 AM, you wrote:
> 
> GLPR> Hola joshy.
> GLPR> No, después del applyupdate hago:
> GLPR> Frmclientes.close
> GLPR> Esa línea es la que lleva al customform.inc
> 
> Los EXC_BAD_ACCESS son difíciles de corregir, suelen venir provocados
> por una corrupción de la memoria, pero puede venir de muy atrás en el
> código. Lo más probable es que hayas (digo tu por que es más probable
> que tu codigo esté mal que el de Lazarus) liberado algún recurso con
> un free por algún sitio pero lo hayas "reusado" sin querer. Para ello
> cambia todos los free de tu código por "FreeAndNIL" si no lo has hecho
> ya. Otra posibilidad es que algo en los objetos que usas con la base
> de datos hagan algo mal debido a un bug en el código, así que la única
> solución que veo a tu problema es que reduzcas tu código a la mínima
> expresión para que lanze el error.
> 
> Por la linea del error en customform.inc, evento close, el problema es
> que el form que estás manejando tiene la memoria corrompida, esto es
> apunta a una dirección que ha sido ya liberada por el motivo que sea.
> Un problema típico de esto, pero que no sería aplicable en este caso
> es hacer algo así en una función:
> 
> var
>   f: Miform;
> begin
>   f:=MiForm.Create;
>   f.show;
>   f.free;
> end;
> 
> Ya que el show se ejecuta y antes de que se cierre el form ya se
> libera, lo que pueda dar problemas de este tipo.
> 
> Usa el debugger y comprueba que el form "Self" siempre apunta a la
> misma dirección, para ello antes del f.showmodal apunta en un papel el
> valor de "f", y en el evento que haces el close, pon una linea de
> código que compruebe el valor de self. Ambos tienen que coincidir.
> 


Hola de nuevo Joshy, pues yo diría que no estoy nada raro.

Abriendo el formulario:
procedure TFrmMain.btnClientesClick(Sender: TObject);
var
   form: TFrmClientes;
begin
   form := TFrmClientes.Create(Application);
   form.ShowModal;
   FreeAndNil(form);
end;      


Cerrando el formulario Clientes
procedure TfrmClientes.BtnAnadir1Click(Sender: TObject);
begin
  dmDatos.queryClientes.ApplyUpdates();
  frmClientes.Close;
end; 

He subido el proyecto a: http://www.lordzealon.com/subidas/incigest.zip
por si alguien quiere echarle una ojeada.

Realmente es una chorrada de dos forms y un datamodule, simplemente
estoy haciendo un pequeño programilla para ir acordándome de Delphi. O
sea, que ignorar el código, a excepción del problema, porque puede que
algo lo halla puesto ahí para probar, pero no sirva para nada :P

Por cierto, que en mi mac, el datasource me detectaba el datamodule y
podía seleccionar el query, pero en la máquina Linux de la oficina no,
aunque supongo que eso será por las distintas versiones de Lazarus, ya
que en Linux 64 bits (ni con OpenSuse, ni con Fedora), puedo descargar
del SVN porque me dá un error)
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20090625/22357f53/attachment-0002.html>


More information about the Lazarus-es mailing list