Olá amigos Devmedia, este é meu primeiro post, e irei abordar uma questão que procurei por algum tempo esta função, mas de todas que encontrei, nenhuma consegui solucionar meu problema, na verdade problema que um sistema criado pela empresa que eu trabalho enfrentava.

Um exemplo que ocorre muito nos clientes, é que nossa aplicação trabalha com formato de data "dd/MM/yyyy', e ao formatar a máquina por um motivo ou outro, no windows xp, que é a plataforma mais usadas nas estações de trabalho de nossos clientes, e na maioria dos usuários, e até comerciais também, o formato de data padrão do windows é "d/M/yyyy", assim acorriam alguns erros na aplicação, devido a este pequeno problema.

Foi então que tentei implementar alguns funções para corrigir este detalhe, mas não obtive sucesso. Recentemente encontrei e adaptei uma função simples e eficiente que resolveu meu problema, ele funciona perfeitamente no windows nas versões xp, vista e windows 7.

Então vamos ao nosso exemplo. Crie uma VCL Forms application, adicione ao formulário os seguintes componentes:

Componente
Nome
Valor
TComboBox
cbFormatos
Items:
dd/MM/aaaa
dd/MM/aa
d/M/aaaa
d/M/aa
dd-MM-aa
dd-MM-aaaa
d-M-aa
d-M-aaaa
dd.MM.aa
dd.MM.aaaa
dd.MMM.aaaa
d.M.aa
d.M.aaaa
aaaa-MM-dd
dddd, dd-MMMM-aaaa

TButton
btnMudarFormato
Caption: Mudar formato





















*
Obs: Para ilustrar o exemplo preenchi o combobox com alguns formatos do windows.

Agora vamos para o código, no evento disparado no OnClick do Componente btnMudarFormato, declare duas variáveis:

Nome
Time
DateFormatString
LCID
LongInt





Agora iremos usar o comando case para comparar o valor armazenado no Componente cbFormatos.

  case ComboBox1.ItemIndex of
    0: DateFormat:=  'dd/MM/yyyy';
    1: DateFormat:=  'dd/MM/yy';
    2: DateFormat:=  'd/M/yyyy';
    3: DateFormat:=  'd/M/yy';
    4: DateFormat:=  'dd-MM-yy';
    5: DateFormat:=  'dd-MM-yyyy';
    6: DateFormat:=  'd-M-yy';
    7: DateFormat:=  'd-M-yyyy';
    8: DateFormat:=  'dd.MM.yy';
    9: DateFormat:=  'dd.MM.yyyy';
    10: DateFormat:= 'dd.MMM.yyyy';
    11: DateFormat:= 'd.M.yy';
    12: DateFormat:= 'd.M.yyyy';
    13: DateFormat:= 'yyyy-MM-dd';
    14: DateFormat:= 'dddd, dd-MMMM-yyyy';
    else begin
      Application.MessageBox('Formato inválido', 'Alteração', MB_ICONINFORMATION+MB_OK);
      Abort;
    end;
  end;























No código fazemos uma condição usando case e armazenamos o valor dentro da variável
DateFormat, caso o formato não entre na condição é reportado uma mensagem dizendo que o formato é inválido.

  SetLocaleInfo(LOCALE_SYSTEM_DEFAULT,  LOCALE_SSHORTDATE, PChar(DateFormat));
  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
  Form1.Caption:= DateToStr(Date);








Nesta parte do código que vem logo após a condição, usamos uma função SetLocaleInfo, que é uma função API do windows.

obs: Na seção links sobre encontrará um link sobre esta função.

Na próxima linha temos outra função da API do windows SendMessage,
que nos permite interagir sobre objetos Window, ou seja, todos os objetos que possuem Handle, seja esse handle de qual tipo for: HWND, HFILE, HMENU, HHOOK, HGLOBAL, HLOCAL, HINST e outros vários. Diante isso podemos entender que o acesso a certos objetos pode ser feito através da utilização dessa API.

No nosso caso o primeiro parâmetro passado pela função SendMessage é a janela destino, o segundo é a mensagem a ser enviada, e os dois zeros são o primeiro e o segundo parâmetro da mensagem.
Aqui fazemos uma chamada para SendMessage para transmitir uma mensagem a todo o sistema dizendo a cada aplicação (incluindo explorer) para atualizar suas configurações.

Links:

Explanação sobre a função da API do windows SetLocaleInfo:
http://msdn.microsoft.com/en-us/library/aa913806.aspx
Explanação sobre a função da API do windows SendMessage: http://projects.pro.br/gsaraiva/2008/05/delphi-sendmessage/.
Download do código-fonte: http://www.4shared.com/file/P6_ZCihc/FormatoDataWindows.html

É isso aí galera, espera que este post venha ajudar a ajudar e tirar dúvidas de muitos leitores da Devmedia. Um forte abraço!!!