søndag den 30. oktober 2011

Locale: TFormatSettings;

TFormatSettings var en af de store nyheder i Delphi 6, men alligevel har den aldrig rigtigt slået igennem. Jo, nogen har nok brugt den, men at dømme ud fra Delphi koden der findes rundt omkring på nettet, så er det ikke vildt udbredt. Grundæggende set kan jeg jo kun tale for mig selv, jeg har kun periodisk brugt record'en.

For nyligt var der et par indlæg på DAPUG omkring datoformat og om hvordan man sikrede sig at en streng-værdi blev konverteret til en dato - uanset hvilken landeindstiling den pågældende Windows har.

Efter som min blog er på dansk, må jeg formode at flertallet af mine læsere har dansk som deres sprog i Windows, så mit eksempel vil omhandle håndtering af en streng, der som udgangspunkt er formateret efter den engelske standard for datoformatering.

Det første vi har brug for, er en implementering af C++ macroen MAKELANGID. Den findes i nyere versioner af Delphi (2009 og frem ,tror jeg), men her kommer den for en sikkerheds skyld:


function MAKELANGID(Language : Word; SubLanguage: WORD = SUBLANG_DEFAULT): WORD; inline;
begin
  Result := WORD(SubLanguage shl 10) or Language;
end;

Derefter skal vi have fat i den "engelske version" af TFormatSettings og have den brugt. I mit lille eksempel viser jeg blot resultatet med en ShowMessage:

procedure TFormMain.FormCreate(Sender: TObject);
var
  aDate: TDateTime;
  Locale: TFormatSettings;
begin;
{$IF CompilerVersion > 18.5} // Delphi 2007
  Locale := TFormatSettings.Create(MAKELANGID(LANG_ENGLISH));
{$ELSE}
  GetLocaleFormatSettings(MAKELANGID(LANG_ENGLISH), Locale);
{$IFEND}
  aDate := StrToDate('10/28/2011', Locale);
  ShowMessage(FormatDateTime(FormatSettings.LongDateFormat, aDate, Locale));
end;


Her er resultatet så :

Variable "Locale: TFormatSettings;" kan således bruges i alle Delphis funktioner til at konvertere tal og datoer til- og fra en streng.

Jens Borrisholt

Ingen kommentarer:

Send en kommentar