Entwickler-Ecke
Windows API - 2-stellige Jahreszahl abfragen
Nersgatt - Mo 13.12.10 15:06
Titel: 2-stellige Jahreszahl abfragen
Moin,
kann mir jemand sagen, wie ich an die Werte komme, die ich auf dem Screenshot markiert habe?
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
chrisw - Mo 13.12.10 15:41
Steht in der registry unter HKEY_CURRENT_USER\Control Panel\International\Calendars\TwoDigitYearMax, wenn er vom Standard 1930-2029 abweicht !
Klabautermann - Mo 13.12.10 18:07
Hi,
chrisw hat folgendes geschrieben : |
| 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:
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 - Mo 13.12.10 19: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.
Nersgatt - Mo 13.12.10 20: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
Tranx - Di 14.12.10 03: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.
Gerd Kayser - Di 14.12.10 04:21
Tranx hat folgendes geschrieben : |
| gibt es bei meinem Rechner nicht. |
Der Schlüssel wird erst dann angelegt, wenn man an den Einstellungen rumgefummelt hat.
jaenicke - Di 14.12.10 05:36
Klabautermann hat folgendes geschrieben : |
| 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 - Di 14.12.10 07: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:
jaenicke - Di 14.12.10 07: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:
http://support.microsoft.com/kb/244664
Klabautermann - Di 14.12.10 11:26
jaenicke hat folgendes geschrieben : |
Klabautermann hat folgendes geschrieben : | | 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 - Di 14.12.10 11: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.
jaenicke - Di 14.12.10 12:04
Genau dort hatte ich in der Doku geschaut, aber GetCalendarInfo ist mir irgendwie durchgerutscht. :zustimm:
Nersgatt - Di 14.12.10 12:21
Sehr schön, das gefällt mir besser als der Registryzugriff. Dankeschön!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!