2. GUI schließen und die Haupt-GUI weiter laufen lassen

  • Hi,

    Jetzt, wo ich mich um den Anfangsdialog meines Programm kümmere, wollte ich für bestimmte Voreinstellungen eine Passwortabfrage einbauen. Die Abfrage habe ich dabei in einer Funktion geregelt. Das Problem ist jetzt, dass ich die 2. GUI (aus der Funktion) nach der Abgfrage nicht schließen kann.

    Ich habe das Ganze mal so weit gekürzt, wie ich konnte. ich Hoffe es geht so:

    [autoit]

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

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

    Global $x = 0
    Global $grx = 500
    Global $gry = 600 ; Fenstergröße
    Global $zahl = 0 ; Sicherheitsvariable
    Global $cont = 1500 ;Pause zur Kontrolle vor dem Fortfahren
    Global $hGUI = 1 ; Handle für Hauptfenster
    Global $msg [2] = [0, 0]
    Global $PC = 100
    Global $hWeiterButton = 1
    Global $hCancelButton = 1
    Global $hPC_Combo = 1
    Global $hProgTab = 1
    Global $hTab1 = 1
    Global $hTab2 = 1
    Global $Checkbox1 [2] = [1, 1]
    Global $Checkbox2 [2] = [1, 1]

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

    $hGUI=GUICreate("Automatische PC-Einrichrung", $grx, $gry)
    GUICtrlCreateLabel("Willkommen bei der Automatischen Einrichtung für Ihren PC.", 20, 10)
    $hWeiterButton=GUICtrlCreateButton("&Weiter", $grx-(60+20), $gry-(25+20), 60, 25)
    $hCancelButton=GUICtrlCreateButton("&Abbrechen", $grx-(60+60+10+20), $gry-(25+20), 60, 25)
    GUICtrlCreateLabel("Wählen sie eine der Voreinstellungen:", 20, 40)
    $hPC_Combo=GUICtrlCreateCombo ("Benutzerdefiniert", 205,38, 110, 20)
    GUICtrlSetData($hPC_Combo,"Einstellung1|Einstellung2","Benutzerdefiniert")

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

    If 1 Then
    $hProgTab=GUICtrlCreateTab(20, 70, 460, 30)
    $hTab1=GUICtrlCreateTabItem ("Tab1")
    $Checkbox1[0]=GUICtrlCreateCheckbox("Checkbox1", 20, 100)

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

    $hTab2=GUICtrlCreateTabItem ("Tab2")
    $Checkbox2[0]=GUICtrlCreateCheckbox("Checkbox2", 20, 100)

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

    GUICtrlCreateTabItem ("")
    EndIf

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

    GUISetState(@SW_SHOW)

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

    If 1 Then ;Alle Checkboxen Aktivieren und Unchecken
    GUICtrlSetState($Checkbox1 [0], $GUI_ENABLE)
    GUICtrlSetState($Checkbox2 [0], $GUI_ENABLE)

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

    GUICtrlSetState($Checkbox1 [0], $GUI_UNCHECKED)
    GUICtrlSetState($Checkbox2 [0], $GUI_UNCHECKED)
    EndIf

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

    While 1
    $msg = GUIGetMsg(1)
    If $msg[0] = $hCancelButton Then $msg[0] = $GUI_EVENT_CLOSE

    Select ; Buttons
    Case $msg[0] = $hWeiterButton
    MsgBox(0, "", "Weiter")
    EndSelect

    Select ;Combobox beim ändern einer Checkbox auf Benutzerdefiniert setzen und Variable der Checkbox anpassen
    Case $msg[0] = $Checkbox1[0]
    $Checkbox1[1]=GUICtrlRead($msg[0])
    GUICtrlSetData($hPC_Combo,"Benutzerdefiniert")
    If $Checkbox1[1]<>1 Then $Checkbox1[1]=0

    Case $msg[0] = $Checkbox2[0]
    $Checkbox2[1]=GUICtrlRead($msg[0])
    GUICtrlSetData($hPC_Combo,"Benutzerdefiniert")
    If $Checkbox2[1]<>1 Then $Checkbox2[1]=0
    EndSelect

    Select ;Pulldown-Menü
    Case $msg[0] = $hPC_Combo
    $PC=GUICtrlRead($hPC_Combo)

    Switch $PC
    Case "Benutzerdefiniert"
    MsgBox(0, "", $PC)
    Case "Einstellung1"
    $x=_PW_Check($PC, "Passwort1")
    If $x=1 Then
    _EigenIniRead(@ScriptDir & "\select.ini", "Desktop")
    _CheckBoxes()
    Else
    GUICtrlSetData($hPC_Combo,"Benutzerdefiniert")
    EndIf
    Case "Einstellung2"
    $x=_PW_Check($PC, "Passwort2")
    If $x=1 Then
    _EigenIniRead(@ScriptDir & "\select.ini", "Desktop")
    _CheckBoxes()
    Else
    GUICtrlSetData($hPC_Combo,"Benutzerdefiniert")
    EndIf
    EndSwitch

    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $hGUI
    Exit
    EndSelect
    WEnd

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

    Exit

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

    Func _PW_Check($PCName, $PWist)
    Local $hPW = 1 ; Handle für Passwortabfrage
    Local $PW = 0 ; eingegebenes Passwort
    Local $msgPW = 0
    Local $hPWInputBox = 0
    Local $hPWOKButton = 0
    Local $hPWCancelButton = 0
    Local $PWx = 10
    Local $PWy = 80
    Local $PWzahl = 0
    Local $PWhelp = "Tipp"

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

    $hPW=GUICreate("Passworteingabe für " & $PCName, 350, 140)
    GUICtrlCreateLabel("Die von Ihnen ausgewählte Voreinstellung ist Passwortgeschützt.", 10, 10)
    GUICtrlCreateLabel("Geben Sie das Passwort ein, oder wählen Sie Abbrechen um mit einer" & @CRLF & " anderen Auswahl fort zu fahren", 10, 35)
    GUICtrlCreateLabel("Passwort:", $PWx, $PWy)
    $hPWInputBox=GUICtrlCreateInput("", $PWx, $PWy+16, 150, 20, $ES_PASSWORD)
    GUICtrlCreateLabel("Hinweis: " & $PWhelp, $PWx, $PWy+36)
    $hPWOKButton=GUICtrlCreateButton("OK", 300, 110, 40, 23)
    $hPWCancelButton=GUICtrlCreateButton("Abbrechen", 230, 110, 60, 23)
    GUISetState(@SW_SHOW)

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

    While 1
    $msgPW = GUIGetMsg()
    If $msgPW = $hPWCancelButton Then $msgPW = $GUI_EVENT_CLOSE

    Select
    Case $msgPW = $hPWOKButton
    $PW=GUICtrlRead($hPWInputBox)
    If $PW==$PWist And $PWzahl<2 Then
    Return 1
    ExitLoop
    ElseIf $PWzahl<1 Then
    MsgBox(0, "Falsche Eingabe", "Das eingegebene Passwort ist Falsch." & @CRLF & "Achten sie auf Groß- und Kleinschreibung." & @CRLF & @CRLF & "Sie haben 1 Versuch übrig")
    ControlSetText($hPW, "", $hPWInputBox, "")
    $PWzahl=$PWzahl+1
    Else
    Return 100
    ExitLoop
    EndIf
    Case $msgPW = $GUI_EVENT_CLOSE
    Return 0
    ExitLoop
    EndSelect
    WEnd
    EndFunc

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

    Func _EigenIniRead($iniFile, $section) ;Voreingestellte Werte aus Ini lesen
    EndFunc

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

    Func _CheckBoxes() ;Checken der Checkboxes nach Ini-Angabe
    EndFunc

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

    exit

    [/autoit]


    Wäre super, wenn mir einer helfen könnte. Ich will die 2. GUI zur PW-Abfrage schließen, ohne das gesamte Script beenden zu müssen.

    Edit:
    Kommando Zurück. Ich habe eine Lösung gefunden. Mit der Funktion GUIDelete() lässt sich das Fenster schließen, wenn ich sie nach dem Beenden der Funktion _PW_Check() verwende und nicht am Ende dieser Funktion. Warum das so ist, weiß ich leider nicht.

    Wenn ein Admin oder Mod so nett wäre, diese unnütze Frage bitte zu löschen?

    Einmal editiert, zuletzt von Mistil (4. August 2013 um 20:10) aus folgendem Grund: Gelöst

  • Würd ich mit GUIOnEventMode machen


    Abgeändertes Beispiel

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    $mainwindow = GUICreate("Hallo Welt", 200, 100, 100, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlCreateLabel("Hallo Welt! Wie geht's?", 30, 10)
    $okbutton = GUICtrlCreateButton("OK", 100, 50, 60)
    GUICtrlSetOnEvent($okbutton, "OKButton")
    $okbutton = GUICtrlCreateButton("GUI 2 öffnen", 10, 50, 70)
    GUICtrlSetOnEvent($okbutton, "OpenGUI2")

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

    $mainwindow2 = GUICreate("Hallo Welt2", 300, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlCreateLabel("GUI 2", 30, 10)
    $okbutton = GUICtrlCreateButton("OK", 10, 50, 60)
    GUICtrlSetOnEvent($okbutton, "OKButton")

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

    GUISetState(@SW_SHOW, $mainwindow)
    GUISetState(@SW_SHOW, $mainwindow2)

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

    Func OpenGUI2()
    GUISetState(@SW_SHOW, $mainwindow2)
    WinActivate("Hallo Welt2")
    EndFunc ;==>OpenGUI2

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

    Func OKButton()
    MsgBox(0, "GUI Event", "Gleiche funktion auf beiden GUIs")
    EndFunc ;==>OKButton

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

    Func CLOSEClicked()
    If @GUI_WinHandle = $mainwindow Then
    MsgBox(0, "GUI Event", "Programm wird beendet")
    Exit
    EndIf
    If @GUI_WinHandle = $mainwindow2 Then
    MsgBox(0, "GUI Event", "GUI 2 wird geschlossen. GUI 1 bleibt")
    GUISetState(@SW_HIDE, $mainwindow2)
    ;GUIDelete($mainwindow2) ;Nur wenn dass GUI ganz sicher nicht mehr geöffnet werden kann
    EndIf
    EndFunc ;==>CLOSEClicked

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

    While 1
    Sleep(10)
    WEnd

    [/autoit]

    /edit: GUIDelete() ohne Parameter löscht die zuletzt genutzte GUI