Form schliessen

  • Hi zusammen, eine Frage wieder mal von mir :)
    Ich habe 2 Gui-Fenster (Forms) anzeigen lassen. Wie kann ich es nun machen, wenn man bei 1 Fenster auf schliessen drückt dass dieses verschwindet ohne jedoch die Exit funktion auszuführen?
    Daher ich möchte den $GUI_EVENT_CLOSE Event abfangen und nur das angeklickte Fenster schliessen lassen.

    Vielen Dank für eure Hilfe :)

    Fr34k

    Einmal editiert, zuletzt von Fr34k (23. Januar 2012 um 15:43)

    • Offizieller Beitrag

    Schau dir mal GUIGetMsg genau in der Hilfe an.
    Es gibt auch einen erweiterten Modus.

  • Sucht du das hier?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    $hGui1 = GUICreate("1")
    GUISetState()
    $hGui2 = GUICreate("2")
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $GUI_EVENT_CLOSE = $nMsg
    $del = GUIDelete($hGui2)
    If $del = 0 Then
    Exit
    EndIf
    EndSelect
    WEnd

    [/autoit]
  • Hallo Fr34k,

    hier ein Beispiel das den Extended-Modus von GuiGetMsg verwendet:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>

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

    Global $idGui1, $idGui2=-99, $idMsgBox, $idZurueck, $idbtnExit2
    _CreateGui2() ;entweder hier oder erst wenn benötigt ($idbtmToGui2 Klick)

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

    $idGui1 = GUICreate('GUI 1', 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    ;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $idGui1 gespeichert
    ;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

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

    $idbtnToGui2 = GUICtrlCreateButton('&Aufruf GUI 2', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnICQ = GUICtrlCreateButton('&ICQ', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "ICQ" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnExit1 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    GUISetState(@SW_SHOW, $idGui1)

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

    While 1
    $nMsg = GUIGetMsg(1) ;extended Modus wichtig!!
    Switch $nMsg[1] ;für welches Fenster ist die Message
    Case $idGui1 ;ab hier ist Gui 1 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idbtnToGui2
    ;GUISetState(@SW_Hide, $idGui1) ;Gui 1 verstecken, damit nur Gui2 sichtbar ist und bearbeitet werden kann
    GUISetState(@SW_DISABLE, $idGui1) ;oder Gui 1 disablen, damit nur Gui2 bearbeitet werden kann
    ;If $idGui2 = -99 Then _CreateGui2() ;nur wenn nicht am Anfang bereits erzeugt nötig, dann auf Vorbelegung der Variable in Global achten)
    GUISetState(@SW_SHOW, $idGui2) ;Gui 2 anzeigen
    Case $idbtnICQ
    MsgBox(0,"","Jetzt würde ICQ gestartet",0,$idGui1)
    ;Run("C:\Program Files\ICQ7.0\ICQ.exe")
    Case $idbtnExit1, $GUI_EVENT_CLOSE
    _end()
    EndSwitch
    Case $idGui2 ;ab hier ist Gui 2 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idMsgBox
    MsgBox(0, 'Test', 'Test', 0, $idGui2)
    Case $idZurueck, $GUI_EVENT_CLOSE
    ;GUISetState(@SW_Show, $idGui1) ;Gui 1 wieder anzeigen
    GUISetState(@SW_ENABLE, $idGui1) ;oder Gui 1 wieder zur Bearbeitung zulsassen
    GUISetState(@SW_HIDE, $idGui2) ;Gui 2 verstecken
    Case $idbtnExit2
    _end()
    EndSwitch
    EndSwitch
    WEnd

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

    Func _CreateGui2()
    $idGui2 = GUICreate('GUI 2', 500, 300, 200, 50, -1, -1, $idGui1) ;wichtig ist der letzte Parameter falls beide gleichzeitig sichtbar sein sollen
    ;erzeugt eine GUI als Child von Gui1, die zurückgebebene ID wird in der Variablen $idGui2 gespeichert

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

    $idMsgBox = GUICtrlCreateButton('&MsgBox', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "MsgBox" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idZurueck = GUICtrlCreateButton('&Zurück zu GUI 1', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "zurück" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnExit2 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "beenden" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
    EndFunc ;==>_CreateGui2

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

    Func _end()
    GUIDelete($idGui2)
    GUIDelete($idGui1)
    Exit
    EndFunc ;==>_end

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

    mfg autoBert

    • Offizieller Beitrag

    Hier ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    $gui1 = GUICreate('GUI 1', 500, 300, -1, -1)
    $button1 = GUICtrlCreateButton('Aufruf GUI 2', 20, 20, 100, 21)

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

    $gui2 = GUICreate('GUI 2', 500, 300, -1, -1)
    $button2 = GUICtrlCreateButton('Zurück zu GUI 1', 20, 20, 100, 21)

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

    GUISetState(@SW_SHOW, $gui1)

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

    While 1
    $msg = GUIGetMsg(1)
    Switch $msg[1] ; window-handle
    Case $gui1
    Switch $msg[0] ; event/control-handle
    Case $button1
    GUISetState(@SW_HIDE, $gui1)
    GUISetState(@SW_SHOW, $gui2)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Case $gui2
    Switch $msg[0]
    Case $button2
    GUISetState(@SW_SHOW, $gui1)
    GUISetState(@SW_HIDE, $gui2)
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_SHOW, $gui1)
    GUISetState(@SW_HIDE, $gui2)
    EndSwitch
    EndSwitch
    WEnd
    ; Ende

    [/autoit]


    Edit:
    Autoberts Beispiel ist besser. Das hatte ich auch gesucht, aber nicht gefunden. :D

  • Mir ist klar wie das ganze mit 2 Guis geht. Jedoch habe ich insgesamt 9 GUIs. Hierfür müsste ich bei einem Close Befehl wissen welche geöffnet sind...

    • Offizieller Beitrag

    Da gaze geht auch mit 100 GUI's. Du mußt dir schon selbst en bisschen Arbeit machen.
    Ausserdem könne wir ja nicht Wissen, wieviele GUI's du benutzt.
    Nirgends steht das geschrieben und ich sehe auch keinen Code. ;)

  • Und wie geht das mit 100 GUI's? Von wo weiss ich ob nun das 9. oder das 10. Gui geschlossen wurde, sodass das 8. oder das 9. wieder angezeigt werden soll?

    • Offizieller Beitrag

    Von welchem Fester der schießen Befehl gekommen ist, steht im Array im 1.Element.
    Das Event zum schließen im 0.
    Was beim schließen eines Fensters geschehen soll, mußt du schon selbst scripten.

    Und nochmal zum mitlesen:
    - Helfen ohne richtige Infos ist schwierig
    - Was du gerne haben willst, Wissen wir nicht
    - Scheibchenweise rausrücken der Fakten ist kontraproduktiv

  • [autoit]

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $GUI_EVENT_CLOSE
    $Gui = $nMsg[1]
    If $Gui = $Form6 Or $Gui = $Form7 Or $Gui = $Form8 Or $Gui = $Form9 Then
    GUISetState(@SW_HIDE, $Gui)
    Else
    Exit
    EndIf
    Wend

    [/autoit]


    Thank You Guys :)