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 |
DateFormat | String |
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!!!