Announcement

Collapse
No announcement yet.

TDateTimePicker, OnChange()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TDateTimePicker, OnChange()

    Hallo zusammen,

    ich habe hier ein seltsames Problem. In einer TDateTimePicker-Komponente möchte ich die Eingabe auf den folgenden Tag als kleinstes Datum beschränken. Dafür verwende ich MinDate. So weit funktioniert das auch. Zusätzlich möchte ich aber eine Warnmeldung ausgeben, sobald das eingegebene Datum innerhalb der nächsten Woche liegt. Dies habe ich versucht in der OnChange() unterzubringen:
    <PRE>
    DataChanged = true;
    if (dtpKdTermin->Date <= TDateTime(TDateTime::CurrentDate().Val + 7))
    {
    ShowMessage("xxx");
    }
    ButtonEnabler();
    </PRE>
    Soweit funktioniert das auch noch. Aber sobald man auf den Monat-zurück-Button klickt (und NUR dann) wird die OnChange() immer und immer wieder aufgerufen, in einer Rekursion, wie es scheint. So lange, bis ein Stacküberlauf stattfindet...

    Das Problem scheint der Zugriff auf dtpKdTermin->Date zu sein, der anscheinend den sofortigen Neuaufruf von OnChange zu Folge hat... Wenn ich die if(..)-Abfrage rauslasse, funktioniert's auch einwandfrei. Ich möchte die Meldung aber bereits bei der Eingabe ausgeben. Wie kann ich das realisieren?

    Danke Jochen

  • #2
    Hallo nochmal,

    in der Hilfe zu TDateTimePicker/OnChange() steht:<BR>
    Schreiben Sie eine Ereignisbehandlungsroutine für OnChange, um bestimmte Aktionen auszulösen, wenn sich der Datums- oder Uhrzeitwert in der Komponente ändert.

    Irgendwíe kommt mir das Ganze komisch vor. Wozu soll die OnChange() gut sein, wenn ich nicht auf ->Date oder ->DateTime zugreifen darf???

    In der Basiskomponente TMonthCalender gibt es keine OnChange() sondern nur eine OnClick(). Aber auch hier läßt sich das Datum unterhalb des MinDate setzen, wenn der 'Monat-zurück-Button' verwendet wird (und ebenfalls nur dann). Beispielsweise setzte ich Date und MinDate auf heute, setze das Datum auf den 02.06.2004 und klicke auf Monat zurück - schon habe ich den 02.05.2004 selektiert - und das dürfte m.E. nicht geschehen. Der Fehler steckt also schon dort...

    Seufz, läuft wohl darauf hinaus, daß ich auf TDateTimePicker und TMonthCalender verzichten muß, wenn ich MinDate verwenden will. Werde das Ganze wohl vorläufig mit einem Edit-Feld machen, in dem das Datum eingetippt werden muß.

    Grüße Joche

    Comment


    • #3
      Hallo Jochen,

      hast Du schon mal versucht, vor der if-Abfrage die zu vergleichenden Datumswerte zwei Variablen zuzuweisen und dann diese zu vergleichen?
      Keine Ahnung, ob das was helfen kann, ist nur so 'ne Idee...

      Gruß Knu

      Comment


      • #4
        Hallo Knut,

        nö, bringt leider auch keine Besserung. Man darf in der OnChange() nicht auf ->Date zugreifen. Generell läßt sich feststellen, daß die OnChange() mindestens zweimal aufgerufen wird, wenn der Kalender im aufgeklappten Zustand verwendet wird.

        Ich verwende auch nicht mehr ->MinDate, sondern eine eigene TDateTime-Variable und mache die Überprüfung in der OnExit(). Scheint besser zu funktionieren...

        Danke und Grüße

        Joche

        Comment


        • #5
          Hallo Jochen,<br>
          hast Du´s mal im OnCloseUp-ereignis probiert?
          dort habe ich sowas schon gemacht.<br>

          Yve

          Comment


          • #6
            Hallo Yves,

            ja, hab' ich. Das funktioniert generell auch. Allerdings wird bei manuellen Eingaben diese Funktion nicht aufgerufen. ich kann Sie also nicht zur Überprüfung der Eingabe verwenden.

            Wie gesagt, ich mache die Überprüfung jetzt in der OnExit() (und hoffe, dass niemand das Datum zuletzt eingibt oder ändert, da sonst der Speichern-Button nicht aktiviert wird )

            Danke,

            Joche

            Comment

            Working...
            X