AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DateTimePicker Benutzereingabe korrigieren

Ein Thema von Nico B. · begonnen am 6. Jun 2017 · letzter Beitrag vom 6. Jun 2017
Antwort Antwort
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#1

DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 10:42
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;
Nico Bäger
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 10:52
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 OnChange -Event nur schauen ob es gültig ist und dementsprechend vielleicht ein "Prüfen Sie Ihre Eingaben"-Label ein/ausblenden.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 10:55
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?
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 11:04
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#5

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 11:11
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...
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 11:23
Hallöle...
Zitat:
Seltsam...
...nö. As designed.
Siehe:
http://www.delphipraxis.net/192493-d...aenderung.html

Lösung (wenn es in das Konzept paßt ): 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. Da gibt es keine Probleme mit dem OnChange...

Geändert von haentschman ( 6. Jun 2017 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 12:01
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äger
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#8

AW: DateTimePicker Benutzereingabe korrigieren

  Alt 6. Jun 2017, 12:17
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!
Nico Bäger
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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