Endlosloop Start-Stop

  • Hallo,

    habe mal wieder ein Problem mit einem Loop.

    Folgendes:
    Wenn ich den Button anklicke,
    dann soll der Loop endlos laufen und erst
    aufhören, wenn ich den Button erneut drücke.

    [autoit]


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

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

    $Form3 = GUICreate("Form3", 403, 116, 302, 218)
    $Button1 = GUICtrlCreateButton("Blättern", 112, 24, 177, 65)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    While 1
    Sleep(2000)
    Send("{RIGHT}")
    Sleep(50)
    WEnd
    EndSwitch
    WEnd

    [/autoit]

    Gut wäre auch wenn sich die Caption ändert (Weiter/Stop)
    Habe in der Hilfe ExitLoop probiert
    das Problem ist aber wie kann ich das mit nur einem Button machen?

    Liebe Grüße
    Ilse ;)

    3 Mal editiert, zuletzt von Ilse (5. November 2011 um 09:37)

  • Hier mal meine Lösung

    Spoiler anzeigen
    [autoit]

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

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

    $1 = 1
    $Form3 = GUICreate("Form3", 403, 116, 302, 218)
    $Button1 = GUICtrlCreateButton("Blättern", 112, 24, 177, 65)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    GUICtrlSetData($Button1,"Gestartet")
    Do
    $1 += 1
    ToolTip($1,100,100,$1) ; In die Schleife schreibst du dann deine Anweisungen die er machen soll
    Until GUIGetMsg() = $Button1
    GUICtrlSetData($Button1,"Beendet")
    Sleep(1500)
    GUICtrlSetData($Button1,"Blättern")
    EndSwitch
    WEnd

    [/autoit]

    Hier wird einfach der Button erneut abgefragt, also ob der Wert von GuiGetMsg() wieder $Button1 ist.
    Solange bis er wieder gedrückt wird führt er den Code in der Do-Until-Schleife aus.

  • Hallo.
    Hoffe das funzt:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstants.au3>
    #Include <Misc.au3>
    Opt("GUIOnEventMode",1)
    ;==========================> GUIstart
    $Form1 = GUICreate("Test_GUI",200,300)
    $Button1 = GUICtrlCreateButton("Start",50,120,100,80)
    GUICtrlSetOnEvent(-1,"_Create")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit",$Form1)
    GUISetState()
    ;==========================> GUIend

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

    Global $iStartVar = 0,$dll = DllOpen("user32.dll")

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Create()
    If $iStartVar = 1 Then
    $iStartVar = 0
    GUICtrlSetData($Button1,"Start")
    MsgBox(0,"Pause","Wie der Name schon sagt, hier kannst du eine Pause einfügen!")


    Else
    $iStartVar = 1
    GUICtrlSetData($Button1,"Pause")
    MsgBox(0,"Start","Hier kannst du nun deine gewünschte Aktion ausführen")
    Do
    Beep(880,100)
    Until _IsPressed(01,$dll)
    _Create()
    EndIf
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    mfg, Stoani

  • So und alle guten Dinge sind drei ;) hier noch eine andere Version:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Form3 = GUICreate("Form3", 403, 116, 302, 218)
    $Button1 = GUICtrlCreateButton("Blättern", 112, 24, 177, 65)
    GUISetState(@SW_SHOW)

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

    $schleife = 0
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    If $schleife = 0 Then
    AdlibRegister("schleife", 2000)
    GUICtrlSetData($Button1, "Stop")
    $schleife = 1
    Else
    AdlibUnRegister()
    GUICtrlSetData($Button1, "Blättern")
    $schleife = 0
    EndIf
    EndSwitch
    WEnd

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

    Func schleife()
    Send("{RIGHT}")
    Sleep(50)
    EndFunc ;==>schleife

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

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (3. November 2011 um 14:20)

  • Hallo zusammen,

    konnte mich leider jetzt erst wieder melden.

    Erstmal mein Großes Lob an alle.
    Tolle Beispiele.

    Klappt alles SUPER!...

    DANK EUCH!

    Liebe Grüße
    Ilse ;)

  • Hallo,

    ich habe leider noch ein kleines Problem.
    Ich versuche schon eine ganze Zeit das zu lösen
    Meine Frage:

    Kann man den Loop auch mit einer anderen Schaltfläche
    beenden, die dann einen bestimmten Code ausführt? (wenn fertig, dann wieder Start...)

    Also so:
    Klick auf
    Blättern startet
    Klickt man auf
    Button 2 Blättern wird angehalten Code v. Button 2 wird ausgeführt
    wenn fertig
    Blättern geht weiter


    Beispiel

    [autoit]


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

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

    $1 = 1
    $Form3 = GUICreate("Form3", 603, 116, 302, 218)
    $Button1 = GUICtrlCreateButton("Blättern", 112, 24, 177, 65)
    $Button2 = GUICtrlCreateButton("Code 1", 312, 24, 177, 65)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    GUICtrlSetData($Button1,"Gestartet")
    Do
    $1 += 1
    ToolTip($1,100,100,$1) ; In die Schleife schreibst du dann deine Anweisungen die er machen soll
    Until GUIGetMsg() = $Button1
    GUICtrlSetData($Button1,"Beendet")
    Sleep(1500)
    GUICtrlSetData($Button1,"Blättern")
    EndSwitch
    WEnd

    [/autoit]

    Ich habe versucht ein OR einzubauen

    [autoit]


    Until GUIGetMsg() = $Button1 or Button2

    [/autoit]


    das ging leider nicht.
    Habe auch mit ControlClick probiert...

    Liebe Grüße
    Ilse ;)

  • Guten Morgen Schnitzel,

    danke für den erlösenden Tipp!
    Das klappt jetzt, aber der Code des Buttons wird noch nicht direkt ausgeführt!
    Erst nach einem erneuten Klick!

    Habe das probiert

    [autoit]


    Until GUIGetMsg() = $Button1 or GUIGetMsg() = $Button2

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

    If GUIGetMsg() = $Button2 Then ; also wenn die Meldung kommt, dann...
    MsgBox(0,"","Klickt kommt an")
    ;tu was...
    endif

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

    Weißt du wie man das umgehen kann?

    Die Msgbox erscheint gar nicht!

    Grüße
    Ilse ;)

  • Hey, ist ja auch Klar, die Aktion die du gemacht hast in diesem Fall Klicken des Button2 steht nur in dem Moment in der GUIgetMsg() in dem du ihn auch drückst^^

    Folgendes Passiert ..
    ...
    Schleife wird ausgeführt (Bis ein Button gedrückt wird)
    du drückst einen Button
    Schleife wird beendet
    GuigetMsg() = '' (wird wieder auf leeren String oder, Nall, oder nenns wie immer du Willst gesetzt einfach ohne Wert oder 0 ich weiß nicht :D)
    dann kommt deine IF und fragt die GUiGetMsg() ab, diese liefert irgend was anderes aber nicht $Button1 oder auch $Button2, erst beim nächsten Klick liefert sie diesen Wert
    aus diesem Grund passiert erst beim 2ten Klicken etwas


    Gruß Marvin

  • Hallo Protex,

    hier nochmal der abgeänderte Code!

    [autoit]


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

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

    $1 = 1
    $Form3 = GUICreate("Form3", 603, 116, 302, 218)
    $Button1 = GUICtrlCreateButton("Blättern", 112, 24, 177, 65)
    $Button2 = GUICtrlCreateButton("Code 1", 312, 24, 177, 65)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    GUICtrlSetData($Button1,"Gestartet")
    Do
    $1 += 1
    ToolTip($1,100,100,$1) ; In die Schleife schreibst du dann deine Anweisungen die er machen soll
    Until GUIGetMsg() = $Button2 or GUIGetMsg() = $Button1
    Button2()

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

    EndSwitch
    WEnd

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

    Func Button2()
    MsgBox(0,"Code Button 2","Code wird von Button 2 ausgeführt!")
    ControlClick("Form3","","[CLASS:Button; INSTANCE:1]","left")
    endfunc

    [/autoit]

    1. Ich klicke auf Blättern (startet....)
    2. Ich klicke auf den Code Button (Stop, Code....weiter)
    3. Klicke ich aber auf Blättern erneut, sollte angehalten werden.

    Das Problem

    Ich kann nicht mehrere Buttons abarbeiten

    [autoit]


    Until GUIGetMsg() = $Button2 or GUIGetMsg() = $Button1

    [/autoit]

    Stell dir folgendes vor:

    1. Ich habe einen Button (Blättern)
    2. Es gibt etliche andere Buttons mit Code!

    Sobald wenn irgendein andere Button angeklickt wird
    (wie in diesem Beispiel) soll die Blätterfunktion anhalten
    und der Code des Buttons ausgeführt werden.

    also wie kann man den Loop UNTIL

    Until GUIGetMsg() = $Button2 or GUIGetMsg() = $Button1

    auf diese Ereignisse reagieren lassen?


    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (4. November 2011 um 11:43)

  • Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode",1)
    $GUI_001 = GUICreate("001",200,300)
    $Button1 = GUICtrlCreateButton("Start",10,120,50,40)
    GUICtrlSetOnEvent(-1,"_Nummer1")
    $Button2 = GUICtrlCreateButton("Start",140,120,50,40)
    GUICtrlSetOnEvent(-1,"_Nummer2")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit",$GUI_001)
    GUISetState()

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

    Global $001 = 0, $001 = 1,$Button1, $Button2

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

    $001 = 2 ;<=== Damit der nicht von Anfang an mit Button1 anfängt
    While 1
    If $001 = 0 Then
    ;~ Hier musst du die Funktion für Button1 eintragen=============Anfang===================
    Beep(300,100)
    ;~ Hier musst du die Funktion für Button1 eintragen=============Ende===================
    ElseIf $001 = 1 Then
    $i = 0
    ;~ Hier musst du die Funktion für Button2 eintragen=============Anfang=================
    Do
    MsgBox(0, "Zahl $i ist:", $i)
    $i = $i + 1
    Until $i = 10
    ;~ Hier musst du die Funktion für Button2 eintragen=============Ende===================
    $001 = 0
    EndIf
    WEnd


    Func _Nummer1()
    $001 = 0
    EndFunc

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

    Func _Nummer2()
    $001 = 1
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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


    Hoffe das ist ca. was du meinst...

    mfg, Stoani

  • Hallo Stoani,

    ich krieg das nicht hin.

    Hier mal eine Fassung mit Kommentaren

    [autoit]


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

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

    $Form1 = GUICreate("Form1", 681, 208, 663, 194)
    $Pages = GUICtrlCreateButton("Blättern", 24, 24, 219, 169)
    $Button1 = GUICtrlCreateButton("Text 1", 312, 24, 75, 25)
    GUICtrlSetState($Button1, $GUI_DISABLE)
    $Button2 = GUICtrlCreateButton("Text 2", 312, 56, 75, 25)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    $Button3 = GUICtrlCreateButton("Text 3", 312, 88, 75, 25)
    GUICtrlSetState($Button3, $GUI_DISABLE)
    GUISetState(@SW_SHOW)
    $1 = 0

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Pages
    GUICtrlSetState($Button1, $GUI_Enable)
    GUICtrlSetState($Button2, $GUI_Enable)
    GUICtrlSetState($Button3, $GUI_Enable)
    Anzeigen(); Seiten werden durchgeblättert

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

    Case $Button1
    Button1();beim Klicken soll gestoppt werden und Funktion starten
    ;danach läuft die Blätterfunktion weiter!
    Case $Button2;beim Klicken soll gestoppt werden und Funktion starten
    Button2()
    Case $Button3
    Button3()
    EndSwitch
    WEnd

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

    Func Anzeigen()
    Do
    $1 += 1
    Sleep (1000)
    ToolTip($1,600,300,$1)
    Until GUIGetMsg() = $Button1

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

    endfunc

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

    Func Button1()
    Msgbox(0,"","Code Button 1")
    ;Code wird gestartet
    ;wenn fertig
    ;Blätterfunktion macht weiter
    EndFunc

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

    Func Button2()
    Msgbox(0,"","Code Button 2")
    EndFunc

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

    Func Button3()
    Msgbox(0,"","Code Button 3")
    EndFunc

    [/autoit]


    Bin mit deiner Version leider nicht ans Ziel gekommen!

    Liebe Grüße
    Ilse ;)

  • Spoiler anzeigen
    [autoit]


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

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

    Global $1
    Global $intervall

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

    $Form1 = GUICreate("Form1", 681, 208, 663, 194)
    $Pages = GUICtrlCreateButton("Blättern", 24, 24, 219, 169)
    $Button1 = GUICtrlCreateButton("Text 1", 312, 24, 75, 25)
    $Button2 = GUICtrlCreateButton("Text 2", 312, 56, 75, 25)
    $Button3 = GUICtrlCreateButton("Text 3", 312, 88, 75, 25)

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

    GUICtrlSetState($Button1, $GUI_DISABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    GUICtrlSetState($Button3, $GUI_DISABLE)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Pages ; Seiten werden durchgeblättert
    $1 = 0
    GUICtrlSetState($Pages, $GUI_DISABLE)
    GUICtrlSetState($Button1, $GUI_Enable)
    GUICtrlSetState($Button2, $GUI_Enable)
    GUICtrlSetState($Button3, $GUI_Enable)
    for $j=1 to 3 ; solange bis alle 3 Buttons gedrückt wurden
    $intervall = TimerInit()
    Do
    if TimerDiff($intervall)>=1000 Or $1=0 Then Anzeigen() ; nur einmal pro Sekunde
    $abort = GUIGetMsg()
    Until $abort=$Button1 or $abort=$Button2 or $abort=$Button3

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

    GUICtrlSetState($abort, $GUI_DISABLE) ; gedrückten Button deaktivieren
    if $abort = $Button1 Then Button1()
    if $abort = $Button2 Then Button2()
    if $abort = $Button3 Then Button3()
    Next
    ToolTip("") ; fertig
    GUICtrlSetState($Pages, $GUI_Enable)
    EndSwitch
    WEnd

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

    Func Anzeigen()
    $1 +=1
    ToolTip($1,600,300,$1)
    $intervall = TimerInit()
    EndFunc

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

    Func Button1()
    Msgbox(0,"","Code Button 1")
    EndFunc

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

    Func Button2()
    Msgbox(0,"","Code Button 2")
    EndFunc

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

    Func Button3()
    Msgbox(0,"","Code Button 3")
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von misterspeed (5. November 2011 um 00:35)