Feiertage im Kalender einbinden

    • Offizieller Beitrag

    Du kannst Tage im Monatskalender markieren. Dazu muß eine Maske übergeben werden. Aus mir unverständlichen Gründen wurde zu dieser nicht ganz einfachen Erstellung der Maske keine Funktion in die UDF integriert. Ich hatte deshalb bereits 2009 die fehlende Funktion erstellt, aber wie nicht anders zu erwarten lehnen die Jungs im EN-Forum es ab Funktionen die das Leben erleichtern mit in die Bibliothek aufzunehmen.
    Da die Forensuche zur Zeit immer auf die Startseite verlinkt poste ich mal ein Bsp-Skript:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GuiMonthCal.au3>
    #include <WindowsConstants.au3>

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

    Example()

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

    Func Example()
    GUICreate("Month Calendar Set Day State", 400, 300)
    Local $hMonthCal = GUICtrlCreateMonthCal("", 4, 4, -1, -1, BitOR($WS_BORDER, $MCS_DAYSTATE), 0x00000000)

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

    ; $aMasks ist ein Array in dem die Masken für die Kalenderdarstellung übergeben werden
    Local $aMasks[_GUICtrlMonthCal_GetMonthRangeSpan($hMonthCal, True)]

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

    ; an Index [1] von $aMask wird die HexMask für die zu markierenden Tage gesetzt
    $aMasks[1] = _GetHexMask('1,5,6,8,12,22,23,24,30', ',')

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

    GUISetState()

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

    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)

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

    Sleep(1500)
    $aMasks[1] = _GetHexMask('1,2,3,12,13,14,29,30', ',')
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Sleep(1500)
    $aMasks[1] = _GetHexMask('11', ',')
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Sleep(1500)
    $aMasks[1] = _GetHexMask('') ; Markierung löschen
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    ; oder als Array übergeben
    Sleep(1500)
    Local $a[9] = [1,5,6,8,12,22,23,24,30]
    $aMasks[1] = _GetHexMask($a)
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Sleep(1500)
    Local $b[8] = [1,2,3,12,13,14,29,30]
    $aMasks[1] = _GetHexMask($b)
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Sleep(1500)
    Local $c[1] = [11]
    $aMasks[1] = _GetHexMask($c)
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Sleep(1500)
    Local $d[1] = ['']
    $aMasks[1] = _GetHexMask($d)
    _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
    ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

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

    ;===============================================================================
    ; Function Name..: _GetHexMask($vDays [, $Delim=Default])
    ; Description....: Codiert die übergebenen Tageszahlen (1-31) als Hex-String, wie er als Maske zum Markieren mit _GUICtrlMonthCal_SetDayState
    ; ...............: im MonthCal Anwendung findet
    ; Parameter(s)...: $vDays Trennzeichenbasierter String oder Array mit den zu markierenden Tagen
    ; ...............: $Delim das Trennzeichen, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
    ; Return Value(s): Hexstring für $aMasks
    ; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _GetHexMask($vDays, $sDelim=Default)
    If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
    If (( Not IsArray($vDays) ) And ($vDays = '') ) Or _
    (( IsArray($vDays) ) And ($vDays[0] = '') ) Then
    Return '0x0'
    Else
    Local $aDays
    If (Not IsArray($vDays)) Then
    $aDays = StringSplit($vDays, $sDelim, 2)
    Else
    $aDays = $vDays
    EndIf
    Local $aHex[8] = [0,0,0,0,0,0,0,0], $pos, $mask = ''
    For $i = 0 To UBound($aDays) -1
    Select
    Case $aDays[$i] < 5
    $pos = 0
    Case $aDays[$i] < 9
    $pos = 1
    Case $aDays[$i] < 13
    $pos = 2
    Case $aDays[$i] < 17
    $pos = 3
    Case $aDays[$i] < 21
    $pos = 4
    Case $aDays[$i] < 25
    $pos = 5
    Case $aDays[$i] < 29
    $pos = 6
    Case Else
    $pos = 7
    EndSelect
    $aDays[$i] -= $pos * 4
    $aHex[$pos] += Int(2 ^ ($aDays[$i]-1))
    Next
    For $i = 0 To UBound($aHex) -1
    $mask = Hex($aHex[$i], 1) & $mask
    Next
    Return '0x' & $mask
    EndIf
    EndFunc ;==>_GetHexMask

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

    ;===============================================================================
    ; Function Name..: _DecodeHexMask($sHex [, $fArray=True[, $Delim=Default]])
    ; Description....: Gibt die mit _GetHexMask() codierten Tageszahlen (1-31) als Array (Standard) oder Trennzeichenstring zurück
    ; Parameter(s)...: $sHex Der Hex-String mit dem/den codierten Zahlenwert/-en
    ; ...............: $fArray Rückgabe als Array (Standard), $a[0]=Anzahl oder String mit Trennzeichen
    ; ...............: $Delim Das Trennzeichen für Stringausgabe, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
    ; Return Value(s): Array/String mit den im Hex-String codierten Tageszahlen
    ; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _DecodeHexMask($sHex, $fArray=True, $sDelim=Default)
    If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
    Local $aHex = StringSplit(Hex($sHex, 8), '', 2), $iInt, $sOut = ''
    Local $aMask[8][4] = [[29,30,31],[25,26,27,28],[21,22,23,24],[17,18,19,20],[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
    For $i = 7 To 0 Step -1
    $iInt = Int('0x' & $aHex[$i])
    If $iInt = 0 Then ContinueLoop
    For $j = 0 To 3
    If BitAND($iInt, 2^$j) Then
    $sOut &= $aMask[$i][$j] & ","
    $iInt = BitXOR($iInt, 2^$j)
    EndIf
    Next
    Next
    If $fArray Then Return StringSplit(StringTrimRight($sOut, 1), ',')
    Return StringTrimRight($sOut, 1)
    EndFunc ;==>_DecodeHexMask

    [/autoit]