- Offizieller Beitrag
Hi,
in letzter Zeit waren einige Fragen zur farblichen Markierung von Datums-Controls.
Ich habe daher mal das Monats-Ctrl anhand des aus Win7 bekannten Datums-Ctrl nachkodiert. Funktionalität ist identisch, nur dass ich nicht diese smoothingen Übergänge benutze.
Zusätzlich lassen sich in meinem Bsp. beliebig viele Daten farbig markieren. Entweder mit einer vordefinierten Farbe für alle Markierungen gleich oder mit Öffnen der Farbpalette zur individuellen Auswahl bei jedem Klick auf ein Tagesdatum. Ist ein Datum bereits markiert, wird die Markierung beim Klick gelöscht.
Datum der Markierung und verwendete Farbe werden in einem Dictionary Objekt gespeichert und können von dort für weitere Verwendung genutzt werden.
Edit: Noch einen Bug beim Wechsel auf die 10-Jahres Übersicht gefixt
Edit 13.06.2011: Version 1.2
- HEUTE (Tag im Monatskalender) und aktueller/zuletzt gewählter Wert (Monat im Jahreskalender, Jahr im 10-Jahreskalender, 10-Jahr-Block in 10-Jahres-Übersicht) sind rot umrahmt
- im Monatskalender am linken Rand jeder Zeile ein Blind-Label eingefügt mit ControlTip: Nummer Kalenderwoche
Edit 13.06.2011 (2): Version 1.3
- markierte Datumswerte werden mit Farbwert in einer INI gespeichert und beim Start geladen
- markierten Datumswerten können per Rechtsklick in einem Editfenster Kommentare zugeordnet werden
- die Kommentare werden in der INI beim Beenden gespeichert und beim Start wieder geladen
- da es erst beim Beenden passiert, wird ein Kommentar nicht sofort durch versehentliches Demarkieren eines Datums gelöscht
Edit 15.06.2011: Version 1.4
- statt vordefinierter Farbe oder Palette, wird eine frei konfigurierbare Liste (gefärbte Radio-Ctrl) für Kategorie+Farbe eingeblendet
- die Liste wird zur Laufzeit dynamisch gestaltet (Ctrl hinzufügen/löschen), Anpassung Fenstergröße
- Kategorien/Farben werden beim Beenden in einer INI gespeichert und beim Start neu geladen
Spoiler anzeigen
#Region - TimeStamp
; 2011-06-15 14:12:42 v 1.4
#EndRegion - TimeStamp
#include <ButtonConstants.au3>
#include <Date.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
; BugFix
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]Global $h10YearView, $h10YearCal, $hYearCal, $hMonthCal, $hComment, $hEdit, $sDateComment, $hCategory
Global $btPrev10YearView, $btNext10YearView
Global $btPrevYear, $btNextYear, $lbYear
Global $btPrevMonth, $btNextMonth, $lbMonth
Global $TodayID, $aCtrlFrame = 0
Global $iCurrMonth = @MON, $iCurrYear = @YEAR, $iCurr10Year = StringLeft($iCurrYear, 3), $iCurr10YearEnd = $iCurr10Year & 9
Global $iShowMonth = $iCurrMonth, $iShowYear = $iCurrYear, $iShow10Year = $iCurr10Year
;~ $iCurrMonth aktueller (bzw. zuletzt gewählter) Monat
;~ $iCurrYear aktuelles (bzw. zuletzt gewähltes) Jahr
;~ $iCurr10Year aktuelles (bzw. zuletzt gewähltes) Jahrzehnt (3-stellig)
;~ $iCurr10YearEnd letztes Jahr des aktuellen (bzw. zuletzt gewählten) Jahrzehnts
;~ $iShowMonth Monat für Rahmen im Jahreskalender
;~ $iShowYear Jahr für Rahmen im 10-Jahreskalender
;~ $iShow10Year Jahrzehnt für Rahmen in 10-Jahresübersicht (3-stellig)
Global $aShortMonth[12] = ['Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez']
Global $a10YearsView[24], $a10Years[12], $aMonth[12], $aDays[42], $aToolTip[6] ; [ID]
Global $oMarkedDays = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Hintergrundfarbe
Global Const $DefCol = 0xF0F0F0, $LightPink = 0xFFB6C1, $LightSkyBlue = 0x87CEEB, $LightGoldenrodYellow = 0xFAFAD2, $LightCyan = 0xE0FFFF
Global $oComment = ObjCreate("Scripting.Dictionary") ; Key=Datum (JJJJ/MM/TT), Value=Kommentar
Global $aCat[1][2] = [[0]], $yCat = 40, $sDateCat, $IndexCat
;~ Global $iChooseCol = $LightSkyBlue
Global $iSetCol, $iChooseCol = -1 ; wenn -1 wird (benutzerdefinierte, speicherbar) Palette (mit Kategorienamen)zur Farbauswahl bei Klick auf Datum geladen, sonst wird die hier definierte Farbe gesetzt
Local $x, $y
; beim Start Markierungen/Kommentare aus INI laden
Local $sINI = @ScriptDir & '\myCal.INI'
_ReadMarkedDaysFromINI($oMarkedDays, $sINI, 'marked')
_ReadMarkedDaysFromINI($oComment, $sINI, 'comment')
#region - Funktionen zu markierten Datumswerten
; Auslesen aus INI und Markierungen setzen beim Programmstart
; Rückgabe: Anzahl gelesener Markierungen
Func _ReadMarkedDaysFromINI(ByRef $oDICT, $sINI, $sSection)
Local $aSection = IniReadSection($sINI, $sSection)
If @error Then Return SetError(1)
For $i = 1 To $aSection[0][0]
$oDICT.Add($aSection[$i][0], $aSection[$i][1])
Next
Return $aSection[0][0]
EndFunc
Func _ReadCategoryFromINI($sINI)
Local $aRead = IniReadSection($sINI, 'category')
If @error Then Return
For $i = 1 To $aRead[0][0]
_CatCtrlCreate($aRead[$i][0], $aRead[$i][1])
Next
GUISetState(@SW_HIDE, $hCategory)
EndFunc
; Schreiben in INI
; Rückgabe: Return von IniWriteSection (1=Erfolg, 0=Fehler)
Func _WriteMarkedDaysToINI(ByRef $oDICT, $sINI, $sSection)
Local $aToINI = _GetMarkedDays($oDICT)
If @error Then
Return SetError(1)
ElseIf $aToINI = 0 Then
Return IniWriteSection($sINI, $sSection, '')
EndIf
Return IniWriteSection($sINI, $sSection, $aToINI)
EndFunc
; z.B. Vorbereiten zum Schreiben in INI
; mit Übergabe Datum (JJJJ/MM/TT) wird geprüft ob dieser Tag markiert, sonst Rückgabe alle markierten Datumswerte
; Rückgabe Array [['JJJJ/MM/TT', iColor]] oder Trennzeichen-String '|' (nur Datum)
; wenn Datum nicht markiert oder keine markierten Daten vorhanden ==> Rückgabe 0, Fehler 1
Func _GetMarkedDays(ByRef $oDICT, $sDate='', $fString=0)
Local $iCount = $oDICT.Count, $sRet = ''
If Not $iCount Then Return 0
If $sDate = '' Then
Local $aRet[$iCount +1][2] = [[$iCount]]
Else
If Not $oDICT.Exists($sDate) Then Return SetError(1,0,0)
Local $aRet[2][2] = [[1],[$sDate,$oDICT.Item($sDate)]]
If $fString = 1 Then Return $sDate
Return $aRet
EndIf
Local $i = 1, $strKey, $colKeys = $oDICT.Keys
For $strKey In $colKeys
$aRet[$i][0] = $strKey
$aRet[$i][1] = $oDICT.Item($strKey)
$sRet &= $strKey & '|'
$i += 1
Next
If $fString = 1 Then Return StringTrimRight($sRet, 1)
Return $aRet
EndFunc
#endregion - markierte Datumswerte
#region - Jahrzehnt Übersicht
$h10YearView = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearView)
$btPrev10YearView = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearViewEvent')
$btNext10YearView = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearViewEvent')
GUICtrlSetState(-1, $GUI_HIDE)
$x = 6
$y = 37
For $i = 0 To 23
Switch $i
Case 2, 4, 6, 10, 12, 14, 18, 20, 22
$y -= 21
$x += 47
Case 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23
$y += 21
Case 8, 16
$x = 6
$y += 22
EndSwitch
$a10YearsView[$i] = GUICtrlCreateLabel('', $x, $y, 46, 21, BitOR($ES_CENTER, $SS_CENTERIMAGE))
GUICtrlSetOnEvent(-1, '_10YearEvent')
GUICtrlSetBkColor(-1, 0xD0D0D0)
Next
#endregion - Jahrzehnt Übersicht
#region - Jahrzehntkalender
$h10YearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $h10YearCal)
$btPrev10Year = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
$lb10Year = GUICtrlCreateLabel($iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd, 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNext10Year = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_10YearCalEvent')
$x = 6
$y = -5
For $i = 0 To 11
If Not Mod($i, 4) Then
$x = 6
$y += 42
EndIf
$a10Years[$i] = GUICtrlCreateLabel($iCurr10YearEnd -10 +$i, $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
GUICtrlSetOnEvent(-1, '_YearEvent')
GUICtrlSetBkColor(-1, 0xD0D0D0)
If $i = 0 Or $i = 11 Then
GUICtrlSetState(-1, $GUI_DISABLE)
Else
GUICtrlSetState(-1, $GUI_ENABLE)
EndIf
$x += 47
Next
#endregion - Jahrzehntkalender
#region - Jahreskalender
$hYearCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hYearCal)
$btPrevYear = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
$lbYear = GUICtrlCreateLabel($iCurrYear, 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNextYear = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_YearCalEvent')
$x = 6
$y = -5
For $i = 0 To 11
If Not Mod($i, 4) Then
$x = 6
$y += 42
EndIf
$aMonth[$i] = GUICtrlCreateLabel($aShortMonth[$i], $x, $y, 46, 41, BitOR($ES_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0xD0D0D0)
GUICtrlSetOnEvent(-1, '_MonthEvent')
$x += 47
Next
#endregion - Jahreskalender
#region - Kategorie Marker
$hCategory = GUICreate('Kategorie', 200, 40, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseCategory', $hComment)
$btCat_New = GUICtrlCreateButton('Neu', 5, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatNew')
$btCat_Del = GUICtrlCreateButton('Löschen', 70, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatDel')
$btCat_Sel = GUICtrlCreateButton('Auswahl', 135, 5, 60, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetOnEvent(-1, '_CatSel')
$group = GUICtrlCreateGroup('', 5, 28, 190, 2)
GUICtrlSetBkColor(-1, 0xD0D0D0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetResizing($group, $GUI_DOCKALL)
_setCatCtrlState()
_ReadCategoryFromINI($sINI)
#endregion - Kategorie Marker
#region - Kommentarfenster
$hComment = GUICreate('Kommentar', 300, 250, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseComment', $hComment)
$hEdit = GUICtrlCreateEdit('', 5, 5, 290, 240)
#endregion
#region - Monatskalender
Local $aWDays[7] = ['Mo','Di','Mi','Do','Fr','Sa','So']
$hMonthCal = GUICreate('Kalender', 200, 171, -1, -1, -1, $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, '_end', $hMonthCal)
GUISetOnEvent($GUI_EVENT_SECONDARYUP, '_RClickMonth', $hMonthCal)
$btPrevMonth = GUICtrlCreateButton('<', 5, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
$lbMonth = GUICtrlCreateLabel('Monat Jahr', 21, 8, 158, 17, $ES_CENTER)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
GUICtrlSetColor(-1, 0x0000FF)
$btNextMonth = GUICtrlCreateButton('>', 180, 5, 15, 20)
GUICtrlSetOnEvent(-1, '_MonthCalEvent')
$x = 6
For $i = 0 To 6
GUICtrlCreateLabel($aWDays[$i], $x, 30, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0xD0D0D0)
$x += 27
Next
$x = 6
$y = 40
For $i = 0 To 41
If Not Mod($i, 7) Then
$x = 6
$y += 18
EndIf
$aDays[$i] = GUICtrlCreateLabel($i, $x, $y, 26, 17, BitOR($ES_CENTER, $SS_CENTERIMAGE))
GUICtrlSetOnEvent(-1, '_DayEvent')
$x += 27
Next
; (leere) Label für Tooltip Wochennummer
$y = 58
For $i = 0 To 5
$aToolTip[$i] = GUICtrlCreateLabel(' ', 1, $y, 5, 17)
$y += 18
Next
_setMonthView()
#endregion - Monatskalender
GUIRegisterMsg($WM_MOVE, "_WM_MOVE")
GUISetState(@SW_SHOW, $hMonthCal)
While 1
Sleep(10)
WEnd
Func _end()
; Kommentare löschen, falls Markierung gelöscht
_DeleteUnusedComments()
; beim Beenden Markierungen/Kommentare/Kategorien in INI schreiben
If $aCat[0][0] = 0 Then
IniWriteSection($sINI, 'category', '')
Else
For $i = 1 To $aCat[0][0]
$aCat[$i][0] = ControlGetText($hCategory, '', $aCat[$i][0])
Next
IniWriteSection($sINI, 'category', $aCat)
EndIf
_WriteMarkedDaysToINI($oMarkedDays, $sINI, 'marked')
_WriteMarkedDaysToINI($oComment, $sINI, 'comment')
Exit
EndFunc
Func _CloseComment()
Local $sRead = GUICtrlRead($hEdit)
If $sRead <> '' Then
$sRead = StringRegExpReplace($sRead, '\r\n', '¤')
If $oComment.Exists($sDateComment) Then
$oComment.Item($sDateComment) = $sRead
Else
$oComment.Add($sDateComment, $sRead)
EndIf
EndIf
GUICtrlSetData($hEdit, '')
GUISetState(@SW_HIDE, $hComment)
EndFunc
Func _DeleteUnusedComments()
Local $strKey, $colKeys = $oComment.Keys
For $strKey In $colKeys
If Not $oMarkedDays.Exists($strKey) Then
$oComment.Remove($strKey)
EndIf
Next
EndFunc
;======= ANZEIGEN =====
Func _show10YearView() ; wechselt von 10-Jahreskalender zu 10-Jahres-Übersicht
GUISetState(@SW_SHOW, $h10YearView)
_set10YearView()
GUISetState(@SW_HIDE, $h10YearCal)
EndFunc
Func _show10YearCal($hWndFrom) ; wechselt von Jahreskalender/10-Jahres-Übersicht zu 10-Jahreskalender
GUISetState(@SW_SHOW, $h10YearCal)
If $iCurr10Year = $iShow10Year Then
$aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
Else
_FrameAroundCtrl_Delete()
EndIf
GUISetState(@SW_HIDE, $hWndFrom)
EndFunc
Func _showYearCal($hWndFrom) ; wechselt von Monatskalender/10-Jahreskalender zu Jahreskalender
GUICtrlSetData($lbYear, $iCurrYear)
GUISetState(@SW_SHOW, $hYearCal)
_setYear()
GUISetState(@SW_HIDE, $hWndFrom)
EndFunc
Func _showMonthCal() ; wechselt von Jahreskalender zu Monatskalender
GUISetState(@SW_SHOW, $hMonthCal)
If $iCurrYear = @YEAR And $iCurrMonth = @MON Then
$aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
Else
_FrameAroundCtrl_Delete()
EndIf
GUISetState(@SW_HIDE, $hYearCal)
EndFunc
;======================
;======= ÜBERSICHT ====
Func _10YearViewEvent() ; Klick auf Control in 10-Jahres-Übersicht
GUISetState(@SW_LOCK, $h10YearView)
Switch @GUI_CtrlId
Case $btPrev10YearView
If $iCurrYear -10 < 1900 Then Return
$iCurrYear = 1900
GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
GUICtrlSetState($btNext10YearView, $GUI_SHOW)
Case $btNext10YearView
If $iCurrYear +10 > 2099 Then Return
$iCurrYear = 2099
GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
GUICtrlSetState($btNext10YearView, $GUI_HIDE)
EndSwitch
_set10YearView()
GUISetState(@SW_UNLOCK, $h10YearView)
EndFunc
Func _10YearEvent() ; Klick auf 10-Jahresbereich in 10-Jahres-Übersicht
_FrameAroundCtrl_Delete()
Local $i10Year = GUICtrlRead(@GUI_CtrlId)
If $i10Year = '' Then Return
If StringRight($i10Year, 1) = 0 Then $i10Year += 9
$iCurr10YearEnd = $i10Year
$iCurr10Year = StringLeft($i10Year, 3)
GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
_set10Year()
_show10YearCal($h10YearView)
EndFunc
Func _set10YearView() ; setze Daten in 10-Jahres-Übersicht
_FrameAroundCtrl_Delete()
Local $iSet = 2, $iFrom = 1990, $iTo = 1999, $iLoop = 2
GUICtrlSetState($btPrev10YearView, $GUI_SHOW)
GUICtrlSetState($btNext10YearView, $GUI_HIDE)
If $iCurrYear < 2010 Then
$iSet = 1
$iFrom = 1900
$iTo = 1909
GUICtrlSetState($btPrev10YearView, $GUI_HIDE)
GUICtrlSetState($btNext10YearView, $GUI_SHOW)
EndIf
If $iSet = 1 Then
GUICtrlSetData($a10YearsView[0], '')
GUICtrlSetData($a10YearsView[1], '')
Else
$iLoop = 0
GUICtrlSetData($a10YearsView[22], '')
GUICtrlSetData($a10YearsView[23], '')
EndIf
For $i = $iLoop To $iLoop +21
If Not Mod($i, 2) Then
GUICtrlSetData($a10YearsView[$i], $iFrom)
$iFrom += 10
Else
GUICtrlSetData($a10YearsView[$i], $iTo)
If StringLeft(GUICtrlRead($a10YearsView[$i]),3) = $iShow10Year Then _
$aCtrlFrame = _FrameAroundCtrl_Create($h10YearView, $a10YearsView[$i])
$iTo += 10
EndIf
Next
EndFunc
;======================
;======= 10 JAHR ======
Func _10YearCalEvent() ; Klick auf Control im 10-Jahreskalender
GUISetState(@SW_LOCK, $h10YearCal)
Switch @GUI_CtrlId
Case $btPrev10Year
If $iCurr10Year -1 < 190 Then Return
$iCurr10YearEnd -= 10
$iCurrYear -= 10
$iCurr10Year -= 1
_set10Year()
Case $btNext10Year
If $iCurr10Year +1 > 209 Then Return
$iCurr10YearEnd += 10
$iCurrYear += 10
$iCurr10Year += 1
_set10Year()
Case $lb10Year
$iShow10Year = $iCurr10Year
_show10YearView()
EndSwitch
GUISetState(@SW_UNLOCK, $h10YearCal)
EndFunc
Func _YearEvent() ; Klick auf Jahr im 10-Jahreskalender
$iCurrYear = GUICtrlRead(@GUI_CtrlId)
$iCurr10Year = StringLeft($iCurrYear, 3)
GUICtrlSetData($lbYear, $iCurrYear)
_showYearCal($h10YearCal)
EndFunc
Func _set10Year()
GUICtrlSetData($lb10Year, $iCurr10YearEnd -9 & ' - ' & $iCurr10YearEnd)
Local $iStart = $iCurr10YearEnd -10
For $i = 0 To 11
GUICtrlSetData($a10Years[$i], $iStart + $i)
Next
If $iCurrYear = $iShowYear Then
$aCtrlFrame = _FrameAroundCtrl_Create($h10YearCal, $a10Years[StringRight($iShowYear,1)+1])
Else
_FrameAroundCtrl_Delete()
EndIf
EndFunc
;======================
;======= JAHR =========
Func _YearCalEvent() ; Klick auf Controls im Jahreskalender
GUISetState(@SW_LOCK, $hYearCal)
Switch @GUI_CtrlId
Case $btPrevYear
If $iCurrYear -1 < 1900 Then Return
$iCurrYear -= 1
_setYear()
Case $btNextYear
If $iCurrYear +1 > 2099 Then Return
$iCurrYear += 1
_setYear()
Case $lbYear
$iCurrYear = GUICtrlRead($lbYear)
$iShowYear = $iCurrYear
$iShow10Year = StringLeft($iShowYear, 3)
GUICtrlSetData($lb10Year, $iCurr10Year & '0 - ' & $iCurr10YearEnd)
_set10Year()
_show10YearCal($hYearCal)
EndSwitch
GUISetState(@SW_UNLOCK, $hYearCal)
EndFunc
Func _MonthEvent() ; Klick auf Monat im Jahreskalender
Local $sMonth = GUICtrlRead(@GUI_CtrlId)
For $i = 0 To 11
If $aShortMonth[$i] = $sMonth Then
$iCurrMonth = $i +1
ExitLoop
EndIf
Next
$iShowMonth = $iCurrMonth
$iCurrYear = GUICtrlRead($lbYear)
$iShowYear = $iCurrYear
$iCurr10Year = StringLeft($iCurrYear, 3)
_setMonthView($iCurrYear, $iCurrMonth)
_showMonthCal()
EndFunc
Func _setYear()
$iCurr10Year = StringLeft($iCurrYear, 3)
$iCurr10YearEnd = $iCurr10Year & 9
GUICtrlSetData($lbYear, $iCurrYear)
If $iCurrYear = $iShowYear Then
$aCtrlFrame = _FrameAroundCtrl_Create($hYearCal, $aMonth[$iShowMonth-1])
Else
_FrameAroundCtrl_Delete()
EndIf
EndFunc
;======================
;======= MONAT ========
Func _MonthCalEvent() ; Klick auf Controls im Monatskalender
GUISetState(@SW_LOCK, $hMonthCal)
Switch @GUI_CtrlId
Case $btPrevMonth
$iCurrMonth -= 1
_setMonthView($iCurrYear, $iCurrMonth)
Case $btNextMonth
$iCurrMonth += 1
_setMonthView($iCurrYear, $iCurrMonth)
Case $lbMonth
$iShowMonth = $iCurrMonth
_showYearCal($hMonthCal)
EndSwitch
GUISetState(@SW_UNLOCK, $hMonthCal)
EndFunc
Func _DayEvent() ; Klick auf Tag im Monatskalender
$iSetCol = $iChooseCol
For $i = 0 To 41
$IndexCat = $i
If $aDays[$i] = @GUI_CtrlId Then ExitLoop
Next
Local $sFullDate = $iCurrYear & '/' & StringRight( '0' & $iCurrMonth, 2) & '/' & GUICtrlRead($aDays[$i])
$sDateCat = $sFullDate
If $oMarkedDays.Exists($sFullDate) Then
$oMarkedDays.Remove($sFullDate)
GUICtrlSetBkColor($aDays[$i], $DefCol)
Else
If $iChooseCol = -1 Then
GUISetState(@SW_SHOW, $hCategory)
Else
$oMarkedDays.Add($sFullDate, $iSetCol)
GUICtrlSetBkColor($aDays[$i],$iSetCol)
EndIf
EndIf
EndFunc
Func _setMonthView($iYear=-1, $iMonth=-1) ; setzt Monatskalender für aktuellen Monat/Jahr
Local $aLongMonth[13] = ['','Januar ','Februar ','März ','April ','Mai ','Juni ','Juli ','August ','September ','Oktober ','November ','Dezember ']
If $iYear = -1 Or IsKeyword($iYear) Then $iYear = @YEAR
If $iMonth = -1 Or IsKeyword($iMonth) Then $iMonth = @MON
If $iMonth = 0 Then
If $iCurrYear -1 < 1900 Then Return
$iCurrYear -= 1
$iCurrMonth = 12
ElseIf $iMonth = 13 Then
If $iCurrYear +1 > 2099 Then Return
$iCurrMonth = 1
$iCurrYear += 1
Else
$iCurrMonth = $iMonth
$iCurrYear = $iYear
EndIf
$iCurr10Year = StringLeft($iCurrYear, 3)
$iCurr10YearEnd = $iCurr10Year & 9
GUICtrlSetData($lbMonth, $aLongMonth[$iCurrMonth] & $iCurrYear)
_CalcDayArray()
If $iCurrYear = @YEAR And $iCurrMonth = @MON Then ; Datum HEUTE mit Rahmen
$aCtrlFrame = _FrameAroundCtrl_Create($hMonthCal, $TodayID)
Else
_FrameAroundCtrl_Delete()
EndIf
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _CalcDayArray() ; im Monatskalender Tageswerte (+ Farben, falls gesetzt) eintragen
Local $iMonthDays = _DateDaysInMonth($iCurrYear, $iCurrMonth)
Local $1stWeekDay = (_DateToDayOfWeekISO($iCurrYear, $iCurrMonth, 1) -1) *(-1)
Local $s1stFullDate = $iCurrYear & '/' & $iCurrMonth & '/01'
Local $1stWeekNum = _WeekNumberISO($iCurrYear, $iCurrMonth, '01'), $refDate, $n = 0
For $i = 0 To 5
GUICtrlSetTip($aToolTip[$i], $1stWeekNum +$i, 'Kalenderwoche', 1, 1)
Next
If $1stWeekDay <> 0 Then
For $i = $1stWeekDay To 0
If $i = 0 Then ExitLoop
$refDate = _DateAdd('D', $i, $s1stFullDate)
If $oMarkedDays.Exists($refDate) Then
GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
Else
GUICtrlSetBkColor($aDays[$n], $DefCol)
EndIf
GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
GUICtrlSetState($aDays[$n], $GUI_DISABLE)
$n += 1
Next
EndIf
For $i = 0 To $iMonthDays -1
$refDate = _DateAdd('D', $i, $s1stFullDate)
If $oMarkedDays.Exists($refDate) Then
GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
Else
GUICtrlSetBkColor($aDays[$n], $DefCol)
EndIf
GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
GUICtrlSetState($aDays[$n], $GUI_ENABLE)
If StringRight($refDate, 2) = @MDAY Then $TodayID = $aDays[$n]
$n += 1
Next
$i = $iMonthDays
While $n <= 41
$refDate = _DateAdd('D', $i, $s1stFullDate)
If $oMarkedDays.Exists($refDate) Then
GUICtrlSetBkColor($aDays[$n], $oMarkedDays.Item($refDate))
Else
GUICtrlSetBkColor($aDays[$n], $DefCol)
EndIf
GUICtrlSetData($aDays[$n], StringRight($refDate, 2))
GUICtrlSetState($aDays[$n], $GUI_DISABLE)
$i += 1
$n += 1
WEnd
EndFunc
;======================
;======= KATEGORIE ====
Func _setCatCtrlState()
If $aCat[0][0] = 0 Then
GUICtrlSetState($btCat_Del, $GUI_DISABLE)
GUICtrlSetState($btCat_Sel, $GUI_DISABLE)
Else
GUICtrlSetState($btCat_Del, $GUI_ENABLE)
GUICtrlSetState($btCat_Sel, $GUI_ENABLE)
EndIf
EndFunc
Func _CatNew()
Local $sName = InputBox('Neue Kategorie', 'Bitte Namen der Kategorie eingeben')
If $sName = '' Then Return
If $aCat[0][0] > 0 Then
For $i = 1 To $aCat[0][0]
If GUICtrlRead($aCat[$i][0]) = $sName Then Return MsgBox(0, 'Achtung!', 'Eine Kategorie mit diesem Namen' & @CRLF & 'existiert bereits!')
Next
EndIf
Local $iBkCol = _ChooseColor(2)
If $iBkCol = -1 Then Return
_CatCtrlCreate($sName, $iBkCol)
EndFunc
Func _CatCtrlCreate($sName, $iBkCol)
Local $y = $yCat
If $aCat[0][0] > 0 Then $y = $yCat + ($aCat[0][0] * 27)
ReDim $aCat[UBound($aCat) +1][2]
$aCat[0][0] += 1
Local $winPos = WinGetPos($hCategory)
WinMove($hCategory, '', $winPos[0], $winPos[1] -13, $winPos[2], $winPos[3] +27)
$aCat[UBound($aCat) -1][0] = GUICtrlCreateRadio($sName, 5, $y, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor($aCat[UBound($aCat) -1][0], $iBkCol)
$aCat[UBound($aCat) -1][1] = $iBkCol
_setCatCtrlState()
EndFunc
Func _CatDel()
Local $Index = 0
For $i = 1 To $aCat[0][0]
If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
$Index = $i
ExitLoop
EndIf
Next
If $Index = 0 Then Return
Local $CtrlPos
GUICtrlDelete($aCat[$Index][0])
Local $winPos = WinGetPos($hCategory)
For $i = $Index To $aCat[0][0] -1
$CtrlPos = ControlGetPos($hCategory, '', $aCat[$i+1][0])
$aCat[$i][0] = GUICtrlCreateRadio(ControlGetText($hCategory, '', $aCat[$i+1][0]), 5, $CtrlPos[1] -27, 190, 22, BitOR($BS_CENTER, $BS_VCENTER))
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor(-1, $aCat[$i+1][1])
$aCat[$i][1] = $aCat[$i+1][1]
GUICtrlDelete($aCat[$i+1][0])
Next
WinMove($hCategory, '', $winPos[0], $winPos[1] +13, $winPos[2], $winPos[3] -27)
$aCat[0][0] -= 1
ReDim $aCat[UBound($aCat)-1][2]
_setCatCtrlState()
EndFunc
Func _CatSel()
$iSetCol = -1
Local $Index = 0
For $i = 1 To $aCat[0][0]
If BitAND(GUICtrlRead($aCat[$i][0]), $GUI_CHECKED) Then
$Index = $i
ExitLoop
EndIf
Next
If $Index = 0 Then Return
$iSetCol = $aCat[$Index][1]
_CloseCategory()
EndFunc
Func _CloseCategory()
GUISetState(@SW_HIDE, $hCategory)
If $iSetCol <> -1 Then
$oMarkedDays.Add($sDateCat, $iSetCol)
GUICtrlSetBkColor($aDays[$IndexCat],$iSetCol)
$iSetCol = -1
EndIf
GUISetState(@SW_SHOW, $hMonthCal) ; wirkt machmal nicht
WinWaitActive($hMonthCal, '', 1)
If WinGetHandle('[ACTIVE]') <> $hMonthCal Then WinActivate($hMonthCal)
EndFunc
;======================
;======= KOMMENTAR ====
Func _RClickMonth()
Local $IDover = _GetCtrlUnderMouse()
If $IDover = 0 Or BitAND(GUICtrlGetState($IDover), $GUI_DISABLE) Then Return
$sDateComment = $iCurrYear & '/' & $iCurrMonth & '/' & GUICtrlRead($IDover)
If Not _GetMarkedDays($oMarkedDays, $sDateComment, 1) Then Return
WinSetTitle($hComment, '', 'Kommentar ' & StringRegExpReplace($sDateComment, '(\d{4})/(\d{2})/(\d{2})', '$3.$2.$1'))
If $oComment.Exists($sDateComment) Then GUICtrlSetData($hEdit, StringRegExpReplace($oComment.Item($sDateComment), '¤', @CRLF))
GUISetState(@SW_SHOW, $hComment)
EndFunc
Func _GetCtrlUnderMouse()
Local $oldOpt = Opt('MouseCoordMode', 2)
Local $Mouse = MouseGetPos(), $Ctrl, $retID = 0
For $i = 0 To 41
$Ctrl = ControlGetPos($hMonthCal, '', $aDays[$i])
If @error Then ContinueLoop
If ($Mouse[0] >= $Ctrl[0] And $Mouse[0] <= $Ctrl[0] + $Ctrl[2]) And _
($Mouse[1] >= $Ctrl[1] And $Mouse[1] <= $Ctrl[1] + $Ctrl[3]) Then
$retID = $aDays[$i]
ExitLoop
EndIf
Next
Opt('MouseCoordMode', $oldOpt)
Return $retID
EndFunc
;======================
;======= RAHMEN =======
Func _FrameAroundCtrl_Create($hWnd, $ID) ; roten Rahmen um Control zeichnen
_FrameAroundCtrl_Delete()
Local $aSize[4]
If $hWnd = $h10YearView Then ; VonJahr-BisJahr als ein Ctrl berechnen
Local $ID_start, $ID_end
If StringRight(GUICtrlRead($ID), 1) = 0 Then
$ID_start = $ID
ElseIf StringRight(GUICtrlRead($ID), 1) = 9 Then
$ID_start = $ID -1
EndIf
Local $aPos = ControlGetPos($hWnd, '', $ID_start)
$aSize[0] = $aPos[0]
$aSize[1] = $aPos[1]
$aSize[2] = $aPos[2]
$aSize[3] = 2 *$aPos[3]
Else
$aSize = ControlGetPos($hWnd, '', $ID)
EndIf
Local $aFrame[4] = [ _
GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] -1, $aSize[2] +2, 1), _ ; top
GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1] +$aSize[3], $aSize[2] +2, 1), _ ; bottom
GUICtrlCreateLabel('', $aSize[0] -1, $aSize[1], 1, $aSize[3]), _ ; left
GUICtrlCreateLabel('', $aSize[0] +$aSize[2], $aSize[1], 1, $aSize[3])] ; right
For $i = 0 To 3
GUICtrlSetBkColor($aFrame[$i], 0xFF0000)
Next
Return $aFrame
EndFunc
Func _FrameAroundCtrl_Delete() ; Rahmen löschen
If Not IsArray($aCtrlFrame) Then Return
GUISetState(@SW_LOCK, WinGetHandle('[ACTIVE]'))
For $i = 0 To 3
GUICtrlDelete($aCtrlFrame[$i])
Next
GUISetState(@SW_UNLOCK, WinGetHandle('[ACTIVE]'))
$aCtrlFrame = 0
EndFunc
;======================
Func _WM_MOVE($hWnd)
Local $pos = WinGetPos($hWnd)
Switch $hWnd
Case $h10YearView
WinMove($h10YearCal, '', $pos[0], $pos[1])
WinMove($hYearCal, '', $pos[0], $pos[1])
WinMove($hMonthCal, '', $pos[0], $pos[1])
Case $h10YearCal
WinMove($h10YearView, '', $pos[0], $pos[1])
WinMove($hYearCal, '', $pos[0], $pos[1])
WinMove($hMonthCal, '', $pos[0], $pos[1])
Case $hYearCal
WinMove($h10YearView, '', $pos[0], $pos[1])
WinMove($h10YearCal, '', $pos[0], $pos[1])
WinMove($hMonthCal, '', $pos[0], $pos[1])
Case $hMonthCal
WinMove($h10YearView, '', $pos[0], $pos[1])
WinMove($h10YearCal, '', $pos[0], $pos[1])
WinMove($hYearCal, '', $pos[0], $pos[1])
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
So sieht es jetzt aus:
[Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Mon.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Year.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_10Year.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_10YearView.png][Blockierte Grafik: http://www.imgbox.de/users/BugFix/Cal_Category.png]
DL v1.0, v1.1: 37