2010-11-10 3 views
6

Cuando se crea un TForm en Builder (o Delphi) de código se añade a main para crear estas formas de inicio de la aplicación:deja que C++ Builder/Delphi cree TForms en el lanzamiento, o crea manualmente?

Application->CreateForm(__classid(TxForm), &xForm); 

esto hace las cosas más fáciles, pero es prudente cuando las aplicaciones tienen 10, 20, 50, 100 formas? Estoy asumiendo que esto puede agarrar todo tipo de memoria y manejos de sistema. La forma siempre se puede crear sobre la marcha cuando sea necesario mediante la eliminación usando el Proyecto-> Opciones-> formas del diálogo y:

std::auto_ptr<TxForm> myForm(new TxForm(this)); 

myForm->ShowModal(); 

Así que la pregunta es, lo que es mejor, dejar que C++ Builder haga su propio forma, o para crear manualmente el formulario cuando sea necesario?

+1

Por supuesto, se puede haga que Delphi no autocinee los formularios en cuestión eliminándolos de la lista de formularios de autocreación en Project >> Options >> Forms. Probablemente ya lo sepas, pero pensé que debería mencionarse con la pregunta. –

+0

Correcto, lo agregaré a la pregunta para mayor claridad. –

Respuesta

2

Los formularios creados pero aún no visibles toman memoria y tienen impacto en el tiempo de inicio, pero no deben usar ningún identificador de sistema, ya que cosas como los identificadores de ventana no se asignan hasta que realmente se muestra la ventana.

Dicho esto, casi siempre creo formularios manualmente (usando un código similar a su auto_ptr), porque no soporto tener variables globales. La creación manual de formularios ofrece algunas ventajas: un inicio de la aplicación más rápido, los formularios siempre se muestran en un buen estado conocido, y más fácil cambiar luego para mostrar varias instancias de un formulario a la vez si es necesario.

Como the VCL documentation explains, delete ing una forma directa (o indirectamente, mediante el uso de una acción std::auto_ptr) puede causar errores de memoria, ya que la forma puede tener mensajes no procesados. Para evitar este problema, escribí dos clases de punteros inteligentes que se encargan de llamar al Release en lugar de delete. Puede descargarlos desde http://gist.github.com/671452.

+2

¿Por qué borra su llamada DeleteOrRelease()? De acuerdo con los documentos ¿Release hará el trabajo todo el tiempo? –

+0

+1 para la nota sobre la eliminación de un TForm comienza ilegal! –

+1

Si observa el código fuente de Release, llama a 'PostMessage (Handle, ...)', y lee el valor de las llamadas de propiedad Handle HandleNeeded, que asigna un manejador (es decir, asigna un grupo de recursos de Windows necesarios para muestra el formulario en la pantalla). Me parece tonto, por una forma que nunca se ha mostrado o cuyo identificador de ventana se ha destruido desde entonces, asignar un asa para que pueda liberarla inmediatamente. Llamar a eliminar si! HandleAllocated es una micro-optimización, pero nunca me ha causado ningún problema. –

5

Realmente depende de cómo use los formularios en su aplicación. Normalmente los creo sobre la marcha cuando es necesario y luego los libero cuando termino. Es más trabajo manual pero ahorra recursos (y cuesta un poco de CPU cada vez que puede causar retrasos).

Si rara vez usa un formulario, yo diría crear/liberar (eliminar) manualmente cuando sea necesario, pero si usa el formulario todo el tiempo y durante toda la vida de la aplicación, permanezca de la manera predeterminada.

2

IMO, la creación automática de formularios que probablemente no utilizará, como el cuadro Acerca de, es simplemente un desperdicio. Por lo general, auto-creo el formulario principal, y luego creo dinámicamente el resto, según sea necesario.

5

Sugerir que el IDE "lo haga a su manera" implica que el IDE está utilizando algún tipo de inteligencia en la forma en que genera el código para crear formularios y módulos de datos. No lo es. Simplemente está creando lo que le dijo que creara, y en el orden que le dijo que usara. Si no le dijo explícitamente qué hacer a través del diálogo de opciones de proyecto, entonces simplemente está creando cosas en el orden en que las agregó a su proyecto. El IDE no sabe nada mejor que tú.

El uso de formularios y módulos de datos creados automáticamente fomenta el uso de las variables globales que el IDE declara que debe referirse a esos objetos. No los necesitas.

Cree automáticamente solo su formulario principal. Cuando necesite algo más, créelo usted mismo utilizando la forma típica de crear objetos: llame al constructor y almacene referencias a los objetos en variables locales o campos de sus otros objetos, no los globales proporcionados por IDE, que debe eliminar. No te molestes con CreateForm.I wrote an article explaining why.

+0

No hubo intención de insinuar que el IDE estaba usando ningún tipo de inteligencia en absoluto :-) –

0

menos que la solicitud es sólo una muy pequeña cama o POC prueba, de crear solo la forma principal (y/o un módulo de datos global si es su estilo/diseño) y crear manualmente todos los demás.

Creación de todas las formas de carga es sólo una pérdida y (dependiendo de lo que se hace en las formas) puede hacer que su programa de carga más rápido que una tortuga de mar caminar sobre la arena ...

Cuestiones relacionadas