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: Problem mit MinDate und MaxDate (https://www.delphipraxis.net/142336-datetimepicker-problem-mit-mindate-und-maxdate.html)

Mike_on_Tour 26. Okt 2009 14:44


DateTimePicker: Problem mit MinDate und MaxDate
 
Hallo,

ich programmiere mit Delphi 2005 Pro und habe ein Problem mit dem DateTimePicker und dem Setzen des Datums und der Min-/Max-Werte zur Laufzeit. Das Auswahldatum darf nur zwischen einem Erfassungsdatum und dem aktuellen Tagesdatum liegen. Der Code sah bisher so aus:
Delphi-Quellcode:
// aktuelles Datum setzen
DateTimePicker1.Date := Date();
// Min/Max-Datum setzen
DateTimePicker1.MinDate := Trunc (adsTblAuftrag.FieldByName('ErfassDatum').AsDateTime);
DateTimePicker1.MaxDate := Date();
Unter Windows XP funktioniert das auch. Unter Windows Vista erhalte ich aber ab dem zweiten Aufruf die Meldung "Kalenderzeit und -datum konnte nicht gesetzt werden". Das Problem sind offensichtlich die Zuweisungen der Min-/Max-Werte. Ich habe den Code auch schon so abgeändert:
Delphi-Quellcode:
// Min/Max-Datum rücksetzen
DateTimePicker1.MinDate := 0;
DateTimePicker1.MaxDate := 0;
// aktuelles Datum setzen
DateTimePicker1.Date := Date();
// Min/Max-Datum neu setzen
DateTimePicker1.MinDate := Trunc (adsTblAuftrag.FieldByName('ErfassDatum').AsDateTime);
DateTimePicker1.MaxDate := Date();
Die Fehlermeldung unter Windows Vista kommt aber weiterhin, während es mit Windwos XP weiter funktioniert.

Wie läßt sich das Problem lösen ?

Mike

fatalerror 26. Okt 2009 15:43

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Delphi-Quellcode:
DateTimePicker1.Date:= Date;
DateTimePicker1.MinDate:=Trunc(date)-10;
DateTimePicker1.MaxDate:= Trunc(date);
obenstehender Code funktioniert bei mir in Vista problemlos

also vermutlich bei dir:

Delphi-Quellcode:
// aktuelles Datum setzen
DateTimePicker1.Date := Date();
// Min/Max-Datum setzen
DateTimePicker1.MinDate := Trunc (adsTblAuftrag.FieldByName('ErfassDatum').AsDateTime);
DateTimePicker1.MaxDate := trunc(Date);
sorry, hab überlesen, dass es erst beim zweiten mal auftritt.

Delphi-Quellcode:
DateTimepicker1.minDate:= 0;
DateTimepicker1.maxdate:= Date +100;
//sicherstellen das Datum grösser ist als einzufügendes Datum und bestehendes Datum

//jetzt neues Datum setzen
DateTimePicker1.Date:= Date +10;

DateTimePicker1.MinDate:=Trunc(date);
DateTimePicker1.MaxDate:= Trunc(date)+10;

Mike_on_Tour 26. Okt 2009 16:14

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
OK, ich muß etwas mehr erklären.

Ich habe ein Form1, in dem ein einzelner Datensatz von vielen ausgewählt wird. Mit einem Doppelklick auf diesen Datensatz wird ein Form2 aufgerufen, um die einzelnen Datenfelder des Datensatzes anzuzeigen:
Delphi-Quellcode:
procedure TForm1.StrGridDblClick(Sender: TObject);
begin
  Form2.ShowModal;
end;
Im Form2 befinden sich im Ereignis 'FormShow' u.a. folgende Codezeilen:
Delphi-Quellcode:
// aktuelles Datum setzen
DateTimePicker1.Date := Date();
// Min/Max-Datum setzen
DateTimePicker1.MinDate := Trunc (adsTblAuftrag.FieldByName('ErfassDatum').AsDateTime);
DateTimePicker1.MaxDate := Date();
bzw. die Änderungen aus meinem 1. Post. Der erste Aufruf von Form2 funktioniert auch unter Vista fehlerfrei. Ab dem zweiten Aufruf kommt jedoch die von mir beschriebene Fehlermeldung, aber nur unter Vista. Was kann ich tun ?

@fatalerror: Meine Antwort hat sich zeitlich etwas überschnitten. Ich habe schon folgends probiert:
Delphi-Quellcode:
DateTimePicker1.MaxDate := Date() + 1;
Das hat aber auch nichts geholfen.

Mike_on_Tour 26. Okt 2009 16:34

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Es gibt eine neue Erkenntnis: Wenn man im ersten Aufruf von Form2 ein Datum aus dem DateTimePicker auswählt, funktionieren auch alle weiteren Aufrufe von Form2. Wird im ersten Aufruf von Form2 das Datum nicht geändert, kommt ab dem zweiten Aufruf die Fehlermeldung.

fatalerror 26. Okt 2009 20:12

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Ich kann dein Problem nicht nachvollziehen.

Stelle sicher, dass vor der Zuweisung des neuen Datums

1. Mindate zurückgesetzt wird auf 0
2. Maxdate sowohl grösser als das (zuvor) gesetzte Datum im Datetimepicker ist, als auch grösser als das neu zu setzende Datum.

Folgender rudimentärer Code funktioniert bei mir:

Delphi-Quellcode:
form2.dtp1.mindate:=0;
form2.dtp1.maxdate:= Trunc(date+360);
form2.dtp1.Date:= date;
form2.dtp1.mindate:= Trunc(date-10);
form2.dtp1.maxdate:= Trunc(date);

form2.ShowModal;
siehe auch:
Datetimepicker Probleme

Mike_on_Tour 27. Okt 2009 08:36

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Erst mal Danke für Deine Mithilfe. Ich habe das schon so eingetragen, aber es kommt trotzdem die Fehlermeldung. Etwas komisch finde ich, daß ich nach einer Änderung des Datums im ersten Aufruf auch alle anderen Aufrufe machen kann, aber ohne Änderung ab dem zweiten Aufruf eine Meldung bekomme.

Sinn und Zweck ist ja die Einschränkung der Datumsauswahl auf einen Bereich vom Tag der Erfassung bis zum aktuellen Tag. Wenn ich das so nicht zum Laufen bekomme, muß ich daß Datum eben beim Speichern in der Datenbank oder bei einem anderen Ereignis prüfen. Wie gesagt, unter Windows XP funktioniert es (Programmierer-PC), Windows Vista macht Probleme. Ich werde mal noch ein paar Tests machen, vielleicht ergibt sich doch noch was.

sirius 27. Okt 2009 10:00

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Der DateTimePicker hatte schon immer irgendwelche Macken (ist ja ein Control von Windows). Ich weis nicht mehr genau welche, aber es hing mit Min und Max zusammen. Ich mache es so, dass ich generel auf Min und Max verzichte und den User im Nachhinein über eine falsche Zeitangabe informiere. I.A. ist dem User seine unmögliche Zeitangabe ja auch bewusst, soll heißen nur ein DAU gibt falsche Zeiten an, und dem reicht eine nachträgliche Meldung auch aus.

fatalerror 28. Okt 2009 10:30

Re: DateTimePicker: Problem mit MinDate und MaxDate
 
Ein Workaround könnte allenfalls sein, die Form nicht automatisch zu erstellen, sondern erst beim entsprechenden Aufruf

Delphi-Quellcode:
var
   form2:TForm2
   
begin
   form2:= TForm2.create(self);
   Try
     form2.DateTimePicker1.Date := Date();
          form2.DateTimePicker1.MinDate := Trunc(adsTblAuftrag.FieldByName('ErfassDatum').AsDateTime);
     form2.DateTimePicker1.MaxDate := trunc(Date);
     form2.showmodal;
     // tu irgendwas

   
   finally
      form2.free;
   end;
end;


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