Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DateTimePicker Benutzereingabe korrigieren (https://www.delphipraxis.net/192955-datetimepicker-benutzereingabe-korrigieren.html)

Nico B. 6. Jun 2017 09:42

DateTimePicker Benutzereingabe korrigieren
 
Hallo zusammen,

ich habe ein Problem mit dem TDateTimePicker.
Ich möchte, dass meine Benutzer ein Start-Datum (inklusive Uhrzeit) und ein Ende-Datum (inklusive Uhrzeit) eingeben.
Dazu habe ich 4 TDateTimePicker-Komponenten genutzt.
DTPStartDatum.Kind:=dtkDate
DTPStartZeit.Kind :=dtkTime
und
DTPEndeDatum.Kind:=dtkDate
DTPEndeZeit.Kine :=dtkTime

Nun möchte ich verhindern, dass ein Benutzer eine Start-DateTime eingibt, die nach der Ende-DateTime liegt, bzw. dass er eine Ende-DateTime eingibt, die vor der Start-DateTime liegt.

Zuerst habe ich versucht, dass mit MaxDate und MinDate zu lösen, aber damit kann ich nur das Datum einschränken.
Also habe ich nun versucht es im OnChange-Event der Komponenten zu lösen.
Im OnChange baue ich jeweils den beiden zusammengehörigen Komponenten die DateTime-Werte zusammen und vergleiche sie anschließend.
Wird bspw. ein zu großer Wert für die Start-DateTime eingegeben, dann möchte ich den Wert bei den Komponenten auf die Ende-DateTime setzen.
Aber obwohl der Vergleich noch funktioniert, wird mir in der Komponente nicht der geänderte Wert angezeigt. Woran kann das liegen, bzw. gibt es einen besseren Weg?

Hier der Code des OnChange-Events für die Start-DateTime:
Delphi-Quellcode:
procedure TMain.DTPStartDatumChange(Sender: TObject);
var
  EndeDatum : TDateTime;
  StartDatum: TDateTime;
begin
  EndeDatum :=DateOf(DTPEndeDatum.Date) +TimeOf(DTPEndeZeit.Time);
  StartDatum:=DateOf(DTPStartDatum.Date)+TimeOf(DTPStartZeit.Time);
  if StartDatum>EndeDatum
    then
      begin
        DTPStartDatum.Date:=DateOf(EndeDatum);
        DTPStartZeit.Time :=TimeOf(EndeDatum);
      end;
end;

Der schöne Günther 6. Jun 2017 09:52

AW: DateTimePicker Benutzereingabe korrigieren
 
Man scheint im OnChange-Event des Pickers seinen Wert nicht noch einmal ändern dürfen.

Ich persönlich mag es sowieso überhaupt nicht wenn ich auf etwas klicke und dann flitscht irgendwas und etwas ganz anderes wird angezeigt als das was ich ausgewählt habe. Ich persönlich würde, wenn die Eingabe nicht gültig sind, das rot anmalen und der Nutzer kann den Dialog nicht bestätigen bis er z.B. ein Start-Datum vor dem End-Datum angibt. Dann müsste man im
Delphi-Quellcode:
OnChange
-Event nur schauen ob es gültig ist und dementsprechend vielleicht ein "Prüfen Sie Ihre Eingaben"-Label ein/ausblenden.

Nico B. 6. Jun 2017 09:55

AW: DateTimePicker Benutzereingabe korrigieren
 
Mhm, na gut. Ich sag, mal das ist ja ein wenig Geschmacksache, ob man Benutzereingabe automatisch ändert, oder ob man den Benutzer die Änderung machen lässt.

Aber wenn ich die Änderung gern automatisch machen wöllte, welches Event wäre denn dann das richtige?

himitsu 6. Jun 2017 10:04

AW: DateTimePicker Benutzereingabe korrigieren
 
Genauso wie .Date und .Time nicht immer "nur" das raus geben, wo nach sie klingen, gibt es auch bei der Zuweisung so ein paar Problemchen.
Drum wirst du doch bestimmt auch das DateOf und TimeOf eingebaut haben, obwohl man denken könnte es sei unnötig.

Tipp, schau mal in TCommonCalendar.SetDateTime und überleg dir, wie/ob die Komponente überhaupt mitbekommt, dass sich dort was geändert hat und dass sie die Anzeige nun aktualisieren muß.

Versuch es mal so
Delphi-Quellcode:
DateTimePicker1.Date := ...;
DateTimePicker1.Invalidate;

Nico B. 6. Jun 2017 10:11

AW: DateTimePicker Benutzereingabe korrigieren
 
Mhm, mit Invalidate hab ich´s jetzt probiert. Das funktioniert leider auch nicht.
Und in meiner Delphi-Hilfe hab ich erst mal keine Beschreibung zu SetDateTime gefunden.

Allerdings habe ich eben festgestellt, dass mein Problem nur auftritt, wenn ich das Datum über den DropDown-Kalender ändere. Ungültige Uhrzeitänderungen und ungültige Änderungen direkt im Eingabefeld des Datums werden korrigiert.
Seltsam...

haentschman 6. Jun 2017 10:23

AW: DateTimePicker Benutzereingabe korrigieren
 
Hallöle...:P
Zitat:

Seltsam...
...nö. As designed. 8-)
Siehe:
http://www.delphipraxis.net/192493-d...aenderung.html

Lösung (wenn es in das Konzept paßt :wink:): Den Benutzer NIE Datumsangaben manuell eingeben lassen. (30.02.2170 oder so). Die Prüfungen für ungültige Datumsangaben sind (sinngemäß) Strafarbeit. Sondern nur über den Picker. :thumb: Da gibt es keine Probleme mit dem OnChange...

Nico B. 6. Jun 2017 11:01

AW: DateTimePicker Benutzereingabe korrigieren
 
Hallo Haentschman,

den Thread hatte ich schon gelesen.
Ist es denn notwendig, dass das OnChange-Event dann noch einmal aufgerufen wird?

Eigentlich mache ich ja schon alles im aktuell aufgerufenen OnChange. Nur wird der übergebene Wert eben nicht angezeigt, wenn das OnChange-Event durch eine Änderung über den DropDown-Kalender aufgerufen wird.

Prinzipiell stimme ich da mit dir nämlich völlig überein. Ich will den Benutzer die Datumsangabe über die DateTimePicker machen lassen. Nur wenn er da ein ungültiges Datum angibt, möchte ich es automatisch ändern.

Nico B. 6. Jun 2017 11:17

AW: DateTimePicker Benutzereingabe korrigieren
 
Hallo zusammen,

ich habe jetzt eine Lösung für mein Problem gefunden.
Ich finde Sie jetzt nicht sonderlich schick, aber sie funktioniert.

Hier meine Lösung:
Ich habe im OnChange-Event der DateTimePicker die Benutzereingabe kontrolliert und geändert wie im ersten Beitrag bereits beschrieben. Damit werden bereits alle ungültigen Änderungen abgefangen, die in den direkten Eingabefelder für Datum und Uhrzeit der DateTimePicker gemacht werden.
Anschließend habe ich im OnCloseUp-Event des DateTimePickers für´s Datum noch einmal das OnChange-Event aufgerufen. Damit werden nun auch ungültige Änderungen abgefangen, die über den DropDown-Kalender gemacht werden.

Mein Problem ist offensichtlich, dass das OnCloseUp-Event erst nach dem OnChange-Event ausgelöst wird. Und irgendwie werden die Änderungen, die im OnChange-Event gemacht werden, noch einmal vom OnCloseUp-Event überschrieben.

Falls noch jemand eine bessere Lösung kennt, kann er sie ja mal bei Gelegenheit posten. Mein Problem ist aber erst einmal grundsätzlich gelöst.

Danke für eure Vorschläge und Hilfestellungen! :thumb:


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