[Lazarus-es] forms enredados II

José Mejuto joshyfun en gmail.com
Lun Dic 20 23:30:04 CET 2010


Hello Paola,

Monday, December 20, 2010, 10:45:24 PM, 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é





More information about the Lazarus-es mailing list