For Next Schleife beenden durch Klick auf Exit Button

  • Guten Morgen zusammen
    ich möchte gerne eine For Next Schleife durch klicken auf den Exit Button in meinem Formular beenden. Das Problem welches ich habe ist dass ich in der Schleife den Befehl Sleep(4000) benötige und dadurch die Schleife nicht beendet wird wenn ich auf den Exit Button klicke.
    For $i = 1 to 100
    If $msg = $btn_exit then Exitloop
    Befehl 1
    Befehl 2
    Sleep(4000)
    Next

    Einmal editiert, zuletzt von johny1099 (5. Januar 2010 um 10:19)

  • Hi,

    vielleicht so:

    [autoit]

    $bexit = False
    For $i = 1 to 100
    Befehl 1
    Befehl 2
    $start = Timerinit ()
    While TimerDiff ($start) < 4000
    Sleep(1)
    If $msg = $btn_exit then
    $bexit = True
    ExitLoop
    EndIf
    WEnd
    If $bexit Then ExitLoop
    Next

    [/autoit]

    ;-))
    Stefan

  • Hi,

    Code Verbesserung, nachdem ich gelernt habe, dass Exitloop mit Level arbeitet (Sprenger120 gilt der Dank):

    [autoit]

    For $i = 1 to 100
    Befehl 1
    Befehl 2
    $start = Timerinit ()
    While TimerDiff ($start) < 4000
    Sleep(1)
    If $msg = $btn_exit then ExitLoop 2
    WEnd
    Next

    [/autoit]

    ;-))
    Stefan

  • Hi...
    gibts auch etwas ähnliches für den OnEvent Modus?
    Ich würde nämlich auch sehr gerne, mit einem Button-Click, aus einer Schleife ausbrechen.

    Nur habe ich keine Ahnung, mit was ich "$msg" ersetzen muss.

    Ich habs schon damit versucht:

    [autoit]


    If GUIGetMsg = $GUI_EVENT_CLOSE Then
    CLOSE()
    ...

    [/autoit]

    Das Script stürzt dann aber mit dieser Meldung ab:

    Code
    If GUIGetMsg = $GUI_EVENT_CLOSE Then
    If ^ ERROR

    2 Mal editiert, zuletzt von Manta (7. Januar 2011 um 21:16)

  • Hallo manta,

    schau dir Tiny URL Downloader v0.95.5 Build 2011-01-06 von UEZ an, dass ist ein gutes Beispiel wie man im OnEvent-Modus soetwas realisert, Durch Adlib wird die Schleife komplett vermieden.

    Edit: Eine andere Lösung wäre allerdings am Anfang der Func den OnEvent-Modus zu verlassen und ihn später wieder herzstellen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GuiOnEventMode", 1)

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

    Global $Button, $bStop

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

    _example() ;dieses Skript erfüllt seinen Zweck Unterschied in _count2 beachten

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

    Func _example()
    $hGui = GUICreate("test", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $Button = GUICtrlCreateButton("&Start", 0, 20, 100, 20)
    GUICtrlSetOnEvent(-1, "_count")
    GUISetState()
    $bStop = False
    While 1
    Sleep(10)
    WEnd
    EndFunc ;==>_example1

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

    Func _count()
    $bRestoreOnEvent = Opt("GuiOnEventMode", 0)
    If GUICtrlRead($Button) = "&Start" Then
    GUICtrlSetData($Button, "&Stop")

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

    For $i = 1 To 1000
    ConsoleWrite($i & @CRLF)
    if GUIGetMsg() = $Button Then ExitLoop
    Sleep(10)
    Next
    Else
    GUICtrlSetData($Button, "&Start")
    EndIf
    Opt("GuiOnEventMode", $bRestoreOnEvent)
    EndFunc ;==>_count

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    Die nächste mir bekannte Möglichkeit ist in der Schleife mit

    [autoit]

    _IsPressed

    [/autoit]

    eine Taste abzfangen und daraufhin abzubrechen,

    stayawayknight: du hast dir es ja sehr einfach gemacht,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (8. Januar 2011 um 01:07)

  • kleines Beispiel:

    [autoit]


    Opt("GuiOnEventMode", 1)
    ;Guierstellung hier rein
    GuiCtrlCreateButton("Button", 0, 20, 100, 20)
    GuiCtrlSetOnEvent(-1, "set")
    GuiSetState(@SW_SHOW)
    $fBool = True

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

    While $fBool ;Solange $fBool = True ist
    Sleep(10)
    ;Leerlauf
    WEnd

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

    Func set()
    $fBool = False ;Damit ist $fBool nicht mehr True, die Schleife oben wird beendet. (dadurch in diesem Falle auch das Script)
    EndFunc

    [/autoit]

    autoBert: Ja, ist ein einfaches Beispiel, aber ich hab die Fragestellung so verstanden: Klick auf Button -> Schleife beenden. Ich versteh auch nicht wirklich, wieso ihr den Msg-Loop Modus verwenden wollt.

    2 Mal editiert, zuletzt von stayawayknight (8. Januar 2011 um 11:23)

  • autoBert
    Ahhh... vielen Dank.
    Das Script von UEZ ist echt spitze.

    Dann werde ich meine While-Schleife entfernen und durch AdlibRegister ersetzen.


    stayawayknight
    Danke fürs Beispiel.
    Ich Schussel habe aber vergessen zu erwähnen, dass die Schleife mitten in einer Funktion sitzt.
    Deshalb greift das anscheinend nicht.

    Aber mit AdlibRegister habe ich jetzt eine schöne Lösung.


    Danke nochmal... und gn8


    Edit:
    Mit AdlibRegister läufts wunderbar.
    Hier mal ein kleines Beispiel:

    [autoit]


    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)

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

    $GUI = GUICreate("Schleife", 130, 45)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE")
    $Start_DL = GUICtrlCreateButton("Start", 10, 10, 50)
    GUICtrlSetOnEvent(-1, "Start")
    $Stop_DL = GUICtrlCreateButton("Stop", 70, 10, 50)
    GUICtrlSetOnEvent(-1, "Stop")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func Start() ;~ für Einstellungen usw...
    AdlibRegister("SCHLEIFE", 1000)
    EndFunc

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

    Func Stop()
    ToolTip("")
    AdlibUnRegister("SCHLEIFE")
    EndFunc

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

    Func SCHLEIFE() ;~ prüft bei mir z.B. andere Prozesse und gibt die Werte aus
    ToolTip("AdlibRegister läuft...", 0, 0)
    EndFunc

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

    Func CLOSE()
    Exit
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Manta (8. Januar 2011 um 14:45)