Inputfeld mit SetLimit - automatisch ins nächste Feld springen

  • Hallo!

    Ich habe folgende Herausfordergung: In meinem Fenster habe ich mehrere Eingabefelder, welche jeweils eine maximale Anzahl von Zeichen haben (in dem Fall 2). Ich möchte gern, dass wenn in einem Eingabefeld die zwei Zeichen eingegeben wurden, dass der Cursor automatisch in das nächste Eingabefeld springt. Könnt ihr mir bitte sagen wie das geht, bzw. wo ich das nachlesen kann? Ich bin bisher nicht fündig geworden.

    [autoit]

    $NewBox3 = GUICtrlCreateInput("", 350, 63, 20, 21)
    GUICtrlSetLimit(-1, 2) ; Um die Eingabe auf 2 Zeichen zu begrenzen
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xFFFBF0)
    $NewBox4 = GUICtrlCreateInput("", 375, 63, 20, 21)
    .....

    [/autoit]


    Vielen Dank und viele Grüße!

    Einmal editiert, zuletzt von AngryApe (28. Juli 2010 um 22:41)

  • So vielleicht?

    Spoiler anzeigen
    [autoit]

    $NewBox3 = GUICtrlCreateInput("", 350, 63, 20, 21)
    GUICtrlSetLimit(-1, 2) ; Um die Eingabe auf 2 Zeichen zu begrenzen
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xFFFBF0)
    $NewBox4 = GUICtrlCreateInput("", 375, 63, 20, 21)
    AdlibRegister("check", 500)

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

    While 1

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

    WEnd

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

    Func check()
    If StringLen(GuiCtrlRead($Newbox3)) = 2 Then
    ControlClick("Fenstertitel", "", $NewBox4)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hallo ihr beiden!

    Danke für die schnelle Antwort! Der Vorschlag von Sprenger klingt sehr interessant. Leider bin ich noch viel aam Basteln und Ausprobieren. Kannst du mir bitte erklären wie ich mit deiner Variante die Länge überprüfe und das Ereignis auslöse? Ggf. mit Code?

    Tausend Dank!

  • Danke! Ich probier jetzt mal rum ob es klappt und geb euch morgen Bescheid.

    Beste Grüße!

  • Ist das mit Send-Tab nicht kürzer? Ich der Kürze, liegt die ... ;)

    Spoiler anzeigen
    [autoit]


    $NewBox3 = GUICtrlCreateInput("", 350, 63, 20, 21)
    GUICtrlSetLimit(-1, 2) ; Um die Eingabe auf 2 Zeichen zu begrenzen
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xFFFBF0)
    $NewBox4 = GUICtrlCreateInput("", 375, 63, 20, 21)
    AdlibRegister("check", 500)

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

    While 1

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

    WEnd

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

    Func check()
    If StringLen(GuiCtrlRead($Newbox3)) = 2 Then
    Send("{TAB}") ; <---------------------------------------------------------------------------------
    EndIf
    EndFunc

    [/autoit]

    Vorausgesetzt die GUI ist ordentlich aufgebaut ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • am einfachsten gings mit einem Array in dem die Controls gespeichert sind. Am besten in der Reihenfolge in der sie verwendet werden sollen. In der While-Schleife wartest du nun darauf dass die Länge des 1. Inputs 2 wird. Dann wird eine Indexvariable um 1 erhöht. Diese Indexvariable gibt an auf welches Control der Fokus gesetzt werden soll und in welchem Control die Länge überprüft werden soll. (In dem Array)

    EDIT:

    Spoiler anzeigen
    [autoit]


    Global $aControlIDs[5] = [1,2,3,4,5] ; <-- das sind jetzt Beispielzahlen, du musst schreiben $aControlIDs[0] = GuiCtrlCreateInput(...) usw

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

    Local $iCounter = 0

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

    While 1
    If StringLen(GuiCtrlRead($aControlIDs[$iCounter])) == 2 Then
    $iCounter += 1 ; das selbe wie $iCounter = $iCounter + 1
    GUICtrlSetState($aControlIDs[$iCounter], $GUI_FOCUS)
    EndIf
    Wend

    [/autoit]
  • Vielen Dank an euch alle! Ich habe nun zuletzt versucht das Bsp. von Oetzn nachzuvollziehen. Leider will es auch nicht so recht funzen. Hier der Code:

    [autoit]

    Global $NewBox[6] = [1,2,3,4,5,6] ; <-- das sind jetzt Beispielzahlen, du musst schreiben $aControlIDs[0] = GuiCtrlCreateInput(...) usw
    Local $iCounter = 0
    While 1
    If StringLen(GuiCtrlRead($NewBox[$iCounter])) == 2 Then
    $iCounter += 1 ; das selbe wie $iCounter = $iCounter + 1
    GUICtrlSetState($NewBox[$iCounter], $GUI_FOCUS)
    EndIf
    Wend

    [/autoit]

    (Wenn ich irgend etwas mit:

    [autoit]

    Global $NewBox[6] = GUICtrlCreateInput(...)

    [/autoit]


    oder ähnliches schreibe bekomme ich immer einen Error Syntax Fehler.)

    Leider funktionieren auch die nachfolgenden Funktionen des Skriptes nicht mehr. Was hab ich alles falsch geschrieben? Und an welche Stelle im Skript muss ich es einbinden (nach EndRegion der GUI? in der GUI? oder wo?). Sorry, ich hab jetzt schon lange rumgespielt, aber egal was ich probiert habe, es hat nicht geklappt.

    Gute Nacht, bis morgen und tausend Dank!!!

  • Hallo noch einmal!

    Meinen ersten Hirnfehler scheine ich gefunden zu haben. Habe die Zeilen wie folgt abgeändert:

    [autoit]

    Global $aControlIDs[5] ; <-- das sind jetzt Beispielzahlen, du musst schreiben $aControlIDs[0] = GuiCtrlCreateInput(...) usw
    $aControlIDs[0] = "$NewBox1"
    $aControlIDs[1] = "$NewBox2"
    $aControlIDs[2] = "$NewBox3"
    $aControlIDs[3] = "$NewBox4"
    $aControlIDs[4] = "$NewBox5"

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

    Local $iCounter = 0
    While 1
    If StringLen(GuiCtrlRead($aControlIDs[$iCounter])) == 2 Then
    $iCounter += 1 ; das selbe wie $iCounter = $iCounter + 1
    GUICtrlSetState($aControlIDs[$iCounter], $GUI_FOCUS)
    EndIf
    Wend

    [/autoit]

    Inwieweit sind die in Ordnung? Und wo muss die Passage hin?

    Leider scheint es noch immer nicht ganz so funktionieren. Der Cursor springt einfach net weiter. Jemand eine Idee????

    Beste Grüße!!!

    • Offizieller Beitrag

    Hier hast du ein Beispiel:

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Dim $aInput[5]
    Local $iCounter = 0

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

    $Form1 = GUICreate("Form1", 198, 212, 192, 124)
    $aInput[0] = GUICtrlCreateInput("", 16, 16, 121, 21)
    $aInput[1] = GUICtrlCreateInput("", 16, 48, 121, 21)
    $aInput[2] = GUICtrlCreateInput("", 16, 80, 121, 21)
    $aInput[3] = GUICtrlCreateInput("", 16, 112, 121, 21)
    $aInput[4] = GUICtrlCreateInput("", 16, 144, 121, 21)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If StringLen(GUICtrlRead($aInput[$iCounter])) == 2 Then
    $iCounter += 1 ; das selbe wie $iCounter = $iCounter + 1
    GUICtrlSetState($aInput[$iCounter], $GUI_FOCUS)
    EndIf
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Hier mal ein simples Bsp., wenn das letzte Input erreicht ist springt der Fokus wieder zum ersten (kannst du natürlich auch anders handeln).

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstants.au3>

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

    Enum $In1, $In2, $In3, $In4, $In5, $In6, $iAnzahl
    Global $a[$iAnzahl]

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

    $gui = GUICreate('Test')
    $a[$In1] = GUICtrlCreateInput('', 10, 10, 40, 20)
    $a[$In2] = GUICtrlCreateInput('', 60, 10, 40, 20)
    $a[$In3] = GUICtrlCreateInput('', 110, 10, 40, 20)
    $a[$In4] = GUICtrlCreateInput('', 10, 40, 40, 20)
    $a[$In5] = GUICtrlCreateInput('', 60, 40, 40, 20)
    $a[$In6] = GUICtrlCreateInput('', 110, 40, 40, 20)

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

    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    Do
    Until GUIGetMsg() = -3

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    For $i = 0 To UBound($a) -1
    If $hWndFrom = GUICtrlGetHandle($a[$i]) Then
    Switch $iCode
    Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
    If StringLen(GUICtrlRead($a[$i])) = 2 Then
    If $i < UBound($a) -1 Then
    GUICtrlSetState($a[$i+1], $GUI_FOCUS)
    Else
    GUICtrlSetState($a[0], $GUI_FOCUS)
    EndIf
    EndIf
    EndSwitch
    EndIf
    Next
    Return 0
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Vielen Dank an alle Beteiligten!!!! Habe eine Menge gelernt und mein Problem ist gelöst. Habe das ausführliche Bsp. von Raupi genommen (welches ja dem von anderen gleich war nur ausführlicher war) und habe in der If Anweisung noch eine ...AND < 5 ... reingenommen, weil sonst eine Fehlermeldung kam, wenn in der letzten Box die 2 Zeichen eingetragen wurden.

    Also vielen Dank noch einmal an alle!!!!!!