verschachtelte Switch-Anweisungen

  • Hallo zusammen,

    ich habe folgendes Problem:
    in einer Switch ... Case Anweisung schließe ich eine GUI und öffne eine andere.
    Innerhalb des Cases will ich eine weitere Switch ... Case Anweisung durchführen, es kommt auch keine Fehlermeldung, jedoch wird auch nichts ausgeführt.

    Das ganze sieht etwa so aus (stark vereinfachtes Beispiel):

    Spoiler anzeigen
    [autoit]

    $Form1 = GUICreate("GUI", 100, 100, 100, 100)
    ;die Buttons sind vorhanden, auch wenn jetzt hier im Beispiel nicht erwähnt
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ;eine kleine If-Abfrage (funktioniert einwandfrei)

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

    Case $Button2
    GUIDelete($Form1)

    $Form2 = GUICreate("GUI 2", 100, 100, 100, 100)
    $AndererButton1= GUICtrlCreateButton("Ein Knopf", 8, 8, 84, 25)
    $AndererButton2= GUICtrlCreateButton("Ein Knopf", 8, 40, 84, 25)
    GUISetState(@SW_SHOW)

    $uMsg = GUIGetMsg()
    Switch $uMsg
    Case $AndererButton1

    If (Bedingung) Then
    MsgBox(0,"Test","Bedingung 1 geht")
    ElseIf (Bedingung) Then
    MsgBox(0,"Test","Bedingung 2 geht")
    Else
    MsgBox(0,"Test","Bedingung 3 geht auch")
    EndIf

    Case $AndererButton2
    MsgBox(0,"Knopf2","Auch Knopf 2 funktioniert")
    Endswitch
    EndSwitch
    WEnd

    [/autoit]

    Die Bedingungen der äußeren Switch ... Case Anweisung gehen alle, allerdings keine der inneren...

    Was mache ich falsch?


    Danke vorab :)

  • Dein zweites GuiGetMsg wird nur ein einziges mal ausgeführt.
    Nämlich unmittelbar nach dem Erstellen der zweiten GUI.
    Dann nie wieder.
    Stattdessen wird einfach die äußere Schleife weiter ausgeführt.
    Dessen GuiGetMsg() bezieht sich nun auf die zweite GUI.
    Eine Abfrage auf die Werte von $Button1 und $Button2 macht da nun aber keinen Sinn mehr.

  • Du hast jetzt also eine while Schleife in deinen case eingebaut? Halte ich für groben Unfug. Zur Laufzeit innerhalb der Haupt Schleife noch GUIs zu erstellen oder zu löschen ist unnötig und wird früher oder später zu Komplikationen führen. Stattdessen sollte man alle GUIs und GUI Elemente bevorzugt am Anfang des Scriptes erstellen und bei Bedarf mit guisetstate(...) oder guictrlsetstate(...) ein- bzw. ausblenden. Das vereinfacht zum einen das Handling, zum anderen bleibt dein Code übersichtlicher, weil sämtlicher GUI code an einer Stelle im Script steht.

    Um in der While Schleife die Nachrichten der Fenster einer bestimmten GUI zuordnen zu können gibt es den extended mode von guigetmsg().

    Beispiel zum extended mode:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>

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

    Example()

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

    Func Example()
    ; Create a GUI.
    Local $hGUI1 = GUICreate("Example GUI1")
    ; Create a button.
    Local $idButton1 = GUICtrlCreateButton("Button1", 10, 10, 80, 22)
    ; Display the GUI
    GUISetState(@SW_SHOW, $hGUI1)

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

    ; Create a GUI.
    Local $hGUI2 = GUICreate("Example GUI2", 300, 300)
    ; Create a button.
    Local $idButton2 = GUICtrlCreateButton("Button2", 10, 10, 80, 22)
    ; Display the GUI
    GUISetState(@SW_SHOW, $hGUI2)

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

    ; Initialize a Local variable.
    Local $aMsg = 0

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

    While 1
    ; Assign to $aMsg the advanced GUI messages.
    $aMsg = GUIGetMsg(1)

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

    ; Switch from GUIs
    Switch $aMsg[1]
    Case $hGUI1
    ; The event comes from the GUI1

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

    ; Switch from event ID
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $idButton1
    MsgBox($MB_SYSTEMMODAL, "", "Button1 clicked.")
    EndSwitch
    Case $hGUI2
    ; The event comes from the GUI2

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

    ; Switch from event ID
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI2)
    Case $idButton2
    MsgBox($MB_SYSTEMMODAL, "", "Button2 clicked.")
    EndSwitch
    EndSwitch
    WEnd

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

    ; Delete the previous GUIs and all controls.
    GUIDelete($hGUI1)
    EndFunc ;==>Example

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