Eingabefelder per Mausklick aktivieren

  • Hallo,
    ich habe eine GUI erstellt und möchte per Mausklick die Eingabefelder aktivieren und nach der Eingabe mit der Entertaste in das nächste Feld kommen. Meine GUI ist eigentlich etwas umfangreicher als hier unten angegeben, dort macht es schon Sinn mit der Maus zu navigieren. Ich weiß, dass man man mit der Tab-taste auch navigieren kann, aber bei mehreren Feldern ist es besser mit der Maus zu navigieren.
    Für eure Vorschläge wäre ich euch dankbar.

    Spoiler anzeigen


    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>

    Global $Auslesen
    Global $Beenden
    Global $VORNAME
    Global $NACHNAME
    Global $STADT
    Global $CUST_SN
    Global $NAME1
    Global $NAME2
    Global $CITY
    Global $iFocus

    ; MAIN PROGRAM
    HotKeySet ( "{ESC}", Terminate )
    Create_GUI()
    CUSTOMER()

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Auslesen
    $NAME1 = GUICtrlRead($VORNAME)
    $NAME2 = GUICtrlRead($NACHNAME)
    $CITY = GUICtrlRead($STADT)
    MsgBox(0, "IHRE EINGABEN", "Vorname: " & $NAME1 & @CRLF & "Nachname: " & $NAME2 & @CRLF & "Stadt: " & $CITY)
    Case $Beenden
    Terminate()
    EndSwitch
    WEnd

    Func Create_GUI()
    $handle1 = GUICreate("GUI",580,290,-1,-1) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0xFFFAFA) ; Snow
    GUISetFont(20, 400, -1)
    GUICtrlSetColor(-1,0x4169E1); RoyalBlue
    GUICtrlCreateLabel("My GUI", 150, 20, 320, 100, 0x01)
    GUICtrlSetColor(-1,0x4169E1); RoyalBlue
    GUISetFont(8, 400, -1)
    GUISetFont(12, 400, -1)
    EndFunc ;=> Create_GUI

    Func CUSTOMER()
    Local $msg
    GUICtrlCreateLabel("Vorname: ", 25, 100, 300, 25)
    $VORNAME = GUICtrlCreateInput("", 185, 100, 300, 25)
    GUICtrlCreateLabel("Nachname: ", 25, 140, 300, 25)
    $NACHNAME =GUICtrlCreateInput("", 185, 140, 300, 25)
    GUICtrlCreateLabel("Stadt: ", 25, 180, 300, 25)
    $STADT =GUICtrlCreateInput("", 185, 180, 300, 25)
    $Auslesen = GUICtrlCreateButton("Daten übernehmen", 180, 240, 150, 30) ;480, 140, 40, 25
    $Beenden = GUICtrlCreateButton("Beenden", 350, 240, 150, 30) ;480, 140, 40, 25
    GUISetState()
    $iFocus = $VORNAME ;Standard
    GUICtrlSetState($iFocus, $GUI_FOCUS) ; setzt den Cursor in das erste Feld.
    $msg = 0
    EndFunc ;==>CUSTOMER

    Func Terminate()
    Exit
    EndFunc ;=> Terminate

    • Offizieller Beitrag

    Da ich gerade mal Lust hatte, wieder mal ein wenig zu scripten:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled

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

    Global $Auslesen
    Global $Beenden
    Global $VORNAME
    Global $NACHNAME
    Global $STADT
    Global $CUST_SN
    Global $NAME1
    Global $NAME2
    Global $CITY
    Global $iFocus

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

    ; MAIN PROGRAM
    $handle1 = GUICreate("GUI", 580, 290, -1, -1) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0xFFFAFA) ; Snow
    GUISetFont(20, 400, -1)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUICtrlCreateLabel("My GUI", 150, 20, 320, 100, 0x01)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUISetFont(8, 400, -1)
    GUISetFont(12, 400, -1)
    GUICtrlCreateLabel("Vorname: ", 25, 100, 300, 25)
    $VORNAME = GUICtrlCreateInput("", 185, 100, 300, 25)
    GUICtrlCreateLabel("Nachname: ", 25, 140, 300, 25)
    $NACHNAME = GUICtrlCreateInput("", 185, 140, 300, 25)
    GUICtrlCreateLabel("Stadt: ", 25, 180, 300, 25)
    $STADT = GUICtrlCreateInput("", 185, 180, 300, 25)
    $Auslesen = GUICtrlCreateButton("Daten übernehmen", 180, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Auslesen")
    $Beenden = GUICtrlCreateButton("Beenden", 350, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Terminate")
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "Mausdown")
    $retdummy = GUICtrlCreateDummy(); Dummy für das Afangen von Enter
    GUICtrlSetOnEvent(-1, "Enterkey")
    $Exit = GUICtrlCreateDummy();Dummy für die Taste ESC
    GUICtrlSetOnEvent(-1, "Terminate")
    Local $AccelKeys[2][2] = [["{ENTER}", $retdummy],["{ESC}", $Exit]]; Accelerators für Enter und ESC verknüpft mit den Dummycontrols
    GUISetAccelerators($AccelKeys)
    GUISetState()
    $iFocus = $VORNAME ;Standard
    GUICtrlSetState($iFocus, $GUI_FOCUS) ; setzt den Cursor in das erste Feld.

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

    While 1
    WEnd

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

    Func Auslesen()
    $NAME1 = GUICtrlRead($VORNAME)
    $NAME2 = GUICtrlRead($NACHNAME)
    $CITY = GUICtrlRead($STADT)
    MsgBox(0, "IHRE EINGABEN", "Vorname: " & $NAME1 & @CRLF & "Nachname: " & $NAME2 & @CRLF & "Stadt: " & $CITY)
    EndFunc ;==>Auslesen

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

    Func Mausdown()
    Local $pos = GUIGetCursorInfo($handle1)
    If IsArray($pos) Then
    Switch $pos[4]
    Case $VORNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $NACHNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $STADT
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    EndSwitch
    EndIf
    EndFunc ;==>Mausdown

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

    Func Enterkey()
    Local $pos = ControlGetFocus($handle1)

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

    Switch $pos
    Case "Edit1"; !.Input
    GUICtrlSetState($NACHNAME, $GUI_FOCUS)
    Case "Edit2"; 2.Input
    GUICtrlSetState($STADT, $GUI_FOCUS)
    Case "Edit3";3. Inpout
    GUICtrlSetState($VORNAME, $GUI_FOCUS)
    EndSwitch
    EndFunc ;==>Enterkey

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

    Func Terminate()
    Exit
    EndFunc ;==>Terminate

    [/autoit]

    Das Beispiel läuft im OnEventMode und ich habe die GUI aus der Funktion entfernt.
    Wie gewünscht erhällt das geklickte Input den Fokus.Nach Return wird das nächste Input angewählt. HotKeySet hab ich entfernt und in die Acceleratoren gepackt.
    Edit: Ich hoffe du hast keine Probleme mit dem OnEventMode, sonst müßte das ganze umgeschrieben werden.


    Edit2: Da mir gerade danach ist, hier das ganze im MessageLoop Mode:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",0) ;0=disabled, 1=OnEvent mode enabled

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

    Global $Auslesen
    Global $Beenden
    Global $VORNAME
    Global $NACHNAME
    Global $STADT
    Global $CUST_SN
    Global $NAME1
    Global $NAME2
    Global $CITY
    Global $iFocus

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

    ; MAIN PROGRAM
    $handle1 = GUICreate("GUI", 580, 290, -1, -1) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0xFFFAFA) ; Snow
    GUISetFont(20, 400, -1)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUICtrlCreateLabel("My GUI", 150, 20, 320, 100, 0x01)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUISetFont(8, 400, -1)
    GUISetFont(12, 400, -1)
    GUICtrlCreateLabel("Vorname: ", 25, 100, 300, 25)
    $VORNAME = GUICtrlCreateInput("", 185, 100, 300, 25)
    GUICtrlCreateLabel("Nachname: ", 25, 140, 300, 25)
    $NACHNAME = GUICtrlCreateInput("", 185, 140, 300, 25)
    GUICtrlCreateLabel("Stadt: ", 25, 180, 300, 25)
    $STADT = GUICtrlCreateInput("", 185, 180, 300, 25)
    $Auslesen = GUICtrlCreateButton("Daten übernehmen", 180, 240, 150, 30) ;480, 140, 40, 25
    $Beenden = GUICtrlCreateButton("Beenden", 350, 240, 150, 30) ;480, 140, 40, 25
    $retdummy = GUICtrlCreateDummy(); Dummy für das Afangen von Enter
    $Exit = GUICtrlCreateDummy();Dummy für die Taste ESC
    Local $AccelKeys[2][2] = [["{ENTER}", $retdummy],["{ESC}", $Exit]]; Accelerators für Enter und ESC verknüpft mit den Dummycontrols
    GUISetAccelerators($AccelKeys)
    GUISetState()
    $iFocus = $VORNAME ;Standard
    GUICtrlSetState($iFocus, $GUI_FOCUS) ; setzt den Cursor in das erste Feld.

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $Auslesen
    $NAME1 = GUICtrlRead($VORNAME)
    $NAME2 = GUICtrlRead($NACHNAME)
    $CITY = GUICtrlRead($STADT)
    MsgBox(0, "IHRE EINGABEN", "Vorname: " & $NAME1 & @CRLF & "Nachname: " & $NAME2 & @CRLF & "Stadt: " & $CITY)
    Case $Beenden, $GUI_EVENT_CLOSE, $Exit
    Exit
    Case $retdummy
    Local $pos = ControlGetFocus($handle1)

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

    Switch $pos
    Case "Edit1"; !.Input
    GUICtrlSetState($NACHNAME, $GUI_FOCUS)
    Case "Edit2"; 2.Input
    GUICtrlSetState($STADT, $GUI_FOCUS)
    Case "Edit3";3. Inpout
    GUICtrlSetState($VORNAME, $GUI_FOCUS)
    EndSwitch
    Case $GUI_EVENT_PRIMARYDOWN
    Local $pos = GUIGetCursorInfo($handle1)
    If IsArray($pos) Then
    Switch $pos[4]
    Case $VORNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $NACHNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $STADT
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    EndSwitch
    EndIf
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Was feht ist, das er nach Stadt noch auf Daten übernehmen geht und wenn man dann Enter drückt, die Daten übernommen werden und nach einen dann weiteren Enter, man wieder von vorne anfangen kann.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag
    Zitat

    Was feht ist, das er nach Stadt noch auf Daten übernehmen geht und wenn man dann Enter drückt, die Daten übernommen werden und nach einen dann weiteren Enter, man wieder von vorne anfangen kann.

    Sind nur ein Paar Zeilen Code mehr. :D

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled
    Global $Auslesen
    Global $Beenden
    Global $VORNAME
    Global $NACHNAME
    Global $STADT
    Global $CUST_SN
    Global $NAME1
    Global $NAME2
    Global $CITY
    Global $iFocus
    ; MAIN PROGRAM
    $handle1 = GUICreate("GUI", 580, 290, -1, -1) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0xFFFAFA) ; Snow
    GUISetFont(20, 400, -1)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUICtrlCreateLabel("My GUI", 150, 20, 320, 100, 0x01)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUISetFont(8, 400, -1)
    GUISetFont(12, 400, -1)
    GUICtrlCreateLabel("Vorname: ", 25, 100, 300, 25)
    $VORNAME = GUICtrlCreateInput("", 185, 100, 300, 25)
    GUICtrlCreateLabel("Nachname: ", 25, 140, 300, 25)
    $NACHNAME = GUICtrlCreateInput("", 185, 140, 300, 25)
    GUICtrlCreateLabel("Stadt: ", 25, 180, 300, 25)
    $STADT = GUICtrlCreateInput("", 185, 180, 300, 25)
    $Auslesen = GUICtrlCreateButton("Daten übernehmen", 180, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Auslesen")
    $Beenden = GUICtrlCreateButton("Beenden", 350, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Terminate")
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "Mausdown")
    $retdummy = GUICtrlCreateDummy(); Dummy für das Afangen von Enter
    GUICtrlSetOnEvent(-1, "Enterkey")
    $Exit = GUICtrlCreateDummy();Dummy für die Taste ESC
    GUICtrlSetOnEvent(-1, "Terminate")
    Local $AccelKeys[2][2] = [["{ENTER}", $retdummy],["{ESC}", $Exit]]; Accelerators für Enter und ESC verknüpft mit den Dummycontrols
    GUISetAccelerators($AccelKeys)
    GUISetState()
    $iFocus = $VORNAME ;Standard
    GUICtrlSetState($iFocus, $GUI_FOCUS) ; setzt den Cursor in das erste Feld.
    While 1
    WEnd
    Func Auslesen()
    $NAME1 = GUICtrlRead($VORNAME)
    $NAME2 = GUICtrlRead($NACHNAME)
    $CITY = GUICtrlRead($STADT)
    MsgBox(0, "IHRE EINGABEN", "Vorname: " & $NAME1 & @CRLF & "Nachname: " & $NAME2 & @CRLF & "Stadt: " & $CITY)
    EndFunc ;==>Auslesen
    Func Mausdown()
    Local $pos = GUIGetCursorInfo($handle1)
    If IsArray($pos) Then
    Switch $pos[4]
    Case $VORNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $NACHNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $STADT
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    EndSwitch
    EndIf
    EndFunc ;==>Mausdown
    Func Enterkey()
    Local $pos = ControlGetFocus($handle1)
    Switch $pos
    Case "Edit1"; !.Input
    GUICtrlSetState($NACHNAME, $GUI_FOCUS)
    Case "Edit2"; 2.Input
    GUICtrlSetState($STADT, $GUI_FOCUS)
    Case "Edit3";3. Inpout
    GUICtrlSetState($Auslesen, $GUI_FOCUS)
    Case "Button1"
    Auslesen()
    GUICtrlSetState($VORNAME, $GUI_FOCUS)
    EndSwitch
    EndFunc ;==>Enterkey
    Func Terminate()
    Exit
    EndFunc ;==>Terminate

    [/autoit]
    • Offizieller Beitrag

    Hier mal aus meinem Muster-Fundus, wie man die Bewegung mit Enter zum nächsten Control auch lösen kann.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <Array.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister('OnAutoItExit')

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

    Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
    Global $active = False, $gui, $ID_lastFocus = 0
    Enum $i1, $i2, $c1, $i3, $c2, $i4, $n ; <== hier die Reihenfolge, wie der Fokus 'wandern' soll ($n ist Zähler für Anz. Ctrl)
    Global $a[$n]

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

    $gui = GUICreate('')
    GUISetOnEvent(-3, '_ende')
    $a[$i1] = GUICtrlCreateInput('', 10,10,40)
    $a[$i2] = GUICtrlCreateInput('', 60,10,40)
    $a[$c1] = GUICtrlCreateCombo('', 110,10,40)
    $a[$i3] = GUICtrlCreateInput('', 160,10,40)
    $a[$c2] = GUICtrlCreateCombo('', 210,10,40)
    $a[$i4] = GUICtrlCreateInput('', 260,10,40)
    GUISetState()

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

    While 1
    If BitAND(WinGetState($gui), 8) Then
    $active = True
    Else
    $active = False
    EndIf
    Sleep(100)
    WEnd

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

    Func _ende()
    Exit
    EndFunc

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

    ;===========================================================
    ; callback function
    ;===========================================================
    Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS, $vkCode, $ID, $index
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Or Not $active Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    $vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
    If $wParam = $WM_KEYDOWN And $vkCode = 13 Then ; ENTER gedrückt
    $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, '', ControlGetFocus($gui)))
    ; Für ComboBoxen kann NICHT der Fokus abgefragt werden, da dieser auf dem Input-Ctrl der ComboBox liegt.
    ; Hier muß in der Instanz-Reihenfolge mit dem Wert des letzten Ctrl verglichen werden.
    ; Die Reihenfolge der Erstellung in der GUI ist egal, da der Fokus über die enumerierte Reihenfolge der Ctrl-Variablen
    ; weitergesetzt wird.
    ; Falls eine ComboBox als letztes Ctrl in der Folge erscheint, muß dies in der Abfragelogik berücksichtigt werden.
    If _WinAPI_GetClassName($ID) <> 'Edit' Then
    ; Variante 1: über Class+Instance
    $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, "", "[CLASS:ComboBox; INSTANCE:1]"))
    If $ID_lastFocus > $ID Then $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($gui, "", "[CLASS:ComboBox; INSTANCE:2]"))
    ; Variante 2: über Enumerations-Reihenfolge der ComboCtrls
    ;~ $ID = $a[$c1]
    ;~ If $ID_lastFocus > $ID Then $ID = $a[$c2]
    EndIf
    $index = _ArraySearch($a, $ID)
    If @error Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $index < UBound($a)-1 Then
    GUICtrlSetState($a[$index +1], $GUI_FOCUS)
    $ID_lastFocus = $a[$index +1]
    Else
    GUICtrlSetState($a[0], $GUI_FOCUS)
    $ID_lastFocus = $a[0]
    EndIf
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    BugFix, ich denke dein Script wird einige Köpfe zum rauchen bringen :D

  • BugFix´ens Lösung ist ideal, wenn man einer bestehenden GUI bspw. weitere Eingabefelder zuweisen will, deren Zuweisung in die bestehende Struktur integriert werden soll.

    Ansonsten erstellt man einfach die Controls in ihrer per TAB oder ENTER (oder wie auch immer) getriggerten Reihenfolge und "springt" über die Control-ID.