AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datumsformat (TT.MM.JJJJ) anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Datumsformat (TT.MM.JJJJ) anzeigen

Ein Thema von TUX_der_Pinguin · begonnen am 6. Jun 2018 · letzter Beitrag vom 11. Jun 2018
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 09:41
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#12

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 09:43
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..
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#13

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 09:47
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
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#14

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 09:49
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 10:09
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] = 'dthen tmp[i] := 'T';
     if tmp[i] = 'ythen 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
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 8. Jun 2018 um 10:26 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 10:25
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;
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#17

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 10:26
Hmm..

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 )


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...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 11:36
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.
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 ShowMessage(GLI(LOCALE_SSHORTDATE));
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 8. Jun 2018 um 11:39 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#19

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 12:17
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Datumsformat (TT.MM.JJJJ) anzeigen

  Alt 8. Jun 2018, 12:42
@KodeZwerg:
TArray<WideChar> -> array of WideChar!

Kennt auch deine Version.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
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