- Offizieller Beitrag
Ich habe Bugfix's Idee mal zum Anlass genommen, eine eigene Datums-Eingabe zu programmieren.
Hier kann man sowohl mit der Maus in die Felder klicken, als auch mit der Tabtaste zwischen den Feldern hin- und herspringen.
Das Datum wird während der Eingabe auf Richtigkeit geprüft und nur wenn es korrekt ist, kann man auf [Ok] klicken.
Spoiler anzeigen
#include<WinAPI.au3>
#include<ButtonConstants.au3>
#include<EditConstants.au3>
#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include<Date.au3>
Global $sTitle = 'Datum eingeben'
GUICreate($sTitle, 320, 120)
Global $aDate[5], $iBgColor = 0xAAFFAA, $iPosX = 50, $iPosY = 50, $hStyle = BitOr($ES_CENTER, $ES_NUMBER)
Global $bCheck = 3, $sDate, $aOutDate[3], $hOld, $hFocus
$aDate[4] = GUICtrlCreateButton('&Heute', $iPosX, $iPosY, 45, 24)
[/autoit] [autoit][/autoit] [autoit]GUICtrlCreateLabel('', $iPosX+50, $iPosY, 97, 24, Default, $WS_EX_CLIENTEDGE)
GUICtrlSetState(-1, $GUI_DISABLE)
$aDate[0] = GUICtrlCreateInput('', $iPosX+52, $iPosY+2, 20, 20, $hStyle, $WS_EX_TRANSPARENT)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
GUICtrlSetLimit(-1, 2)
GUICtrlSetBkColor(-1, $iBgColor)
GUICtrlCreateLabel('.', $iPosX+72, $iPosY+2, 4, 20)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
GUICtrlSetBkColor(-1, $iBgColor)
$aDate[1] = GUICtrlCreateInput('', $iPosX+76, $iPosY+2, 20, 20, $hStyle, $WS_EX_TRANSPARENT)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
GUICtrlSetLimit(-1, 2)
GUICtrlSetBkColor(-1, $iBgColor)
GUICtrlCreateLabel('.', $iPosX+96, $iPosY+2, 4, 20)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
GUICtrlSetBkColor(-1, $iBgColor)
$aDate[2] = GUICtrlCreateInput('', $iPosX+100, $iPosY+2, 45, 20, $hStyle, $WS_EX_TRANSPARENT)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
GUICtrlSetLimit(-1, 4)
GUICtrlSetBkColor(-1, $iBgColor)
$aDate[3] = GUICtrlCreateButton('Ok', $iPosX+155, $iPosY, 40, 24, $BS_DEFPUSHBUTTON)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetState($aDate[0], $GUI_FOCUS)
[/autoit] [autoit][/autoit] [autoit]GUISetState()
GUIRegisterMsg($WM_COMMAND, 'MY_WM_COMMAND')
$hOld = $aDate[0]
Do
$msg = GUIGetMsg()
Switch $msg
Case $aDate[3]
$aOutDate[0] = StringRight('0' & GUICtrlRead($aDate[0]), 2)
$aOutDate[1] = StringRight('0' & GUICtrlRead($aDate[1]), 2)
If StringLen(GUICtrlRead($aDate[2])) < 4 Then
$aOutDate[2] = StringRight('000' & GUICtrlRead($aDate[2]), 4)
If StringMid($aOutDate[2], 1, 1) = '0' Then $aOutDate[2] = StringReplace($aOutDate[2], 1, '2')
Else
$aOutDate[2] = GUICtrlRead($aDate[2])
EndIf
$sDate = $aOutDate[0] & '.' & $aOutDate[1] & '.' & $aOutDate[2]
$sFDate = $aOutDate[2] & $aOutDate[1] & $aOutDate[0]
MsgBox(0,0, $sDate & @CRLF & @CRLF & $sFDate)
ExitLoop
Case $aDate[4]
GUICtrlSetData($aDate[0], @MDAY)
GUICtrlSetData($aDate[1], @MON)
GUICtrlSetData($aDate[2], @YEAR)
GUICtrlSetState($aDate[3], $GUI_FOCUS)
$hOld = $aDate[2]
EndSwitch
If StringLen(GUICtrlRead($aDate[0])) = 2 And $hOld = $aDate[0] Then
ControlFocus($sTitle, '', $aDate[1])
GUICtrlSetData($aDate[1], '')
$hOld = $aDate[1]
EndIf
If StringLen(GUICtrlRead($aDate[1])) = 2 And $hOld = $aDate[1] Then
ControlFocus($sTitle, '', $aDate[2])
GUICtrlSetData($aDate[2], '')
$hOld = $aDate[2]
EndIf
$hFocus = Number(_WinAPI_GetDlgCtrlID(ControlGetHandle($sTitle, '', ControlGetFocus($sTitle, ''))))
If $hFocus = $aDate[0] And $hOld <> $aDate[0] Then
$hOld = $aDate[0]
GUICtrlSetData($aDate[0], '')
EndIf
If $hFocus = $aDate[1] And $hOld <> $aDate[1] Then
$hOld = $aDate[1]
GUICtrlSetData($aDate[1], '')
EndIf
Until $msg = $GUI_EVENT_CLOSE
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
If GUICtrlRead($aDate[2]) < 1 Then
$bCheck = BitOr($bCheck, 4)
Else
$bCheck = BitAND($bCheck, 3)
EndIf
If GUICtrlRead($aDate[1]) > 12 Or GUICtrlRead($aDate[1]) < 1 Then
$bCheck = BitOr($bCheck, 2)
Else
$bCheck = BitAND($bCheck, 5)
EndIf
If StringInStr('04060911', StringRight('00' & GUICtrlRead($aDate[1]), 2)) And GUICtrlRead($aDate[0]) > 30 Then
$bCheck = BitOR($bCheck, 1)
ElseIf GUICtrlRead($aDate[0]) > 31 Or GUICtrlRead($aDate[0]) < 1 Then
$bCheck = BitOR($bCheck, 1)
ElseIf StringRight('00' & GUICtrlRead($aDate[1]), 2) = '02' And GUICtrlRead($aDate[0]) > (28 + _DateIsLeapYear(GUICtrlRead($aDate[2]))) Then
$bCheck = BitOR($bCheck, 1)
Else
$bCheck = BitAND($bCheck, 6)
EndIf
If $bCheck Then
GUICtrlSetState($aDate[3], $GUI_DISABLE)
Else
GUICtrlSetState($aDate[3], $GUI_ENABLE)
EndIf
EndFunc ;==>MY_WM_COMMAND
Edit: Ich habe das Script nochmal angepasst, sodass man nun ein Datum "durchgehend" (ohne die TAB-Taste drücken zu müssen) eingeben kann.