Edit und Inputbox Change event

  • heyho,

    ich würde gerne darauf reagieren wenn jemand einen Text in eine inputbox bzw edit einträgt.
    Also bei jedem buchstaben der eingegeben wird (onchange) möchte ich gerne eine Funktion aufrufen.

    Um etwas genauer zu werden würde ich gerne wärend ich etwas in Edit1 eintrage ein anderes Steuerelement deaktivieren.
    Nachdem dann so 2-3 sekunden keinerlei eingaben mehr in Edit1 gemacht wurde, dann würd ich gerne das Steuerelement wieder aktivieren.

  • moin,
    hier ist ein (schlechtes - quick&VeryDirty) Beispiel, aber es klappt immerhin ^^

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $input, $text
    Example($input)
    Func Example(ByRef $input)
    Local $file, $btn, $msg
    GUICreate(" My GUI input", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45)
    $file = GUICtrlCreateInput("", 10, 5, 300, 20)
    $input = GUICtrlCreateInput("", 10, 35, 300, 20)
    $btn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)
    GUIRegisterMsg(0x0111, "MY_WM_COMMAND")
    GUISetState()

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

    $msg = 0
    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
    Select
    Case $msg = $btn
    EndSelect
    WEnd
    EndFunc ;==>Example

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID
    $nID = BitAND($wParam, 0x0000FFFF)
    If $nID = $input And GUICtrlRead($input) <> $text Then
    $text = GUICtrlRead($input)
    MsgBox(0,"test","Text: "&$text)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_COMMAND

    [/autoit]

    Es ist einfach aus der Hilfedatei zusammengesucht und scheint zu funktionieren...
    Die optimale Lösung wäre für mich interessant zu wissen, sowie das Registrieren
    eines Tastendrucks innerhalb des Inputfelds OHNE, dass die Taste sofort angezeigt wird!
    Hintergrund: Ich würde gern in dem Inputfeld nur bestimmte Zeichen zulassen...
    Vielleicht kann ja jemand beide Lösungen posten :)

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

  • Das mit den Sekunden kann man mit TimerInit und TimerDiff lösen.
    Das überprüfen ob sich was geändert hat kann man machen indem man z.b. alle 200 ms den Text ausliest und in einer Variable speichert. Dann mit If abfragen ob in der Variable das selbe steht wie im Edit.
    Hier habe ich mal so etwas gebaut:

    Spoiler anzeigen
    [autoit]

    #cs
    GUI - Bei Veränderung Funktion aufrufen

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

    Author: Molaynox
    E-Mail: [email='black.eyes.soft@gmx.de'][/email]

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

    AutoIt Version: 3.3.6.1
    #ce

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("GUI - Bei Veränderung Funktion aufrufen", 480, 200, -1, -1) ; GUI erstellen
    $hEdit = GUICtrlCreateEdit("", 0, 0, 480, 130) ; Edit Control erstellen
    GUICtrlSetData(-1, "Anfangstext") ; Text ins Edit Control setzen
    $hBtn = GUICtrlCreateButton("Ich bin ein Button", 135, 150, 200, 35, $WS_GROUP) ; Button erstellen
    GUISetState(@SW_SHOW) ; GUI anzeigen

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

    $sLastText = GUICtrlRead($hEdit) ; Aktuellen Text von hEdit in $sLastText speichern
    $hTimer = 0 ; 0 in die Variable schreiben die später für den Timer benötigt wird damit keine Fehler auftreten

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

    While 1 ; While Schleife starten
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE ; Prüfen ob das X geklickt wurde
    Exit
    Case $hBtn ; Prüfen ob der Button geklickt wurde
    MsgBox(64, "Button geklickt.", "Button 1 wurde geklickt") ; Wenn ja dann MsgBox anzeigen
    EndSwitch
    If $sLastText <> GUICtrlRead($hEdit) Then ; Überprüfen ob aktueller Text nicht mit zuletzt gespeichertem Text übereinstimmt
    $hTimer = TimerInit() ; Einen Timer Starten/leeren. Mit TimerDiff($hTimer) auslesen (Rückgabe in ms)
    GUICtrlSetState($hBtn, $GUI_DISABLE) ; $hBtn disablen
    MsgBox(64, "Info", "Es hat sich etwas geändert.") ; Wenn ja dann MsgBox anzeigen
    EndIf
    If TimerDiff($hTimer) > 2500 Then ; Überprüfen ob der Timer länger als 2,5 Sekunden läuft
    GUICtrlSetState($hBtn, $GUI_ENABLE)
    EndIf
    $sLastText = GUICtrlRead($hEdit) ; Aktuellen Text von hEdit in $sLastText speichern
    Sleep(20) ; 20 ms warten damit die Gui nicht flackert wenn der Button disabled/enabled wird
    WEnd ; Ab hier wieder zum While springen und Skript von dort fortsetzen

    [/autoit]
  • XovoxKingdom
    Ich hab das mal für die geskriptet das man in ein Input nur bestimmte Zeichen eintragen kann:

    Spoiler anzeigen
    [autoit]

    #cs
    GUI - Nur bestimmte Zeichen in Input/Edit zulassen

    Author: Molaynox
    E-Mail: [email='black.eyes.soft@gmx.de'][/email]

    AutoIt Version: 3.3.6.1
    #ce

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("TestGui", 382, 70, -1, -1) ; GUI erstellen
    $hInputZ = GUICtrlCreateInput("", 16, 8, 265, 21) ; 1. Input erstellen
    $hInputB = GUICtrlCreateInput("", 16, 40, 265, 21) ; 2. Input erstellen
    GUICtrlCreateLabel("Nur Zahlen", 288, 8, 57, 17) ; Hinweis Label erstellen
    GUICtrlCreateLabel("Nur Buchstaben", 288, 40, 81, 17) ; Hinweis Label erstellen
    GUISetState(@SW_SHOW)

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

    While 1 ; While Schleife starten
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    $sReadZ = GUICtrlRead($hInputZ) ; Input 1 auslesen
    $sReadB = GUICtrlRead($hInputB) ; Input 2 auslesen
    $sOutput = StringRegExpReplace($sReadZ, "\d", "") ; Aus dem Ausgelesenen alle Zahlen herausfiltern
    $sOutput2 = StringRegExpReplace($sReadB, "\w", "") ; Aus dem Ausgelesenen alle Buchstaben herausfiltern
    GUICtrlSetData($hInputZ, $sOutput) ; Das Gefilterte wieder ins Input setzen
    GUICtrlSetData($hInputB, $sOutput2) ; Das Gefilterte wieder ins Input setzen
    Sleep(10) ; 10 ms warten damit die Gui nicht flackert
    WEnd ; Weiter ab While

    [/autoit]


    Grundsätzlich könnte man so auch ganze Wörter aus dem Input fernhalten mit StringReplace.
    Wenn man nur Nummern eingeben will dann reicht auch der Input Stil $ES_NUMBER.

  • noch eine Möglichkeit
    [autoit]

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

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

    #region - GUI Create
    Global $timer = 0
    GUICreate('',100,100)
    $hInput = GUICtrlCreateInput('',4,4,40)
    $hButton = GUICtrlCreateButton('bla', 50,4)
    GUISetState()
    #endregion
    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
    AdlibRegister("_enableControl")
    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd
    #endregion

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $hCtrl = $lParam
    Local $hInputCtrl = $hInput
    If Not IsHWnd($hInputCtrl) Then $hInputCtrl = GUICtrlGetHandle($hInput)
    ConsoleWrite($nNotifyCode & @CRLF)
    If ($nNotifyCode = 1024 Or $nNotifyCode = 786) And $hCtrl = $hInputCtrl Then
    $timer = TimerInit()
    GUICtrlSetState($hButton, $GUI_DISABLE)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func _enableControl()
    If TimerDiff($timer) >= 3000 Then
    GUICtrlSetState($hButton, $GUI_ENABLE)
    $timer = 0
    EndIf
    EndFunc

    [/autoit]
  • Hallo,

    Inputs und Edits melden sich doch, wenn sich etwas ändert:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>

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

    #region - GUI Create
    GUICreate('', 200, 50)
    $idInput = GUICtrlCreateInput('', 10, 10, 120)
    $idButton = GUICtrlCreateButton('bla', 140, 10, 50)
    GUISetState()
    #endregion

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

    #region - GUI SelectLoop
    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idInput
    GUICtrlSetState($idButton, $GUI_DISABLE)
    AdlibRegister("_EnableButton", 3000)
    Case $idButton
    MsgBox(0, "", "Bingo!")
    EndSwitch
    WEnd
    #endregion

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

    Func _EnableButton()
    GUICtrlSetState($idButton, $GUI_ENABLE)
    AdlibUnRegister("_EnableButton")
    EndFunc

    [/autoit]
  • @Molaynox
    Danke für das Beispiel! :thumbup:
    ich habs jetzt angepasst, sodass es (auf meinem Rechner) garnicht mehr flackert und ich damit weiterarbeiten kann... ;)

    Spoiler anzeigen
    [autoit]

    #cs
    GUI - Nur bestimmte Zeichen in Input/Edit zulassen

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

    Author: Molaynox
    E-Mail: [email='black.eyes.soft@gmx.de'][/email]

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

    AutoIt Version: 3.3.6.1
    #ce

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

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate("TestGui", 382, 70, -1, -1) ; GUI erstellen
    $hInputZ = GUICtrlCreateInput("", 16, 8, 265, 21) ; 1. Input erstellen
    $hInputB = GUICtrlCreateInput("", 16, 40, 265, 21) ; 2. Input erstellen
    GUICtrlCreateLabel("Nur Zahlen", 288, 8, 57, 17) ; Hinweis Label erstellen
    GUICtrlCreateLabel("Nur Buchstaben", 288, 40, 81, 17) ; Hinweis Label erstellen
    GUISetState(@SW_SHOW)

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

    While 1 ; While Schleife starten
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    $sReadZ = GUICtrlRead($hInputZ) ; Input 1 auslesen
    $sReadB = GUICtrlRead($hInputB) ; Input 2 auslesen
    $sOutput = StringRegExpReplace($sReadZ, "[A-Z]|[a-z]", "") ;Aus dem Ausgelesenen alle Buchstaben herausfiltern
    $sOutput2 = StringRegExpReplace($sReadB, "\d", "") ; Aus dem Ausgelesenen alle Zahlen herausfiltern
    If $sReadZ <> $sOutput Then GUICtrlSetData($hInputZ, $sOutput)
    If $sReadB <> $sOutput2 Then GUICtrlSetData($hInputB, $sOutput2)
    Sleep(10) ; 10 ms warten damit die Gui nicht flackert
    WEnd ; Weiter ab While

    [/autoit]

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

    • Offizieller Beitrag
    Zitat

    Hallo,

    Inputs und Edits melden sich doch, wenn sich etwas ändert:

    Ja, aber nur wenn man Return drückt. ;)

  • Ja, aber nur wenn man Return drückt. ;)

    Verdammig, dann muss ich wohl mein Windows schon wieder neu installieren. Bei mir geht's nämlich auch ohne! ;)

    Edit: Jedenfalls ein bisschen. Mein Langzeitgedächtnis spielt mir manchmal Streiche. Sie melden sich erst beim Fokusverlust! ;(

    Einmal editiert, zuletzt von Großvater (23. Februar 2011 um 18:22)

    • Offizieller Beitrag
    Zitat

    Verdammig, dann muss ich wohl mein Windows schon wieder neu installieren. Bei mir geht's nämlich auch ohne! ;)

    Edit: Jedenfalls ein bisschen. Mein Langzeitgedächtnis spielt mir manchmal Streiche. Sie melden sich erst beim Fokusverlust! ;(

    Ich wollte schon schreien und meine Rechner aus dem Fenster werfen, auch den mit WINXp. :D
    Das mit dem Fokusverlust ist mir erst aufgefallen, als ich es ausprobiert habe, nachdem du es geschrieben hast. :thumbup: