Autor Beitrag
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 13.12.10 16:06 
Moin,

kann mir jemand sagen, wie ich an die Werte komme, die ich auf dem Screenshot markiert habe?
Datum
Ich brauche die Angaben, um den richtigen Wert für SysUtils.TwoDigitYearCenturyWindow zu berechnen (damit mein Programm auch das macht, was der User erwartet :roll: )

Danke!
Jens
Einloggen, um Attachments anzusehen!
_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mo 13.12.10 16:41 
Steht in der registry unter HKEY_CURRENT_USER\Control Panel\International\Calendars\TwoDigitYearMax, wenn er vom Standard 1930-2029 abweicht !

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mo 13.12.10 19:07 
Hi,
user profile iconchrisw hat folgendes geschrieben Zum zitierten Posting springen:
Steht in der registry unter HKEY_CURRENT_USER\Control Panel\International\Calendars\TwoDigitYearMax, wenn er vom Standard 1930-2029 abweicht !


kleine Interessensfrage: Ist das immer 1930-2029 oder (CurYear - 70) bis (CurYear + 19)? Ich nehme mal an letzteres, weiß da jemand genaueres?

Eigentlich dachte ich ja, dass TFormatSettings.TwoDigitYearCenturyWindow dafür verantwortlich wäre diesen wert zu halten. Aber folgende kleine Funktion liefert leider kein zufriedenstellendes Ergebnis, oder übersehe ich da etwas:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function GetTwoDigitYearBorder : Word;
var
  FormatSettings :TFormatSettings;
begin
  GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FormatSettings);
  Result := FormatSettings.TwoDigitYearCenturyWindow;
end;


Gruß
Klabautermann
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 13.12.10 20:32 
Wahrscheinlich ist voreingestellt - unabhängig vom Jahr - 1930 - 2029

Aber warum benötigst Du denn diese Grenzen, denn die Umwandlung von vier- in zweistellige Jahresangaben sind doch mit FormatDateTime möglich.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 13.12.10 21:49 
Ich hatte es getestet, indem ich einfach das Datum des Rechners umgestellt hab. Es blieb bei 1930 - 2029.

Aber durch die Voreinstellung von TwoDigitYearCenturyWindow = 50 wandert bei Delphi diese Grenze. Also macht das Programm nicht das, was der User (aufgrund der Einstellung in der Systemsteuerung) erwartet. Aufgefallen war es, weil ich eine Option eingebaut hab, dass der User in der ganzen Anwendung das Jahr 2-stellig hat. Ich persönlich mag das zwar nicht, aber einigen User wollen es scheinbar. Und da fiel auf, dass bei der Eingabe von Geburtsdaten das Jahr falsch interpretiert wurde.

Bleibt also nur, beim Programmstart den richtigen Wert für TwoDigitYearCenturyWindow auszurechnen, damit das Programm zu den Einstellungen in der Systemsteuerung passt.

Jens

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 14.12.10 04:32 
Da haben wir wieder den Salat. In Windows7 ist die Registrierung wieder mal anders. Den o. angegebenen Schlüssel

HKEY_CURRENT_USER\Control Panel\International\Calendars\TwoDigitYearMax

gibt es bei meinem Rechner nicht.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 14.12.10 05:21 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
gibt es bei meinem Rechner nicht.
Der Schlüssel wird erst dann angelegt, wenn man an den Einstellungen rumgefummelt hat.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 06:36 
user profile iconKlabautermann hat folgendes geschrieben Zum zitierten Posting springen:
Aber folgende kleine Funktion liefert leider kein zufriedenstellendes Ergebnis
Das liegt daran, dass dieser Wert in FormatSettings schlicht nicht befüllt wird. Der Standardwert ist 50 bei der globalen Variable, die Auslesefunktionen ignorieren den Wert schlicht. :autsch:

Ich konnte aber (ohne .NET, dort gibt es Calendar.TwoDigitYearMax) auch keinen vorgesehenen Weg via GetLocaleInfo oder ähnlichem finden um den Wert auszulesen. Bleibt wohl wirklich nur der manuelle Zugriff auf die Registry. :nixweiss:
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 14.12.10 08:41 
Sehr seltsame Sache. Ich hab jetzt mal den Wert geändert und er wurde in die Registry geschrieben. Soweit in Ordnung. Aber dann steht der Wert dort unter den Namen "1", "2", "9" - "12" drin. Warum das denn?
Und dass der Wert als String gespeichert wird, ist auch nicht wirklich logisch, oder? :nixweiss:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 08:51 
Wofür die Zahlen stehen, weiß ich auch nicht, wenn ich jedenfalls nur unter 1 einen Wert eintrage, klappt das. Beim Ändern via CP werden wieder alle Werte geschrieben.

Jedenfalls solltest du die richtigen Ergebnisse bekommen, wenn du den ersten Wert ausliest, falls er existiert, denke ich.

Schließlich steht das eh unter HKCU. Und wenn ich verschiedene Lokalisationen auswähle, wird der Wert immer bei den selben Zahlen eingetragen, also nicht je nach Lokalisation. :nixweiss:

// EDIT:
Microsoft selbst gibt in der KB auch nur den Wert unter 1 an:
support.microsoft.com/kb/244664
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 14.12.10 12:26 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKlabautermann hat folgendes geschrieben Zum zitierten Posting springen:
Aber folgende kleine Funktion liefert leider kein zufriedenstellendes Ergebnis
Das liegt daran, dass dieser Wert in FormatSettings schlicht nicht befüllt wird. Der Standardwert ist 50 bei der globalen Variable, die Auslesefunktionen ignorieren den Wert schlicht. :autsch:

Ja, so in etwa erschien es mir in meinem Test auch, auch wenn ich dem nicht weiter nachgegangen bin. Auch wenn ich zweistellige Jahreszahlen nicht mag, scheint mir das doch ein ziemlicher Mängel zu sein, zumal in den TFormatSettings ja ein Wert hierfür vorgesehen ist.

Gruß
Klabautermann
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 12:33 
Der Mangel ist vor allem, dass es nicht zumindest beim Füllen der FormatSettings auf den gleichen Wert wie die globale Variable initial gesetzt wird. Dadurch entsteht ein inkonsistentes Verhalten.

Weshalb sie es nicht auslesen, dürfte daran liegen, dass es anscheinend keine API zum Auslesen gibt, und sie nicht die Registry direkt nutzen wollten. Gut ist das aber nicht, ja.
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Di 14.12.10 13:02 
hiermit funktioniert es übrigens ohne die Registry auslesen zu müssen !

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.12.10 13:04 
Genau dort hatte ich in der Doku geschaut, aber GetCalendarInfo ist mir irgendwie durchgerutscht. :zustimm:
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 14.12.10 13:21 
Sehr schön, das gefällt mir besser als der Registryzugriff. Dankeschön!

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)