Embedded Window & Tabulatortastenfunktion zur Ansteuerung der Ctrl's in GUI

  • Hallo Gemeinde,

    habe folgendes Problem:
    GUI erstellt mit einigen Ctrls, wie Button und Inputs. Die Ansteuerung der Ctrls mittels Tabulatortaste in der Reihenfolge ihrer Programmierung funktioniert einwandfrei. Habe nun ein embedded IE-Window _IECreateEmbedde() und GUICtrlCreateObj( ... ) erfolgreich hinzugefügt - mittels _IENavigate() aufgerufene Seite wird auch fehlerfrei angezeigt. Bloß, die Navigation per Tabulatortaste zwischen den den GUI-Ctrls funktioniert nicht mehr. Keine Reaktion mehr bei Tabulatortastendruck!
    Was mach ich falsch? Wo liegt der Fehler? Ich konnte weder etwas dazu "googeln" noch habe ich in der Hilfe etwas Passendes gefunden.

    Hier das Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ie.au3>
    #include <StaticConstants.au3>
    $TestGUI =GUICreate("TestGUI", 800, 600, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN))
    $GUI_Button_Ok = GUICtrlCreateButton("&Weiter", 100, 560, 100, 30)
    $GUI_Button_Can = GUICtrlCreateButton("&Abbrechen", 300, 560, 100, 30)
    GUISetState(@SW_SHOW, $TestGUI)
    ; #cs
    $oIE = _IECreateEmbedded()
    $ActiveX = GUICtrlCreateObj($oIE, 240, 40, 240, 200)
    _IENavigate($oIE, "www.autoit.de")
    ; #ce
    while 1 * Sleep(100)
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    GUIDelete($TestGUI)
    Exit
    EndSelect
    Select
    case $msg[1] = $TestGUI
    Select
    Case $msg[0] = $GUI_Button_Can
    GUIDelete($TestGUI)
    Exit
    Case $msg[0] = $GUI_Button_Ok
    ExitLoop
    EndSelect
    EndSelect
    WEnd
    $TestGUI1 = GUICreate("Hier steht ein Text", 500, 300, -1, -1);, BitOr($WS_CAPTION, $WS_POPUP, $WS_TABSTOP));, $WS_EX_TOPMOST)
    GUICtrlCreateLabel("Hier steht noch ein Text", 10, 10, 480, 15, $SS_CENTER)
    GUICtrlCreateLabel("Eingabe 1", 10, 50, 200, 15)
    $inp1 = GUICtrlCreateInput("", 10, 70, 200, 20, 0x0020)
    GUICtrlCreateLabel("Eingabe 2", 10, 120, 200, 15)
    $inp2 = GUICtrlCreateInput("", 10, 140, 200, 20, 0x0020)
    GUICtrlCreateLabel("Eingabe 3", 10, 180, 200, 15)
    $inp3 = GUICtrlCreateInput("", 10, 200, 200, 20, 0x0020)
    $GUI1_Button_Ok = GUICtrlCreateButton("&Weiter", 100, 260, 100, 30)
    $GUI1_Button_Can = GUICtrlCreateButton("&Abbrechen", 300, 260, 100, 30)
    GUISetState(@SW_SHOW, $TestGUI1)
    while 1 * Sleep(100)
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    GUIDelete($TestGUI1)
    ExitLoop
    EndSelect
    WEnd
    Exit

    [/autoit]

    Zum Nachvollziehen einfach #cs und #ce aktivieren.

    Ich hoffe, jemand kann mir helfen.

    HalleMike

    edit:
    Habe den Quellcode erweitert, damit das Problem auch wirklich beim Aufruf der 2. GUI auftritt.
    HM

    Einmal editiert, zuletzt von HalleMike (22. Juni 2012 um 12:29)

  • Hi,

    setzte:

    GUICtrlSetState ( $inp1, $GUI_FOCUS )

    GUISetState()

    vor Deinen while loop.

    Streiche Dein erstes GUISetState(@GUI_show,..) sonst wird die GUI zu früh angezeigt (flickert).

    Ergänze: $TestGUI = GUICreate("Hier steht ein Text", 500, 300, -1, -1,$WS_CLIPSIBLINGS)

    Entspricht dann der Empfehlung in der Hilfe.

    Mfg, Reinhard

  • Hallo Reinhard,
    schön, dass Du mich auch im deutschen Forum gefunden hast. Deine Antwort bringt mich ein wenig durcheinander, denke aber, Du hast vor meiner Überarbeitung reagiert. Der Code war zuerst nicht ganz vollständig, Deine Anwort aber zu diesem korrekt. Das oben beschriebene Problem tritt aber in der jetzigen Code-Version auf, also wenn ich aus einer GUI mit embedded Window eine 2. neue GUI aufrufe. Vielleicht bist Du ja so nett und wirfst noch mal einen Blick auf den Programm-Code. Wie gesagt, wenn ich den Code-Teil zwischen #cs und #ce deaktiviere, kann ich mit der Tabulatortaste zwischen den Ctrls navigieren. Wenn aktiviert, dann nicht. Hier nochmal der Code:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ie.au3>
    #include <StaticConstants.au3>
    $TestGUI =GUICreate("TestGUI", 800, 600, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN))
    $GUI_Button_Ok = GUICtrlCreateButton("&Weiter", 100, 560, 100, 30)
    $GUI_Button_Can = GUICtrlCreateButton("&Abbrechen", 300, 560, 100, 30)
    ; #cs
    $oIE = _IECreateEmbedded()
    $ActiveX = GUICtrlCreateObj($oIE, 240, 40, 240, 200)
    _IENavigate($oIE, "www.autoit.de")
    GUISetState(@SW_SHOW, $TestGUI)
    ; #ce
    while 1 * Sleep(100)
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    GUIDelete($TestGUI)
    Exit
    EndSelect
    Select
    case $msg[1] = $TestGUI
    Select
    Case $msg[0] = $GUI_Button_Can
    GUIDelete($TestGUI)
    Exit
    Case $msg[0] = $GUI_Button_Ok
    ExitLoop ;<== ruft die 2. GUI auf
    EndSelect
    EndSelect
    WEnd
    $TestGUI1 = GUICreate("Hier steht ein Text", 500, 300, -1, -1);, BitOr($WS_CAPTION, $WS_POPUP, $WS_TABSTOP));, $WS_EX_TOPMOST)
    GUICtrlCreateLabel("Hier steht noch ein Text", 10, 10, 480, 15, $SS_CENTER)
    GUICtrlCreateLabel("Eingabe 1", 10, 50, 200, 15)
    $inp1 = GUICtrlCreateInput("", 10, 70, 200, 20, 0x0020)
    GUICtrlCreateLabel("Eingabe 2", 10, 120, 200, 15)
    $inp2 = GUICtrlCreateInput("", 10, 140, 200, 20, 0x0020)
    GUICtrlCreateLabel("Eingabe 3", 10, 180, 200, 15)
    $inp3 = GUICtrlCreateInput("", 10, 200, 200, 20, 0x0020)
    $GUI1_Button_Ok = GUICtrlCreateButton("&Weiter", 100, 260, 100, 30)
    $GUI1_Button_Can = GUICtrlCreateButton("&Abbrechen", 300, 260, 100, 30)
    GUICtrlSetState ( $inp1, $GUI_FOCUS )
    GUISetState()
    while 1 * Sleep(100)
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    GUIDelete($TestGUI1)
    ExitLoop
    EndSelect
    Select
    case $msg[1] = $TestGUI1
    Select
    Case $msg[0] = $GUI_Button_Can
    GUIDelete($TestGUI)
    Exit
    Case $msg[0] = $GUI_Button_Ok
    ExitLoop ;<== weiter zum nachfolgen Code
    EndSelect
    EndSelect
    WEnd
    ; weiterer Code, z.B. Inputs auslesen un verarbeiten
    Exit

    [/autoit]


    Vielen Dank schon mal vorab. LG., Michael (Ps.: Antwort auf eMail folgt)

  • "Das oben beschriebene Problem tritt aber in der jetzigen Code-Version auf, also wenn ich aus einer GUI mit embedded Window eine 2. neue GUI aufrufe"

    Mmmh,

    au3 scheint damit ein Problem zui haben. Lässt sich aber leicht umschiffen indem man den Tabkey als accelkey definiert. Siehe Beispiel.

    Mfg, Reinhard

    PS: I'm out of office for some days

  • Hallo Reinhard,
    zuerst, vielen Dank für Deine Mühe und Geduld. Habe Deinen Vorschlag modifizeirt in mein "Programm" eingebaut; funktioniert auch. Nun tun sich aber 2 neue Probleme auf:
    1. Die "Rückwärtsauswahl" (Shift+Tab) geht natürlich noch nicht, da bin ich aber schon am Basteln und auf dem richtigen Weg.
    2. Wie kriege ich das hin, dass ich die mit TAB durchgeführte Button-Auswahl mit 'ENTER' bestätigen kann? Bis jetzt muss ich einen Mausklick vornehmen. But I'm looking forward optimistical, knowing even therefore you'll have a solution.

    In diesem Sinne und bis neulich ....
    LG., Michael
    Lösung für "vorwärts" und "rückwärts" im CHILD-Window. Ich denke, so geht's.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ie.au3>
    DIM $mainGui
    main()
    func main()
    $mainGUI = GUICreate("Main", 400, 400, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_CLIPCHILDREN + $WS_CLIPSIBLINGS)
    GUISetStyle(BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_CAPTION, $WS_SIZEBOX, $WS_SYSMENU))
    $btn_Child = GUICtrlCreateButton("Child",20,20,40,20)
    $btn_action = GUICtrlCreateButton("Action",80,20,40,20)
    $oIE = _IECreateEmbedded()
    GUICtrlCreateObj($oIE, 5, 50, 380, 200)
    _IENavigate($oIE, "www.autoit.de")
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    case $btn_action
    msgbox(0,"","Action")
    case $btn_Child
    Child()
    EndSwitch
    WEnd
    endfunc
    func Child()
    $ChildGui = GUICreate("Child",200,200,-1,-1, -1, 0, $mainGUI)
    $inp_1 = GuiCtrlCreateInput("",5,5,80,20)
    $inp_2 = GuiCtrlCreateInput("",5,30,80,20)
    $btn_Ok = GUICtrlCreateButton("Ok",10,60,40,20)
    $btn_Quit = GUICtrlCreateButton("Quit",55,60,40,20)
    GUISetState()
    local $tk_focus = GuiCtrlCreateDummy()
    Local $tk_focus1 = GuiCtrlCreateDummy()
    Dim $AccelKeys[2][2]=[["{TAB}", $tk_focus], ["+{TAB}", $tk_focus1]]
    GUISetAccelerators($AccelKeys)
    local $ct = 1
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE, $btn_quit
    ExitLoop
    case $btn_OK
    ;......
    ;......
    ExitLoop
    case $tk_focus
    if $ct = 4 Then $ct = 0
    $ct += 1
    case $tk_focus1
    if $ct = 1 Then $ct = 5
    $ct -= 1
    EndSwitch
    if $ct = 1 then GUICtrlSetState ( $inp_1, $GUI_FOCUS )
    if $ct = 2 then GUICtrlSetState ( $inp_2, $GUI_FOCUS )
    if $ct = 3 then GUICtrlSetState ( $btn_Ok, $GUI_FOCUS )
    if $ct = 4 then GUICtrlSetState ( $btn_quit, $GUI_FOCUS )
    WEnd
    GUIDelete($ChildGui)
    GUISwitch($mainGUI)
    endfunc

    [/autoit]


    Ist also "nur noch" das Problem "ENTER"-Taste als Bestätigung für die getroffene Tabulator-Auswahl im CHILD-Window -> CHIL-Window ohne Maus!
    LG., Michael
    Hab' schon mal selber versucht, die Entertaste ins GUI zu integrieren, lässt sich aber bestimmt noch optimieren:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ie.au3>
    ; Definiton GUI ....
    Local $tk_enter = GUICtrlCreateDummy() ;<== 'Enter' executes chosen focused Button
    Dim $AccelKeys[1][2]=[["{ENTER}", $tk_enter]
    GUISetAccelerators($AccelKeys)
    while 1
    local $msg = GUIGetMsg()
    switch $msg
    case $GUI_EVENT_CLOSE
    exit
    case $tk_enter
    local $focus = ControlGetFocus($GUIName)
    switch $focus
    case "Edit1"
    ;code
    case "Button1"
    ;code
    EndSwitch
    EndSwitch
    wend

    [/autoit]


    Würde mich sehr über Deine Meinung freuen
    LG., Michael

    2 Mal editiert, zuletzt von HalleMike (27. Juni 2012 um 20:08) aus folgendem Grund: Lösung für "vorwärts" und "rückwärts" im CHILD-Window. Eine Lösung für's "Enter"-Prob gefunden

  • Hallo,

    habe den code mit Enter mal arbeitsfähig überarbeitet.

    Mfg, Reinhard

    Spoiler anzeigen