PDA

Ver la Versión Completa : dudas sobre fichas


Cecilio
15-09-2007, 13:46:18
Si se hace una aplicación, con muchas fichas y todas se crean automaticamente, deduzco que se ocupará mucha memoria y la aplicación será mas perezosa. ¿ cierto ?

Entonces yo, he desactivado la creación automatica de algunas fichas y para abrirla tengo este código:


Comunicaciones:=TComunicaciones.Create(Application);
Comunicaciones.Show;
//comunicaciones.Free;


si en vez de Show abro en modo moal, puedo ejecutar el Free, sin problema.
1- ¿ pero como hago Free cuando es en modo Show normal ?
2- ¿ Como se libera la aplicación ?
3- ¿ como saber el número de veces que hay abierta una ficha ? ( esto no es muy importante ahora)

Gracias.

dec
15-09-2007, 14:06:07
Hola,

Hace poco que leí el artículo Delphi "problem": TForm.Create(?) Nil, Self or Application? (http://delphi.about.com/od/adptips2005/qt/nilselfapp.htm) de Zarko Gajic, que creo que viene aquí al pelo y tal vez te interese leer a ti también.

Lo primero decirte que estás en lo correcto: si al inicio de la aplicación se crean N formularios, se consumirán Y recursos. Si estos se van creando, por tanto, según vayan necesitándose, y liberándose luego de que su uso no sea necesario, probablemente ahorremos recursos.


1- ¿ pero como hago Free cuando es en modo Show normal ?


Puedes hacerlo "cuando quieras", pero, sabe que los formularios cuentan con un evento "OnClose", en el que se pasa por referencia un parámetro "Action", de tipo "TCloseAction", que determina, precisamente, qué ha de hacerse con el formulario una vez este se cierre.

¿Posibles valores para dicho parámetro "Action"? Pues: caNone (para no hacer nada en concreto), caHide (para ocultar el formulario, simplemente), caFree (para liberar el formulario) o caMinimize (para minimizarlo).


2- ¿ Como se libera la aplicación ?


Ahí ya me meto yo en camisas de once varas, pero, tal vez baste decir que cuando el formulario principal de la aplicación se cierre... la aplicación comenzará a liberarse. Por aplicación entiendo aquí a la variable "Application", que comenzará a liberar los objetos de que sea dueña, para por último terminar la aplicación. El formulario principal de la aplicación es el primero que se crea.


3- ¿ como saber el número de veces que hay abierta una ficha ? ( esto no es muy importante ahora)


Eso depende. Una variable "Form", de tipo "TForm", sólo puede contener una instancia de la clase "TForm". Si tienes más variables con más instancias del mismo formulario... pero, no es lo común, diría yo. También hay que ver qué se entiende por un formulario "abierto". Este puede estar creado, pero, oculto, por ejemplo.

En todo caso si te interesa conocer todos los formularios de la aplicación cuenas con la variable "Screen", que tiene propiedades como "FormCount" y "Forms", que te dan acceso a todos los formularios creados en la aplicación en un momento dado.

Y termino remitiéndote de nuevo al artículo Delphi "problem": TForm.Create(?) Nil, Self or Application? (http://delphi.about.com/od/adptips2005/qt/nilselfapp.htm) de Zarko Gajic; verás que en lugar de usar "Application" como "dueña" (owner) de un formulario que crees, tal vez te convenga usar el propio "Self", o incluso "nil". Revisa el artículo en todo caso. Aunque en inglés no resulta complicado de seguir.

Ñuño Martínez
15-09-2007, 14:33:29
Confirmo lo que dice dec porque lo he comprobado en mis propias carnes. Hace años me encargaron mejorar un programa. Era completísimo y tenía como 200 ventanas, fichas, paneles y formularios o más. El que había hecho el programa había dejado que se crearan todos estos objetos automáticamente, así que nada más empezar el programa se tiraba media hora (reloj en mano) parado hasta abrir la primera ventana.

Cuando terminé la remodelación (un año más tarde) mi programa tenía tantas o más ventanas y paneles pero sólo los cuatro o cinco más importantes (la principal, un datasource y alguna cosilla más) eran creados al arrancar mientras que el resto se creaban y destruían cuando procedía.

Mi jefe se quedó flipando porque el anterior programador le dijo que no podía cargar más rápido y mi versión cargaba en 30 segundos o poco más (y por culpa de la base de datos, que se las traía).

Así que pregunta, pregunta:

2- ¿ Como se libera la aplicación ?Cuando se cierra la "ventana principal" (mira el código fuente del archivo "dpr" de tu proyecto). Esto lo hace el objeto Application, el cual mantiene una lista con todas las ventanas que se crean, tanto automáticamente como a mano, a través del objeto "Screen" que ha descrito dec. Cuando se destruye la "ventana principal" el objeto Application entiende que se quiere terminar el programa así que coge la lista de ventanas y las va destruyendo una a una.

(nota: Lo cierto es que hace mucho que no hago programas "visuales" en Delphi, así que si estoy equivocado ruego me disculpen).

Cecilio
15-09-2007, 15:30:59
Hola,

Puedes hacerlo "cuando quieras", pero, sabe que los formularios cuentan con un evento "OnClose", en el que se pasa por referencia un parámetro "Action", de tipo "TCloseAction", que determina, precisamente, qué ha de hacerse con el formulario una vez este se cierre.

¿Posibles valores para dicho parámetro "Action"? Pues: caNone (para no hacer nada en concreto), caHide (para ocultar el formulario, simplemente), caFree (para liberar el formulario) o caMinimize (para minimizarlo).


¿ y como se hace eso ? De todas formas voy a buscar en el foro, por si encuentro algo.

dec
15-09-2007, 15:42:31
Hola,

Pues muy sencillo. Tienes que usar el evento "OnClose" de los formularios, siempre que lo estimes oportuno. Y en dicho evento verás que se pasa por referencia un parámetro "Action". A dicho parámetro uno de los valores posibles, por ejempo, "caFree", de modo que cuando el formulario se cierre se libere al mismo tiempo.