![]() |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Ehm, kann das mal sein dass das lediglich lokalisierte Platzhalter sind?
Das ist exakt das gleiche wie im FormatSettings beim DatePicker. Die Anzeige muss man selber schreiben, auswerten über die aktuellen System Settings. ![]() |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Hmm..
1. Das TFormatSettings.ShortDateFormat' ist das Format eine 'andere' Darstellung gibt es nicht!!! 2. Windows unterscheidet (wie erwähnt) zwischen SYSTEM und USER Wenn Du als User angemeldet bist, dann zeigt dir Windows die Settings des Users an. Spricht: Englisches Windows, User hat auf deutsch umgestellt, Windows zeigt die Deutschen Settings an. Rüfst Du hingegen die Fortmatsettings ohne Windows-Anmeldung ab (z.B. bei einem Dienst) erhälst Du die SYSTEM-Formatsettings, welche bei einem Englischen Windows eben EN sind! Irgendwo hatten wir hier im Forum auch einen Thread, wlcher sich mit dem Bug von Win7 beschäftigt und dem Bug in Delphi (kann sein nur in älteren Versionen) dass dort per default LOCALE_SYSTEM_DEFAULT statt LOCALE_USER_DEFAULT verwendet wurde und somit durch den Bug die falschen Settings gezogen wurden.. |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Zitat:
Es handelt sich also tatsächlich um ein reines Übersetzungsproblem, da du die Übersetzungen für die Kürzel brauchst. Wenn diese Kürzel vorliegen, könnte eine Implementierung etwa so aussehen:
Delphi-Quellcode:
function GetDateHint(const D, M, Y: Char): string;
begin Result := FormatDateTime('c', EncodeDate(3333,11,22)).Replace('3', Y).Replace('1', M).Replace('2', D); end; |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Zitat:
|
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Oder meintest Du es so?
Delphi-Quellcode:
Das zeigt Dir eventuell bei Englisch Windows mit Deutscher Einstellung zwei verschiedene Setups an?
var
FmtSet: TFormatSettings; tmp: String; i: Integer; begin GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FmtSet); ShowMessage(FmtSet.ShortDateFormat); GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FmtSet); ShowMessage(FmtSet.ShortDateFormat); tmp := FmtSet.ShortDateFormat; for i := 1 to Length(tmp) do begin if tmp[i] = 'd' then tmp[i] := 'T'; if tmp[i] = 'y' then tmp[i] := 'J'; end; ShowMessage(tmp); end. Ps: Ergebnis bei mir ist: 2 x dd.MM.yyyy und zu letzt Dein TT.MM.JJJJ |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Schluss mit rumraten, Zeit für die Windows API:
Delphi-Quellcode:
var
lpLocaleName: PWideChar; LLCType: LCTYPE; lpLCData: PWideChar; cchData, ReturnValue: Integer; DataValue: TArray<WideChar>; begin lpLocaleName := PChar(LOCALE_NAME_SYSTEM_DEFAULT); LLCType := LOCALE_SSHORTDATE; lpLCData := nil; cchData := 0; cchData := GetLocaleInfoEx(lpLocaleName, LLCType, lpLCData, cchData); if cchData = 0 then RaiseLastOSError else begin SetLength(DataValue, cchData); lpLCData := @DataValue[0]; cchData := GetLocaleInfoEx(lpLocaleName, LLCType, lpLCData, cchData); end; ShowMessage(string(DataValue)); end; |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Hmm..
Zitat:
Eine API von MS habe ich nicht gefunden, somit muss dass wohl manuell gemacht werden. Bei mir steht übrigens 'dd.MM.yyyy' im ShortDateFormat, was dem deutschen Format mit '.' als DateSeparator entspricht. (Ich bin davon ausgegangen, das es um das Problem geht, dass in einem deutschen Windows ein englisches 'dd/mm/yyyy' statt des deutschen 'dd.MM.yyyy' als Format kommt. Dass es dem TE um 'T' statt 'd' geht, ist mir (leider) nicht aufgefallen ;) ) Zitat:
|
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Zitat:
Delphi-Quellcode:
So rufe ich die non-Ex Funktion auf. Da mein Delphi noch keinen Windows.pas Eintrag für die Ex hat, habe ich den lt. MSDN Nachgebastelt.
function GLI(T: Cardinal): String;
var NeedLen : Integer; begin NeedLen := GetLocaleInfo(LOCALE_USER_DEFAULT, t, nil, 0); SetLength(Result, NeedLen); if GetLocaleInfo( LOCALE_USER_DEFAULT, t, PChar(Result), NeedLen) <> 0 then SetLength(Result, NeedLen-1) else RaiseLastOSError; end;
Delphi-Quellcode:
Aber ich bekomme das einfach nicht zum Laufen. Mein Delphi kennt noch kein TArray<WideChar>
function GetLocaleInfoEx(const lpLocaleName: LPCWSTR; const LCType: LCTYPE; out lpLCData: LPWSTR; const cchData: integer): Integer; external kernel32 name 'GetLocaleInfoEx';
Ps: Ein Beispiel Aufruf für den Code da oben schaut so aus
Delphi-Quellcode:
ShowMessage(GLI(LOCALE_SSHORTDATE));
|
AW: Datumsformat (TT.MM.JJJJ) anzeigen
Hmm..
und auch da kommt nur 'dd.MM.yyyy' ;) (Zumindestens bei mir) Wie auch aus dem Post ![]() ersichtlich, da dort das 'dd.MM.yyyy' mit StringReplace bearbeitet wird.. Hinzu kommt noch, dass ein einfaches Übersetzen von 'd' nach 'T' auch falsch währe.. Denn die Formatsettings von Microsoft unterscheiden eingentlich zwischen 'd' und 'D'. ![]() |
AW: Datumsformat (TT.MM.JJJJ) anzeigen
@KodeZwerg:
TArray<WideChar> -> array of WideChar! Kennt auch deine Version. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz