Hello Paola,
you wrote> Vale... Pero si es "ShowModal" puedes liberarlo despu�s del modal, sin
> tener que meterte en lo del caFree.
PB> prob� ahora de no usar los cafree y liberar los forms correspondientes PB> luego del showmodal y pasa lo mismo..!!
PB> y se detiene en la MISMA PARTE!!, o sea, en el c�digo que te captur� PB> anteriormente..
No consigo reproducir el error, as� que s�lo me queda especular.
Para empezar, si me lo permites vamos a cambiar algunas cosas del estilo de programaci�n, ya que conllevan errores frecuentes:
1) Application.CreateForm s�lo se usa con formularios o datamodules que van a ser creados al principio de la aplicaci�n y que s�lo se destruir�n despu�s de cerrar la �ltima ventana, o en un "Application.Terminate". Resumiendo, lo podemos usar en el .lpr y en el resto de casos a menos que estemos seguros 100% de lo que hacemos no usarlo.
2) Para crear los forms, especialmente los que vamos a mostrar con ShowModal de este modo:
procedure Form3.XXXXXXX;
var
NewForm: TForm4;
begin
NewForm:=TForm4.Create(Self);
NewForm.ShowModal;
NewForm.Free;
end;
Donde NewForm NO es la variable global asociada a TForm4.
3) No usaremos caFree en los form que vayan a ser modal por definici�n.
4) Para crear un form que no va a ser modal, lo crearemos igual que en el punto 2, pero no pondremos el "NewForm.Free", en su lugar activaremos el caFree en el OnClose. Ojo! al crearlo de este modo, al hacer un Free del form3, el form4 se cerrar� autom�ticamente.
Resumiendo, que tenemos que tener controlado el ciclo de vida de cada formulario. Si un formulario depende �nica y exclusivamente de la presencia anterior de otro, haremos que este sea el "Owner" del que creamos, de modo que en una secuencia de creaci�n nos queda un �rbol:
form1 |-> form2 -> form4
|-> form3 |-> form5
|-> form6
De este modo, si le decimos (como sea) a form1 que se cierre, autom�ticamente �l cerrar� todos los form hijos, o sea, form2 y form3, a su vez form2 cerrar� form4, y form3 cerrar� form5 y form6.
Tal y como tu lo haces, "Application" controla la vida de todos los formularios, y aunque eso no tiene por qu� causar ning�n problema, si que hace el control del flujo m�s complicado y dif�cil de evaluar.
Ah! se me olvidaba, y quiz� lo m�s importante, los datamodules. Cuando crees estos, aseg�rate de que no lo haces dos veces!, para ello haz lo de:
if Assigned(Datamodule) then
DataModule:=TDataModule.Create(Application);
Y aseg�rate que cuando se destruye (si es que lo haces) de que lo destruyes SIEMPRE con FreeAndNil(DataModule).
Best regards,
Jos�