Delphi-PRAXiS
Seite 3 von 4     123 4      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr.
Seite 3 von 4     123 4      

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