Bug? Benötige Workaround

  • Ich habe einige Inputfelder, die automatisch aktualisiert werden und andere bei denen ich was eingeben kann. Nur da wird der Event schon vor dem Drücken der Enter-Taste ausgelöst, und zwar immer wenn ein anderes Inputfeld automatisch beschrieben wird. Gibt es dafür eine Lösung?
    Danke.

    Spoiler anzeigen
    [autoit]

    Opt("GuiOnEventMode", 1)

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

    GUICreate("Test Bug", 200, 200)
    GUISetOnEvent(-3, "_Exit")

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

    Global $nInput1 = GUICtrlCreateInput("0.00", 10, 10, 80, 20, 0x800)
    Global $nInput2 = GUICtrlCreateInput("0.00", 10, 30, 80, 20)
    GUICtrlSetOnEvent($nInput2, "_Input2")

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

    AdlibRegister("_UpdateInput1", 1000)

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

    GUISetState()

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

    While 1
    Sleep(20000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Input2()
    ConsoleWrite(GUICtrlRead(@GUI_CtrlId) & " - Enter pressed?" & @CRLF)
    EndFunc

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

    Func _UpdateInput1()
    GUICtrlSetData($nInput1, StringFormat("%3.2f", Random()))
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Ich bin mir nicht ganz sicher, was du vorhast. Aber du solltest WM_COMMAND auswerten. Wenn ein Ctrl den Fokus bekommt wird $EN_SETFOCUS ausgelöst. Ist es das Ctrl, das du per Hand bearbeiten möchtest, solltest du für die Dauer der Bearbeitung AdlibRegister deaktivieren und nach $EN_KILLFOCUS für dieses Ctrl wieder aktivieren.

  • Danke. Ich möchte aber Adlibregister eigentlich nicht deaktivieren. Die Daten kommen von einer SPS, und je nach Parameter können auch diese Eingabefelder editiert werden, deswegen kann ich auch kein Label nehmen, bei dem dieser Fehler nicht auftritt.
    Ich werde mal versuchen mit WM_COMMAND was zu basteln.

    • Offizieller Beitrag

    Ich möchte aber Adlibregister eigentlich nicht deaktivieren.


    Wenn mit den Funktionen kontinuierlich Einträge gemacht werden sollen, kannst du ja diese Werte auch puffern, während du händische Eingaben machst. Habs grad nicht getestet - aber ich vermute du würdest den Fokus verlieren, wenn während deiner Eingabe per Adlibfunktion ein Eintrag automatisch erfolgt.

  • Bin seit 2 Tagen wieder aus dem Urlaub zurück und muss mich nach 4 wöchiger Abstinenz wieder an das Coden gewöhnen.

    [autoit]


    #include <WindowsConstants.au3>
    Opt("GuiOnEventMode", 1)

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

    GUICreate("Test Bug", 200, 200)
    GUISetOnEvent(-3, "_Exit")

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

    Global $nInput1 = GUICtrlCreateInput("0.00", 10, 10, 80, 20, 0x800)
    Global $nInput2 = GUICtrlCreateInput("0.00", 10, 30, 80, 20)

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

    AdlibRegister("_UpdateInput1", 1000)

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

    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    While 1
    Sleep(20000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _UpdateInput1()
    GUICtrlSetData($nInput1, StringFormat("%3.2f", Random()))
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    If $nID = 4 Then
    ConsoleWrite("Some input was entered" & @CRLF)
    EndIf
    If Not $lParam Then ConsoleWrite("Enter pressed" & @CRLF)
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_COMMAND

    [/autoit]

    Hilft dir das weiter?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke UEZ, auf diese Möglichkeit bin ich auch gekommen, auch wenn sie mir nicht so recht gefällt. Aber es wird schon gehen (müssen).

    Spoiler anzeigen
    [autoit]

    Opt("GuiOnEventMode", 1)

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

    GUICreate("Test Bug", 200, 200)
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x0111, "_WM_COMMAND")

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

    Global $ActiveControl = 0

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

    Global $nInput1 = GUICtrlCreateInput("0.00", 10, 10, 80, 20, 0x800)
    Global $nInput2 = GUICtrlCreateInput("0.00", 10, 30, 80, 20, 0x1000)
    Global $nInput3 = GUICtrlCreateInput("0.00", 10, 50, 80, 20)

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

    AdlibRegister("_UpdateInput1", 1000)

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

    GUISetState()

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

    While 1
    Sleep(20000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _UpdateInput1()
    GUICtrlSetData($nInput1, StringFormat("%3.2f", Random()))
    EndFunc

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0x0000FFFF)

    If $nNotifyCode = 256 Then ; Got Focus
    $ActiveControl = $nID
    EndIf
    If $nID = 1 And $nNotifyCode = 0 Then
    ConsoleWrite("ID" & $ActiveControl & " - " & GUICtrlRead($ActiveControl) & " - Enter pressed" & @cr)
    EndIf
    EndFunc

    [/autoit]
  • Ich bin jetzt eigentlich fast zufrieden mit der Anwendung, deswegen stelle ich den Thread auf gelöst.
    Ich will eigentlich nur verhindern, das der Event eines Controls öfter als einmal ausgeführt wird, da ich damit Daten an die SPS schicke.
    Wenn ich z.B. 614.28 zur SPS senden will, dann wurde vorher 6, 61, 614, 614.2 und zu guter letzt 614.28 gesendet. Und dass das nicht optimal ist, ist wohl jedem hier klar.
    Aber nun funktioniert eh alles bis auf, dass der Wert wenn er geändert wurde beim Focus-Verlust auch gesendet werden soll. Aber das schaffe ich auch noch.

    Trotzdem danke Bugfix.