2012-02-10 12 views
7

creo mis formas en tiempo de ejecución algo como esto:Dynamic Form Creación

AboutForm := TAboutForm.Create(AboutForm); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 

Pero ¿cuál es la diferencia de que en el uso de cualquiera de estos:

AboutForm := TAboutForm.Create(Self); 
AboutForm := TAboutForm.Create(nil); 
AboutForm := TAboutForm.Create(Application); 

Todos ellos parecen funcionar de la misma a partir lo que puedo ver pero que es correcto, o son todos correctos, que generalmente es el mejor para usar?

Agradecemos sus comentarios, gracias :)

+0

1. Su primer ejemplo no tiene una pérdida de memoria. –

+0

re: su pregunta ahora eliminada sobre cómo ser un buen programador - lea el manual fino antes de enviar la pregunta al público - http://docwiki.embarcadero.com/VCL/en/Forms.TCustomForm.Create. ¿Qué argumento es de especial interés para ti? Sí, 'AOwner' - siga el enlace - http://docwiki.embarcadero.com/VCL/es/Classes.TComponent.Owner – OnTheFly

+0

@ user539484 gracias, pensé que mi otra pregunta eliminada se hubiera permitido ya que era una programación relacionada pregunta. –

Respuesta

8

El TForm.Create toma un Owner como parámetro.

En su primer ejemplo, AboutForm es el propietario. Lo que obviamente es una mala idea, ya que aún no está creado.

Cuando Self es el parámetro, la instancia que realiza la llamada es el propietario.
Cuando Application es el parámetro, la aplicación es el propietario.
Cuando nil es el parámetro, el formulario AboutForm no tiene un propietario. Eso está bien, pero en esos casos debe recordar liberar el formulario usted mismo.

Cuando transfiere un propietario, en realidad no necesita liberarlo explícitamente. El propietario lo liberará cuando el propietario sea liberado.

Así es como su código debería ser similar:

AboutForm := TAboutForm.Create(nil); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 
+0

Eso tiene sentido, especialmente con la información @PresleyDias publicada. –

+1

Eche un vistazo a este atrículo que describe el sistema de notificación del propietario y del componente, y por qué no debería asignar un propietario a un componente que desea liberar: http://delphi.about.com/od/ kbcurt/ss/dynamiccreateno.htm –

+0

¡Muchas gracias, ahora puedo ver cómo pasar el parámetro incorrecto es algo malo! –

2

El primero

AboutForm := TAboutForm.Create(AboutForm); 

cuenta la TAboutForm, que su propietario es un objeto, el cual ha sido asignado al puntero "AboutForm" antes (también podría ser NIL -> sin dueño).

El parámetro "propietario" de

TForm.Create(Owner: TComponent) 

cuenta la forma, que es su propietario. TComponents se registran a sí mismos en su propietario, si se proporciona alguno. Entonces, hay algún tipo de comunicación entre el propietario y sus hijos.

Ejemplo: Si el propietario es liberado, también puede liberar sus propios componentes.

Por lo tanto,

TAboutForm.Create(Self); 

medios, que "Ser" es el dueño de la nueva TAboutForm, si (Self is TComponent).

TAboutForm.Create(NIL); 

también es una solución aceptable, pero en este caso, hay que liberar el componente usted mismo (a excepción de, se crea TAboutForm dentro de un MDI-Window).

+4

¿Cómo crees que la primera podría estar en lo cierto? ¿Bajo qué circunstancias debe un TAboutForm crear y poseer otro TAboutForm, y luego descartar la referencia al original y reemplazarlo por el nuevo? –

+0

@RobKennedy: Ok, ¡el primero podría estar en lo cierto! Por supuesto, podría crearse otro TControl y asignarse a AboutForm, antes de que se sobrescriba con el nuevo ObjRef. Lo leí al revés (era un poco tarde aquí en Austria;) – MJSt

+0

@RobKennedy tu comentario anterior tiene mucho sentido cuando lo pones así :) –

5

cuando se crea el formulario de forma dinámica, es decir es la forma available formulario. Tienes que pasar el owner del formulario.

enter image description here

.. Así, en su caso

AboutForm: = TAboutForm.Create (Ser);

AboutForm: = TAboutForm.Create (nil);

AboutForm: = TAboutForm.Create (Aplicación);

  1. Auto
  2. Ninguna
  3. Aplicación

es el propietario de la de AboutForm (como usted ya sabe que)

But what is the difference though in using any of these:

aquí es algo de about.com-Form Owner

nula - especifica que ningún objeto posee la forma - y, por tanto, un desarrollador (usted) es responsable de liberar la forma creada (llamando myForm.Free cuando ya no se necesita el formulario)

Self - especifica el objeto al que se llama el método. Si, por ejemplo, está creando una nueva instancia de un formulario TMyForm desde el controlador OnClick de un Botón (donde este botón se coloca en un MainForm) - self se refiere a "MainForm". Por lo tanto, cuando MainForm se libera, también liberará "MyForm".

Aplicación: especifica una variable de tipo de TA global creada cuando ejecuta su aplicación. La "aplicación" encapsula su aplicación y proporciona muchas funciones que ocurren en el fondo del programa.

y esto Form Owner

a) Formx.Create (Aplicación) también - se liberarán los recursos> Formulario de aplicación cuando se termina

b) Formx.Create (Ser) -> Formulario los recursos se liberan cuando se destruye el objeto propietario (si el uno es un descendiente y el componente T)

c) Formx.Create (nil) -> usted es responsable de liberar el formulario.

Esto es de

un es utilizado por Delphi cuando una forma se crea automáticamente

b es útil para un formulario principal que tiene varias ventanas hijas que tienen que cerrar cuando el formulario principal está cerrado

c es útil para mostrar un cuadro de diálogo

Para liberar puede hacer esto ACtion := caFree onclose de la forma.

+0

Gran información gracias –