Input-Feld soll nur bei {enter} Aktionen auslösen

  • Hejo

    Wenn ich ein Input-Feld (GUICtrlCreateInput) erzeuge, und mit GUIGetMsg() überwache, bekomme ich ein Signal sobald irgendwas ins Feld getippt wird. Ich würde aber gerne nur Aktionen auslösen, wenn im Feld die Enter-Taste gedrückt wird.

    GUISetAccelerators() bezieht sich ja leider auf die gesamte GUI und nicht auf einzelne Controls. Da ich mehrere Input-Felder nutze scheint das nicht die richtige Wahl zu sein, aber schonmal nah dran.

    Ich könnte zwar mit GuiCtrlGetState() in einer Schleife schauen ob und welche Input-Felder den Fokus haben, und dann solang per _isPressed() oder HotKeySet() die Enter-Taste belegen, aber ich würd gern wissen ob es nicht doch eine einfachere, zuverlässigere und/oder performantere Möglichkeit gibt?

    Einmal editiert, zuletzt von klischee (8. August 2012 um 03:21)

  • Meinst du so?

    Spoiler anzeigen
    [autoit]

    GUICreate("Test")
    Global $cInput_1 = GUICtrlCreateInput("", 20, 20, 200, 20)
    Global $cInput_2 = GUICtrlCreateInput("", 20, 60, 200, 20)
    Global $cInput_3 = GUICtrlCreateInput("", 20, 100, 200, 20)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $cInput_1
    ConsoleWrite("Enter in Input 1" & @CRLF)
    Case $cInput_2
    ConsoleWrite("Enter in Input 2" & @CRLF)
    Case $cInput_3
    ConsoleWrite("Enter in Input 3" & @CRLF)
    EndSwitch
    WEnd

    [/autoit]


    Aber du musst erst was reinschrauben, dann nimmt er erst das Enter an.

    • Offizieller Beitrag

    Oder so, da wird ENTER auch ohne Eintrag angenommen:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #Include <GUIConstantsEx.au3>

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

    Global Const $WM_COMMAND = 0x0111

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

    $hGUI = GUICreate('TEST')
    $input1 = GUICtrlCreateInput('', 40, 30, 60, 20)
    $input2 = GUICtrlCreateInput('', 40, 60, 60, 20)
    $input3 = GUICtrlCreateInput('', 40, 90, 60, 20)
    $input4 = GUICtrlCreateInput('', 40, 120, 60, 20)

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

    GUISetState(@SW_SHOW, $hGUI)

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

    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND') ; == registriert Windows-Message "WM_COMMAND" und weist dieser Msg die gleichnamige Funktion zu

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Select
    Case $iCode = 0x0
    Local $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($hGUI, '', ControlGetFocus($hGUI)))
    Switch $ID
    Case $input1
    ConsoleWrite('ENTER - Input-1' & @CRLF)
    Case $input2
    ConsoleWrite('ENTER - Input-2' & @CRLF)
    Case $input3
    ConsoleWrite('ENTER - Input-3' & @CRLF)
    Case $input4
    ConsoleWrite('ENTER - Input-4' & @CRLF)
    EndSwitch
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Danke euch beiden schonmal!


    Ja so mein ich das. Wenn man was tippt passiert erst nichts, aber sobald man das Input-Feld verläßt wird der Trigger ausgelöst.

    Mit GUICtrlGetState bekomm ich es nicht hin dass nur bei aktivem {enter} getriggert wird, nur mit ControlGetFocus. Was aber irgendwie doof ist, da die CID sich ja ändern kann falls was an der GUI umgebaut wird. Bei GUICtrlGetState kann ich jedenfalls nicht auf die Variable $GUI_FOCUS checken, da kommt dann im Debugger dass er die nicht kennt.

    So sieht das jetzt aus, fällt euch da was besseres zu sein? Ist mir irgendwie zu holprig auch wenn's klappt.
    (Im ersten Input Enter drücken löst eine gezielte Aktion aus, ansonsten wird nach Eingaben bei Fokusverlust normal getriggert)

    Spoiler anzeigen
    [autoit]

    $Form = GUICreate("Test")
    Global $cInput_1 = GUICtrlCreateInput("", 20, 20, 200, 20)
    Global $cInput_2 = GUICtrlCreateInput("", 20, 60, 200, 20)
    Global $cInput_3 = GUICtrlCreateInput("", 20, 100, 200, 20)
    GUISetState()

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

    Dim $AccelKeys[1][2] = [["{enter}", $cInput_1]]
    GUISetAccelerators($AccelKeys)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $cInput_1
    If ControlGetFocus($Form) = "Edit1" Then
    ConsoleWrite("Aktives Enter in Input 1" & @CRLF)
    Else
    ConsoleWrite("Enter in Input 1" & @CRLF)
    EndIf
    Case $cInput_2
    ConsoleWrite("Enter in Input 2" & @CRLF)
    Case $cInput_3
    ConsoleWrite("Enter in Input 3" & @CRLF)
    EndSwitch
    WEnd

    [/autoit]


    Edit:


    Danke BugFix, das funktioniert auch! GUIRegisterMsg bzw WMCOMMAND ist mir noch gänzlich fremd, werd mich da mal schlau lesen aber sieht auf jeden Fall auch wenn's komplexer ist zuverlässig aus.

  • Hi, die Lösung von m-obi kann man noch etwas verfeinern. 8)

    Spoiler anzeigen
    [autoit]


    _main()
    Func _main()
    Local $msg, $aInput[4]
    GUICreate("Test")
    $aInput[0] = GUICtrlCreateInput('', 40, 30, 60, 20)
    $aInput[1] = GUICtrlCreateInput('', 40, 60, 60, 20)
    $aInput[2] = GUICtrlCreateInput('', 40, 90, 60, 20)
    $aInput[3] = GUICtrlCreateInput('', 40, 120, 60, 20)

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

    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    For $i = 0 To 3
    If $msg = $aInput[$i] Then ConsoleWrite("Enter in Input " & $aInput[$i] - 2 & @CRLF)
    Next
    Until $msg = -3
    EndFunc ;==>_main
    ; Ende

    [/autoit]
  • So ist es sinnvoller:

    Spoiler anzeigen
    [autoit]

    Global $acInput[4], $iMsg

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

    GUICreate("Test")
    For $i = 0 To UBound($acInput) - 1
    $acInput[$i] = GUICtrlCreateInput("", 20, 20 + ($i * 40), 200, 20)
    Next
    GUISetState()

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    Case $acInput[0] To $acInput[UBound($acInput) - 1]
    ConsoleWrite("Enter in Input " & $iMsg - $acInput[0] + 1 & @CRLF)
    EndSwitch
    WEnd

    [/autoit]
  • @m-obi! Nicht schlecht, aber es geht noch mehr. ;) Humor

    Spoiler anzeigen
    [autoit]


    Global $msg, $aInput[4]
    GUICreate("Test")
    For $i = 0 To 3
    $aInput[$i] = GUICtrlCreateInput("", 20, 20 + $i * 40, 200, 20)
    Next
    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    For $i = 0 To 3
    If $msg = $aInput[$i] Then
    Switch $i
    Case 0
    ConsoleWrite("Enter in Input 1" & @CRLF)
    Case 1
    ConsoleWrite("Enter in Input 2" & @CRLF)
    Case 2
    ConsoleWrite("Enter in Input 3" & @CRLF)
    Case 3
    ConsoleWrite("Enter in Input 4" & @CRLF)
    EndSwitch
    EndIf
    Next
    Until $msg = -3
    ; Ende

    [/autoit]
  • Ui ein Battle 8)

    Spoiler anzeigen
    [autoit]

    Global $aInput[4][2], $iMsg

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

    $aInput[0][1] = "Enter in Input 1"
    $aInput[1][1] = "Enter in Input 2"
    $aInput[2][1] = "Enter in Input 3"
    $aInput[3][1] = "Enter in Input 4"

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

    GUICreate("Test")
    For $i = 0 To UBound($aInput) - 1
    $aInput[$i][0] = GUICtrlCreateInput("", 20, 20 + ($i * 40), 200, 20)
    Next
    GUISetState()

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    Case $aInput[0][0] To $aInput[UBound($aInput) - 1][0]
    ConsoleWrite($aInput[$iMsg - $aInput[0][0]][1] & @CRLF)
    EndSwitch
    WEnd

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

    ;i UBound in der Schleife verursacht
    ;i Mehrfachaufrufe (bei jedem $i) und das Prog. wird unnötig gebremst
    For $i = 0 To UBound($aInput) - 1
    $aInput[$i][0] = GUICtrlCreateInput("", 20, 20 + ($i * 40), 200, 20)
    Next

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

    ;i Besser so:
    $UBoundaInput = UBound($aInput) - 1 ;i einmalige UBoundabfrage
    For $i = 0 To $UBoundaInput ;i statisch kein UBound
    $aInput[$i][0] = GUICtrlCreateInput("", 20, 20 + ($i * 40), 200, 20)
    Next

    [/autoit]
  • Dann so:

    Spoiler anzeigen
    [autoit]

    Global Const $iMaxIndexInputs = 3
    Global $aInput[$iMaxIndexInputs + 1][2], $iMsg

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

    $aInput[0][1] = "Enter in Input 1"
    $aInput[1][1] = "Enter in Input 2"
    $aInput[2][1] = "Enter in Input 3"
    $aInput[3][1] = "Enter in Input 4"

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

    GUICreate("Test")
    For $i = 0 To $iMaxIndexInputs
    $aInput[$i][0] = GUICtrlCreateInput("", 20, 20 + $i * 40, 200, 20)
    Next
    GUISetState()

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    Case $aInput[0][0] To $aInput[$iMaxIndexInputs][0]
    ConsoleWrite($aInput[$iMsg - $aInput[0][0]][1] & @CRLF)
    EndSwitch
    WEnd

    [/autoit]
  • Wenn das so ist, dann wäre das eine Endlosschleife, oder?

    [autoit]

    #include <Array.au3>

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

    Global $aArray[3] = [1, 2, 3]

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

    For $i = 0 To UBound($aArray) - 1
    _ArrayAdd($aArray, $i + 3)
    ConsoleWrite($aArray[$i] & @CRLF)
    Next

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

    _ArrayDisplay($aArray)

    [/autoit]
  • funkey, ich meine es so:

    [autoit]


    #comments-start
    ;Example by Funkey
    ;~ Wenn das so ist, dann wäre das eine Endlosschleife, oder?
    #include <Array.au3>
    Global $aArray[3] = [1, 2, 3]
    For $i = 0 To UBound($aArray) - 1
    _ArrayAdd($aArray, $i + 3)
    ConsoleWrite($aArray[$i] & @CRLF)
    Next
    _ArrayDisplay($aArray)
    ;Ende Example by Funkey

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

    In Zeile 4 wird in die Variable "$i" die Funktion UBound gelegt.
    UBound - Das Array dessen Größe ermittelt werden soll!

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

    Hieraus ergibt sich,
    dass bei jedem weiteren Aufruf von "$i" die Funktion UBound ausgefürt wird,
    obwohl die Größe des Arrays schon bekannt ist!

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

    Demnach wird in Deinem Beispiel die Größe des Arrays 3 mal ermittelt.
    In den Zeilen 4, 5 und 6.
    #comments-end

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

    #include <Array.au3>
    Global $aArray[3] = [1, 2, 3]
    $UBoundaArray = UBound($aArray) - 1 ;i Dynamisch mit UBound.
    ConsoleWrite("Der integere Wert von UBound ist: " & $UBoundaArray & @CRLF)
    For $i = 0 To $UBoundaArray ;i Statisch kein UBound.
    _ArrayAdd($aArray, $i + 3)
    ConsoleWrite($aArray[$i] & @CRLF)
    Next
    _ArrayDisplay($aArray)

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

    #comments-start
    Nach der einmaligen Abfrage von UBound, in Zeile 26,
    liegt in der Variable ein integerer Wert (hier 2)
    mit diesem Wert wird im Verlauf weitergerechnet.
    Die Funktion UBound wird nicht mehrfach aufgerufen!
    #comments-end

    [/autoit]
  • Ich bin noch ein kleiner Newbie, aber ich denke nicht, dass das so ist.

    For $i To $x ist doch das gleiche wie For $i To Ubound($x). Es wird ja nicht jedes mal auf's neue der For-Befehl an sich aufgerufen, sondern lediglich der Inhalt der For-Schleife x-mal durchlaufen, so wie in "To" angegeben.

    Anders wäre das bei einer While-Schleife, die nach jedem Durchlauf die Bedingung prüft. Aber eine For-Schleife ist ja eben dafür da, dass dass die Bedingung lediglich einmalig angegeben wird und nicht neu überprüft wird.

    Zumindest nach meinem Verständnis.

  • Jap, so ist es auch ^^ |> Der Beweis liegt auch in diesem Script hier:

    [autoit]


    $Variable = 3

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

    For $i = 1 To $Variable
    MsgBox(0, '', $i)
    $Variable += 1
    Next

    [/autoit]

    Wollt auch mal meinen Senf dazu geben lol ^^