Formulário de Aplicação
Este é o código gerado automaticamente para um Formulário de Aplicação (já renomeado):
unit _AppForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIForm;
type
TAppForm = class(TUniForm)
private
{ Declarações privadas }
public
{ Declarações públicas }
end;
function AppForm: TAppForm;
implementation
{$R *.dfm}
uses
MainModule, uniGUIApplication;
function AppForm: TAppForm;
begin
Result := TAppForm(UniMainModule.GetFormInstance(TAppForm));
end;
end.Em vez de uma variável como:
que é o código padrão gerado para um formulário VCL, o Assistente gerou uma função com o mesmo nome e tipo.
A variável original era de escopo global, o que é problemático em um ambiente multiusuário. A nova função solicita a instância ao UniMainModule da sessão, tornando automaticamente o formulário local para cada sessão.
A função mantém a intenção original da variável VCL: cada sessão sempre acessará apenas uma instância desse formulário (é um singleton por sessão).
A função também é inteligente o suficiente para gerenciar o tempo de vida do formulário:
Ela criará o formulário se ele não existir.
Se o formulário for fechado, ele será liberado e removido da lista de formulários gerenciados. (Propriedade FreeOnClose = True)
Ele será retornado imediatamente se já existir.
Usando a função global do Application Form
Formulários uniGUI são objetos dinâmicos e o framework os aloca e descarta automaticamente. Como descrito acima, cada formulário de aplicação uniGUI está associado a uma função que criará/retornará uma instância desse formulário. O objetivo principal de fornecer essa função foi oferecer compatibilidade de sintaxe entre VCL e uniGUI.
Na VCL todos os seus formulários são criados automaticamente e todas as variáveis globais dos formulários são inicializadas quando sua aplicação é iniciada. Na VCL você pode usar facilmente seu formulário simplesmente escrevendo:
Da mesma forma, no uniGUI fornecemos uma sintaxe similar para permitir o acesso aos seus formulários:
Observação: UniForm1 é uma função, não uma variável. Ela retorna a instância correta do formulário para a sessão atual ou criará uma nova instância se uma instância ainda não estiver criada.
Essa função é fornecida para executar certas tarefas apenas e não deve ser tratada como uma variável global.
Essa função global deve ser usada somente quando você quiser instanciar e exibir um formulário uniGUI:
Outro detalhe importante é que formulários uniGUI devem ser mostrados assim que são criados. Não é possível criar um formulário em um evento e exibi-lo em outro. Se você tentar isso, o uniGUI exibirá automaticamente o formulário se você não chamar Show ou ShowModal explicitamente.
Evite usar uma instância de formulário dentro de um datamodule a menos que ela seja usada para criar e exibir esse formulário como demonstrado acima. Você deve evitar acessar variáveis públicas do formulário a partir de um datamodule ou de outro formulário — isso vai contra boas regras de design OO.
Formulários não devem ser usados para armazenar variáveis globais da aplicação ou componentes de dados (como conexões) que serão usados por outros formulários e datamodules. Cada formulário deve ser considerado um elemento atômico da sua aplicação que conterá suas próprias variáveis privadas para uso interno. Se você quer definir variáveis públicas para uma sessão, use MainModule ou outros datamodules para esse propósito.
Por exemplo, o seguinte está incorreto porque um formulário é usado para exibir dados de campo de um datamodule:
Em vez disso, você pode resolver isso:
Usando um controle com consciência de dados, como TUniDBText, e conectando-o a uma fonte de dados.
Colocando um componente TDataSource diretamente no formulário e usando seus eventos para atualizar os elementos visuais do formulário.
Regra prática: evite atualizar elementos visuais de um formulário a partir de manipuladores de eventos de componentes que não pertencem àquele formulário.
A única exceção é quando você tem controle total sobre o tempo de vida de um formulário específico (isto é, você o cria e o destrói explicitamente em seu próprio código).