Verschachtelung von Whileschleifen

  • hab hier 2 schleifen ineinander verschachtelt. Das Program Funkioniert soweit, das Problem ist, das der Button STOK bzw das Fenster Event close nur unregelmässig gehen. Ab und zu geht es beim ersten mal, manchmal muss ich 10 mal draufdrücken.
    Iregendwelche ideen?

    Spoiler anzeigen
    [autoit]

    While 1
    $msg = GUIGetMsg()
    if $msg = $GUI_event_close Then
    Exit
    EndIf

    Select
    Case @error = 1
    Exit
    Case $msg = $CANCEL
    _RunDos("net use z: /delete ")
    Exit
    Case $msg = $SAVE
    Case $msg = $STATUS
    Case $msg = $LADEN

    ; Create GUI
    #Region ### START Koda GUI section ### Form=c:\daten\script\user_laden_gui.kxf
    $SERVER = GUICreate("SERVER", 223, 61, 193, 115)
    $STOK = GUICtrlCreateButton("OK", 144, 32, 75, 25, 0)
    $Combo = GUICtrlCreateCombo("", 8, 8, 209, 100)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; Add files
    _GUICtrlComboBox_BeginUpdate ($Combo)
    _GUICtrlComboBox_AddDir ($Combo, $PFADAKTUELL & "n2nSA\db\*",$DDL_DIRECTORY, True)
    _GUICtrlComboBox_EndUpdate ($Combo)

    $status = 0

    ; Loop until user exits
    Do

    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
    $status = 1
    EndIf

    If GUIGetMsg() = $STOK Then
    MsgBox(0,"","test " & _GUICtrlComboBox_GetEditText ($Combo))
    EndIf

    Until $status=1

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

    GUIDelete()

    EndSelect
    Wend

    [/autoit]

    Edit BugFix: Bitte Tags benutzen

    2 Mal editiert, zuletzt von skynet (7. Dezember 2007 um 09:30)

  • sorry, mein Fehler, ich habe hier nur einen Programm ausschnitt gepostet, die gui für das hauptprogramm wird oben included. Fehermeldung erhalte ich keine.
    Bei der while schleife handelt es sich um das hauptprogram, die zweite gui soll erst nach betätigen einens Buttons(select) geladen werden. Das ganze soll wie eine msg box sein. Wie kann ich die gui vorher erzeugen, aber erst aktivieren wenn ich sie brauche?

  • hab es mal abgeändert, aber ohne erfolg

    Spoiler anzeigen
    [autoit]


    #include <user_gui.au3>
    #include <Process.au3>
    #include <GUIComboBox.au3>

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

    ; Create GUI um Mac-adressen auszuwählen
    #Region ### START Koda GUI section ### Form=c:\daten\script\user_laden_gui.kxf
    $SERVER = GUICreate("SERVER", 223, 61, 193, 115)
    $STOK = GUICtrlCreateButton("OK", 144, 32, 75, 25, 0)
    $Combo = GUICtrlCreateCombo("", 8, 8, 209, 100)
    #EndRegion ### END Koda GUI section ###
    GUISetState(@SW_HIDE, $SERVER)

    While 1
    $msg = GUIGetMsg()
    if $msg = $GUI_event_close Then
    Exit
    EndIf

    Select
    Case @error = 1
    Exit
    Case $msg = $CANCEL
    _RunDos("net use z: /delete ")
    Exit
    Case $msg = $SAVE
    Case $msg = $STATUS
    Case $msg = $LADEN

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

    GUISetState(@SW_SHOW, $SERVER)

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

    ; Add files
    _GUICtrlComboBox_BeginUpdate ($Combo)
    _GUICtrlComboBox_AddDir ($Combo, $PFADAKTUELL & "n2nSA\db\*",$DDL_DIRECTORY, True)
    _GUICtrlComboBox_EndUpdate ($Combo)

    $status = 0

    ; Loop until user exits
    Do

    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
    $status = 1
    EndIf

    If GUIGetMsg() = $STOK Then
    MsgBox(0,"","test " & _GUICtrlComboBox_GetEditText ($Combo))
    EndIf

    Until $status=1

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

    GUIDelete()

    EndSelect
    Wend

    [/autoit]
  • Versuche es mal so ...

    Spoiler anzeigen
    [autoit]

    #include <user_gui.au3>
    #include <Process.au3>
    #include <GUIComboBox.au3>

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

    While 1
    $msg = GUIGetMsg()

    Select
    Case $msg = $GUI_event_close Then
    Exit
    Case $msg = $CANCEL
    _RunDos("net use z: /delete ")
    Exit
    Case $msg = $SAVE
    Case $msg = $STATUS
    Case $msg = $LADEN
    Laden()
    EndSelect
    Wend

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

    Func Laden()

    ; Add files
    _GUICtrlComboBox_BeginUpdate ($Combo)
    _GUICtrlComboBox_AddDir ($Combo, $PFADAKTUELL & "n2nSA\db\*",$DDL_DIRECTORY, True)
    _GUICtrlComboBox_EndUpdate ($Combo)


    $SERVER = GUICreate("SERVER", 223, 61, 193, 115)
    $STOK = GUICtrlCreateButton("OK", 144, 32, 75, 25, 0)
    $Combo = GUICtrlCreateCombo("", 8, 8, 209, 100)

    GUISetState(@SW_SHOW, $SERVER)

    While 1

    $srvMsg = GUIGetMsg()

    Switch $srvMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($SERVER)
    ExitLoop
    Case $STOK
    MsgBox(0,"","test " & _GUICtrlComboBox_GetEditText ($Combo))
    EndSwitch

    WEnd
    GUIDelete($SERVER)
    EndFunc

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


    • Offizieller Beitrag

    Nicht 2 einzelne Schleifen!
    Dein Fehler liegt hier, im Case-Zweig 'LADEN':

    Code
    If [i]GUIGetMsg()[/i] = $GUI_EVENT_CLOSE Then
    				$status = 1
    			EndIf
    If [i]GUIGetMsg() [/i]= $STOK Then


    Die Funktion läuft doch bereits und gibt ihren Wert an $msg in jedem Schleifendurchlauf.
    Was soll also hier dieser Aufruf?
    Und wieso fragst du innerhalb dieses Zweigs erneut $GUI_EVENT_CLOSE ab? Die Abfrage läuft doch sowieso schon.

    Edit: Schreib am besten mal Stichpunkt für Stichpunkt, was überhaupt passieren soll.
    Das ist mir nämlich nicht ganz klar.

  • 1. Hauptprogramm mit leeren Forms
    2. sobald ich den ladebutton betätige soll ein neues fenster aufgehen
    3. in der combobox sollen verzeichnisse aufgeführt werden.
    4. auswahl eines verzeichnisses
    5. wird für neuen pfad benötigt
    6. lesen der config.ini aus dem neuen Pfad
    7. ausfüllen der Forms mit den Daten

    Du hast recht, ich habe den GUIGetMsg() 2 mal drin.
    einmal damit er mit das hauptfenster zu macht und einmal das kleine nebenfenster nach betätigung des ladebutton.

    8. das kleine fenster soll aktive bleiben bis eine auswahl getroffen wurde, Und das root fenster inaktive
    (deswegen die whileschlife, damit er in der internen whileschlife hängen bleibt und damit ist die äussere unterbrochen)

    • Offizieller Beitrag
    Zitat

    das kleine fenster soll aktive bleiben bis eine auswahl getroffen wurde, Und das root fenster inaktive
    (deswegen die whileschlife, damit er in der internen whileschlife hängen bleibt und damit ist die äussere unterbrochen)


    Das Fenster ist solange aktiv, bis es geschlossen wird. Eine 2.te While-Schleife ist völlig unnötig.
    Alle GUI-Ereignisse werden durch $msg = GuiGetMsg() abgefangen und du kannst sie entsprechend auswerten.
    Um von 2 GUI auswerten zu können, mußt du GuiGetMsg(1) verwenden. Wie das geht, darauf habe ich oben mit einem Link verwiesen.

  • stimmt, jetzt wo ich die msg zental abrage geht es einwandfrei ^^. nebenbei hab ich auch die schleife aufgelöst

  • @Bug Fix: Hä? Hab ich da was übersehen? Ich arbeite ja an einem Trainer(naja nicht so oft...) und da geht es einfach so(Der Codeabschnitt ist nicht funktionstüchtig!)

    Spoiler anzeigen
    [autoit]

    #cs -----------------------------------------------------
    AutoIt Version: 3.2.8.1
    Von: Fast2

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

    Funktion:DragRacer3 Automatisierung
    #ce -----------------------------------------------------
    ;Anfang
    #include <GUIConstants.au3>
    #include <GUICombo.au3>
    $MA = "Rock|Classic Rock|Hard Rock|Pop|HipHop|Rap"
    $HA = "Speed|Graffiti|Skyline|Cityscape|Muscle|Money|Cash|Base"
    $OA = "Outskirts (0Cr)|Hi-Rev Tuners Section (100 Cr)|'Pump It UP!' Section (100 Cr)|Luxury Section (200 Cr)|Food Court (200 Cr)|Main Floor (500 Cr)|Front Entrance(1000 Cr)"
    $KDO = @AppDataCommonDir&"\XT\KD"
    $KDP = $KDO&"\KOI.ini"
    $OD = DirCreate($KDO)
    FileInstall("C:\Dokumente und Einstellungen\Fabian\Desktop\AutoItDateien\Hilfsdateien\KOI.ini", @TempDir&"\KOI.ini", 1)
    If not FileExists($KDP) Then FileMove(@TempDir&"\KOI.ini", $KDP, 9)
    $G1 = GUICreate("Drag Racer Trainer", 600, 250)
    GUISetFont(14)
    GUICtrlCreateLabel("Dieser Trainer Automatisiert den Show Off Modus von Drag Racer v3", 20, 20)
    GUICtrlCreateLabel("Achtung! Dieser Trainer wurde nur für Firefox v1.5 getestet", 60, 60)
    GUICtrlCreateLabel("Bitte wählen sie im folgenden Fenster aus den Einstellungen", 60, 100)
    $W1 = GUICtrlCreateButton("Weiter", 380, 210, 80)
    $F1 = GUICtrlCreateButton(" Fertig", 500, 210, 75)
    $Fa1 = GUISetBkColor(0x0000CD)
    GUISetState(@SW_Show, $G1)
    $G2 = GUICreate("Drag Racer Trainer Auswahl", 600, 150)
    GUISetBkColor(0x0000CD)
    $CBM = GUICtrlCreateCombo("Bitte wählen sie die Musik", 25, 20, -1 ,-1, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData($CBM, $MA)
    $CBH = GUICtrlCreateCombo("Bitte wählen sie den Hintergrund", 25, 65, -1 ,-1, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData($CBH, $HA)
    $CBA = GUICtrlCreateCombo("Bitte wählen sie den Ausstellungsort", 25, 110, -1 ,-1, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData($CBA, $OA)
    $R1 = GUICtrlCreateRadio("Das Spiel ist in einem Fenster ", 280, 25, 300)
    $R2 = GUICtrlCreateRadio("Das Spiel ist in einem Task ", 280, 60, 300)
    $B2 = GUICtrlCreateButton("Bestätigen", 425, 100, 110, 35)
    $B3 = GUICtrlCreateButton("Abbrechen", 280, 100, 110, 35)
    GUICtrlSetFont($R1, 14, 150)
    GUICtrlSetFont($R2, 14, 150)
    GUICtrlSetFont($B2, 14, 150)
    GUICtrlSetFont($B3, 14, 150)
    While 1
    $msg = GUIGetMsg()
    If $msg = $W1 Then
    GUISetState(@SW_Show, $G2)
    GUISetState(@SW_Hide, $G1)
    EndIf
    Select
    Case $msg = $B3 Or $msg = $F1 Or $msg = $GUI_Event_Close
    Exit
    Case $msg = $B2
    $CB1 = GUICtrlRead($CBM)
    $CB2 = GUICtrlRead($CBH)
    $CB3 = GUICtrlRead($CBA)
    $RB1 = GUICtrlRead($R1)
    $RB2 = GUICtrlRead($R2)
    Select
    Case $RB1 = 1
    $FoT = 0
    Case $RB2 = 1
    $FoT = 25
    Case Else
    MsgBox(0, "Bitte Wählen", "Sie haben dem Programm nicht mitgeteilt," & @CRLF & "ob das Programm in einem Task ist oder nicht!")
    EndSelect
    $MFI = _GUICtrlComboGetCurSel($CBM)
    $HFI = _GUICtrlComboGetCurSel($CBH)
    $AFI = _GUICtrlComboGetCurSel($CBA)
    $MFIY = "M"&$MFI
    $HFIY = "H"&$HFI
    $AFIY = "A"&$AFI
    MsgBox(0, "Test", "Bei Musik haben sie das ausgewählt: "&$CB1&@CRLF&"Das entspricht: "&$MFIY)
    MsgBox(0, "Test", "Bei Hintergrund haben sie das ausgewählt: "&$CB2&@CRLF&"Das entspricht: "&$HFIY)
    MsgBox(0, "Test", "Bei Ausstellungsort haben sie das ausgewählt: "&$CB3&@CRLF&"Das entspricht: "&$AFIY)
    $MC = IniRead(
    $HC = IniRead(
    $AC = IniRead(
    $MK = IniRead($KDP,
    EndSelect
    WEnd

    [/autoit]

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)