2. GUI lässt sich nicht schliessen.

  • Hallo zusammen,

    ja, ich weiss, das wurde schon mal behandelt und gefragt. Trotzdem kriege ich es nicht hin.
    Ich habe eine GUI. Irgendwann wird dann mal ein Button eingeblendet der in einer 2. GUI ein "Hilfe"-Bild anzeigen soll.

    Das zweite GUI kommt auch, aber es lässt sich nicht schliessen. Auch das erste lässt sich dann nicht mehr schliessen.
    Ich arbeite mit GUISetOnEvent.

    Für das 1. GUI funktioniert das wunderbar, solange das 2. nicht geöffnet ist.
    Das 2. GUI habe ich aber nur vom 1. kopiert und wenig geändert:

    Spoiler anzeigen
    [autoit]

    Dim $CloseGUI2 = False, $hGUI
    opt("GUIOnEventMode", 1) ;Enable events on GUI

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

    Func SecondGUI()
    Local $hGUI2, $msg
    $hGUI2 = GUICreate("Umbauhilfe", 700, 700, 10, 10) ;Create GUI
    GUICtrlCreatePic("Testbild.jpg",0,0,700,700)
    GUISwitch($hGUI2)
    GUISetState() ; Display the GUI
    GUISetOnEvent(-3,"CloseSecondGUI",$hGUI2)

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

    While Not $CloseGUI2
    Sleep(100)
    WEnd

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

    GUIDelete($hGUI2)
    GUISwitch($hGUI)
    $CloseGUI2 = False
    EndFunc

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

    Func CloseSecondGUI()
    $CloseGUI2 = True
    EndFunc

    [/autoit]

    Leider kann ich nicht das ganze Programm hier mitgeben, da es viel zu gross zum analysieren wäre...
    Vielleicht findet ja jemand einen Denkfehler oder kann mir Tipps geben, wonach ich suchen könnte!

    Wenn ich in der Funktion SecondGUI() die Option Event auf 0 stelle (opt("GUIOnEventMode", 0))
    dann kann ich ganz normal mit GUIGetMsg() das schliessen abfragen. Dann geht es!
    Am Schluss stelle ich natürlich dann die Events wieder ein.

    Aber das müsste doch auch mit den Event klappen?

    Grüsse
    Veronesi

    Einmal editiert, zuletzt von veronesi (21. April 2010 um 11:05)

  • Meine Frage wäre: Kommt dein Script überhaupt in der Close Funktion an?

    Sowei ich mich erinnere, ist es so, dass der OnEvent-Mode nur funktioniert, solange das Script in der Hauptschleife ist. Ich kann mich aber auch irren.
    Bevor ich hier aber anfange zu spekulieren, poste doch bitte mal deinen kompletten Code, das macht es uns immer einfacher (weil man 1. das Script starten kann, und 2 die schematischen Abläufe dahinter besser erkennen, und 3. kann man sich Anhand des ganzen Codes ein WorkAround überlegen.

  • Hallo SEuBo,

    nein, das Script kommt wirklich nicht in die Close Funktion!
    Der Komplette Code hat inzwischen 2790 Zeilen, dazu 9 Include Dateien und 12 FileInstall Dateien (2 davon ebenfalls AutoIt EXE Files).

    Das ganze zu analysieren ist viel zu viel.
    Vielleicht schaffe ich es, das Problem auf wenige Zeilen Testcode zusammenzukürzen. Aber das kann eine Weile dauern, bis ich das Problem dann wieder reproduzieren kann.

    Gibt es bei zwei GUIs etwas zu beachten (ausser dem GUISwitch) ?

    Mein WorkAround ist im Moment, dass ich in der Unterfunktion die OnEvent ausschalte und danach wieder einschalte. Das funktioniert, doch finde ich unschön!

    Gruss
    Veronesi

  • Hallo,

    Generell gilt: Es ist besser GUI's am Scriptanfang zu erstellen, und dann nur noch mit @SW_HIDE / @SW_SHOW zu arbeiten. Du kannst ja in deiner Hauptschleife immer noch mithilfe einer variable unterscheiden, welches GUI aktiv ist.

    Hier ein Beispiel:

    Spoiler anzeigen
    [autoit]


    Global $hCurActive, $hGUI, $hChild ; GUI's
    Global $hOpen2 ; Ctrls
    _SetupGUI()

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

    While 1 * Sleep(25)
    Switch $hCurActive
    Case $hGUI
    ToolTip("Aktiv ist die HauptGUI")
    Case $hChild
    ToolTip("Das Child ist aktiv")
    EndSwitch
    WEnd

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

    Func OnEvent_Eventhandler()
    Switch @GUI_CtrlId
    Case -3
    If @GUI_WinHandle = $hGUI Then Exit
    GUISetState(@SW_HIDE, @GUI_WinHandle)
    $hCurActive = $hGUI
    Case $hOpen2
    GUISetState(@SW_SHOW, $hChild)
    $hCurActive = $hChild
    EndSwitch
    EndFunc ;==>OnEvent_Eventhandler

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

    Func _SetupGUI()
    Opt("GUIOnEventMode", 1)

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

    $hGUI = GUICreate("", 400, 400)
    $hOpen2 = GUICtrlCreateButton("GUI2", 20, 20, 200, 20)
    GUICtrlSetOnEvent(-1, "OnEvent_Eventhandler")
    GUISetOnEvent(-3, "OnEvent_Eventhandler")

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

    $hChild = GUICreate("Child", 200, 200, 200, 200)
    GUISetOnEvent(-3, "OnEvent_Eventhandler")

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

    GUISetState(@SW_SHOW, $hGUI)
    $hCurActive = $hGUI
    EndFunc ;==>_SetupGUI

    [/autoit]
  • Hey, vielen Dank!

    Nun funktioniert alles!
    Das Problem scheint wirklich das folgende zu sein:
    OnEvent scheint nur in der Hauptschleife zu funktionieren.

    Vorher war ich dauernd in der Sub-Funktion und OnEvent funktionierte deshalb vermutlich nicht!

    Nun habe ich eine Funktion "ShowGUI2" und "HideGUI2" und alles läuft!

    Vielen Dank
    Gruss
    Veronesi

    • Offizieller Beitrag

    Es geht so (die While-Schleife hat in der Funktion nix verloren):

    Spoiler anzeigen
    [autoit]

    Global $hGUI2
    opt("GUIOnEventMode", 1) ;Enable events on GUI

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

    _Main()

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

    While True
    Sleep(100)
    WEnd

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

    Func _Main()
    $hGUI1 = GUICreate('GUI 1')
    GUISetOnEvent(-3, 'exitMain')
    $bt = GUICtrlCreateButton('Umbauhilfe', 10,10,80,20)
    GUICtrlSetOnEvent(-1, 'SecondGUI')
    GUISetState()
    EndFunc

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

    Func exitMain()
    Exit
    EndFunc

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

    Func SecondGUI()
    $hGUI2 = GUICreate("Umbauhilfe", 700, 700, 10, 10) ;Create GUI
    GUISetOnEvent(-3,"CloseSecondGUI",$hGUI2)
    GUICtrlCreatePic("Testbild.jpg",0,0,700,700)
    GUISwitch($hGUI2)
    GUISetState() ; Display the GUI
    EndFunc

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

    Func CloseSecondGUI()
    GUIDelete($hGUI2)
    EndFunc

    [/autoit]
  • Sehr gut, dass es jetzt funktioniert.

    Ich glaube das Problem mit der Hauptschleife, würde sich lösen lassen, wenn man nochmals eine Stufe höher geht - über GUIRegisterMsg() und die WIndows Messages $WM_NOTIFY und/oder $WM_COMMAND. Dann sollte das Script eigentlich reagieren, egal was du machst (Auch wenn das Script in ner Schleife festhängt). Das ist aber schon härterer Tobak, ich wollte es nur der Vollständigkeit halber erwähnt haben.