Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eingabe wie z.B. 1.7.50 in (DateTime Obj) 01.07.1950 wandeln


jf_stgt - Di 21.04.09 12:04
Titel: Eingabe wie z.B. 1.7.50 in (DateTime Obj) 01.07.1950 wandeln
Hallo zusammen,

die Funktion StrToDate wandelt ja Benutzereingaben in ein DateTime Objekt um.
In unserer Software wird eine Benutzereingabe eines Geburtsdatums umgewandelt durch


Delphi-Quelltext
1:
2:
3:
4:
...
dtObj := StrToDate(Edit1.Text);
Edit1.Text := DateToStr(dtObj);
...


Tut soweit auch wenn jemand z.B. 1.7.70 eingibt.
Dies wird dann umgewandelt in 01.07.1970.

Gibt der Kunde allerdingg 1.7.50 ein, wird das Datum in 01.07.2050 gewandelt.
Das Problem ist, dass dies für ein Geburtsdatum natürlich kein Sinn macht und eigentlich als Jahr 1950 rauskommen hätte müssen. Gerade bei Geburtsdaten.
Hat jemand eine Idee, was man da tun könnte?
Man könnte dies natürlich manuell überwachen aber vielleicht gibts ja irgendwas, was die StrToDate steuert.

Gruß
Jürgen


elundril - Di 21.04.09 12:12

ich hab zwar keine direkte lösung aber wie wäre es wenn du ein Mask-Edit verwenden würdest und damit den User "zwingst" die Eingabe vollständig auszufüllen??

lg elundril


GTA-Place - Di 21.04.09 12:13

Oder noch besser: Du bietest ihm 3. Dropdown-Listen an und er kann es damit auswählen.


matze - Di 21.04.09 13:35

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
Oder noch besser: Du bietest ihm 3. Dropdown-Listen an und er kann es damit auswählen.
Das ist die Frage ob das besser ist. Mich nervt sowas eher.


jf_stgt - Di 21.04.09 14:31

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
Oder noch besser: Du bietest ihm 3. Dropdown-Listen an und er kann es damit auswählen.


Das ist für einen User nicht gerade Benutzefreundlich - sorry!
Auch die vorgeschlagene Lösung mit Mask Edit würde zwar gehen, aber auch das finde ich nicht soo der Brüller.
Der Kunde muss ruck zuck die Daten eingeben und er mostert jetzt schon, dass er das 19xx mit eingeben muss.


Narses - Di 21.04.09 15:07

Moin!

Das das Problem nun mal nicht eindeutig lösbar ist, wirst du dich für eine ähnlich geartete Lösung entscheiden müssen. Kompromisse wären:cu
Narses


Boldar - Di 21.04.09 15:10

naja, ein geburtsdatum kann ja nicht in der Zukunft liegen, also wenn es in der Zukunft liegt, einfach 100 abziehen.


GTA-Place - Di 21.04.09 16:08

user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:
Der Kunde muss ruck zuck die Daten eingeben und er mostert jetzt schon, dass er das 19xx mit eingeben muss.

Dir ist aber schon bewusst, dass man das Auswählen der Combobox genau wie das Eintippen in ein Feld mit der Tastaur erledigen kann? Einmal 12 tippen wählt im ersten Feld auch 12 aus ;-)


jf_stgt - Di 21.04.09 16:24

Hallo!

Danke für eure rege Diskussion und Vorschläge.

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:
Der Kunde muss ruck zuck die Daten eingeben und er mostert jetzt schon, dass er das 19xx mit eingeben muss.

Dir ist aber schon bewusst, dass man das Auswählen der Combobox genau wie das Eintippen in ein Feld mit der Tastaur erledigen kann? Einmal 12 tippen wählt im ersten Feld auch 12 aus ;-)

Wenn ich das Datum direkt eintippe, komme ich mit wenigen Klicks aus. Wenn man z.B. das Jahr über ein Dropdown Feld auswählt, dauert es ewig über Maus oder Tastatur.

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
naja, ein geburtsdatum kann ja nicht in der Zukunft liegen, also wenn es in der Zukunft liegt, einfach 100 abziehen.


Dies gefällt mir für mich am besten. Danke.

Gruß
Jürgen


GTA-Place - Di 21.04.09 16:28

user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das Datum direkt eintippe, komme ich mit wenigen Klicks aus. Wenn man z.B. das Jahr über ein Dropdown Feld auswählt, dauert es ewig über Maus oder Tastatur.

Versteh ich jetzt nicht. Vorgehen für ein fiktives Geburtsdatum (Angaben in Klammern entsprechen den Tasten der Tastatur):


Quelltext
1:
2:
Dropdown: [1] [Tab] [1] [Tab] [1] [9] [5] [0]
Textfeld: [1]  [.]  [1]  [.]  [1] [9] [5] [0]


Ich sehe da jetzt keinen Unterschied?!


elundril - Di 21.04.09 16:29

user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:

Wenn ich das Datum direkt eintippe, komme ich mit wenigen Klicks aus. Wenn man z.B. das Jahr über ein Dropdown Feld auswählt, dauert es ewig über Maus oder Tastatur.

Gruß
Jürgen


darf ich meinen Informatik-Lehrer zitieren? "Mäuse sind was für Katzen"

und mittels richtiger Taborder usw sind mir somanche dieser programme lieber als diese "Black boxes" um es mal übertrieben zu formulieren.

lg elundril


jf_stgt - Di 21.04.09 16:42

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjf_stgt hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das Datum direkt eintippe, komme ich mit wenigen Klicks aus. Wenn man z.B. das Jahr über ein Dropdown Feld auswählt, dauert es ewig über Maus oder Tastatur.

Versteh ich jetzt nicht. Vorgehen für ein fiktives Geburtsdatum (Angaben in Klammern entsprechen den Tasten der Tastatur):


Quelltext
1:
2:
Dropdown: [1] [Tab] [1] [Tab] [1] [9] [5] [0]
Textfeld: [1]  [.]  [1]  [.]  [1] [9] [5] [0]


Ich sehe da jetzt keinen Unterschied?!


Die Eingabe ist aber [1].[1].[5][0]
Darum gehts.

user profile iconelundril hat folgendes geschrieben:
darf ich meinen Informatik-Lehrer zitieren? "Mäuse sind was für Katzen"
lg elundril


Klasse Spruch!

Moderiert von user profile iconNarses: Zitat repariert


ssb-blume - Mi 22.04.09 10:09

Hallo,
versuch mal Folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses DateUtils;
...
var d: TDate;
...
  d := StrToDate(Edit1.Text);
  if YearOf(now) < YearOf(d) then d := IncYear(d, -100);
  Edit1.Text := DateToStr(d);
....


jf_stgt - Mi 22.04.09 11:41

user profile iconssb-blume hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
versuch mal Folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses DateUtils;
...
var d: TDate;
...
  d := StrToDate(Edit1.Text);
  if YearOf(now) < YearOf(d) then d := IncYear(d, -100);
  Edit1.Text := DateToStr(d);
....


Guter Code!
Danke!
Damit schließe ich mal diese Frage hier.

Gruß
Jürgen


Stundenplan - Mi 22.04.09 16:42

Es geht auch mit  TwoDigitYearCenturyWindow := 50;
Windows nimmt als Bezugsjahr nämlich das aktuelle, also 2009. Und TwoDigitYearCenturyWindow setzt das Bezugsjahr um 50 Jahre zurück.