Uhrzeit für Inputfeld

  • Hi,
    Ich möchte eine GUI erstellen in der man in einem Inputfeld die Uhrzeit eintragen kann.
    Bedingungen:
    1. Man darf NUR gültige ZAHLEN eintragen können
    2. Es muss automatisch nach der 2. eingabe ein ":" gesetzt werden z.b. man gibt 1205 ein und der inputtext wird zu 12:05
    ABER: wenn man z.b die eingabe löscht und dann soll aus "12:" "1" werden (bei 1maligem betätigen der Löschentaste)

    Mein ansatz funktioniert nicht wirklich :S

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    $Frm = GUICreate("Input Filter", 300, 30, -1, -1)
    Global $INPUT = GUICtrlCreateInput("", 5, 5, 290,21,0x2000)
    ; to select a specific default format
    $DTM_SETFORMAT_ = 0x1032
    $style = "hh:nn"
    GUICtrlSendMsg($INPUT, $DTM_SETFORMAT_, 0, $style)
    GUISetState(@SW_SHOW)
    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    $read=GUICtrlRead($INPUT)
    If StringLen($read)=2 And IsNumber(Int(StringMid($read,2,1)))=True then
    GUICtrlSetData($INPUT,GUICtrlRead($INPUT)&":")
    EndIf
    If StringInStr(StringLeft($read,2),":")=True Then
    GUICtrlSetData($INPUT,StringTrimRight($INPUT,1))
    EndIf
    WEnd
    MsgBox(0, "Time", GUICtrlRead($INPUT))

    [/autoit]


    ich hoffe man versteht worauf ich hinauswill ^^

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • hier mal ein Ansatz zum Basteln...

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    $Frm = GUICreate("Input Filter", 300, 30, -1, -1)
    Global $INPUT = GUICtrlCreateInput("", 5, 5, 290,21,0x2000)
    ; to select a specific default format
    $DTM_SETFORMAT_ = 0x1032
    $style = "hh:nn"
    GUICtrlSendMsg($INPUT, $DTM_SETFORMAT_, 0, $style)
    GUISetState(@SW_SHOW)
    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    $inhalt_pur=StringReplace(StringReplace(GUICtrlRead($INPUT), " ", ""), ":", "")
    Switch StringLen($inhalt_pur)
    Case 1
    Switch $inhalt_pur
    Case 1 To 2
    GUICtrlSetData($INPUT, $inhalt_pur & " :")
    Send("{LEFT 2}")
    Case 3 To 9
    GUICtrlSetData($INPUT, "0" & $inhalt_pur & ":")
    EndSwitch
    Case 2
    Switch $inhalt_pur
    Case 0 To 23
    GUICtrlSetData($INPUT, $inhalt_pur & ":")
    Case Else
    GUICtrlSetData($INPUT, "")
    GUICtrlSetState($INPUT, $GUI_FOCUS)
    EndSwitch
    Case 3
    Switch StringRight($inhalt_pur, 1)
    Case 0 To 5
    GUICtrlSetData($INPUT, StringLeft($inhalt_pur, 2) & ":" & StringRight($inhalt_pur, 1))
    Case Else
    GUICtrlSetData($INPUT, StringLeft($inhalt_pur, 2) & ":")
    EndSwitch
    EndSwitch
    WEnd
    MsgBox(0, "Time", GUICtrlRead($INPUT))

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Danke für den Ansatz (muss ich mir im Detail nochmal angucken wodran es liegt)
    Derzeit FAST nur reguläre eingaben möglich:
    "03:5999999999999" ist auch möglich :S (kann man bestimmt mit der begrenzung an zeichen fixen)
    (das bekomme ich noch hin :P)
    aber warum flackert die GUI so?
    kann man das irgendwie verhindern?
    wenn man z.b. "3" eingibt dann steht da "03:" (ist ja richtig)
    aber der curser bewegt sich schnell und flackert..
    bei einer vollständigen uhrzeit scheints zu funzen.

    PS: Diese GUI ist nur ein ausschnitt damits nicht zu unübersichtlich ist
    kann man diese methode in punkto Performance noch verbessern? (die "richtige" GUI wird etwas umfangreicher)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • ich selber hatte das etwas aufwendiger gelöst.
    Ich hatte das Inputfeld über WM_COMMAND abgefragt und dann eine Funktion zeit_prüfen() aufgerufen.
    Damit wurde an der Inputbox nur etwas geändert, wenn man auch eine Eingabe machte oder Tab drückte, etc
    So unterbindet man das flackern.
    Im Moment wird das Input ja ständig über die While-Schleife neu mit Daten "befüllt", daher das flackern

    Da ich das in einem komplexeren Zusammenhang mal geproggt hatte,
    habe ich ja auch geschrieben das das ein Ansatz sein soll und keine Endlösung :)

    Edit:
    mal ein Ansatz... ohne flackern und begrenzt auf Länge der Uhrzeit

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    $Frm = GUICreate("Input Filter", 300, 30, -1, -1)
    Global $INPUT = GUICtrlCreateInput("", 5, 5, 290,21,0x2000)
    GUICtrlSetLimit(-1, 5)
    Global $INPUT_ALT = ""
    ; to select a specific default format
    $DTM_SETFORMAT_ = 0x1032
    $style = "hh:nn"
    GUICtrlSendMsg($INPUT, $DTM_SETFORMAT_, 0, $style)
    GUISetState(@SW_SHOW)
    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    If $INPUT_ALT <> GUICtrlRead($INPUT) Then
    $INPUT_ALT = GUICtrlRead($INPUT)
    $inhalt_pur=StringReplace(StringReplace(GUICtrlRead($INPUT), " ", ""), ":", "")
    Switch StringLen($inhalt_pur)
    Case 1
    Switch $inhalt_pur
    Case 1 To 2
    GUICtrlSetData($INPUT, $inhalt_pur & " :")
    Send("{LEFT 2}")
    Case 3 To 9
    GUICtrlSetData($INPUT, "0" & $inhalt_pur & ":")
    EndSwitch
    Case 2
    Switch $inhalt_pur
    Case 0 To 23
    GUICtrlSetData($INPUT, $inhalt_pur & ":")
    Case Else
    GUICtrlSetData($INPUT, "")
    GUICtrlSetState($INPUT, $GUI_FOCUS)
    EndSwitch
    Case 3
    Switch StringRight($inhalt_pur, 1)
    Case 0 To 5
    GUICtrlSetData($INPUT, StringLeft($inhalt_pur, 2) & ":" & StringRight($inhalt_pur, 1))
    Case Else
    GUICtrlSetData($INPUT, StringLeft($inhalt_pur, 2) & ":")
    EndSwitch
    EndSwitch
    EndIf

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

    WEnd
    MsgBox(0, "Time", GUICtrlRead($INPUT))

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

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)