Destruindo Controles em Tempo de Execução

No uniGUI, é possível destruir um controle em tempo de execução chamando seu método Free(). Isso removerá o controle de seu pai e o destruirá junto com todos os recursos associados. No entanto, chamar Free() manualmente não é recomendável, a menos que haja um bom motivo. Geralmente é melhor permitir que o uniGUI gerencie quando os controles devem ser liberados.

Normalmente, os controles são destruídos quando o formulário proprietário é fechado. Se o proprietário for um TUniFrame, seus controles filhos serão destruídos quando o formulário proprietário for fechado. Em alguns casos, controles ou um TUniFrame podem residir dentro de uma página de guia (TUniTabSheet) de um page control. Se a página de guia for fechável, ela será liberada quando o usuário a fechar; todos os seus controles filhos também serão liberados.

Você pode criar controles dinamicamente em tempo de execução, mas deve deixar a destruição desses controles para o uniGUI. Como regra geral, os controles devem ser liberados por ações do usuário, como fechar formulários, fechar páginas de guia, encerrar uma sessão, etc.

circle-exclamation
chevron-rightCenário de exemplo ilustrando o problemahashtag

Você tem um UniDBGrid preenchido com dados na tela e chama seu Free() no manipulador OnClick de um botão:

Exemplo (Delphi)
procedure TMainForm.UniButton1Click(Sender: TObject);
begin
  UniDBGrid1.Free;
end;

Como a comunicação entre servidor e cliente é assíncrona, pode haver um atraso entre o usuário pressionar o botão e a grade ser liberada e removida da interface. Durante esse intervalo, o usuário ainda pode interagir com a grade, gerando eventos enviados ao servidor. Esses eventos não podem ser processados porque a grade não existe mais no servidor, o que pode gerar exceções.

Isso poderia ser mitigado exibindo uma máscara na tela (bloqueando a interação do usuário) até que a grade seja totalmente removida, mas essa abordagem aumenta a complexidade e é fácil de esquecer — especialmente porque o problema frequentemente aparece apenas em conexões de internet lentas e não em redes locais rápidas.

Melhor prática: deixe o framework liberar os controles por meio dos eventos normais do ciclo de vida dirigidos pelo usuário (fechar formulários, fechar páginas de guia, encerrar sessões, etc.) em vez de chamar Free() manualmente para controles visuais em tempo de execução.