Erfassungsmaske - Springen zwischen den Inputfeldern per Enter-Taste

  • Hey,

    ich habe hier ein Programm bei dem Daten von Hand (Orginal in Papierform, eintippen ist also immer erfoderlich) eingegeben werden.
    Es handelt sich dabei ausschließlich um Zahlen, deshalb wird der Nummernblock verwendet.
    Zwischen den Inputfeldern soll mit der Num-Enter Taste gewechselt werden (nicht verhandelbar, da angelehnt an eine andere Software).

    Jedes Input soll nach der Eingabe geprüft werden, manche Inputs wieder geleert werden manche nicht.

    Hier das Beispiel zum Ausprobieren:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <Guilistview.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 438, 192, 132)
    $ListView1 = GUICtrlCreateListView("Input1|Input2|Input3|Input4", 16, 16, 601, 265)
    Global $hLVHandle = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Input1", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Input2", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Input3", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Input4", 130, 0)
    $Input1 = GUICtrlCreateInput("", 16, 320, 129, 24)
    $Input2 = GUICtrlCreateInput("", 168, 320, 129, 24)
    $Input3 = GUICtrlCreateInput("", 328, 320, 137, 24)
    $Input4 = GUICtrlCreateInput("", 496, 320, 121, 24)

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

    $button = GUICtrlCreateButton("ADD", 250, 350, 100, 50)

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

    Global $hCM = GUICtrlCreateContextMenu($ListView1) ; ein Kontextmenü für das Listview erstellen
    Global $hCMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $hCM) ; der 3. Kontextmenüeint

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    _NewItem()
    Case $hCMDel
    _GUICtrlListView_DeleteItemsSelected($hLVHandle)
    EndSwitch
    WEnd

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

    Func _TestInput1()
    Local $read = GUICtrlRead($Input1)
    If StringLen($read) > 1 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input1, $GUI_FOCUS)
    Else
    GUICtrlSetData($Input1, "")
    GUICtrlSetState($Input2, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput1

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

    Func _TestInput2()
    Local $read = GUICtrlRead($Input2)
    If StringLen($read) > 2 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input2, $GUI_FOCUS)
    Else
    GUICtrlSetData($Input2, "")
    GUICtrlSetState($Input3, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput2

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

    Func _TestInput3()
    Local $read = GUICtrlRead($Input3)
    If StringLen($read) > 3 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input3, $GUI_FOCUS)
    Else
    GUICtrlSetState($Input4, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput3

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

    Func _TestInput4()
    _NewItem()
    GUICtrlSetState($Input1, $GUI_FOCUS)
    EndFunc ;==>_TestInput4

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

    Func _NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    GUICtrlCreateListViewItem(GUICtrlRead($Input1) & "|" & GUICtrlRead($Input2) & "|" & GUICtrlRead($Input3) & "|" & GUICtrlRead($Input4), $ListView1)
    EndFunc ;==>_NewItem

    [/autoit]

    Möglichkeiten gib es viele, ich möchte hier jetzt mal keine eigenen Versuche posten um den kreativen Denkprozess nicht zu verhindern. Bis jetzt hatte jede Variante so ihre Nachteile und daher möchte ich noch weitere Meinungen zu diesem Problem einholen.
    Also, wie würdet ihr es machen?
    Danke schonmal für die Anregungen.

    Gruß Nuts

    Einmal editiert, zuletzt von nuts (9. Dezember 2009 um 15:04)

  • Spoiler anzeigen
    [autoit]

    #cs **************************************************************************

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

    Erfassungsmaske - Springen zwischen den Inputfeldern per Enter-Taste

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

    http://www.autoit.de/index.php?page…4634#post124634

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

    #ce **************************************************************************

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <Guilistview.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 438, 192, 132)
    $ListView1 = GUICtrlCreateListView("Input1|Input2|Input3|Input4", 16, 16, 601, 265)
    Global $hLVHandle = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Input1", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Input2", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Input3", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Input4", 130, 0)
    $Input1 = GUICtrlCreateInput("", 16, 320, 129, 24)
    $Input2 = GUICtrlCreateInput("", 168, 320, 129, 24)
    $Input3 = GUICtrlCreateInput("", 328, 320, 137, 24)
    $Input4 = GUICtrlCreateInput("", 496, 320, 121, 24)

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")

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

    $button = GUICtrlCreateButton("ADD", 250, 350, 100, 50)

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

    Global $hCM = GUICtrlCreateContextMenu($ListView1) ; ein Kontextmenü für das Listview erstellen
    Global $hCMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $hCM) ; der 3. Kontextmenüeint

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    _NewItem()
    Case $hCMDel
    _GUICtrlListView_DeleteItemsSelected($hLVHandle)
    EndSwitch
    WEnd

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitAND($wParam, 0x0000FFFF)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam
    If $nID = 1 Then
    Switch ControlGetFocus("Form1")
    Case "Edit1"
    GUICtrlSetState($Input2, $gui_focus)
    Case "Edit2"
    GUICtrlSetState($Input3, $gui_focus)
    Case "Edit3"
    GUICtrlSetState($Input4, $gui_focus)
    Case "Edit4"
    GUICtrlSetState($button, $gui_focus)
    EndSwitch
    EndIf
    EndFunc ;==>MY_WM_COMMAND

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

    Func _NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    GUICtrlCreateListViewItem(GUICtrlRead($Input1) & "|" & GUICtrlRead($Input2) & "|" & GUICtrlRead($Input3) & "|" & GUICtrlRead($Input4), $ListView1)
    GUICtrlSetState($Input1, $gui_focus)
    EndFunc ;==>_NewItem

    [/autoit]
  • Geht das nicht einfach mit HotKeySet?


    Natürlich, bei einem komplexen Programm ist es aber "schwieriger" umzusetzen.
    Sobald keines der Inputfelder (deren Anzahl dynamisch ist) den Fokus hat muss der Hotkey wieder entfernt werden.
    Vielleicht fehlt mir auch nur die Kreativität ein gutes Konzept mit Hotkeyset aufzustellen. Darum auch der Thread :)

    edit \ Das von Funkey ist schon nicht schlecht. Verwende im moment etwas ähnliches mit _WinAPI_GetFocus, was einige "Nebenwirkungen" (unerwünschte Funktionsaufrufe) hat.
    Ich teste die Variante mal im Hauptprogramm und berichte dann.
    Weitere Vorschläge wären trotzdem super ;)

    Einmal editiert, zuletzt von nuts (4. Dezember 2009 um 14:12)

  • Oder so. Verwendet ein Dummy-Field in der GUI:

    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <Guilistview.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #AutoIt3Wrapper_Run_Debug_Mode=n

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 438, 192, 132)
    $ListView1 = GUICtrlCreateListView("Input1|Input2|Input3|Input4", 16, 16, 601, 265)
    Global $hLVHandle = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Input1", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Input2", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Input3", 130, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Input4", 130, 0)
    $Input1 = GUICtrlCreateInput("", 16, 320, 129, 24)
    GUICtrlSetState(-1, $GUI_FOCUS)
    $Input2 = GUICtrlCreateInput("", 168, 320, 129, 24)
    $Input3 = GUICtrlCreateInput("", 328, 320, 137, 24)
    $Input4 = GUICtrlCreateInput("", 496, 320, 121, 24)

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

    $button = GUICtrlCreateButton("ADD", 250, 350, 100, 50)

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

    Global $hCM = GUICtrlCreateContextMenu($ListView1) ; ein Kontextmenü für das Listview erstellen
    Global $hCMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $hCM) ; der 3. Kontextmenüeint

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

    Global $hEnter = GUICtrlCreateDummy()

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; Set accelerators for ENTER
    Global $asAccelKeys[1][2] = [["{ENTER}", $hEnter]]
    GUISetAccelerators($asAccelKeys)

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

    ;$dll = DllOpen("user32.dll")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hEnter
    Switch ControlGetFocus("Form1")
    Case "Edit1"
    GUICtrlSetState($Input2,$GUI_FOCUS)
    Case "Edit2"
    GUICtrlSetState($Input3,$GUI_FOCUS)
    Case "Edit3"
    GUICtrlSetState($Input4,$GUI_FOCUS)
    Case "Edit4"
    GUICtrlSetState($Input1,$GUI_FOCUS)
    _NewItem()
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Input2,"")
    GUICtrlSetData($Input3,"")
    GUICtrlSetData($Input4,"")
    EndSwitch
    Case $button
    _NewItem()
    Case $hCMDel
    _GUICtrlListView_DeleteItemsSelected($hLVHandle)
    EndSwitch
    ;Sleep(250)
    WEnd

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

    Func _TestInput1()
    Local $read = GUICtrlRead($Input1)
    If StringLen($read) > 1 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input1, $GUI_FOCUS)
    Else
    GUICtrlSetData($Input1, "")
    GUICtrlSetState($Input2, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput1

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

    Func _TestInput2()
    Local $read = GUICtrlRead($Input2)
    If StringLen($read) > 2 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input2, $GUI_FOCUS)
    Else
    GUICtrlSetData($Input2, "")
    GUICtrlSetState($Input3, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput2

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

    Func _TestInput3()
    Local $read = GUICtrlRead($Input3)
    If StringLen($read) > 3 Then
    MsgBox(1, "", "Ungültige Eingabe")
    GUICtrlSetState($Input3, $GUI_FOCUS)
    Else
    GUICtrlSetState($Input4, $GUI_FOCUS)
    EndIf
    EndFunc ;==>_TestInput3

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

    Func _TestInput4()
    _NewItem()
    GUICtrlSetState($Input1, $GUI_FOCUS)
    EndFunc ;==>_TestInput4

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

    Func _NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    GUICtrlCreateListViewItem(GUICtrlRead($Input1) & "|" & GUICtrlRead($Input2) & "|" & GUICtrlRead($Input3) & "|" & GUICtrlRead($Input4), $ListView1)
    EndFunc ;==>_NewItem

    [/autoit][autoit][/autoit][autoit][/autoit]
  • So wollte noch kurz ein Feedback geben. Die Methode von Funkey hat jetzt den Alltagstest bestanden und wird weiterhin verwendet.
    Eine Frage dazu: Wie wurde der abgefeuerte Wert für "Enter" ermittelt (Zeile 53 im Bsp.)?

    water: Bei deiner Variante sind mir auch keine "Nebenwirkungen" aufgefallen, WM_Command war mir aber lieber.

  • So mach ich das eigentlich auch, nur kam in diesem Fall nur Unsinn raus. ?(
    Muss genauer untersucht werden, aber okay läuft ja erstmal - danke dir. :thumbup:

    edit \ So nochmal: Die Nachricht "Enter wurde gedrückt" kommt gar nicht vom Input Control richtig (sondern vom Fenster?)?

    Einmal editiert, zuletzt von nuts (9. Dezember 2009 um 16:52)

  • Ich denke du hast recht! In $nID sollte ja die ControlID sein, aber ich erhalte da keine ID. Und bei $nNotificationCode kommt auch Blödsinn raus. Ich habe nur gesehen, dass ich bei einem Enter in $nID eine 1 erhalte. Woher war mir egal, da es ja funktionierte, schöner wäre es natürlich gewesen, wenn es wie gewohnt funktioniert hätte, aber egal (zumindest mir).