Por que alguns componentes Delphi Exigir “AOwner: TComponent” para construí-los?

StackOverflow https://stackoverflow.com/questions/474448

  •  19-08-2019
  •  | 
  •  

Pergunta

Parece completamente irrelevante para exigir um TComponent como um proprietário para instanciar um objeto de algum tipo. Por que existem tantos componentes Delphi que exigem isso?

Por exemplo, TXMLDocument requer um objeto TComponent instanciar.

Por que isso é e se há uma razão boa, o que eu deveria estar usando lá para "fazer a coisa certa"?

Foi útil?

Solução

O componente proprietário é suposto para gerenciar todos os seus componentes de propriedade. Os componentes de propriedade é destruído automaticamente quando o proprietário é destruído.

Isso ajuda o desenvolvedor que apenas arrasta componentes da ferramenta de paleta, cai-los sobre a forma e simplesmente conecta-se os eventos para obter seu trabalho feito sem se preocupar com o gerenciamento da vida útil dos componentes.

O formulário é o proprietário de todos os componentes caiu sobre ele. O objeto Application é proprietário do formulário. Quando o aplicativo é fechado o objeto Application é destruído que por sua vez destrói as formas e todos os componentes.

Mas o proprietário não é realmente necessário quando um componentes é criado. Se você passar Nil ao parâmetro, o componente será criado sem dono e, neste caso, será de sua responsabilidade de gerenciar a vida útil do componente.

Outras dicas

descendentes Todos TComponent exigem proprietário, é definido no construtor TComponent. O componente proprietário é responsável para destruir todos os componentes Owned.

Se você quiser controlar o tempo de vida, você pode passar nil como parâmetro.

Só para acrescentar algumas informações extra.

Cada controle tem também um pai. (Um TWinControl). Caso o proprietário cuida da vida, o pai cuida de mostrar o objeto.

Por exemplo, um formulário tem um painel e o painel tem um botão. Nesse caso, o formulário possui o painel eo botão. Mas a forma é o pai do painel e o painel é o pai do botão.

Há também outra coisa para estar ciente. Eu tenho usado mais do que um par de componentes de terceiros que confiar em um ser componente proprietário passou no construtor Criar, e se você passar no Nil irá lançar uma exceção / AV.

O resultado líquido é que estes componentes irá funcionar bem quando você usa o visual dentro dos problemas IDE, mas porque quando eles são criados em tempo de execução.

A causa destes problemas é, em certo sentido, design ruim. Nada nas regras dizem que você não pode / não deve passar em NIL como o parâmetro AOwner.

O objeto não EXIGEM a TComponent ser passado como AOwner. Você pode facilmente passar nil para isso e lidar com a destruição si mesmo. Na maioria das vezes, eu tendem a usar esta técnica para rotinas localizadas onde o ser componente usado não estará fora usada do método atual. por exemplo:

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

Você shoudl usar isso por duas razões: - o mecanismo de propriedade significa também como uma espécie de sistema de coleta de lixo -. O mecanismo propriedade é importante no processo de serialização Delphi (Stream.ReadComponent / WriteComponent etc)

parâmetro

Um proprietário só é necessária para descendentes TComponent, pois é um parâmetro do construtor TComponent. Todos os componentes que são acessíveis em tempo de design para deixar cair em TForm, TFrame e classes TDataModule são descendentes TComponent (que inclui TXMLDocument).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top