Whileschleifen

  • Hallo,
    hab in meinem script eine etwas verzweigte while-schleifenstruktur
    soweit hab ich das prinzip ja schon verstanden und die schleife funktioniert soweit ganz gut
    einziges problem ist das man beim verlassen des 2 fensters (der while-schleife für das $texthttpfenster2)
    wieder zurück in die andere whileschleife kommt
    ich möchte aber das wenn der $OKurl button und anschließend der $OKurl2 button gedrückt wurde, man aus der while 1- und while 2-schleife komplett herauskommt.
    wie setzt man das um?

    Spoiler anzeigen
    [autoit]


    Case ...
    Case $http
    $texthttpfenster = GUICreate("Texteingabe für URL:", 350, 120)
    GUICtrlCreateLabel("Geben sie bitte die URL des Links ein.", 30, 20)
    $texturl = GUICtrlCreateInput("", 30, 45, 290, 23)
    GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
    $OKurl = GUICtrlCreateButton("OK", 90, 80, 75, 25)
    $AbbrechenURL = GUICtrlCreateButton("Abbrechen", 175, 80, 75, 25)
    GUISetState(@SW_SHOW, $texthttpfenster)

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

    While 1
    $texthttpfenster = GUIGetMsg()
    Switch $texthttpfenster
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE)
    ExitLoop
    Case $OKurl
    $texthttpfenster2 = GUICreate("Texteingabe für Name:", 350, 120)
    GUICtrlCreateLabel("Geben sie bitte den Namen des Links ein.", 30, 20)
    $texturl2 = GUICtrlCreateInput("", 30, 45, 290, 23)
    GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
    $OKurl2 = GUICtrlCreateButton("OK", 90, 80, 75, 25)
    $AbbrechenURL2 = GUICtrlCreateButton("Abbrechen", 175, 80, 75, 25)
    GUISetState(@SW_SHOW, $texthttpfenster2)

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

    While 2
    $texthttpfenster2 = GUIGetMsg()
    Switch $texthttpfenster2
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE)
    ExitLoop
    Case $OKurl2
    GUICtrlSetData($text, GUICtrlread($text) & '' & GUICtrlread($texturl2) & '')
    GUISetState(@SW_HIDE)
    GUISetState(@SW_HIDE)
    ExitLoop
    Case $AbbrechenURL2
    GUISetState(@SW_HIDE)
    ExitLoop
    EndSwitch
    WEnd
    Case $AbbrechenURL
    GUISetState(@SW_HIDE)
    ExitLoop
    EndSwitch
    WEnd
    Case ...

    [/autoit]

    3 Mal editiert, zuletzt von Inferior (1. Juli 2010 um 17:48)

  • Also wie ich das sehe bist du mit dem OnEvent Mudus weit besser bedient hier.

    Einfach mal im Forum nach OnEvent Mudus suchen.

    danke schön, werd mich gleich mal schlau machen zwecks dem OnEvent Mudus ;)
    aber an sich ist das was ich da zusammengebastelt habe ja nicht wirklich "falsch" oder?
    es funktioniert ja wirklich super,
    nur das sich die beiden eingabefelder $texthttpfenster und $texthttpfenster2 ständig bis ins unendliche abwechseln
    was ja völlig klar ist aber ich bisher nicht unterbinden konnte..
    könnte man denn nicht am ende der 2. while-schleife irgend etwas setzen
    was dann in der ersten schleife unter case auch zur auswahl steht, wodurch man dann aus der 2 schleife auch heraus kommt
    nur so ne idee... umsetzung bisher fehlgeschlagen :(

  • Hallo Inferior,

    Zitat von Hilfe

    ExitLoop

    Beendet eine While-, Do- oder For-Schleife.

    ExitLoop [level]

    Parameter

    level [optional] Die Ebene der Schleife, die beendet werden soll (Standard ist 1, also die aktuelle Schleife).

    mfg (Auto)Bert

  • Guckt dir mal dieses Beispiel mit zwei GUI Fenstern an, hier gibt es keinerlei Probleme:

    Quick'n'Dirty

    [autoit]

    $hgui1 = GUICreate("a")
    $hbtn1 = GUICtrlCreateButton("gui2", 1, 1)
    GUISetState(@SW_SHOW, $hgui1)
    $hgui2 = guicreate("b")
    $hbtn2 = GUICtrlCreateButton("gui1", 1, 1)
    GUISetState(@SW_HIDE, $hgui2)

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

    while 1
    $nmsg = guigetmsg(1)
    switch $nmsg[1]
    case $hgui1
    Switch $nmsg[0]
    case $hbtn1
    GUISetState(@SW_HIDE, $hgui1)
    guisetstate(@SW_SHOW, $hgui2)
    case -3
    exit
    EndSwitch
    Case $hgui2
    Switch $nmsg[0]
    case $hbtn2
    GUISetState(@SW_HIDE, $hgui2)
    guisetstate(@sw_show, $hgui1)
    case -3
    GUISetState(@SW_HIDE, $hgui2)
    guisetstate(@sw_show, $hgui1)
    EndSwitch
    EndSwitch
    wend

    [/autoit]

    Trotzdem werde ich dir wie viele andere den GUIOnEventMode empfehlen:

    [autoit]

    Opt("GUIOnEventMode", 1) ;An den Anfang deines Skriptes
    GUICtrlSetOnEvent($controlID, "function") ;Wenn z.B. ein Button geklickt wird rufe diese Funktion auf
    GUISetOnEvent($specialeventID, "function") ;Mache das wenn z.B. $GUI_EVENT_CLOSE (Schließen-Button in der Titelleiste wurde gedrückt)

    [/autoit]

    Oder du gibst den Level bei ExitLoop an. (Standart ist 1, die aktuelle Schleife, bei dir ist "2" nötig, dann werden beide Schleifen geschlossen)

  • danke BurakSZ,

    aber bei dir ist genau der selbe effekt wie bei mir
    ich schaff es ja auch die beiden gui fenster nacheinander aufzurufen, jedoch möchte ich das diese das nur EINMAL tun
    das heißt
    gui 1 wartet auf ok knopf
    bei ok schließt sich gui 1
    und gui 2 ist zu sehn wartend auf ok2 knopf
    ok2 knopf gedrückt beide gui sind verschwunden
    OHNE das sich wie das bisher noch der fall ist wieder gui 1 öffnet und das spiel von vorn anfängt

    hab jetzt mal ein wenig mit dem level von exitloop gespielt jedoch werd ich nicht ganz schlau was nun zu tun ist
    1 ist der standart (also aktuelle schleife) welchen wert hat dann eine andere schleife?

    ebenfalls hab ich mich mit dem befehl "AutoItSetOption("GUIOnEventMode", 1)" probiert.. jedoch hab ich da noch weniger durchblick wann ich an welcher stelle was genau verwenden soll..

    was ist den das beste um hier einfach ans ziel zu kommen.. die schleifen funktionieren wie gesagt ja gut.. nur sie sollen ein einziges mal durchlaufen werden

    EDIT:
    das mit dem level 2 bei exitloop hab ich versucht.. funktioniert leider nicht :(
    und Opt("GUIOnEventMode", 1) am anfang des scripts verursacht,
    das ALLE butten mit "GUICtrlSetOnEvent($controlID, "function")" umgeschrieben werden müssen da sonst keiner mehr funktioniert
    nur damit sich diese kleine schleife nicht wiederholt??
    das muss doch irgendwie einfacher gehn, oder?

    2 Mal editiert, zuletzt von Inferior (1. Juli 2010 um 14:03)

  • ok hab meinen fehler gefunden
    waren um genau zu sein mehrere die ich jetzt systematisch ausgebügelt hab :)
    hab letztendlich mit dem level von exitloop gearbeitet
    bei interesse poste ich das script gern.

    gruß Inferior

  • ok hab meinen fehler gefunden
    waren um genau zu sein mehrere die ich jetzt systematisch ausgebügelt hab :)
    hab letztendlich mit dem level von exitloop gearbeitet
    bei interesse poste ich das script gern.

    gruß Inferior

    schön, dann ist dein Problem ja gelöst, schön wäre es allerdings auch wenn du den Thread auf gelöst setzt. Einfach 1. Beitrag bearbeiten, Präfix (nähe Überschrift) ändern und speichern (absenden)

    mfg (Auto)Bert

  • Bei meinem Skript kannst du doch selbst einstellen was passiert, wenn auf ein Button gedrückt wird. Dafür gibts doch

    [autoit]

    Case

    [/autoit]

    ^^ Naja egal.