<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
<META NAME="GENERATOR" CONTENT="GtkHTML/3.26.2">
</HEAD>
<BODY>
El jue, 25-06-2009 a las 14:21 +0200, JoshyFun escribió:
<BLOCKQUOTE TYPE=CITE>
<PRE>
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.
</PRE>
</BLOCKQUOTE>
<BR>
Hola de nuevo Joshy, pues yo diría que no estoy nada raro.<BR>
<BR>
Abriendo el formulario:<BR>
procedure TFrmMain.btnClientesClick(Sender: TObject);<BR>
var<BR>
form: TFrmClientes;<BR>
begin<BR>
form := TFrmClientes.Create(Application);<BR>
form.ShowModal;<BR>
FreeAndNil(form);<BR>
end; <BR>
<BR>
<BR>
Cerrando el formulario Clientes<BR>
procedure TfrmClientes.BtnAnadir1Click(Sender: TObject);<BR>
begin<BR>
dmDatos.queryClientes.ApplyUpdates();<BR>
frmClientes.Close;<BR>
end; <BR>
<BR>
He subido el proyecto a: <A HREF="http://www.lordzealon.com/subidas/incigest.zip">http://www.lordzealon.com/subidas/incigest.zip</A> por si alguien quiere echarle una ojeada.<BR>
<BR>
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<BR>
<BR>
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)
</BODY>
</HTML>