Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datumsformat (TT.MM.JJJJ) anzeigen (https://www.delphipraxis.net/196645-datumsformat-tt-mm-jjjj-anzeigen.html)

KodeZwerg 8. Jun 2018 09:41

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.
http://docs.embarcadero.com/products...er_Format.html

HolgerX 8. Jun 2018 09:43

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..

Uwe Raabe 8. Jun 2018 09:47

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1404233)
Irgendwie macht Windows das ja auch.

Windows setzt diese Strings aus den Format-Strings anhand der aktuellen Sprache zusammen. Also ähnlich wie FormatDateTime, aber anstatt der Ziffern werden die entsprechenden Buchstaben (in Deutsch T, M und J) für Tag, Monat und Jahr eingesetzt. Die sprachabhängigen Buchstaben liegen als Resourcestrings in den verschiedenen mui-Dateien der intl.cpl. Welche davon genommen wird hängt von der aktuellen Sprache ab.

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;

Uwe Raabe 8. Jun 2018 09:49

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Zitat:

Zitat von HolgerX (Beitrag 1404240)
1. Das TFormatSettings.ShortDateFormat' ist das Format eine 'andere' Darstellung gibt es nicht!!!

Das TFormatSettings.ShortDateFormat ist in Deutsch "dd/mm/yyyy". In dem gezeigten Dialog steht aber "TT.MM.JJJJ". Letzteres ist gewünscht - nicht das Format.

KodeZwerg 8. Jun 2018 10:09

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Oder meintest Du es so?
Delphi-Quellcode:
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.
Das zeigt Dir eventuell bei Englisch Windows mit Deutscher Einstellung zwei verschiedene Setups an?
Ps: Ergebnis bei mir ist: 2 x dd.MM.yyyy und zu letzt Dein TT.MM.JJJJ

TiGü 8. Jun 2018 10:25

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;

HolgerX 8. Jun 2018 10:26

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Hmm..

Zitat:

Zitat von Uwe Raabe (Beitrag 1404244)
Zitat:

Zitat von HolgerX (Beitrag 1404240)
1. Das TFormatSettings.ShortDateFormat' ist das Format eine 'andere' Darstellung gibt es nicht!!!

Das TFormatSettings.ShortDateFormat ist in Deutsch "dd/mm/yyyy". In dem gezeigten Dialog steht aber "TT.MM.JJJJ". Letzteres ist gewünscht - nicht das Format.

Windows geht wohl hin und tauscht im Dialog für 'Region und Sprache' das 'd' gegen 'T' und das 'y' gegen 'Y' um hier die Visualisierung für den deutschen User zu Vereinfachen. ;)

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:

Zitat von KodeZwerg (Beitrag 1404246)
Oder meintest Du es so?
Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
 GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FmtSet);
 ShowMessage(FmtSet.ShortDateFormat);
 GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FmtSet);
 ShowMessage(FmtSet.ShortDateFormat);
end.
Das zeigt Dir eventuell bei Englisch Windows mit Deutscher Einstellung zwei verschiedene Setups an?
Ps: Ergebnis bei mir ist: dd.MM.yyyy

Das meinte ich mit dem unterschiedlichen Format von System zu User und dass Delphi hier (wohl nur in älteren Delphis) mit System arbeitet statt User, während Windows in den Regions-Settings die des Users anzeigt...

KodeZwerg 8. Jun 2018 11:36

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Zitat:

Zitat von TiGü (Beitrag 1404249)
Schluss mit rumraten, Zeit für die Windows API:

Könntest Du mir helfen die Api mit meinem D2009 zu verschmelzen?
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
function GetLocaleInfoEx(const lpLocaleName: LPCWSTR; const LCType: LCTYPE; out lpLCData: LPWSTR; const cchData: integer): Integer; external kernel32 name 'GetLocaleInfoEx';
Aber ich bekomme das einfach nicht zum Laufen. Mein Delphi kennt noch kein TArray<WideChar>

Ps: Ein Beispiel Aufruf für den Code da oben schaut so aus
Delphi-Quellcode:
ShowMessage(GLI(LOCALE_SSHORTDATE));

HolgerX 8. Jun 2018 12:17

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Hmm..

und auch da kommt nur 'dd.MM.yyyy' ;) (Zumindestens bei mir)

Wie auch aus dem Post
https://www.delphipraxis.net/1404030-post4.html
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'.
https://docs.microsoft.com/de-de/dot...format-strings

TiGü 8. Jun 2018 12:42

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
@KodeZwerg:
TArray<WideChar> -> array of WideChar!

Kennt auch deine Version.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz