Criando Controles em Tempo de Execução

No VCL, as regras para criação dinâmica de controles são mais flexíveis em comparação com o uniGUI. Por exemplo, no uniGUI, formulários e controles não podem ser criados sem um owner. No uniGUI, formulários devem ser exibidos quando são criados, enquanto no VCL não existe essa restrição.

Outra observação importante aqui refere-se ao gerenciamento de tempo de vida de controles criados dinamicamente. Quando um controle é criado dinamicamente, a prática correta é deixar que sejam destruídos por seus owners ou pais. Não é recomendado destruir controles dinamicamente no código. Cada controle com um owner será destruído pelo seu owner (ou pai) quando o owner for liberado, portanto, em condições normais não há necessidade de escrever código adicional para destruir controles criados dinamicamente. A melhor prática é permitir que as ações do usuário decidam quando um controle deve ser liberado. Por exemplo, se você tiver um formulário que contém vários controles criados dinamicamente, esses controles serão liberados quando o usuário fechar o formulário owner.

Vamos resumir algumas das regras que devem ser seguidas ao criar controles dinamicamente:

1

Regra

Formulários, controles e componentes do uniGUI devem ser criados com um owner.

2

Regra

Para formulários, o owner deve sempre ser o objeto UniApplication.

3

Regra

Para controles e componentes, o owner deve ser um descendente de TUniForm ou TUniFrame.

4

Regra

Formulários devem ser exibidos após serem criados. Um formulário não pode ser criado agora e exibido depois.

5

Regra

Sempre que possível, objetos criados dinamicamente devem receber um nome único.

6

Regra

Controles devem ter um parent atribuído depois de serem criados.

7

Regra

O parent atribuído deve ser um descendente de TUniContainer, TUniForm ou TUniFrame.

8

Regra

A prática correta é não destruir controles no seu código. Deixe que o framework os destrua quando o owner (ou parent) do controle for destruído.

No código abaixo, um formulário é criado dinamicamente. Como você pode ver, o owner é o objeto UniApplication e o formulário é exibido logo após ser criado.

Exemplo
procedure TMainForm.UniButton1Click(Sender: TObject);
begin
  TUniForm1.Create(UniApplication).Show;
end;

Essa sintaxe pode ser estendida para modificar propriedades do formulário antes de exibi-lo.

Exemplo
procedure TMainForm.UniBitBtn1Click(Sender: TObject);
begin
  with TUniForm1.Create(UniApplication) do
  begin
    Color := clGray;
    BorderStyle := bsNone;
    ShowModal;
  end;
end;

Em ambos os exemplos, não mantemos uma instância do formulário criado porque em muitos casos isso é desnecessário. Um formulário deve ser considerado um objeto independente que é usado e descartado. Claro, você pode manter uma referência a uma instância de formulário, mas deve estar ciente de que formulários do uniGUI são destruídos dinamicamente quando são fechados pelo usuário, de modo que qualquer variável que contenha a instância do formulário ficará em um estado inválido após o fechamento do formulário.

Para criar controles dinamicamente, podemos usar os eventos OnCreate ou OnBeforeShow do formulário. Na verdade, qualquer outro evento pode ser usado, mas se você quiser criar muitos controles dinâmicos é sensato fazer isso antes que o formulário se torne visível.