2. Fenster schließt nicht

  • Hallo,

    wahrscheinlich ist es ganz einfach, aber ich komme und komme einfach nicht drauf und schmeiß gleich meinen Rechner aus dem Fenster!!! (Aufreg...)

    Nur gut, dass es Euch gibt und ihr mir helfen könnt (Abreg...)

    Warum bekomme ich kein Event gemeldet, wenn ich versuche das 2. Fenster zu schließen. Mit GUISwitch($hGUI2) habe ich auch schon rumgespielt - bringt gar nichts.

    Also: Programm starten, Menü -> Einstellungen, neues Fenster geht auf, und dieses wieder per Kreuz zuklicken -> Geht leider nicht.

    Danke für eure Hilfe.


    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)
    const $Windowtitle = "Test"
    Oberflaeche()
    ; Main Loop
    while 1
    Sleep(100)
    WEnd
    Exit
    func Ende()
    Save_ini()
    Exit
    EndFunc
    func Einstellungen()
    Oberflaeche_Einstellungen()
    Global $Wait_for_Event = True
    while $Wait_for_Event
    Sleep(100)
    WEnd
    GUIDelete($hGUI2)
    EndFunc
    func close_einstellungen()
    $Wait_for_Event = False
    EndFunc
    func Oberflaeche()
    Global $hGUI1 = GUICreate($Windowtitle, 200,200,100,100)
    GUISetOnEvent($GUI_EVENT_CLOSE,"ENDE")

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

    Global $filemenu = GUICtrlCreateMenu("&Einstellungen")
    Global $Menu_Einstellungen = GUICtrlCreateMenuItem("Einstellungen", $filemenu)
    GUICtrlSetOnEvent($Menu_Einstellungen,"Einstellungen")

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

    GUISetState()
    EndFunc
    func Oberflaeche_Einstellungen()
    Global $hGUI2 = GUICreate("Einstellungen",200,200)
    GUISetOnEvent($GUI_EVENT_CLOSE,"Ende")

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

    GUISetState()
    EndFunc

    [/autoit]
  • Habs mal ein bisschen aufgeräumt...

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $sWindowTitle = "Test"

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

    MainGuiCreate()

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

    ; Main Loop
    While Sleep(100)
    WEnd

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

    Func Ende()
    SaveIni()
    Exit
    EndFunc

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

    Func CreateEinstellungen()
    GUICreate("Einstellungen", 200, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseEinstellungen")
    GUISetState()
    EndFunc

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

    Func CloseEinstellungen()
    GUIDelete(@GUI_WinHandle)
    EndFunc

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

    Func MainGuiCreate()
    GUICreate($sWindowTitle, 200, 200, 100, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Ende")

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

    Local $hFileMenu = GUICtrlCreateMenu("&Einstellungen")
    GUICtrlCreateMenuItem("Einstellungen", $hFileMenu)
    GUICtrlSetOnEvent(-1, "CreateEinstellungen")

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

    GUISetState()
    EndFunc

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

    Func SaveIni()

    EndFunc

    [/autoit]


    Ansonsten solltest du keine globalen Variablen in Funktionen erstellen.
    Wenn du welche benötigst, kannst du diese am Anfang des Scriptes deklarieren und dann in den Funktionen die Werte zuweisen.
    Lg

  • Hallo,

    vielen Dank. Dein Skript ist eleganter und vor allem: es funktioniert.

    Nun überlege ich, was ich das nächste mal (wenn ich das nächste Programm schreiben sollte) besser machen soll und ehrlich gesagt - ich weiß es immer noch nicht.

    Warum funktioniert dein Programm und meins nicht? Selbst wenn ich deinen Vorschlag mit den Globalen Variablen befolge, dann klappts immer noch nicht.

    Was mache ich konkret falsch?

    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode",1)
    const $Windowtitle = "Test"
    Global $hGui1
    Global $hGui2
    Global $Event
    Oberflaeche()
    ; Main Loop
    while 1
    Sleep(100)
    WEnd
    Exit
    func Ende()
    Exit
    EndFunc
    func Einstellungen()
    Oberflaeche_Einstellungen()
    $Event = True
    while $Event
    Sleep(100)
    WEnd
    GUIDelete($hGUI2)
    EndFunc
    func close_einstellungen()
    $Event = False
    GUIDelete(@GUI_WinHandle)
    EndFunc
    func Oberflaeche()
    $hGUI1 = GUICreate($Windowtitle, 200,200,100,100)
    GUISetOnEvent($GUI_EVENT_CLOSE,"Ende")
    $filemenu = GUICtrlCreateMenu("&Einstellungen")
    $Menu_Einstellungen = GUICtrlCreateMenuItem("Einstellungen", $filemenu)
    GUICtrlSetOnEvent($Menu_Einstellungen,"Einstellungen")
    GUISetState()
    EndFunc
    func Oberflaeche_Einstellungen()
    $hGUI2 = GUICreate("Einstellungen",200,200)
    GUISetOnEvent($GUI_EVENT_CLOSE,"Ende")
    GUISetState()
    EndFunc

    [/autoit]
  • Ich würd mal Strenggenommen behaupten du bist aus einer While nicht mehr rausgekommen die du in einer Func erstellt hast

    [autoit]

    func Einstellungen()
    Oberflaeche_Einstellungen()
    $Event = True
    while $Event
    Sleep(100)
    WEnd
    GUIDelete($hGUI2)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Guten Tag,

    meiner Meinung entsteht das Verhalten durch die Warteschleife in der Menüfunktion Einstellungen(). Menüs blockieren die Anwendung / sind anwendungsmodal. Vor Rückkehr aus der dem Menüeintrag zugeordneten Funktion kann das Skript deshalb keine weiteren Aktionen verarbeiten.

  • Jup genau das ist das Problem.
    Deine Funktion Einstellungen kommt nie zum Ende.
    Außerdem ist die Funktion close_einstellungen überflüssig weil sie nie aufgerufen wird.

    Am besten ist es egtl alle Gui's am Anfang zu erstellen und dann einzublenden wenn man sie benötigt ;)
    Sonst hast du das Problem das man die Einstellungen öfters aufrufen kann (siehe Ahnungslos Beispiel)

    Also einfach am Anfang alles erstellen und wenns benötigt wird einblenden ;)

  • Genau in Zeile 38 müsste statt "Ende", "close_einstellungen" stehen.
    Übrigens du musst dir mal einen ordentlichen Programmierstil aneignen. D.h. Zeilen einrücken, sinnvolle Variablennamen und nur eine Sprache, also nicht englisch mit deutsch gemischt (close_einstellungen(), $Event, Ende()), am besten nur englisch, da die Befehle von AutoIt ja auch auf englisch sind.

    Edit:
    Hier mal ein kleines Workaround:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $Gui1 = GUICreate("Erste GUI", 200, 200, 100, -1)
    $Button1_1 = GUICtrlCreateButton("Zweite GUI öffnen", 10, 30, 120, 25)
    $Button1_2 = GUICtrlCreateButton("Zweite GUI schließen", 10, 80, 120, 25)
    GUISetState()

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

    $Gui2 = GUICreate("Zweite GUI", 200, 200, 400, -1)
    $Button2_1 = GUICtrlCreateButton("Erste GUI öffnen", 10, 30, 120, 25)
    $Button2_2 = GUICtrlCreateButton("Erste GUI schließen", 10, 80, 120, 25)
    GUISetState(@SW_HIDE)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $Gui1)
    GUICtrlSetOnEvent($Button1_1, "_SecondGuiOpen")
    GUICtrlSetOnEvent($Button1_2, "_SecondGuiClose")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $Gui2)
    GUICtrlSetOnEvent($Button2_1, "_FirstGuiOpen")
    GUICtrlSetOnEvent($Button2_2, "_FirstGuiClose")

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

    While 1
    Sleep(10)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _SecondGuiOpen()
    GUISetState(@SW_SHOW, $Gui2)
    EndFunc

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

    Func _SecondGuiClose()
    GUISetState(@SW_HIDE, $Gui2)
    EndFunc

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

    Func _FirstGuiOpen()
    GUISetState(@SW_SHOW, $Gui1)
    EndFunc

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

    Func _FirstGuiClose()
    GUISetState(@SW_HIDE, $Gui1)
    EndFunc

    [/autoit]
  • Vorbildlich. Vielen Dank für die wichtigen Infos.

    Das mit der Zeile 38 war ein Fehler und müsste tatsächlich "close_einstellungen" heißen.

    Dennoch funktioniert das Skript dann nicht. Großvater sagt, dass Menüs die Anwendung blockieren bzw. anwendungsmodal sind.

    Das habe ich noch gehört oder gelesen. Wie kommt man denn an solche Infos?

    Das mit dem Programmierstil ist leider richtig - ich tue mich sehr schwer mit Variablennamen und Funktionsnamen. Aber wenn ich mal bewusst drauf achte wirds bestimmt besser...

  • Das liegt an meiner Vorbelastung durch AutoHotkey. ;)

    In diesem Fall war es aber eher schlecht geraten, weil ich mir keine andere Erklärung vorstellen konnte. Tatsächlich scheint es aber so zu sein, dass die Events des OnEventMode nur das Hauptskript selbst, nicht aber andere Event-Funktionen unterbrechen können. QED:

    [autoit]

    #include <GUIConstantsEx.au3>
    Global $Warten
    Opt("GUIOnEventMode",1)
    GUICreate("GUI", 120, 80)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    GUICtrlCreateButton("Warten", 10, 10, 100, 20)
    GUICtrlSetOnEvent(-1, "Button1_Clicked")
    GUICtrlCreateButton("Ab dafür!", 10, 50, 100, 20)
    GUICtrlSetOnEvent(-1, "Button2_Clicked")
    GUISetState()
    While True
    Sleep(100)
    WEnd
    Exit

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

    Func Close()
    Exit
    EndFunc

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

    Func Button1_Clicked()
    $Warten = True
    While $Warten
    Sleep(10)
    WEnd
    MsgBox(0, "", "Ausgewartet!")
    EndFunc

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

    Func Button2_Clicked()
    $Warten = False
    EndFunc

    [/autoit]


    In AutoHotkey funktioniert das anders:

    Ich muss wohl mit meinen Unterstellungen zur Funktionsweise von AutoIt etwas vorsichtiger sein! ;)