- Offizieller Beitrag
Hi,
wenn man in einem Monatskalender (GUICtrlCreateMonthCal) Tage fett markieren möchte (erfordert Style: $MCS_DAYSTATE) ist es erforderlich, die Tage zu maskieren.
Mit der folgenden Funktion wird das erledigt. Einfach einen String mit den zu markierenden Tagen übergeben (braucht nicht in Reihenfolge zu sein) und die Maske als Hexstring wird zurückgegeben.
Trennzeichen ist standardmäßig das per Opt('GUIDataSeparatorChar') festgelegte Zeichen.
Markiert wird mit _GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks).
Edit:
Übergabe nun als trennzeichenbasierter String oder als Array möglich.
Edit 12.08.2011
Da sich diese Funktion nicht nur für _GUICtrlMonthCal_SetDayState verwenden läßt, sondern generell, wenn innerhalb eines Monats Markierungen für verschiedene Tage gesetzt werden sollen, habe ich jetzt mal noch die Gegenfunktion zum Auslesen der markierten Tage erstellt.
Die Funktionen sind also:
_GetHexMask($vDays [, $Delim=Default])
Codiert die übergebenen Tageszahlen (1-31) als Hex-String, wie er als Maske zum Markieren mit _GUICtrlMonthCal_SetDayState im MonthCal Anwendung findet
_DecodeHexMask($sHex [, $fArray=True[, $Delim=Default]])
Gibt die mit _GetHexMask() codierten Tageszahlen (1-31) als Array (Standard) oder Trennzeichenstring zurück
Days2HexMask.au3
Local $aDays[6] = [10,12,13,23,25,31]
$sHex1 = _GetHexMask($aDays)
ConsoleWrite('--@@Line[' & @ScriptLineNumber -1 & '] Debug_Var >> $sHex1 >>' & $sHex1 & @CRLF) ;### DebugToConsole
$sHex2 = _GetHexMask('1|5|7|22|30|31')
ConsoleWrite('--@@Line[' & @ScriptLineNumber -1 & '] Debug_Var >> $sHex2 >>' & $sHex2 & @CRLF) ;### DebugToConsole
$sRet = _DecodeHexMask($sHex1, False)
ConsoleWrite($sRet & @CRLF)
$sRet = _DecodeHexMask($sHex2, False)
ConsoleWrite($sRet & @CRLF)
$aRet = _DecodeHexMask($sHex1)
_ArrayDisplay($aRet)
;===============================================================================
; 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] += 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
;===============================================================================
; 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