PDA

Ver la Versión Completa : Diferencia de crear formularios con Create(self) y con Application.CreateForm


Lizette
30-03-2009, 00:04:22
Hola a todo el foro, tengo una duda cuando creo formularios dinámicamente se crean con:
Form1:=TForm1.Create(self);

Pero también se pueden crear con:
Application.CreateForm(TForm1, Form1);

O cuál es la diferencia entre estas dos sentencias?

Gracias y saludos..

PD: Mi aplicación consta de más de 20 formularios y se tarda bien mucho en cargar, y quiero que la carga sea más rápida.. Pero como paso informacion entre formularios al seleccionar una opción creo los form que voy a necesitar para ejecutar dicha opción, y al salir de la misma libero los form creados.

La incógnita es, es vieble hacerlo con Application.CreateForm(TForm1, Form1)??:confused:

De antemano gracias

dec
30-03-2009, 00:28:48
Hola,

Todo se resume en quién es el "dueño" ("owner") del formulario, esto es, quién es el encargado de liberarlo, cuando a su vez sea liberado. Si asignas como dueño de un formulario a otro, como cuando creas un formulario usando "Self" (otro formulario) como "dueño", dicho formulario será liberado automáticamente, cuando el formulario "dueño" sea liberado a su vez.

Si sigues el método "Application.CreateForm()", verás que al formulario que se crea se le asigna como dueño el mismo objeto "Application", de modo que el formulario será liberado, automáticamente, cuando el objeto "Application" sea liberado a su vez. Piensa que incluso puedes crear un formulario de este modo:


with TSampleForm.Create(nil) do
begin
try
ShowModal();
finally
Free();
end;
end;


Con "nil" no estás asignando ningún dueño para el formulario "TSampleForm", de modo que en este caso hemos de ser nosotros mismos quienes nos encargamos de liberarlo, y así lo hacemos más abajo, como puedes ver. ;)

Lizette
30-03-2009, 02:24:33
Haber si te entendi entonces lo que yo hago es lo siguiente (pero me marca error :():

En un Form1, cuando doy click a la opcion 1 hago lo sig:


//Se crean los Formularios necesarios para ejecutar la opcion 1
Form2:=Form2.Create(nil);
Form3:=Form2.Create(nil);
Form4:=Form2.Create(nil);
Form5:=Form2.Create(nil);
Form6:=Form2.Create(nil);
Form7:=Form2.Create(nil);
FormOp1.Show;//Manda llamar el menu de opcion 1


Una vez dentro del menu puedo ejecutar cualquier operacion y mandar llamar a Form2,3,4,5,6,7 previemente creados. Cuando dentro del menu le pongo salir, hago:


Form2.Free;
Form3.Free;
Form4.Free;
Form5.Free;
Form6.Free;
Form7.Free;
//Para liberar los form creados para la opcion elegida


Pero cuando dentro del menu de la opcion 1 mando llamar a Form2.Show, me marca error.. De que no existe esa direccion de memoria:confused:

Que hacer??

Lizette
30-03-2009, 02:26:56
Se supone q si le doy salir, me libera todo, y me regresa al menu de opciones, pero si ejecuto cualquier form creado previamente, me deberia de visualiar el form.. y no lo hace :mad:

Neftali [Germán.Estévez]
30-03-2009, 08:46:44
Prueba con:
Form2:=TForm2.Create(nil);
en lugar de:

Form2:=Form2.Create(nil);

Estás llamando a la instancia en lugar de a la clase para el Create. Igual para el resto de llamadas.