FormatSettings

FormatSettings é um registro global no Delphi usado para armazenar variáveis relacionadas à localidade, como DecimalSeparator, CurrencyFormat, CurrencyString, etc. Essa variável foi introduzida no Delphi XE. Antes do Delphi XE, DecimalSeparator, CurrencyFormat, etc. eram declarados como variáveis globais separadas em SysUtils.pas.

O problema com FormatSettings é que ele é uma variável global que não lida bem com o ambiente multithread do uniGUI. Para contornar esse problema, os desenvolvedores devem garantir que FormatSettings seja modificado apenas antes do início das sessões. Não é seguro modificar FormatSettings dentro das sessões. Para fornecer uma maneira segura de acessar FormatSettings, o uniGUI implementa duas funções:

function FmtSettings: TFormatSettings;

function PFmtSettings: PFormatSettings;

A função FmtSettings retorna um TFormatSettings somente leitura que pode ser usado em várias funções da RTL, tais como:

FloatToStr(FValue, FmtSettings);

A função PFmtSettings retorna um ponteiro para o TFormatSettings registro que permite modificações, por exemplo:

PFmtSettings.CurrencyString := '£';

Quando chamadas dentro do contexto de uma sessão, as funções acima irão retornar uma cópia privada do TFormatSettings registro que pertence àquela sessão. Essa instância privada de TFormatSettings será usada internamente em todas as funções do uniGUI que usam parâmetros em TFormatSettings. Entretanto, nem todas as funções internas de BD usam essa cópia privada. Algumas funções de BD, como TField.AsString usam o FormatSettings, então se você quiser usar um FormatSettings diferente para cada sessão, deve levar isso em conta. O mesmo vale para ferramentas de banco de dados de terceiros que utilizam o FormatSettings.

Por outro lado, se essas funções forem chamadas dentro do OnCreate evento de ServerModule, elas definirão o FormatSettings global usado por todas as sessões na aplicação.

O código abaixo irá alterar o FormatSettings global para todas as sessões na aplicação:

ServerModule - alterar o FormatSettings global
procedure TUniServerModule.UniGUIServerModuleCreate(Sender: TObject);
begin
  // Alterar as configurações de formato globais da aplicação
  PFmtSettings.CurrencyFormat  := 0;
  PFmtSettings.CurrencyString  := '';
  PFmtSettings.DateSeparator   := '/';
  PFmtSettings.ShortDateFormat := 'dd/mm/yyyy';
  PFmtSettings.ThousandSeparator := '.';
  PFmtSettings.DecimalSeparator  := ',';
end;

Quando as funções acima são chamadas dentro do contexto de uma sessão, o registro retornado não é a instância global do FormatSettings registro que é definido em SysUtils.pas. Em vez disso, será uma instância privada do TFormatSettings registro que é mantida em TUniGUIApplication classe. Isso significa que, dentro de uma sessão, você deve incluir explicitamente FmtSettings como parâmetro para funções da RTL que o utilizam:

O código abaixo irá alterar o FormatSettings privado apenas para a sessão atual: