Kalenderelemente in Abhängigkeit von einander und vom Wochentag einstellen

  • Hallo zusammen.
    Habe folgendes Problem. In meinen Programm erstelle ich eine Form welche 2 Kalenderelemete beinhaltet und eine Checkbox.
    Das erste Kalenderelement soll das aktuelle Datum anzeigen und das zweite Element soll je nach Datum des ersten Elementes den Wochentag zuvor anzeigen.
    Ändert sich das Datum im ersten Element soll wenn die Checkbox aktiviert ist automatisch das Datum in dem Kalenderelement 2 geändert werden.
    Und zwar wenn im ersten Element Mittwoch, der 15.September 2010 eingestellt ist so soll im zweiten Element Dienstag, 14. September eingestellt werden.
    Wenn im ersten Element Montag, der 13. September 2010 eingestellt wird, so soll im zweiten Element Freitag der 10. September 2010 eingestellt werden.

    Hat jemand einen Rat.

    Danke schon mal

    • Offizieller Beitrag

    Das geht so:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <DateTimeConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <Date.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $DTM_SETFORMAT_ = 0x1032
    Const $DATUMSFORMAT = "MMMM,dddd, dd.MM.yyyy"

    [/autoit] [autoit][/autoit] [autoit]

    $akt_datum = @YEAR & "/" & @MON & "/" & @WDAY;
    $folderDelim = "\"
    $xDelim = "-"

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Datumwechsel", 233, 170, 52, 702,-1, 0x00000018)
    $Date1 = GUICtrlCreateDate($akt_datum, 10, 45, 200, 21)
    GUICtrlSendMsg($Date1, $DTM_SETFORMAT_, 0, $DATUMSFORMAT)
    $Date2 = GUICtrlCreateDate($akt_datum, 10, 90, 200, 21)
    GUICtrlSendMsg($Date2, $DTM_SETFORMAT_, 0, $DATUMSFORMAT)
    $Checkbox1 = GUICtrlCreateCheckbox("Automatisch Datum2 einstellen", 10, 117, 200, 19,$BS_AUTOCHECKBOX)
    GuiCtrlSetState(-1, $GUI_CHECKED)
    GUISetState(@SW_SHOW, $Form1)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Date1
    _datumChange()
    Case $Date2

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _datumChange()
    If Not BitAND(GUICtrlRead($Checkbox1), $GUI_CHECKED) Then Return
    Local $date = StringRight(GUICtrlRead($Date1), 10)
    $date = _DateAdd('D', -1, StringRight($date,4) & '/' & StringMid($date,4,2) & '/' & StringLeft($date,2))
    GUICtrlSetData($Date2, $date)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Das heisst wenn Freitag ist muss das zweite Datumselement auf Freitag gesetzt werden.


    Das zweite Datumsfeld ist doch immer einen Tag zurück - ergo sollte es am Montag zurückzeigen auf Freitag. Das macht in meinen Augen Sinn.
    Aber Freitag auf Freitag.. :wacko:

    So sieht es für Mo auf Fr aus. Kannst du bei Bedarf auch abändern.:

    [autoit]

    Func _datumChange()
    If Not BitAND(GUICtrlRead($Checkbox1), $GUI_CHECKED) Then Return
    Local $date = StringRight(GUICtrlRead($Date1), 10), $add = -1
    Local $wDay = _DateToDayOfWeekISO(StringRight($date,4), StringMid($date,4,2), StringLeft($date,2))
    If $wDay = 1 Then $add = -3
    $date = _DateAdd('D', $add, StringRight($date,4) & '/' & StringMid($date,4,2) & '/' & StringLeft($date,2))
    GUICtrlSetData($Date2, $date)
    EndFunc

    [/autoit]
  • BugFix du bist wirklich wahnsinn :rock:

    Ich hätte ewig irgendeinen Quatsch versucht. Das es so einfach ist mit so wenig Code hätte ich nicht gedacht.

    Leider stellt der Code aber nicht am Montag 3 Tage zurück sondern am Dienstag.
    Habe es aber nicht gelößt bekommen. :whistling:

    • Offizieller Beitrag

    Leider stellt der Code aber nicht am Montag 3 Tage zurück sondern am Dienstag.

    Hat sich erledigt
    Funktioniert super.
    Durch das erste Local date wird der @wday ein weniger also muss
    If $wDay = 0 heißen


    Ist auch korrekt, die Funktion _DateToDayOfWeekISO gibt "0" für Montag zurück (laut Hilfe). Aber auf meinem Laptop seltsamerweise 1, deshalb hatte ich dort die 1 verwendet. ;)

    (Setze mal bitte im ersten Beitrag den Präfix auf 'gelöst'.)

  • Kann mir bitte jemand erklären, wie man damit zu einer 0 für Montag kommen soll?

    EDIT: Hat sich erledigt, wurde in V3.3.5 korrigiert, aber nicht in der Hilfe berichtigt (siehe hier)

    Einmal editiert, zuletzt von Großvater (1. Oktober 2010 um 08:05) aus folgendem Grund: Wer selbst sucht, braucht nicht zu fragen!!