Conceito Geral de Projeto
Cada aplicação uniGUI é criada com um MainForm, um MainModule e um ServerModule. Como descrito anteriormente, MainModule e MainForm são instanciados por sessão, enquanto ServerModule é um singleton. Além do MainModule, você pode adicionar DataModules extras à sua aplicação. Um LoginForm também pode ser adicionado, se necessário.
MainModule é criado automaticamente com sua aplicação e realiza muitas tarefas importantes. MainModule é o melhor local para colocar recursos compartilhados para uma sessão. Esses recursos são compartilhados entre os forms e DataModules (ou unidades chamadas por eles) de uma sessão. Uma conexão com banco de dados é um bom exemplo de recurso compartilhado. Podemos considerar cada sessão como uma cópia separada da aplicação web e, como em uma aplicação normal, você precisa de uma conexão de banco de dados separada para cada instância da aplicação. No uniGUI isso pode ser alcançado colocando o componente de conexão em um DataModule, de modo que uma conexão será criada quando uma nova sessão for iniciada e destruída quando a sessão for encerrada. Isso garante que cada sessão usará sua cópia privada da conexão com o banco de dados.
Outro exemplo de recursos compartilhados são estruturas de dados compartilhadas. Por exemplo, cada sessão pode precisar manter um registro compartilhado que contenha informações sobre o usuário atual. Todos os outros forms e DataModules da aplicação devem ser capazes de acessar essa estrutura quando necessário. Considere a seguinte estrutura de dados definida na unidade MainModule.pas:
type
TUserInfo = record
Name, Surname : string;
UserId : Integer;
end;Essa estrutura precisa ser acessível a partir de outros forms na sessão, então devemos defini-la como uma propriedade pública em TUniMainModule:
TUniMainModule = class(TUniGUIMainModule)
private
{ Private declarations }
FUserInfo: TUserInfo;
public
{ Public declarations }
property UserInfo: TUserInfo read FUserInfo;
end;A estrutura acima será preenchida com dados reais do usuário quando o usuário efetuar login. MainForm pode acessar UserInfo assim:
procedure TMainForm.UniFormCreate(Sender: TObject);
begin
UniLabel1.Caption :=
UniMainModule.UserInfo.Name +
' ' +
UniMainModule.UserInfo.Surname;
end;Você pode ver que isso pode ser feito facilmente acessando a propriedade UserInfo do UniMainModule modificado. Como cada sessão tem sua cópia privada de UniMainModule, cada form acessará a instância correta do UserInfo registro.
Evite usar objetos globais compartilhados no uniGUI. Use módulos com escopo de sessão (MainModule, DataModules) e suas propriedades públicas para dados compartilhados por sessão.
Por exemplo, alguém poderia definir TUserInfo como uma variável global em MainModule:
E então acessá-la em MainForm:
Embora o código acima possa parecer funcionar quando apenas uma única sessão está ativa, ele falhará com múltiplas sessões concorrentes: a variável global será compartilhada entre sessões, produzindo comportamento incorreto que pode ser difícil de diagnosticar.
Tais falhas de projeto podem permanecer não detectadas quando apenas algumas sessões estão ativas, mas com aumento de carga, os efeitos colaterais do defeito inicial de projeto se tornarão mais visíveis e pode não ser fácil identificar a origem do problema. Por isso, é importante manter um padrão de projeto correto desde o início.
Da mesma forma, deve-se evitar colocar componentes no ServerModule. Como descrito anteriormente, ServerModule é um singleton e não será criado para cada sessão, portanto, por exemplo, colocar um componente de Connection de banco de dados em ServerModule pode funcionar quando houver poucas sessões, mas com mais sessões você terá erros inesperados que são difíceis de detectar e depurar.
Não coloque componentes por sessão (por exemplo: conexões de banco de dados, dados por usuário) no ServerModule. ServerModule é um singleton compartilhado entre todas as sessões.

Application ServerModule
Links neste documento:
MainForm: https://unigui.com/doc/online_help/main_form.htm
MainModule: https://unigui.com/doc/online_help/main_module.htm
ServerModule: https://unigui.com/doc/online_help/server_module.htm
DataModules: https://unigui.com/doc/online_help/data_modules.htm
LoginForm: https://unigui.com/doc/online_help/login-form.htm