For-Schleife einer GUI untebrechen und mit Schließen einer andern GUI wiederaufnehmen

  • Hi,

    ich hab folgendes AutoIT Problemchen und komm einfach nicht weiter.
    Zur Veranschauung des Problems hab ich mein eigentliches Programm mal auf einen Minimalcode reduziert.
    Das Programm macht so natürlich grad keinen großen Sinn, aber ich kann euch zeigen, wo's Hakt.

    Es geht darum: Ich hab ein Haupt-GUI von dem aus ich eine FOR-Schleife starte.
    Nun soll pro abgearbeiteten STEP der For-Schleife die Unter-GUI gestartet und aus der For-Schleife der Wert übergeben werden.
    Die For-Schleife soll nun so lange pausieren, bis das Fenster der Unter-GUI geschlossen wird.
    Dann soll Sie um eins hoch springen und das Ganze wieder von Vorne anfangen, sprich Unterfenster auf, Wert übergeben, warten bis Unterfenster geschlossen wird.

    Folgendes hab ich probiert, funktioniert aber leider nicht:

    [autoit]


    #include <include/GuiComboBox.au3>
    #include <include/GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 0)

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

    ; Variablen
    global $stopper

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

    ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Hauptfenster
    $gui_main = GUICreate("Hauptfenster", 100, 50, -1, -1)
    $button_start = GUICtrlCreateButton("Schleife starten", 5, 5, 80, 33, 0)
    ; Fenster einblenden
    GUISetState(@SW_SHOW, $gui_main)

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

    ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Unterfenster
    $gui_sub = GUICreate("Unterfenster", 500, 314, -1, -1)
    $combo_fsresults = GUICtrlCreateCombo("", 8, 8, 500, 266, $CBS_SIMPLE)
    GUISetState(@SW_HIDE, $gui_sub)

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

    While 1; PROGRAMMSCHLEIFE
    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $gui_main; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Event Handling HAUPTFENSTER
    Switch $msg[0] ; Event
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button_start
    $stopper=false
    For $i = 1 to 5 Step +1
    If NOT $stopper Then
    ; Aktuellen Wert von $i in Combobox schreiben
    _GUICtrlComboBox_BeginUpdate($combo_fsresults)
    _GUICtrlComboBox_AddString($combo_fsresults, $i)
    _GUICtrlComboBox_EndUpdate($combo_fsresults)
    ;Hauptfenster ausblenden
    GUISetState(@SW_HIDE, $gui_main)
    ;Unterfenster einblenden
    GUISetState(@SW_SHOW, $gui_sub)
    ;Stopper auf True setzen, dass die For-Schleife erstmal "pausiert" wird
    ;Und zwar solange, bis das Unterfenster wieder geschlossen wird (Denn mit dieser Aktion wird die Variable $stopper wieder auf FALSE gesetzt...)
    $stopper = True
    EndIf
    Next
    EndSwitch
    Case $gui_sub; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Event Handling Unterfenster
    Switch $msg[0] ; Event
    Case $GUI_EVENT_CLOSE
    ;ComboBox löschen
    _GUICtrlComboBox_ResetContent($combo_fsresults)
    ; Stopper wieder auf FALSE setzen, so dass die For-Schleife wdes Hauptfensters wieder weiter abgearbeitet wird...
    $stopper=False
    ; Unterfenster ausblenden
    GUISetState(@SW_HIDE, $gui_sub)
    ;Hauptfenster einblenden
    GUISetState(@SW_SHOW, $gui_main)
    EndSwitch
    EndSwitch
    WEnd; PROGRAMMSCHLEIFE

    [/autoit]

    Wenn ich zum checken der Variable STOPPER statt IF/ENDIF WHILE einsetze funktionierts auch nicht...

    Bin für jeden Tipp dankbar.

    Grüßen
    Daniel

  • Hi,

    danke für den Tipp!
    Habs nun folgendermaßen gelöst:

    [autoit]


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

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

    global $counter
    $counter=0

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

    Opt("GUIOnEventMode", 1) ; Wechseln in den OnEventMode

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

    ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Hauptfenster
    $gui_main = GUICreate("Hauptfenster", 200, 100, -1, -1)
    ; Button zum Starten der Schleife
    $okbutton = GUICtrlCreateButton("Starten", 70, 40, 60)

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

    ; +++++++++++++++++++++++++++++ Ereignisse
    ;Fenster schließen
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    ;Schleife starten
    GUICtrlSetOnEvent($okbutton, "Start")

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

    ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Child-Fenster
    $gui_child = GUICreate("Ausgabe der Schleife", 200, 100, -1, -1)
    ; Edit-Box zur Ausgabe des Zählers
    $counter_ausgabe = GUICtrlCreateEdit("", 2, 2, 394, 268)

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

    ; ++++++++++++++++++++++++++++++ Ereignisse
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")

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

    ; ++++ Hauptfenster aktiv schalten
    GUISwitch($gui_main)
    GUISetState(@SW_SHOW)

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

    ; ++++ Programmschleife
    While 1
    Sleep(1000) ; Idle around
    WEnd

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

    ; Funktion zum Erhöhen des Zählers (entspricht der For-Schleife) und Aufrufen des Child-Fensters
    Func Start()
    ;Endwert für Zähler festlegen
    $ergebnisse=5
    ; Prüfen, ob Endwert schon erreicht
    if ($counter < $ergebnisse) then
    ; Endwert noch nicht erreicht --> Zähler um eins erhöhen
    $counter=$counter+1
    ; Zählerstand in Edit-Feld des Child-Fensters schreiben
    _GUICtrlEdit_SetText($counter_ausgabe, $counter)
    ; Child-Fenster aufmachen
    GUISetState(@SW_SHOW, $gui_child)
    Else
    MsgBox(0, "Fertig", "Schleife abgelaufen!")
    EndIf
    EndFunc

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

    ; Funktion in der definiert ist, was passiert, wenn man in den beiden Fenster auf Schließen drückt
    Func Close()
    ; Falls der Schließen-Button im Child-Fenster gedrückt wird...
    If @GUI_WINHANDLE = $gui_child Then
    GUISetState(@SW_HIDE, $gui_child)
    Start()
    EndIf
    ; Falls der Schließen-Button im Hauptfenster gedrückt wird...
    If @GUI_WINHANDLE = $gui_main Then
    ; Programm wird beendet
    Exit
    EndIf
    EndFunc

    [/autoit]

    Autoit rocks!

    Es grüßt

    Der Daniel