Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FormatSettings for Dummies (https://www.delphipraxis.net/188843-formatsettings-dummies.html)

haentschman 12. Apr 2016 14:32

Delphi-Version: 10 Seattle

FormatSettings for Dummies
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöle...:P

Ihr müßt mich mal erleuchten. Ich bin zu doof die aktuellen Systemeinstellungen (FormatSettings http://docwiki.embarcadero.com/Libra...FormatSettings) zu laden. :roll:

1. Systemeinstellungen (Bild1)
2. Das was entweder der Record FormatSettings oder eine Variable initialisiert mit TFormatSettings.Create (macht keinen Unterschied ob ohne Länderkennung initialisiert oder mit 'de-DE') liefert :? (Bild2)

Das mit dem Schrägstrich statt dem Dateseparator im Datum ist ja schon ein alter Hut seit XE2. Muß ich mich nun auch selbst um die 24 Stunden Darstellung kümmern (HH statt hh)? Wozu ist das ganze dann gut wenn ich die Einstellungen des Users benutzen will?

PS: Wenn ich das Datumsformat in den Systemeinstellungen ändere, ändern die FormatSettings das brav mit... nur ohne den korrekten Dateseparator und Zeitformat.
PS2: Den W7 Bug bezüglich der Einstellungen habe ich mit dem W10 auch probiert... (Umstellen, neu starten und wieder zurück)

Danke für Info´s bzw. Alternativen 8-)

baumina 12. Apr 2016 14:44

AW: FormatSettings for Dummies
 
Stehen die Einstellungen des Benutzers nicht einfach in der globalen Variable System.SysUtils.FormatSettings?

haentschman 12. Apr 2016 14:48

AW: FormatSettings for Dummies
 
:-D Ja, und das ist genau das was du auf Bild2 siehst... nämlich falsch. :evil:

baumina 12. Apr 2016 14:53

AW: FormatSettings for Dummies
 
Weil du oben was von TFormatSettings.Create geschrieben hast, das hat mich dann wohl verwirrt.

haentschman 12. Apr 2016 14:55

AW: FormatSettings for Dummies
 
:-D nicht schlimm. Du kannst dir ja auch eine Variable mit einem Gebietsschema deiner Wahl, unabhängig vom System, belegen und damit arbeiten. Dafür brauchst du das Create = Initialisierung.

hoika 12. Apr 2016 15:36

AW: FormatSettings for Dummies
 
Hallo,
klick auf "Weitere Einstellungen" und dann auch unten rechts auf "Zurücksetzen".

Wie sieht es danach bei deinem Programm aus?


Heiko

haentschman 12. Apr 2016 15:56

AW: FormatSettings for Dummies
 
:wink: Danke für deine Anteilnahme...

Antwort: Exakt gleich falsch. :evil:

PS: Auch der XX = Vormittags String Zusatz bei 12 Stundenanzeige wird in den FormatSettings nicht übernommen, die Strings dafür schon ... (Im DateTimePicker.Format ist es tt)

Es sieht danach aus als ob für
DateShortFormat, DateLongFormat, TimeShortFormat, TimeLongFormat Standardwerte zurückgegeben werden statt der Einstellungen. Alles Andere wird offensichtlich angepaßt.

Der schöne Günther 12. Apr 2016 16:10

AW: FormatSettings for Dummies
 
Also laut
http://qc.embarcadero.com/wc/qcmain.aspx?d=104942

kann man das für einen Fehler halten, das "/" sei allerdings ein "Meta-Character" für den DateSeparator und nicht als "/"-Zeichen zu verstehen.

himitsu 12. Apr 2016 16:13

AW: FormatSettings for Dummies
 
Das "/" und ":" in den Date-/Time-Strings wird durch die Werte von DateSeparator und TimeSeparator ersetzt, in den Formatfunktionen.

Will man das nicht, dann muß man die in " einfassen.
Delphi-Quellcode:
'hh":"mm":"ss'
macht immer ":", egal was in TimeSeparator drin steht.

haentschman 12. Apr 2016 18:49

AW: FormatSettings for Dummies
 
:wink: Ok, dann stell ich mich mal blöd...

1. Warum kommt hier
Delphi-Quellcode:
Label.Caption := FormatDateTime(Now, FormatSettings.ShortDateFormat)
12/04/2016 statt 12.04.2016 ?
-> weil die FormatStrings nicht "kompatibel" sind.
2. Warum steht im ShortTimeFormat etc. immer hh statt HH wie ausgewählt?
->
Delphi-Quellcode:
FormatDateTime(Now, FormatSettings.ShortTimeFormat)
immer 07:49 statt 19:49 wie ausgewählt?
3. Warum werden beim Auswählen des englischen Formates zwar die Strings für Vormittag / Nachmittag in FormatSettings eingetragen aber kein Platzhalter dafür?
-> Wie soll FormatDatetime wissen ob Vormittag oder Nachmittag?

Mit FormatDateTime geht es nicht. Mit DateTimeToString http://docwiki.embarcadero.com/Libra...teTimeToString geht die Ersetzung des / im Datum. :thumb:
Delphi-Quellcode:
DateTimeToString(Result,
                 FormatSettings.ShortDateFormat + ' - ' + FormatSettings.ShortTimeFormat,
                 Now);
ergibt deutsch 14.04.2016 20:48 und englisch 14/04/2016 20:48 je nach Datumeinstellung
...egal welche Einstellungen für den Zeitanteil gewählt werden, der Zeitanteil ist immer gleich. :? (siehe Punkt 2 + 3)

baumina 13. Apr 2016 06:14

AW: FormatSettings for Dummies
 
Wenn ich einen Blick in die SysUtils werfe, sehe ich dass es 'HH' als Formatierung nicht gibt. Es gibt nur 'hh', wenn man keine 24-Stundenanzeige will, wird das über am/pm geregelt.

Zitat:

{ FormatDateTime formats the date-and-time value given by DateTime using the
format given by Format. The following format specifiers are supported:

c Displays the date using the format given by the ShortDateFormat
global variable, followed by the time using the format given by
the LongTimeFormat global variable. The time is not displayed if
the fractional part of the DateTime value is zero.

d Displays the day as a number without a leading zero (1-31).

dd Displays the day as a number with a leading zero (01-31).

ddd Displays the day as an abbreviation (Sun-Sat) using the strings
given by the ShortDayNames global variable.

dddd Displays the day as a full name (Sunday-Saturday) using the strings
given by the LongDayNames global variable.

ddddd Displays the date using the format given by the ShortDateFormat
global variable.

dddddd Displays the date using the format given by the LongDateFormat
global variable.

g Displays the period/era as an abbreviation (Japanese and
Taiwanese locales only).

gg Displays the period/era as a full name.

e Displays the year in the current period/era as a number without
a leading zero (Japanese, Korean and Taiwanese locales only).

ee Displays the year in the current period/era as a number with
a leading zero (Japanese, Korean and Taiwanese locales only).

m Displays the month as a number without a leading zero (1-12). If
the m specifier immediately follows an h or hh specifier, the
minute rather than the month is displayed.

mm Displays the month as a number with a leading zero (01-12). If
the mm specifier immediately follows an h or hh specifier, the
minute rather than the month is displayed.

mmm Displays the month as an abbreviation (Jan-Dec) using the strings
given by the ShortMonthNames global variable.

mmmm Displays the month as a full name (January-December) using the
strings given by the LongMonthNames global variable.

yy Displays the year as a two-digit number (00-99).

yyyy Displays the year as a four-digit number (0000-9999).

h Displays the hour without a leading zero (0-23).

hh Displays the hour with a leading zero (00-23).

n Displays the minute without a leading zero (0-59).

nn Displays the minute with a leading zero (00-59).

s Displays the second without a leading zero (0-59).

ss Displays the second with a leading zero (00-59).

z Displays the millisecond without a leading zero (0-999).

zzz Displays the millisecond with a leading zero (000-999).

t Displays the time using the format given by the ShortTimeFormat
global variable.

tt Displays the time using the format given by the LongTimeFormat
global variable.

am/pm Uses the 12-hour clock for the preceding h or hh specifier, and
displays 'am' for any hour before noon, and 'pm' for any hour
after noon. The am/pm specifier can use lower, upper, or mixed
case, and the result is displayed accordingly.

a/p Uses the 12-hour clock for the preceding h or hh specifier, and
displays 'a' for any hour before noon, and 'p' for any hour after
noon. The a/p specifier can use lower, upper, or mixed case, and
the result is displayed accordingly.

ampm Uses the 12-hour clock for the preceding h or hh specifier, and
displays the contents of the TimeAMString global variable for any
hour before noon, and the contents of the TimePMString global
variable for any hour after noon.

/ Displays the date separator character given by the DateSeparator
global variable.

: Displays the time separator character given by the TimeSeparator
global variable.

'xx' Characters enclosed in single or double quotes are displayed as-is,
"xx" and do not affect formatting.

Format specifiers may be written in upper case as well as in lower case
letters--both produce the same result.

If the string given by the Format parameter is empty, the date and time
value is formatted as if a 'c' format specifier had been given.

The following example:

S := FormatDateTime('"The meeting is on" dddd, mmmm d, yyyy, ' +
'"at" hh:mm AM/PM', StrToDateTime('2/15/95 10:30am'));

assigns 'The meeting is on Wednesday, February 15, 1995 at 10:30 AM' to
the string variable S. }

haentschman 13. Apr 2016 06:21

AW: FormatSettings for Dummies
 
:P Moin und danke....

Das weiß ich alles. Ich will aber wissen wie das Zeitformat, was der Nutzer eingestellt hat, aussieht und anwenden. Primär geht es nur um die in FormatSettings gelieferten Werte. Die sind definitiv beim Zeitformat falsch. :? Du kannst einstellen was du willst. Der Formatstring für die Zeit ist immer gleich.
Ich habe mir schon eine Funktion gebaut die die "Unzulänglichkeiten" ausbügelt. Das kann es doch aber nicht sein.

Sir Rufo 13. Apr 2016 08:17

AW: FormatSettings for Dummies
 
Dann lies dich in die entsprechenden API-Funktionen ein und bau dir das so wie du das haben willst.

Kleiner Tipp: Da hat sich über die Zeit von Windows XP über Vista und 7 ... etwas (einiges) getan, was du auch alles berücksichtigen musst. Mal sehen auf welchen Ansatz du kommst.

Mit Delphi-Referenz durchsuchenSystem.SysUtils.GetLocaleStr kannst du sozusagen direkt auslesen, was das OS zurückgibt.

haentschman 13. Apr 2016 10:45

AW: FormatSettings for Dummies
 
Danke...:P
Zitat:

Da hat sich über die Zeit von Windows XP über Vista und 7
...da muß ich mal sagen das interessiert mich nicht. Ich lese die FormatSettings (dafür sind sie da) und erwarte korrekte Werte. :roll:
Stelle mal bitte in deinen Regionseinstellungen das kurze Zeitformat auf HH:mm Uhr (Vorlage). Dann zeige mir wie du mit Hilfe der Formatsettings das 13:48 Uhr (so wollte es ja der Nutzer) ohne zusätzliche Korrekturen in ein Label schreibst.

Ich will doch nur bestätigt haben, das auch bei Euch die Zeitformatierung in den FormatSettings falsch ist. :?

Der schöne Günther 13. Apr 2016 10:58

AW: FormatSettings for Dummies
 
Liste der Anhänge anzeigen (Anzahl: 1)
Klar, das wird bei jedem so sein.

Sir Rufo 13. Apr 2016 11:21

AW: FormatSettings for Dummies
 
Die
Delphi-Quellcode:
FormatSettings
sind dafür da, dass Delphi mit diesen arbeiten kann und zwar auf jeder Plattform. Somit sind diese Einstellungen dort entsprechend gleichgeschaltet.

Um damit zu arbeiten verwendet man ganz simpel die Funktionen, die optional die FormatSettings als Argument anbieten. Alles, was nach Datum/Zeit riecht wird intern von
Delphi-Quellcode:
System.SysUtils.DateTimeToString()
(nur intern verfügbar) in einen String umgewandelt.

Wenn du wissen willst, was jetzt explizit bei dem OS an EInstellungen original drin stehen, dann musst du das über den Weg auslesen, den das OS zur Verfügung stellt.

Eigentlich nicht so schwer zu verstehen ...

Sir Rufo 13. Apr 2016 11:33

AW: FormatSettings for Dummies
 
Nur mal so gesagt:
Zitat:

Zitat von haentschman (Beitrag 1335433)
1. Warum kommt hier
Delphi-Quellcode:
Label.Caption := FormatDateTime(Now, FormatSettings.ShortDateFormat)
12/04/2016 statt 12.04.2016 ?

Das kann ich noch nicht einmal kompilieren :stupid:

Das hier schon
Delphi-Quellcode:
Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now );
Hier mal ein kleines Beispielprogramm, wo man auch live die Änderungen sehen kann
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.AppEvnts;

type
  TForm1 = class( TForm )
    Label1: TLabel;
    ApplicationEvents1: TApplicationEvents; { OnSettingChange = ApplicationEvents1SettingChange }
    procedure ApplicationEvents1SettingChange(Sender: TObject; Flag: Integer;
      const Section: string; var Result: Integer);
    procedure FormShow(Sender: TObject);
  private
    procedure PresentData;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1SettingChange(Sender: TObject; Flag: Integer;
  const Section: string; var Result: Integer);
begin
  PresentData;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PresentData;
end;

procedure TForm1.PresentData;
begin
  Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now );
end;

end.

haentschman 13. Apr 2016 11:37

AW: FormatSettings for Dummies
 
Zitat:

Um damit zu arbeiten verwendet man ganz simpel die Funktionen, die optional die FormatSettings als Argument anbieten. Alles, was nach Datum/Zeit riecht wird intern von System.SysUtils.DateTimeToString() (nur intern verfügbar) in einen String umgewandelt.
...aber mit falschem Zeitformat. :roll:
Zitat:

Das kann ich noch nicht einmal kompilieren
...sorry war auf dem Handy aus dem Hut getippt. Value und FormatString ist umgekehrt. :oops:
Delphi-Quellcode:
procedure TForm1.PresentData;
begin
  Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now );
end;
...jetzt nimmst du mal ShortTimeFormat und versuchst in der Region Englisch mit 12 Std. Anzeige und AM/PM einzustellen. Alternativ kannst du auch unser 24 Stundenformat probieren... es kommt immer 12 Std.Format ohne AM/PM raus.:wink:


Wir brechen hier ab. Ich habe mir das selbst für unsere Zwecke korrigiert.

Danke an alle...

Sir Rufo 13. Apr 2016 11:43

AW: FormatSettings for Dummies
 
Beim Zeitformat hat Emba allerdings geschlafen, das wird nicht so übernommen, wie in den Windows-Einstellungen eingetragen.

Delphi-Quellcode:
  TimePrefix := '';
  TimePostfix := '';
  if StrToIntDef(GetLocaleStr(Locale, LOCALE_ITLZERO, '0'), 0) = 0 then
    HourFormat := 'h'
  else
    HourFormat := 'hh';
  if StrToIntDef(GetLocaleStr(Locale, LOCALE_ITIME, '0'), 0) = 0 then
    if StrToIntDef(GetLocaleStr(Locale, LOCALE_ITIMEMARKPOSN, '0'), 0) = 0 then
      TimePostfix := ' AMPM'
    else
      TimePrefix := 'AMPM ';
  Result.ShortTimeFormat := TimePrefix + HourFormat + ':mm' + TimePostfix; // <- DA
  Result.LongTimeFormat := TimePrefix + HourFormat + ':mm:ss' + TimePostfix; // <- DA
Da bleibt nur der Weg über das OS (auslesen, ummodeln, verwenden)

haentschman 13. Apr 2016 11:44

AW: FormatSettings for Dummies
 
:P Davon rede ich die ganze Zeit... na endlich. :wink:

Sir Rufo 13. Apr 2016 11:47

AW: FormatSettings for Dummies
 
Zitat:

Zitat von haentschman (Beitrag 1335471)
:P Davon rede ich die ganze Zeit... na endlich. :wink:

Nicht wirklich
Zitat:

Zitat von haentschman (Beitrag 1335433)
1. Warum kommt hier
Delphi-Quellcode:
Label.Caption := FormatDateTime(Now, FormatSettings.ShortDateFormat)
12/04/2016 statt 12.04.2016 ?


Stevie 13. Apr 2016 11:50

AW: FormatSettings for Dummies
 
Dein Problem liegt darin, dass du annimmst,
TFormatSettings.ShortTimeFormat und LongTimeFormat hätten etwas mit dem ab Windows 7 einstellbaren "Short time" und "Long time" zu tun, was aber nicht der Fall ist.

haentschman 13. Apr 2016 11:53

AW: FormatSettings for Dummies
 
8-) Oh ja... streiten. :P
Das mit den / am Anfang war ein zusätzliches zum Zeitformat.

Zitat:

1. Warum kommt hier Label.Caption := FormatDateTime(Now, FormatSettings.ShortDateFormat) 12/04/2016 statt 12.04.2016 ?
.
2. Warum steht im ShortTimeFormat etc. immer hh statt HH wie ausgewählt?
3. Warum werden beim Auswählen des englischen Formates zwar die Strings für Vormittag / Nachmittag in FormatSettings eingetragen aber kein Platzhalter dafür?
.
.
...egal welche Einstellungen für den Zeitanteil gewählt werden, der Zeitanteil ist immer gleich. (siehe Punkt 2 + 3)
Danke an alle...

Sir Rufo 13. Apr 2016 11:54

AW: FormatSettings for Dummies
 
Zitat:

Zitat von Stevie (Beitrag 1335473)
Dein Problem liegt darin, dass du annimmst,
TFormatSettings.ShortTimeFormat und LongTimeFormat hätten etwas mit dem ab Windows 7 einstellbaren "Short time" und "Long time" zu tun, was aber nicht der Fall ist.

Öhm ... diese Relation würde ich aber auch implizieren ... nein besser: erwarten!

So bekommt man das Gewünschte:
Delphi-Quellcode:
procedure TForm1.PresentData;
var
  lShortTimeFmt: string;
  lLongTimeFmt : string;
begin
  Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now ) + ' (' + FormatSettings.ShortDateFormat + ')';

  lShortTimeFmt := GetLocaleStr( GetThreadLocale, LOCALE_SSHORTTIME, FormatSettings.ShortDateFormat );
  Label2.Caption := FormatDateTime( lShortTimeFmt, Now );

  // Geht erst ab Windows 7!
  lLongTimeFmt  := GetLocaleStr( GetThreadLocale, LOCALE_STIMEFORMAT, FormatSettings.LongTimeFormat );
  Label3.Caption := FormatDateTime( lLongTimeFmt, Now );
end;

haentschman 13. Apr 2016 11:55

AW: FormatSettings for Dummies
 
Zitat:

TFormatSettings.ShortTimeFormat und LongTimeFormat hätten etwas mit dem ab Windows 7 einstellbaren "Short time" und "Long time" zu tun, was aber nicht der Fall ist.
...kannst du das näher erklären? Alle anderen Änderungen an der Region werden in die Formatsettings übernommen... nur die 2 Zeitformatierungen nicht.

Stevie 13. Apr 2016 12:09

AW: FormatSettings for Dummies
 
Weil es diese beiden Werte (damals noch ohne TFormatSettings als globale Variablen) schon vor Windows 7 gab, welches zusätzlich zu dem Time Format noch ein Short Time einführte (und die entsprechende Konstante dazu).

Bernhard Geyer 16. Jan 2018 16:56

AW: FormatSettings for Dummies
 
Bin heute auch über diese "bescheuerte" Logik gestolpert.

Hier mal Voten das dieser "Logik" mit dem "meta character" weggeschmießen wird: RSP-18603

Ich vermute nicht das irgendwo eine Logik in den VCL-Sourcen sich auf diese "Meta Character" verläst.
Ist wohl eher ein "Irgendwo wird das noch erwartet weil man die Implementierung nicht richtig gemacht hat"

Cashew 30. Apr 2019 07:23

AW: FormatSettings for Dummies
 
Moin...

gestern bin ich auch über die Probleme mit den TFormatSettings gestolpert.

Was hat es den mit diesem "Meta-Character" auf sich? Den unten aufgeführten Link kann ich bei mir nicht (mehr ?) öffnen.

Zitat:

Zitat von Der schöne Günther (Beitrag 1335424)
Also laut
http://qc.embarcadero.com/wc/qcmain.aspx?d=104942

kann man das für einen Fehler halten, das "/" sei allerdings ein "Meta-Character" für den DateSeparator und nicht als "/"-Zeichen zu verstehen.


Wenn ich das ganze aber richtig verstehe, dann bleibt einem nichts anders übrig, als die "falschen" Werte in den TFormatSettings zu korrigieren?

Bernhard Geyer 30. Apr 2019 07:46

AW: FormatSettings for Dummies
 
qc.embarcadero.com ist das alte BugTracking-System das mittlerweile abgschaltet wurde.
Nur noch quality.embarcadero.com ist die Einzige Quelle für solche Infos.

Cashew 30. Apr 2019 09:00

AW: FormatSettings for Dummies
 
Vielen Dank für die Info.

Gibt es dann die erwähnten Erklärungen zum "Meta Character" irgendwo noch zum nachlesen? Oder kann mir jemand vielleicht so kurz sagen was damals die Erklärung von Embarcadero dazu war?

Uwe Raabe 30. Apr 2019 09:56

AW: FormatSettings for Dummies
 
Ohne diesen alten Thread jetzt nochmal komplett durchzulesen: Die Funktion FormatDateTime z.B. erwartet als Datumstrenner ein "/", weil das im Code fest so hinterlegt ist. Lässt man dort den Formatstring leer, wird TFormatSettings.ShortDateFormat verwendet.

Demnach sollten Datums-Formatstrings immer ein "/" als Datumstrenner verwenden, der dann in den aktuellen TFormatSettings.DateSeparator umgewandelt wird. Ich sehe da jetzt nichts falsches daran, wenn Delphi die Einträge für die vordefinierten Datumsformate entsprechend anpasst. Das schließt natürlich nicht aus, daß jemand seine Programme so schreibt, daß dieses Verhalten einen Fehler auslöst. Das ist dann aber eher ein Problem des betreffenden Programmierers, der hier eine andere Erwartungshaltung hat, und kein Fehler in der RTL.

Cashew 30. Apr 2019 16:34

AW: FormatSettings for Dummies
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1431337)
Ohne diesen alten Thread jetzt nochmal komplett durchzulesen: Die Funktion FormatDateTime z.B. erwartet als Datumstrenner ein "/", weil das im Code fest so hinterlegt ist. Lässt man dort den Formatstring leer, wird TFormatSettings.ShortDateFormat verwendet.

Danke für die Info, war mir so noch nicht bewusst...

haentschman 1. Mai 2019 05:59

AW: FormatSettings for Dummies
 
Moin...:P
...nur so am Rande. Der Thread ging eigentlich ausschließlich um den falschen Zeitanteil in den TFormatSettings. :wink:


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