• 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
    [autoit]


    #include<WinAPI.au3>
    #include<ButtonConstants.au3>
    #include<EditConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include<Date.au3>

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

    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

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

    $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)

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

    $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)

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

    GUICtrlCreateLabel('.', $iPosX+72, $iPosY+2, 4, 20)
    GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, $iBgColor)

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

    $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)

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

    GUICtrlCreateLabel('.', $iPosX+96, $iPosY+2, 4, 20)
    GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, $iBgColor)

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

    $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)

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

    $aDate[3] = GUICtrlCreateButton('Ok', $iPosX+155, $iPosY, 40, 24, $BS_DEFPUSHBUTTON)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    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

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

    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

    [/autoit]

    Edit: Ich habe das Script nochmal angepasst, sodass man nun ein Datum "durchgehend" (ohne die TAB-Taste drücken zu müssen) eingeben kann.

  • Das Script funktioniert wesentlich besser und nutzerfreundlicher als das von Bugfix. :thumbup:

    Habe noch zwei Vorschläge:
    Wenn ich folgende Zeichenfolge eingebe, sollte das Script die Zahlen automatisch richtig verteilen:
    010203 (d.h. nach 2 eingegebenen Zahlen im Tag- und Monatsfeld Cursor ins nächste Feld)
    1.1.01 (d.h. mit Eingabe eines Punkts sollte der Cursor auch ins nächste Feld gesetzt werden.

  • Hi

    Wenn ich ein Datum eingegeben hab und dann nur den Tag verändern will, wird nach der Tag-Eingabe der Monat gelöscht.
    Sollte eigentlich so sein, daß der Monat erst gelöscht wird, wenn man hier eine Eingabe macht.

    Genau das gleiche, wenn man mit der Maus reinklickt: sollte erst gelöscht werden, wenn man eine Zahl drückt...

    lgE