Delphi-PRAXiS

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)

TUX_der_Pinguin 6. Jun 2018 09:39

Datumsformat (TT.MM.JJJJ) anzeigen
 
Guten Morgen,

ich möchte neben einem Eingabefeld das aktuelle Datumsformat anzeigen lassen, so wie das auch in den Regionaleinstellungen von Windows angezeigt wird. Leider bekomme ich bisher nur an ein internes Format welches auch auf einem deutschen Windows in englischer Schreibweise dargestellt wird.

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Die Ausgabe lautet 'dd/MM/yyyy' in den Windows Einstellungen steht jedoch 'TT.MM.JJJJ', jetzt die Frage wie schaffe ich es das mir das Format genau so angezeigt wird. Bzw. es müsste immer so dargestellt werden wie das jeweilige System eingestellt ist, also je nach Spracheinstellung.

TRomano 6. Jun 2018 10:15

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Hallo,

ergibt aber das richtige Ergebnis:

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(DateToStr(Now,FmtSet);
Gruß Thomas

TUX_der_Pinguin 6. Jun 2018 10:30

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

Zitat von TRomano (Beitrag 1404019)
Hallo,

ergibt aber das richtige Ergebnis:

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(DateToStr(Now,FmtSet);
Gruß Thomas

Ich will kein Datum formatieren sondern die Formatierung anzeigen.


So sollte es sein...
Zitat:

Bitte geben sie das Datum im Format TT.MM.JJJJ ein!
und so ist es im Moment
Zitat:

Bitte geben sie das Datum im Format dd/MM/yyyy ein!

Der schöne Günther 6. Jun 2018 11:22

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Knifflige Frage.

Die paar Leute die sich im Internet die gleiche Frage gestellt haben ([1], [2]) hast du sicher auch schon gefunden. Da das Format mit 'yyyy' oder 'dd' dokumentiert und sprachunabhängig ist [3] musst du die halt durch deine eigene lokalisierte Fassung ersetzen. Beispielsweise so in der Art:
Delphi-Quellcode:
uses
   System.SysUtils,
   WinApi.Windows,
   Vcl.Dialogs;

function getShortDateFormat(): String;
const
   lcType = LOCALE_SSHORTDATE;
var
   str: String;
   bufferSize: Integer;
begin
   bufferSize := GetLocaleInfoEx(
      PChar(LOCALE_NAME_USER_DEFAULT),
      lcType,
      nil,
      0
   );
   str := String.Create(#0, bufferSize);
   Win32Check(
      GetLocaleInfoEx(
         PChar(LOCALE_NAME_USER_DEFAULT),
         lcType,
         PChar(str),
         bufferSize
      ) = bufferSize
   );
   Result := Str;
end;

procedure p();
resourcestring
   shortDay = 'T';
   shortMonth = 'M';
   shortYear = 'Y';
var
   shortDateFormat: String;
begin
   shortDateFormat :=
      getShortDateFormat()
      .Replace('d', shortDay)
      .Replace('M', shortMonth)
      .Replace('y', shortYear);
   ShowMessage(shortDateFormat);
end;

[1] http://forums.codeguru.com/showthrea...indowsversions
[2] https://stackoverflow.com/q/12591993/2298252
[3] https://technet.microsoft.com/de-de/.../dd317787.aspx

HolgerX 6. Jun 2018 14:11

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

Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1404012)
Die Ausgabe lautet 'dd/MM/yyyy' in den Windows Einstellungen steht jedoch 'TT.MM.JJJJ', jetzt die Frage wie schaffe ich es das mir das Format genau so angezeigt wird. Bzw. es müsste immer so dargestellt werden wie das jeweilige System eingestellt ist, also je nach Spracheinstellung.


Da bist Du in eine kleine Windows-Falle gatappt!

Ich vermute, dass dein Rechner entweder ein auf deutsch umgestelltes englisches Windows ist, oder dass hier der Windows 7 EN auf 10 Upgrade-Bug zugeschlagen hat! ;)

Nehme mal statt LOCALE_SYSTEM_DEFAULT das LOCALE_USER_DEFAULT


Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_USER_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Denn mit LOCALE_SYSTEM_DEFAULT werden die OS-Einstellungen gelesen, mit LOCALE_USER_DEFAULT die User-Einstellungen, welche dir auch von Windows angezeigt werden...

Alallart 6. Jun 2018 14:12

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
@TUX_der_Pinguin

Hier eine kleine Funktion aus einem meiner Programme:
Delphi-Quellcode:
const
  FS_Ger_DateSeparator = '.';
  FS_Ger_TimeSeparator = ':';

function FS: TFormatSettings;
begin
  GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, Result);
  Result.DateSeparator := FS_Ger_DateSeparator;
  Result.TimeSeparator := FS_Ger_TimeSeparator;
  Result.ShortDateFormat := 'dd/MM/yyyy';
  Result.ShortTimeFormat := 'hh:mm';
  Result.LongTimeFormat   := 'hh:mm:ss';
end;
Das habe ich so geregelt, weil ich das Datum und Uhrzeit unabhängig einer Landeseinstellung immer im gleichen Format speichern und lesen wollte.

Zuerst zu den Schrägstrichen "/" in TFormatSettings. Die muss man als Platzhalter verstehen. Zufällig passt es zu der us-amerikanischen Schreibweise. Wenn du da etwas anders rein schreibst, zB. Rauten:
Delphi-Quellcode:
Result.ShortDateFormat := 'dd#MM#yyyy'
deaktivierst du sozusagen die Platzhalterfunktion. In dem Fall wird das Datum mit Rauten angezeigt. Ist es ein Schrägstrich, wird das Zeichen aus
Delphi-Quellcode:
Result.DateSeparator
genommen. Diese Besonderheit darf man nicht vergessen . Also entweder man läßt die Schrägstriche in Ruhe, dann nimmt das System den DateSeparator, oder du manipulierst den String in ShortDateFormat direkt (was ich nicht empfehlen würde).

Machen wir ein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  FS2: TFormatSettings;
begin
  FS2 := FS;
  ShowMessage(FormatDateTime(FS2.ShortDateFormat, Now, FS2));
end;
Änder nun diese Zeile:
Delphi-Quellcode:
const
  FS_Ger_DateSeparator = '~';
Soviel zum Thema Punkt und Strich. Der Strich ist nur ein Platzhalter für das eigentliche Zeichen. Wo es die Umrechnung von TT zu dd oder YYYY zu JJJJ gibt weiß ich nicht. Vermutlich gibt es auch einen Record mit den Informationen.

Uwe Raabe 6. Jun 2018 14:36

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Einige hier scheinen die Problemstellung einfach nicht richtig zu verstehen. Vielleicht solltest du einen konkreten Test-Case machen, der genau zeigt, was du haben willst.

So wie ich das sehe, handelt es sich hier eher um ein Übersetzungsproblem und nicht um die länderspezifische Darstellung eines Datums.

en-US: 'mm/dd/yyyy'
de-de: 'TT.MM.JJJJ'

Gefragt ist also nicht der tatsächliche Format-String, der z.B. für FormatDate verwendet wird, sondern der Hinweistext zur Eingabe eines Datumswerts.

TUX_der_Pinguin 8. Jun 2018 08:22

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1404061)
Einige hier scheinen die Problemstellung einfach nicht richtig zu verstehen. Vielleicht solltest du einen konkreten Test-Case machen, der genau zeigt, was du haben willst.

So wie ich das sehe, handelt es sich hier eher um ein Übersetzungsproblem und nicht um die länderspezifische Darstellung eines Datums.

en-US: 'mm/dd/yyyy'
de-de: 'TT.MM.JJJJ'

Gefragt ist also nicht der tatsächliche Format-String, der z.B. für FormatDate verwendet wird, sondern der Hinweistext zur Eingabe eines Datumswerts.

Der Uwe hat's verstanden, es geht allein um den Hinweis Text. Wie er in den Windows Einstellungen auch zu sehen ist.

Anhang 49217

Zitat:

Zitat von HolgerX (Beitrag 1404056)
Da bist Du in eine kleine Windows-Falle gatappt!

Ich vermute, dass dein Rechner entweder ein auf deutsch umgestelltes englisches Windows ist, oder dass hier der Windows 7 EN auf 10 Upgrade-Bug zugeschlagen hat! ;)

Nehme mal statt LOCALE_SYSTEM_DEFAULT das LOCALE_USER_DEFAULT


Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_USER_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Denn mit LOCALE_SYSTEM_DEFAULT werden die OS-Einstellungen gelesen, mit LOCALE_USER_DEFAULT die User-Einstellungen, welche dir auch von Windows angezeigt werden...

Und ob ich jetzt 'LOCALE_SYSTEM_DEFAULT' oder 'LOCALE_USER_DEFAULT' verwende spielt keine Rolle ich bekomme immer nur das interne Format (z.B. dd/MM/yyyy) zurück. Bei dem Windows handelt es sich um Windows 7 Ultimate, welches auf deutsch eingestellt ist.

haentschman 8. Jun 2018 08:38

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Moin...8-)

Imho haben die FormatSettings einen Bug was die Zeit betrifft.
https://www.delphipraxis.net/188843-...s-dummies.html

Zitat:

Bei dem Windows handelt es sich um Windows 7 Ultimate
Früher gab es mal Windows 7 Versionen die falsch installiert waren. Obwohl Deutsch eingestellt war, wurden die englischen Einstellungen geladen. Da half das Umstellen auf Englisch und wieder zurück.

TUX_der_Pinguin 8. Jun 2018 08:50

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von haentschman (Beitrag 1404231)
Moin...8-)

Imho haben die FormatSettings einen Bug was die Zeit betrifft.
https://www.delphipraxis.net/188843-...s-dummies.html

Zitat:

Bei dem Windows handelt es sich um Windows 7 Ultimate
Früher gab es mal Windows 7 Versionen die falsch installiert waren. Obwohl Deutsch eingestellt war, wurden die englischen Einstellungen geladen. Da half das Umstellen auf Englisch und wieder zurück.

Wie gesagt es geht nicht um die Format Einstellungen, die sind meiner Meinung nämlich soweit in Ordnung, es geht um den lokalisierten Hinweis Text und wie man daran kommt. Irgendwie macht Windows das ja auch. Der Anwender soll einen Hinweis erhalten wie er ein Datum bzw. eine Uhrzeit eingeben soll und dieser Hinweis soll analog zu den Windows Regional Einstellungen sein. Sprich bei einem deutschen Windows mit deutschen Regional Einstellungen soll da stehen 'TT.MM.JJJJ' ein 'TFormatSettings.ShortDateFormat' gibt aber 'dd/MM/yyyy' aus. Das Format ist korrekt nur die Darstellung nicht so wie ich das gerne hätte.

Anhang 49218

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.

KodeZwerg 8. Jun 2018 13:02

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Danke TiGü, ich habe es jetzt so umgesetzt
Delphi-Quellcode:
function GetLocaleInfoEx(const lpLocaleName: LPCWSTR; const LCType: LCTYPE; out lpLCData: LPWSTR; const cchData: integer): Integer; external kernel32 name 'GetLocaleInfoEx';

procedure DoJob;
const
  LOCALE_NAME_SYSTEM_DEFAULT = '!x-sys-default-locale';
var
  lpLocaleName: PWideChar; LLCType: LCTYPE;
  lpLCData: PWideChar; cchData, ReturnValue: Integer;
  DataValue: array of 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;

procedure TForm1.FormCreate(Sender: TObject);
Begin
 DoJob();
End;
Ein Kompilat kann ich erzeugen aber der sagt dann immer "Unzulässige Attribute". Was mache ich noch falsch?

TiGü 8. Jun 2018 13:26

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Delphi-Quellcode:
function GetLocaleInfoEx(lpLocaleName: PWideChar; LCType: LCTYPE;
  lpLCData: PWideChar; cchData: Integer): Integer; stdcall; external kernel32 name 'GetLocaleInfoEx';

KodeZwerg 8. Jun 2018 13:32

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke fürs korrigieren aber ich erhalte dabei einen leeren String. Anhang 49223
Mein Delphi und ich machen da noch irgendwas falsch.

TiGü 8. Jun 2018 13:46

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Delphi-Quellcode:
function GetLocaleInfoEx(lpLocaleName: PWideChar; LCType: LCTYPE;
  lpLCData: PWideChar; cchData: Integer): Integer; stdcall; external kernel32 name 'GetLocaleInfoEx';
...
var
  lpLocaleName: PWideChar; LLCType: LCTYPE;
  lpLCData: PWideChar; cchData, ReturnValue: Integer;
  DataValue: array of WideChar;
  DataString: string;
begin
  lpLocaleName := PChar(LOCALE_NAME_USER_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;
  SetString(DataString, PChar(@DataValue[0]), Length(DataValue));
  ShowMessage(DataString);
end;

KodeZwerg 8. Jun 2018 13:54

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
So klappt es, vielen Dank!

Hier nochmal für HolgerX wegen fehlender Konstanten zum nachvollziehen:
Delphi-Quellcode:
function GetLocaleInfoEx(lpLocaleName: PWideChar; LCType: LCTYPE; lpLCData: PWideChar; cchData: Integer): Integer; stdcall; external kernel32 name 'GetLocaleInfoEx';

procedure DoJob;
const
  LOCALE_NAME_SYSTEM_DEFAULT = '!x-sys-default-locale'; // <- das bringt bei mir einen Leerstring
  LOCALE_NAME_USER_DEFAULT = $00; // <- das funktioniert
var
  lpLocaleName: PWideChar; LLCType: LCTYPE;
  lpLCData: PWideChar; cchData, ReturnValue: Integer;
  DataValue: array of WideChar;
  DataString: string;
begin
  lpLocaleName := PChar(LOCALE_NAME_USER_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;
  SetString(DataString, PChar(@DataValue[0]), Length(DataValue));
  ShowMessage(DataString);
end;
Aber das Ergebnis bleibt auch hier = dd.MM.yyyy
also irgendwie alles das gleiche nur eine andere Möglichkeit:gruebel:

HolgerX 8. Jun 2018 14:04

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

Zitat:

Zitat von KodeZwerg (Beitrag 1404285)
Aber das Ergebnis bleibt auch hier = dd.MM.yyyy
also irgendwie alles das gleiche nur eine andere Möglichkeit:gruebel:

Hatte ich doch schon geschrieben, dass mit dem dd.MM.yyyy ;)

Es scheint keine API zu geben, um das 'TT.MM.JJJJ' zu erhalten, dies macht anscheinend der Windows-Dialog selber....

Uwe Raabe 8. Jun 2018 14:10

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

Zitat von HolgerX (Beitrag 1404287)
Es scheint keine API zu geben, um das 'TT.MM.JJJJ' zu erhalten, dies macht anscheinend der Windows-Dialog selber....

Exakt!
https://www.delphipraxis.net/1404242-post13.html

Zitat:

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.

Uwe Raabe 8. Jun 2018 14:15

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Um das nochmal zu verdeutlichen:

Region-Settings = Deutsch, Sprache = Deutsch => TT.MM.JJJJ
Region-Settings = English (US), Sprache = Deutsch => M/T/JJJJ
Region-Settings = Deutsch, Sprache = English => DD.MM.YYYY
Region-Settings = English (US), Sprache = English => M/D/YYYY

KodeZwerg 8. Jun 2018 15:31

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
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;

function GetLocaleInfoEx(lpLocaleName: PWideChar; LCType: LCTYPE; lpLCData: PWideChar; cchData: Integer): Integer; stdcall; external kernel32 name 'GetLocaleInfoEx';
function GLIx(T: Cardinal): String;
const
  LOCALE_NAME_USER_DEFAULT = $00;
var
   NeedLen : Integer;
begin
   NeedLen := GetLocaleInfoEx(PChar(LOCALE_NAME_USER_DEFAULT), t, nil, 0);
   SetLength(Result, NeedLen);
   if GetLocaleInfoEx(PChar(LOCALE_NAME_USER_DEFAULT), t, PChar(Result), NeedLen) <> 0
   then SetLength(Result, NeedLen-1)
   else RaiseLastOSError;
end;

function GetFmtSet: String;
var
  FmtSet: TFormatSettings;
begin
  try
    GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FmtSet);
  finally
    Result := FmtSet.ShortDateFormat;
  end;
end;
Delphi-Quellcode:
 ShowMessage('GLIx: ' + GLIx(LOCALE_SSHORTDATE));
 ShowMessage('GLI: ' + GLI(LOCALE_SSHORTDATE));
 ShowMessage('TFormatSettings:' + GetFmtSet);
Alle Varianten liefern "dd.MM.yyyy" als Ergebnis, ist es Geschmacksfrage oder gibt es da noch ein Richtig/Falsch ?

EWeiss 8. Jun 2018 16:34

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

Alle Varianten liefern "dd.MM.yyyy" als Ergebnis, ist es Geschmacksfrage oder gibt es da noch ein Richtig/Falsch ?
Wurde doch schon beantwortet oder?

gruss

KodeZwerg 8. Jun 2018 18:44

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Delphi-Quellcode:
function GetLocaleString(LangID: Integer): string;
var
  s: string;
begin
  Result := '';
  SetLength(s, 128);
  if GetLocaleInfo(LangID, LOCALE_SNATIVELANGNAME, PChar(s), 128) > 0 then
  begin
    Result := StrPas(PChar(s));
    if GetLocaleInfo(LangID, LOCALE_SNATIVECTRYNAME, PChar(s), 128) > 0 then
    begin
      Result := Format('%s (%s)', [Result, StrPas(PChar(s))]);
    end;
  end;
end;
Delphi-Quellcode:
ShowMessage(GetLocaleString(GetUserDefaultLangID));
So bekomme ich in etwa das hin was Uwe schreibt aber es beantwortet nicht meine Frage, Danke trotzdem.

Alallart 8. Jun 2018 21:12

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

Zitat von TUX_der_Pinguin (Beitrag 1404233)
Sprich bei einem deutschen Windows mit deutschen Regional Einstellungen soll da stehen 'TT.MM.JJJJ' ein 'TFormatSettings.ShortDateFormat' gibt aber 'dd/MM/yyyy' aus. Das Format ist korrekt nur die Darstellung nicht so wie ich das gerne hätte.

So richtig verstehe ich dein Problem nicht wirklich. Ich habe dir bereits vor Tagen geschrieben, dass bei 'dd/MM/yyyy' die Schrägstriche Platzhalter sind. Ich habe dir auch geschrieben, dass es sowas wie einen DateSeparator und TimeSeparator gibt. Wenn also der Schrägstrich bei 'dd/MM/yyyy' ein Platzhalter für DateSeparator ist, und der Doppelpunkt ein Platzhalter für TimeSeparator ist, dann ist das auch so zu verstehen. Also, wenn da ein Schrägstich ist, dann einfach den Schrägstrich durch DateSeparator ersetzen. Schon klappt das.

Uwe Raabe 8. Jun 2018 22:51

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

Zitat von Alallart (Beitrag 1404317)
So richtig verstehe ich dein Problem nicht wirklich.

Überraschenderweise scheint das hier gerade ein sehr weit verbreitetes Phänomen zu sein.

Uwe Raabe 8. Jun 2018 22:55

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von KodeZwerg (Beitrag 1404315)
So bekomme ich in etwa das hin was Uwe schreibt

:gruebel:

Alallart 8. Jun 2018 23:30

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Vielleicht noch etwas - wie das Datumsformat aussehen soll steht in der ISO 8601.

KodeZwerg 9. Jun 2018 00:30

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

Zitat von Uwe Raabe (Beitrag 1404321)
:gruebel:

Tut mir leid, mein Fehler, ich brachte Deinen Text mit diesen Ergebnissen durcheinander.
Delphi-Quellcode:
function LCIDToLocaleName(Locale: LCID; lpName: LPWSTR; cchName: Integer; dwFlags: DWORD): Integer; stdcall; external kernel32 name 'LCIDToLocaleName';
function LCIDToLocal ( LCID: Integer ) : String;
var
  strNameBuffer : array [0..LOCALE_NAME_MAX_LENGTH-1] of WideChar;
begin
  Result := '';
  if (LCIDToLocaleName(LCID, strNameBuffer, LOCALE_NAME_MAX_LENGTH, 0) = 0) then
      RaiseLastOSError
  else
      Result := strNameBuffer;
end;

procedure DoJob;
begin
 Memo1.Lines.Add('GetLocaleString: '+GetLocaleString(GetUserDefaultLangID));
 Memo1.Lines.Add('LCIDToLocal: ' + LCIDToLocal(GetUserDefaultLangID));
 Memo1.Lines.Add('LOCALE_ILANGUAGE: ' + GLIx(LOCALE_ILANGUAGE));
 Memo1.Lines.Add('LOCALE_SLANGUAGE: ' + GLIx(LOCALE_SLANGUAGE));
 Memo1.Lines.Add('LOCALE_SENGLANGUAGE: ' + GLIx(LOCALE_SENGLANGUAGE));
 Memo1.Lines.Add('LOCALE_SABBREVLANGNAME: ' + GLIx(LOCALE_SABBREVLANGNAME));
 Memo1.Lines.Add('LOCALE_SNATIVECTRYNAME: ' + GLIx(LOCALE_SNATIVECTRYNAME));
 Memo1.Lines.Add('LOCALE_ICOUNTRY: ' + GLIx(LOCALE_ICOUNTRY));
 Memo1.Lines.Add('LOCALE_SCOUNTRY: ' + GLIx(LOCALE_SCOUNTRY));
 Memo1.Lines.Add('LOCALE_SENGCOUNTRY: ' + GLIx(LOCALE_SENGCOUNTRY));
 Memo1.Lines.Add('LOCALE_SABBREVCTRYNAME: ' + GLIx(LOCALE_SABBREVCTRYNAME));
 Memo1.Lines.Add('LOCALE_SNATIVECTRYNAME: ' + GLIx(LOCALE_SNATIVECTRYNAME));
 Memo1.Lines.Add('LOCALE_IDEFAULTLANGUAGE: ' + GLIx(LOCALE_IDEFAULTLANGUAGE));
 Memo1.Lines.Add('LOCALE_IDEFAULTCOUNTRY: ' + GLIx(LOCALE_IDEFAULTCOUNTRY));
 Memo1.Lines.Add('LOCALE_IDEFAULTCODEPAGE: ' + GLIx(LOCALE_IDEFAULTCODEPAGE));
 Memo1.Lines.Add('LOCALE_IDEFAULTANSICODEPAGE: ' + GLIx(LOCALE_IDEFAULTANSICODEPAGE));
 Memo1.Lines.Add('LOCALE_IDEFAULTMACCODEPAGE: ' + GLIx(LOCALE_IDEFAULTMACCODEPAGE));
 Memo1.Lines.Add('LOCALE_SLIST: ' + GLIx(LOCALE_SLIST));
 Memo1.Lines.Add('LOCALE_IMEASURE: ' + GLIx(LOCALE_IMEASURE));
 Memo1.Lines.Add('LOCALE_SDECIMAL: ' + GLIx(LOCALE_SDECIMAL));
 Memo1.Lines.Add('LOCALE_STHOUSAND: ' + GLIx(LOCALE_STHOUSAND));
 Memo1.Lines.Add('LOCALE_SGROUPING: ' + GLIx(LOCALE_SGROUPING));
 Memo1.Lines.Add('LOCALE_IDIGITS: ' + GLIx(LOCALE_IDIGITS));
 Memo1.Lines.Add('LOCALE_ILZERO: ' + GLIx(LOCALE_ILZERO));
 Memo1.Lines.Add('LOCALE_INEGNUMBER: ' + GLIx(LOCALE_INEGNUMBER));
 Memo1.Lines.Add('LOCALE_SNATIVEDIGITS: ' + GLIx(LOCALE_SNATIVEDIGITS));
 Memo1.Lines.Add('LOCALE_SCURRENCY: ' + GLIx(LOCALE_SCURRENCY));
 Memo1.Lines.Add('LOCALE_SINTLSYMBOL: ' + GLIx(LOCALE_SINTLSYMBOL));
 Memo1.Lines.Add('LOCALE_SMONDECIMALSEP: ' + GLIx(LOCALE_SMONDECIMALSEP));
 Memo1.Lines.Add('LOCALE_SMONTHOUSANDSEP: ' + GLIx(LOCALE_SMONTHOUSANDSEP));
 Memo1.Lines.Add('LOCALE_SMONGROUPING: ' + GLIx(LOCALE_SMONGROUPING));
 Memo1.Lines.Add('LOCALE_ICURRDIGITS: ' + GLIx(LOCALE_ICURRDIGITS));
 Memo1.Lines.Add('LOCALE_IINTLCURRDIGITS: ' + GLIx(LOCALE_IINTLCURRDIGITS));
 Memo1.Lines.Add('LOCALE_ICURRENCY: ' + GLIx(LOCALE_ICURRENCY));
 Memo1.Lines.Add('LOCALE_INEGCURR: ' + GLIx(LOCALE_INEGCURR));
 Memo1.Lines.Add('LOCALE_SDATE: ' + GLIx(LOCALE_SDATE));
 Memo1.Lines.Add('LOCALE_STIME: ' + GLIx(LOCALE_STIME));
 Memo1.Lines.Add('LOCALE_SSHORTDATE: ' + GLIx(LOCALE_SSHORTDATE));
 Memo1.Lines.Add('LOCALE_SLONGDATE: ' + GLIx(LOCALE_SLONGDATE));
 Memo1.Lines.Add('LOCALE_STIMEFORMAT: ' + GLIx(LOCALE_STIMEFORMAT));
 Memo1.Lines.Add('LOCALE_IDATE: ' + GLIx(LOCALE_IDATE));
 Memo1.Lines.Add('LOCALE_ILDATE: ' + GLIx(LOCALE_ILDATE));
 Memo1.Lines.Add('LOCALE_ITIME: ' + GLIx(LOCALE_ITIME));
 Memo1.Lines.Add('LOCALE_ITIMEMARKPOSN: ' + GLIx(LOCALE_ITIMEMARKPOSN));
 Memo1.Lines.Add('LOCALE_ICENTURY: ' + GLIx(LOCALE_ICENTURY));
 Memo1.Lines.Add('LOCALE_ITLZERO: ' + GLIx(LOCALE_ITLZERO));
 Memo1.Lines.Add('LOCALE_IDAYLZERO: ' + GLIx(LOCALE_IDAYLZERO));
 Memo1.Lines.Add('LOCALE_IMONLZERO: ' + GLIx(LOCALE_IMONLZERO));
 Memo1.Lines.Add('LOCALE_S1159: ' + GLIx(LOCALE_S1159));
 Memo1.Lines.Add('LOCALE_S2359: ' + GLIx(LOCALE_S2359));
 Memo1.Lines.Add('LOCALE_ICALENDARTYPE: ' + GLIx(LOCALE_ICALENDARTYPE));
 Memo1.Lines.Add('LOCALE_IOPTIONALCALENDAR: ' + GLIx(LOCALE_IOPTIONALCALENDAR));
 Memo1.Lines.Add('LOCALE_IFIRSTDAYOFWEEK: ' + GLIx(LOCALE_IFIRSTDAYOFWEEK));
 Memo1.Lines.Add('LOCALE_IFIRSTWEEKOFYEAR: ' + GLIx(LOCALE_IFIRSTWEEKOFYEAR));
 Memo1.Lines.Add('LOCALE_SDAYNAME1: ' + GLIx(LOCALE_SDAYNAME1));
 Memo1.Lines.Add('LOCALE_SDAYNAME2: ' + GLIx(LOCALE_SDAYNAME2));
 Memo1.Lines.Add('LOCALE_SDAYNAME3: ' + GLIx(LOCALE_SDAYNAME3));
 Memo1.Lines.Add('LOCALE_SDAYNAME4: ' + GLIx(LOCALE_SDAYNAME4));
 Memo1.Lines.Add('LOCALE_SDAYNAME5: ' + GLIx(LOCALE_SDAYNAME5));
 Memo1.Lines.Add('LOCALE_SDAYNAME6: ' + GLIx(LOCALE_SDAYNAME6));
 Memo1.Lines.Add('LOCALE_SDAYNAME7: ' + GLIx(LOCALE_SDAYNAME7));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME1: ' + GLIx(LOCALE_SABBREVDAYNAME1));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME2: ' + GLIx(LOCALE_SABBREVDAYNAME2));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME3: ' + GLIx(LOCALE_SABBREVDAYNAME3));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME4: ' + GLIx(LOCALE_SABBREVDAYNAME4));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME5: ' + GLIx(LOCALE_SABBREVDAYNAME5));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME6: ' + GLIx(LOCALE_SABBREVDAYNAME6));
 Memo1.Lines.Add('LOCALE_SABBREVDAYNAME7: ' + GLIx(LOCALE_SABBREVDAYNAME7));
 Memo1.Lines.Add('LOCALE_SMONTHNAME1: ' + GLIx(LOCALE_SMONTHNAME1));
 Memo1.Lines.Add('LOCALE_SMONTHNAME2: ' + GLIx(LOCALE_SMONTHNAME2));
 Memo1.Lines.Add('LOCALE_SMONTHNAME3: ' + GLIx(LOCALE_SMONTHNAME3));
 Memo1.Lines.Add('LOCALE_SMONTHNAME4: ' + GLIx(LOCALE_SMONTHNAME4));
 Memo1.Lines.Add('LOCALE_SMONTHNAME5: ' + GLIx(LOCALE_SMONTHNAME5));
 Memo1.Lines.Add('LOCALE_SMONTHNAME6: ' + GLIx(LOCALE_SMONTHNAME6));
 Memo1.Lines.Add('LOCALE_SMONTHNAME7: ' + GLIx(LOCALE_SMONTHNAME7));
 Memo1.Lines.Add('LOCALE_SMONTHNAME8: ' + GLIx(LOCALE_SMONTHNAME8));
 Memo1.Lines.Add('LOCALE_SMONTHNAME9: ' + GLIx(LOCALE_SMONTHNAME9));
 Memo1.Lines.Add('LOCALE_SMONTHNAME10: ' + GLIx(LOCALE_SMONTHNAME10));
 Memo1.Lines.Add('LOCALE_SMONTHNAME11: ' + GLIx(LOCALE_SMONTHNAME11));
 Memo1.Lines.Add('LOCALE_SMONTHNAME12: ' + GLIx(LOCALE_SMONTHNAME12));
 Memo1.Lines.Add('LOCALE_SMONTHNAME13: ' + GLIx(LOCALE_SMONTHNAME13));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME1: ' + GLIx(LOCALE_SABBREVMONTHNAME1));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME2: ' + GLIx(LOCALE_SABBREVMONTHNAME2));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME3: ' + GLIx(LOCALE_SABBREVMONTHNAME3));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME4: ' + GLIx(LOCALE_SABBREVMONTHNAME4));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME5: ' + GLIx(LOCALE_SABBREVMONTHNAME5));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME6: ' + GLIx(LOCALE_SABBREVMONTHNAME6));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME7: ' + GLIx(LOCALE_SABBREVMONTHNAME7));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME8: ' + GLIx(LOCALE_SABBREVMONTHNAME8));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME9: ' + GLIx(LOCALE_SABBREVMONTHNAME9));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME10: ' + GLIx(LOCALE_SABBREVMONTHNAME10));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME11: ' + GLIx(LOCALE_SABBREVMONTHNAME11));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME12: ' + GLIx(LOCALE_SABBREVMONTHNAME12));
 Memo1.Lines.Add('LOCALE_SABBREVMONTHNAME13: ' + GLIx(LOCALE_SABBREVMONTHNAME13));
 Memo1.Lines.Add('LOCALE_SPOSITIVESIGN: ' + GLIx(LOCALE_SPOSITIVESIGN));
 Memo1.Lines.Add('LOCALE_SNEGATIVESIGN: ' + GLIx(LOCALE_SNEGATIVESIGN));
 Memo1.Lines.Add('LOCALE_IPOSSIGNPOSN: ' + GLIx(LOCALE_IPOSSIGNPOSN));
 Memo1.Lines.Add('LOCALE_INEGSIGNPOSN: ' + GLIx(LOCALE_INEGSIGNPOSN));
 Memo1.Lines.Add('LOCALE_IPOSSYMPRECEDES: ' + GLIx(LOCALE_IPOSSYMPRECEDES));
 Memo1.Lines.Add('LOCALE_IPOSSEPBYSPACE: ' + GLIx(LOCALE_IPOSSEPBYSPACE));
 Memo1.Lines.Add('LOCALE_INEGSYMPRECEDES: ' + GLIx(LOCALE_INEGSYMPRECEDES));
 Memo1.Lines.Add('LOCALE_INEGSEPBYSPACE: ' + GLIx(LOCALE_INEGSEPBYSPACE));
 Memo1.Lines.Add('LOCALE_FONTSIGNATURE: ' + GLIx(LOCALE_FONTSIGNATURE));
 Memo1.Lines.Add('LOCALE_SISO639LANGNAME: ' + GLIx(LOCALE_SISO639LANGNAME));
 Memo1.Lines.Add('LOCALE_SISO3166CTRYNAME: ' + GLIx(LOCALE_SISO3166CTRYNAME));
end;

TUX_der_Pinguin 11. Jun 2018 13:34

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

Zitat von Uwe Raabe (Beitrag 1404320)
Zitat:

Zitat von Alallart (Beitrag 1404317)
So richtig verstehe ich dein Problem nicht wirklich.

Überraschenderweise scheint das hier gerade ein sehr weit verbreitetes Phänomen zu sein.

Ich hätte das wohl besser etwas verständlicher schreiben sollen, aber immerhin haben es ein paar ja doch verstanden. :zwinker:

Danke jedenfalls für die Hilfe, hab das Thema mal nach hinten geschoben da es da wohl außer einer manuellen Übersetzung keine Lösung für gibt.

Uwe Raabe 11. Jun 2018 13:45

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

Zitat von TUX_der_Pinguin (Beitrag 1404536)
da es da wohl außer einer manuellen Übersetzung keine Lösung für gibt.

Wie auch. Die Übersetzung hängt ja nicht einmal von der aktuellen Windows-Sprache ab, sondern von der deines Programms (außer, du schreibst eine Shell-Extension oder sowas).

himitsu 11. Jun 2018 13:53

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

Zitat von TUX_der_Pinguin (Beitrag 1404024)
Ich will kein Datum formatieren sondern die Formatierung anzeigen.


So sollte es sein...
Zitat:

Bitte geben sie das Datum im Format TT.MM.JJJJ ein!
und so ist es im Moment
Zitat:

Bitte geben sie das Datum im Format dd/MM/yyyy ein!

Dann solltest du vorher besser einmal den Aufbau dieser Formatstrings lernen.

Das was im String als Trennzeichen steht ist nicht unbedingt das Angezeigte,
denn
Delphi-Quellcode:
/
bedeutet hierbei nunmal, dass dort der jeweilige DateSeparator eingefügt werden soll.
Delphi-Quellcode:
ShowMessage(ReplaceStr(FmtSet.LongDateFormat, '/', FmtSet.DateSeparator)); // dd.MM.yyyy

Natürlich könnte man in diesem DateFormat-String auch direkt das Datumszeichen setzen, aber das macht Spaß, wenn man ein englisches Format schreibt und dann den DateSeparator falsch setzt, der das wieder überschreibt.

Aber das Lokalisierte TT.MM.JJJJ bekommst du da niemals raus, außer du übersetzt das auch noch. (Y>J, D>T usw.),
und viel Spaß mit M für Month oder Minute, je nach dem ob davor ein Datums- oder Zeitformatzeichen steht. (bei zusammengesetzten Datum&Zeitstrings)
Dieser Formatstring ist grundsätzlich immer englisch und gibt nur die Reihenfolge/Position/Größe der Felder an.





PS: Es gibt auch noch den Bug in einigen vorinstallierten Windowsen.
Im Windows gibt es mehrere Stellen, wo das Format gespeichert ist und da vergisst gern jemand alle Stellen anzupassen.
Windows zeigt das Eine in den Einstellungsdialogen an, aber Delphi liest dann das Andere aus. (da z.B. mal kurz nach Englisch umstellen, speichern und wieder zurück auf Deutsch)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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