PDA

Ver la Versión Completa : Creacion y destruccion de forms


lbidi
31-08-2005, 22:37:54
Hola, grandioso foro.

Tengo la siguiente GRAN duda.

Estoy realizando un proyecto y a medida q va creciendo, oviamente tarda mas en cargar , debido a la auto-creacion de los forms.

Tengo entendido que debo crear los forms y destruirlos a medida q los voy
utilizando, y he aqui mi gran problema. He visto otros hilos sobre esto, y he leido algunos libros al respecto, pero no he dado con la tecla :(

He sacado los forms de las opciones auto-create del proyecto y dentro
del codigo he puesto:


try
Application.CreateForm( tf_Listas, f_Listas);
f_Listas.ShowModal;
finally
f_Listas.Destroy;
end;



Asi esta bien, esta es la manera correcta???
Cual es la diferencia entre ShowModal y Show?
Se debe hacer Destroy o Free??

Si lo hago de la manera descrita arriba, el formulario se abre correctamente,
y me muestra los controles q tengo en él, sin embargo, cuando ejecuto un
query y muestro los datos ( deberia :) ), en un rxgrid, se cierra el formulario
y vuelve al menu principal. :confused

Cualquier ayuda sera bienvenida.
Saludos.
Leo.

marcoszorrilla
31-08-2005, 22:41:04
Pues de la manera en que lo creas, bastará con que en el evento OnClose del mismo pongas:
Action:=CaFree;

En cuanto a Show y ShowModal, como su nombre indica la segunda instrucción lo abre de forma modal es decir no podrás abandanor el formulario hasta que lo cierres o pulses en alguno de los controles que hayas habilitado.

Un Saludo

Crandel
01-09-2005, 07:08:49
La diferencia entre Free y Destroy, es que Free verifica si tu formulario existe (Self <> nil). Por lo que es preferible llamar a Free.

La otra forma es hacer (como comenta Marcos) Action:=CaFree; esto es identico a llamar a Release. La ventaja de esto es que se genera un mensaje al formulario pidiendo que se destruya, muy util cuando se esta dentro del formulario (como en el evento OnClose).

Pero este último es mas lento, dado que se genera un mensaje el cual tiene que ser procesado y demas para recien liberarse.

Para tu caso, lo que yo prefiero es llamar a Free.

lbidi
01-09-2005, 14:25:42
Gracias a ambos x sus respuestas.

Saludos.

lbidi
01-09-2005, 14:33:14
Sobre la misma duda:
Alguno de Uds sabria decirme porque se me cierra solo el formulario,
si lo hago de esa manera, modal y no autocreate??.
Me muestra bien los controles pero luego de ejecutar un query y cuando
deberia mostrar los datos en una grilla, se cierra el form :mad:

Gracias.

marcoszorrilla
01-09-2005, 14:49:35
Supongo que ejecutas la consulta pulsando en un botón, en este caso mirate la propiedad ModalREsult del mismo, por ahí puede venir la solución.

Un Saludo.

roman
01-09-2005, 17:04:43
Free verifica si tu formulario existe (Self <> nil)


Una pequeña aclaración. La existencia del formulario no es equivalente a que sea distinto de nil. Free únicamente verifica esto último. Si el formulario ya ha sido destruido y vuelve a aplicarse Free sobre la variable, muy probablemente se obtendrá una violación de acceso.

// Saludos

Crandel
01-09-2005, 18:07:34
Una pequeña aclaración. La existencia del formulario no es equivalente a que sea distinto de nil. Free únicamente verifica esto último. Si el formulario ya ha sido destruido y vuelve a aplicarse Free sobre la variable, muy probablemente se obtendrá una violación de acceso.

Tenes razón, se obtiene una violación de acceso.

Lo que se podría hacer para evitar eso (si la creación y destrucción estan por separados) es poner despues de free Form2 := nil;