![]() |
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 ![]() 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-) |
AW: FormatSettings for Dummies
Stehen die Einstellungen des Benutzers nicht einfach in der globalen Variable
![]() |
AW: FormatSettings for Dummies
:-D Ja, und das ist genau das was du auf Bild2 siehst... nämlich falsch. :evil:
|
AW: FormatSettings for Dummies
Weil du oben was von TFormatSettings.Create geschrieben hast, das hat mich dann wohl verwirrt.
|
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.
|
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 |
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. |
AW: FormatSettings for Dummies
Also laut
![]() kann man das für einen Fehler halten, das "/" sei allerdings ein "Meta-Character" für den DateSeparator und nicht als "/"-Zeichen zu verstehen. |
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:
macht immer ":", egal was in TimeSeparator drin steht.
'hh":"mm":"ss'
|
AW: FormatSettings for Dummies
:wink: Ok, dann stell ich mich mal blöd...
1. Warum kommt hier
Delphi-Quellcode:
12/04/2016 statt 12.04.2016 ?
Label.Caption := FormatDateTime(Now, FormatSettings.ShortDateFormat)
-> weil die FormatStrings nicht "kompatibel" sind. 2. Warum steht im ShortTimeFormat etc. immer hh statt HH wie ausgewählt? ->
Delphi-Quellcode:
immer 07:49 statt 19:49 wie ausgewählt?
FormatDateTime(Now, FormatSettings.ShortTimeFormat)
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 ![]()
Delphi-Quellcode:
ergibt deutsch 14.04.2016 20:48 und englisch 14/04/2016 20:48 je nach Datumeinstellung
DateTimeToString(Result,
FormatSettings.ShortDateFormat + ' - ' + FormatSettings.ShortTimeFormat, Now); ...egal welche Einstellungen für den Zeitanteil gewählt werden, der Zeitanteil ist immer gleich. :? (siehe Punkt 2 + 3) |
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:
|
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. |
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 ![]() |
AW: FormatSettings for Dummies
Danke...:P
Zitat:
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. :? |
AW: FormatSettings for Dummies
Liste der Anhänge anzeigen (Anzahl: 1)
Klar, das wird bei jedem so sein.
|
AW: FormatSettings for Dummies
Die
Delphi-Quellcode:
sind dafür da, dass Delphi mit diesen arbeiten kann und zwar auf jeder Plattform. Somit sind diese Einstellungen dort entsprechend gleichgeschaltet.
FormatSettings
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:
(nur intern verfügbar) in einen String umgewandelt.
System.SysUtils.DateTimeToString()
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 ... |
AW: FormatSettings for Dummies
Nur mal so gesagt:
Zitat:
Das hier schon
Delphi-Quellcode:
Hier mal ein kleines Beispielprogramm, wo man auch live die Änderungen sehen kann
Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now );
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. |
AW: FormatSettings for Dummies
Zitat:
Zitat:
Delphi-Quellcode:
...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:
procedure TForm1.PresentData;
begin Label1.Caption := FormatDateTime( FormatSettings.ShortDateFormat, Now ); end; Wir brechen hier ab. Ich habe mir das selbst für unsere Zwecke korrigiert. Danke an alle... |
AW: FormatSettings for Dummies
Beim Zeitformat hat Emba allerdings geschlafen, das wird nicht so übernommen, wie in den Windows-Einstellungen eingetragen.
Delphi-Quellcode:
Da bleibt nur der Weg über das OS (auslesen, ummodeln, verwenden)
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 |
AW: FormatSettings for Dummies
:P Davon rede ich die ganze Zeit... na endlich. :wink:
|
AW: FormatSettings for Dummies
Zitat:
Zitat:
|
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. |
AW: FormatSettings for Dummies
8-) Oh ja... streiten. :P
Das mit den / am Anfang war ein zusätzliches zum Zeitformat. Zitat:
|
AW: FormatSettings for Dummies
Zitat:
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; |
AW: FormatSettings for Dummies
Zitat:
|
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
![]() ![]() ![]() |
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: ![]() 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" |
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:
Wenn ich das ganze aber richtig verstehe, dann bleibt einem nichts anders übrig, als die "falschen" Werte in den TFormatSettings zu korrigieren? |
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. |
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? |
AW: FormatSettings for Dummies
Ohne diesen alten Thread jetzt nochmal komplett durchzulesen: Die Funktion
![]() 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. |
AW: FormatSettings for Dummies
Zitat:
|
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 20:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz