2009-01-23 9 views

Respuesta

35

Se supone que el componente propietario administra todos sus componentes propios. Los componentes de propiedad se destruyen automáticamente cuando el propietario es destruido.

Esto ayuda al desarrollador que simplemente arrastra los componentes de la paleta de herramientas, los coloca en el formulario y simplemente conecta los eventos para realizar su trabajo sin preocuparse por administrar la vida útil de los componentes.

El formulario es el propietario de todos los componentes que se le han agregado. El objeto Aplicación es el propietario del formulario. Cuando se cierra la aplicación, se destruye el objeto Aplicación, que a su vez destruye los formularios y todos los componentes.

Pero el propietario no es realmente necesario cuando se crean componentes. Si pasa Nil al parámetro, el componente se creará sin un propietario y en este caso será su responsabilidad administrar la duración del componente.

+0

Gran respuesta. Entonces, si quisiera administrar mi vida, ¿cómo me aseguraría de que un objeto se destruya cuando termine? – Dave

+1

@prapin: es necesaria una ligera corrección: el objeto Aplicación es el único propietario de un formulario si el formulario se ha creado con Application.CreateForm(), o cuando la Aplicación se ha pasado a Create as AOwner. Un formulario puede ser propiedad de otro formulario o cualquier otro componente para ese asunto. – mghie

+0

@Dave: A continuación, las preguntas de SO tratan sobre la propiedad del objeto: http://stackoverflow.com/questions/398137/what-is-the-best-way-to-do-nested-try-and-finally-statement-in- delphi # 399860, http://stackoverflow.com/questions/415958/how-to-automatically-free-classes-objects#415990 – mghie

9

Todos los descendientes TComponent requieren Propietario, se define en el constructor TComponent. El componente propietario es responsable de destruir todos los componentes de propiedad.

si desea controlar el tiempo de vida, puede pasar nil como parámetro.

3

Solo para añadir más información.

Cada control también tiene uno de los padres. (A TWinControl). Cuando el propietario se ocupa de la vida, el padre se ocupa de mostrar el objeto.

Por ejemplo, un formulario tiene un panel y el panel tiene un botón. En ese caso, el formulario posee el panel y el botón. Pero el formulario es el padre del panel y el panel es el padre del botón.

+1

Sí, pero no todos los componentes (TComponent) son controles (TControl). TControl desciende de TComponent. Un componente que no es un control no tiene un padre. –

+0

También vale la pena señalar que si destruyes a un padre, los hijos también serán destruidos, incluso si no son propiedad del padre. –

3

También hay algo más que debe tener en cuenta. He utilizado más de un par de componentes de terceros que dependen de en un componente Propietario que se pasa en el Constructor Crear, y si pasa en Nil lanzará una excepción/AV.

El resultado neto es que estos componentes funcionarán bien cuando utilice visualmente dentro del IDE pero causará problemas cuando se creen en tiempo de ejecución.

La causa de estos problemas es, en cierto sentido, un mal diseño. Nada en las reglas establece que no puede/no debe pasar en NIL como el parámetro aOwner.

1

El objeto no es REQUISITOS a tComponent pasará como AOwner. Puede pasar fácilmente a esto y manejar la destrucción usted mismo. Muy a menudo, tiendo a usar esta técnica para rutinas localizadas donde el componente que se usa no se usará fuera del método actual.por ejemplo:

Procedure TForm1.Foo; 
var 
    XmlDoc : tXmlDocument; 
begin 
    XmlDoc := tXmlDocument.Create(nil); 
    try 
    // do processing of the XMLDoc here 
    finally 
    FreeAndNil(XmlDoc); 
    end; 
end; 
+2

'TXMLDocument' es un caso especial. Cuando pasas un Propietario 'nil' a su constructor, ¡el objeto actúa como una interfaz contada por referencia, no como un componente! Como tal, ** DEBE ** asignar el objeto a una variable de interfaz 'IXMLDocument' para mantener ese conteo de referencia correctamente. Este comportamiento está documentado en la Ayuda. Como debe usar 'IXMLDocument' en ese caso, es mejor que use' NewXMLDocument() 'y funciones relacionadas en lugar de instanciar' TXMLDocument' manualmente. –

0

Usted shoudl usar esto por dos razones: - el mecanismo de la propiedad se encuentra también como una especie de sistema de recolección de basura - el mecanismo de la propiedad es importante en el proceso de serialización Delphi (Stream.ReadComponent/WriteComponent etc.)

0

Un parámetro de propietario solo es necesario para los descendientes TComponent, ya que es un parámetro del constructor TComponent. Todos los componentes a los que se puede acceder en tiempo de diseño para caer en las clases TForm, TFrame y TDataModule son descendientes de TComponent (que incluye).

Cuestiones relacionadas