Comentarios

Comprender propietario vs. padre en aplicaciones de Delphi

Comprender propietario vs. padre en aplicaciones de Delphi

Cada vez que coloca un panel en un formulario y un botón en ese panel, establece una conexión "invisible". El formulario se convierte en el propietario del Botón, y el Panel está configurado para ser su padre.

Cada componente de Delphi tiene una propiedad de Propietario. El propietario se encarga de liberar los componentes de propiedad cuando se está liberando.

Similar pero diferente, la propiedad Parent indica el componente que contiene el componente "hijo".

Padre

Principal se refiere al componente en el que está contenido otro componente, como TForm, TGroupBox o un TPanel. Si un control (primario) contiene otros, los controles contenidos son controles secundarios del primario.

Principal determina cómo se muestra el componente. Por ejemplo, las propiedades Izquierda y Superior son todas relativas a la Principal.

La propiedad principal se puede asignar y cambiar durante el tiempo de ejecución.

No todos los componentes tienen el padre. Muchas formas no tienen un padre. Por ejemplo, los formularios que aparecen directamente en el escritorio de Windows tienen Parent configurado en nil. Un componente HasParent El método devuelve un valor booleano que indica si al componente se le ha asignado un padre o no.

Usamos la propiedad Parent para obtener o establecer el padre de un control. Por ejemplo, coloque dos paneles (Panel1, Panel2) en un formulario y coloque un botón (Botón1) en el primer panel (Panel1). Esto establece la propiedad principal de Button en Panel1.

Button1.Parent: = Panel2;

Si coloca el código anterior en el evento OnClick para el segundo Panel, cuando hace clic en Panel2, el botón "salta" de Panel1 a Panel2: Panel1 ya no es el padre del botón.

Cuando desee crear un TButton en tiempo de ejecución, es importante que recordemos asignar un padre, el control que contiene el botón. Para que un componente sea visible, debe tener un padre para mostrarse dentro.

ParentThis y ParentThat

Si selecciona un botón en el momento del diseño y mira el Inspector de objetos, notará varias propiedades "para padres". los ParentFont, por ejemplo, indica si la Fuente utilizada para el título del Botón es la misma que la utilizada para el elemento primario del Botón (en el ejemplo anterior: Panel1). Si ParentFont es verdadero para todos los botones en un panel, cambiar la propiedad de fuente del panel a negrita hace que todos los títulos de los botones en el panel usen esa fuente (negrita).

Propiedad de controles

Todos los componentes que comparten el mismo padre están disponibles como parte de Controles propiedad de ese padre. Por ejemplo, los controles pueden usarse para iterar sobre todos los elementos secundarios del control con ventana.

El siguiente fragmento de código se puede usar para ocultar todos los componentes contenidos en Panel1:

para ii: = 0 a Panel1.ControlCount - 1 hacer

Panel1.Controlsii.Visible: = falso;

Trucos de engaño

Los controles en ventana tienen tres características básicas: pueden recibir el foco de entrada, usan los recursos del sistema y pueden ser padres de otros controles.

Por ejemplo, el componente Button es un control de ventana y no puede ser el padre de algún otro componente; no puede colocar otro componente en él. La cuestión es que Delphi nos oculta esta característica. Un ejemplo es la posibilidad oculta de que un TStatusBar tenga algunos componentes como TProgressBar.

Propiedad

Primero, tenga en cuenta que un Formulario es el Propietario general de cualquier componente que resida en él (colocado en el formulario en tiempo de diseño). Esto significa que cuando se destruye un formulario, todos los componentes del formulario también se destruyen. Por ejemplo, si tenemos una aplicación con más de un formulario cuando llamamos al método Free o Release para un objeto de formulario, no tenemos que preocuparnos de liberar explícitamente todos los objetos en ese formulario, porque el formulario es el propietario de Todos sus componentes.

Cada componente que creamos, en diseño o tiempo de ejecución, debe ser propiedad de otro componente. El propietario de un componente, el valor de su propiedad Propietario, está determinado por un parámetro pasado al constructor Crear cuando se crea el componente. La única otra forma de reasignar el propietario es usar los métodos InsertComponent / RemoveComponent durante el tiempo de ejecución. Por defecto, un formulario posee todos los componentes y, a su vez, es propiedad de la Aplicación.

Cuando usamos la palabra clave Self como parámetro para el método Create, el objeto que estamos creando pertenece a la clase en la que está contenido el método, que generalmente es una forma Delphi.

Si, por otro lado, hacemos que otro componente (no el formulario) sea el propietario del componente, entonces hacemos que ese componente sea responsable de deshacerse del objeto cuando se destruye.

Como cualquier otro componente de Delphi, el componente TFindFile personalizado se puede crear, usar y destruir en tiempo de ejecución. Para crear, usar y liberar un componente TFindFile durante la ejecución, puede usar el siguiente fragmento de código:

usos Encontrar archivo;

var FFile: TFindFile;

procedimiento TForm1.InitializeData;

empezar // form ("Self") es el propietario del componente // no hay Parent ya que // es un componente invisible.

FFile: = TFindFile.Create (Self);

 …

fin;

Nota: Dado que el FFile se crea con un propietario (Form1), no necesitamos hacer nada para liberar el componente; se liberará cuando se destruya el propietario.

Propiedad de componentes

Todos los componentes que comparten el mismo propietario están disponibles como parte de Propiedad de componentes de ese dueño. El siguiente procedimiento se utiliza para borrar todos los componentes de Edición que están en el formulario:

procedimiento ClearEdits (AForm: TForm);

var

ii: entero;

empezar

  para ii: = 0 a AForm.ComponentCount-1 hacer

  Si (AForm.Componentsii es TEdit) luego TEdit (AForm.Componentsii) .Text: = ";

fin;

"Huérfanos"

Algunos controles (como los controles ActiveX) están contenidos en ventanas que no son VCL en lugar de en un control principal. Para estos controles, el valor de Parent es nulo y el ParentWindow La propiedad especifica la ventana principal que no es VCL. La configuración de ParentWindow mueve el control para que esté contenido en la ventana especificada. ParentWindow se establece automáticamente cuando se crea un control utilizando el CreateParented método.

La verdad es que en la mayoría de los casos no necesita preocuparse por los Padres y Propietarios, pero cuando se trata de OOP y desarrollo de componentes o cuando desea llevar a Delphi un paso adelante, las declaraciones en este artículo lo ayudarán a dar ese paso más rápido .