Entendendo o proprietário vs. Pai em aplicativos Delphi

Toda vez que você coloca um painel em um formulário e um botão nesse painel, você faz uma conexão "invisível". O formulário se torna o proprietário do botão e o painel está definido como pai.

Todo componente Delphi possui uma propriedade Owner. O proprietário cuida de libertando os componentes de propriedade quando está sendo liberado.

Semelhante, mas diferente, a propriedade Parent indica o componente que contém o componente "filho".

Pai

Pai se refere ao componente em que outro componente está contido, como TForm, TGroupBox ou um TPanel. Se um controle (pai) contiver outros, o controles contidos são controles filhos do pai.

Pai determina como o componente é exibido. Por exemplo, as propriedades Esquerda e Superior são todas relativas ao Pai.

A propriedade Parent pode ser atribuída e alterada durante o tempo de execução.

Nem todos os componentes têm o pai. Muitos formulários não têm um pai. Por exemplo, os formulários que aparecem diretamente na área de trabalho do Windows têm o Pai definido como nulo. Um componente

instagram viewer
HasParent O método retorna um valor booleano indicando se o componente foi ou não atribuído a um pai.

Usamos a propriedade Parent para obter ou definir o pai de um controle. Por exemplo, coloque dois painéis (Painel1, Painel2) em um formulário e coloque um botão (Botão1) no primeiro painel (Painel1). Isso define a propriedade Parent do botão como Panel1.

 Button1.Parent: = Panel2; 

Se você colocar o código acima no evento OnClick para o segundo painel, quando você clicar em Panel2, o botão "pula" do Panel1 para o Panel2: Panel1 não é mais o pai do botão.

Quando você deseja criar um TButton em tempo de execução, é importante lembrarmos de atribuir um pai - o controle que contém o botão. Para que um componente fique visível, ele deve ter um pai para se exibir dentro.

ParentThis e ParentThat

Se você selecionar um botão no momento do design e examinar o Object Inspector, notará várias propriedades "compatíveis com os pais". o ParentFont, por exemplo, indica se a fonte usada para a legenda do botão é igual à usada para o pai do botão (no exemplo anterior: Painel1). Se ParentFont for True para todos os botões em um painel, alterar a propriedade de fonte do painel para Negrito fará com que todas as legendas de botões no painel usem essa fonte (em negrito).

Propriedade Controls

Todos os componentes que compartilham o mesmo pai estão disponíveis como parte do Controles propriedade desse pai. Por exemplo, controles podem ser usados ​​para iterar sobre todos os filhos do controle em janelas.

O próximo trecho de código pode ser usado para ocultar todos os componentes contidos no Panel1:

para ii: = 0 para Panel1.ControlCount - 1 Faz

 Panel1.Controls [ii] .Visible: = false;


Truques

Os controles com janelas têm três características básicas: eles podem receber o foco de entrada, usam os recursos do sistema e podem ser pais de outros controles.

Por exemplo, o componente Button é um controle em janela e não pode ser o pai de outro componente - você não pode colocar outro componente nele. O problema é que o Delphi esconde esse recurso de nós. Um exemplo é a possibilidade oculta de um TStatusBar ter alguns componentes como TProgressBar nele.

Propriedade

Primeiro, observe que um formulário é o proprietário geral de todos os componentes que residem nele (posicionados no formulário no momento do design). Isso significa que, quando um formulário é destruído, todos os componentes no formulário também são destruídos. Por exemplo, se tivermos um aplicativo com mais de um formulário quando chamarmos o método Free ou Release para um objeto de formulário, não precisa se preocupar em liberar explicitamente todos os objetos desse formulário - porque o formulário é o proprietário de todos os seus componentes.

Cada componente que criamos, no design ou no tempo de execução, deve pertencer a outro componente. O proprietário de um componente - o valor de sua propriedade Owner - é determinado por um parâmetro transmitido ao construtor Create quando o componente é criado. A única outra maneira de reatribuir o Proprietário é usar os métodos InsertComponent / RemoveComponent durante o tempo de execução. Por padrão, um formulário possui todos os componentes nele e, por sua vez, pertence ao Aplicativo.

Quando usamos a palavra-chave Auto como o parâmetro para o método Create - o objeto que estamos criando pertence à classe em que o método está contido - que geralmente é um formulário Delphi.

Se, por outro lado, tornamos outro componente (não o formulário) o proprietário do componente, então estamos responsabilizando-o pelo descarte do objeto quando ele é destruído.

Como qualquer outro Componente Delphi, O componente TFindFile personalizado pode ser criado, usado e destruído em tempo de execução. Para criar, usar e liberar um Componente TFindFile na execução, você pode usar o próximo trecho de código:

usa Achar arquivo;

...
var FFile: TFindFile;

procedimento TForm1.InitializeData;

início // form ("Self") é o proprietário do componente // não há pai, pois esse // é um componente invisível.

 FFile: = TFindFile. Criar (Self);

 ...

fim;

Nota: Como o FFile é criado com um proprietário (Form1), não precisamos fazer nada para liberar o componente - ele será liberado quando o proprietário for destruído.

Propriedade de componentes

Todos os componentes que compartilham o mesmo proprietário estão disponíveis como parte do Propriedade de componentes desse proprietário. O procedimento a seguir é usado para limpar todos os componentes de edição que estão no formulário:

procedimento ClearEdits (AForm: TForm);

var

 ii: Inteiro;

início

para ii: = 0 para Um formulário. ComponentCount-1 Faz

E se (Um formulário. Componentes [ii] é TEdit) então TEdit (AForm. Componentes [ii]) Texto: = '';

fim; 

"Órfãos"

Alguns controles (como controles ActiveX) estão contidos em janelas que não são da VCL, e não em um controle pai. Para esses controles, o valor de Parent é nada e a ParentWindow A propriedade especifica a janela pai não-VCL. A configuração ParentWindow move o controle para que ele fique contido na janela especificada. ParentWindow é definido automaticamente quando um controle é criado usando o CreateParented método.

A verdade é que, na maioria dos casos, você não precisa se preocupar com pais e proprietários, mas quando se trata de OOP e desenvolvimento de componentes ou quando você quiser dar um passo à frente no Delphi, as instruções neste artigo o ajudarão a dar esse passo mais rapidamente.

instagram story viewer