Do...Until Problem

  • Halli Hallo Hallöle erstmal

    Bin neu hier und beschäftige mich seit gestern mit AutoIt. Hab auch schon mehrere klein programme geschrieben, stehe jetzt aber voll am berg.

    Und zwar will ich eine Do...Until Schleife in mein Programm integrieren.
    Aber jedesmal, wenn ich auf einen Button in der GUI klicke, sind die anderen nicht mehr aktiv, das heisst es geht gar nichts mehr. als ob sich $msg nicht mehr überschreiben lässt...

    Hier mal mein Code:

    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Scooby\Desktop\test.kxf
    $Form1 = GUICreate("Form1", 284, 90, 193, 187)
    $Button1 = GUICtrlCreateButton("Start", -8, 48, 129, 41, 0)
    $Button2 = GUICtrlCreateButton("Stop", 152, 48, 129, 41, 0)
    $Label1 = GUICtrlCreateLabel("Autoklicker", 88, 8, 96, 28)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Button1
    Run("notepad.exe")
    Do
    WinActivate("Unbenannt - Editor")
    WinWaitActive("Unbenannt - Editor")
    Send("Das ist ein Beispieltext.")
    until $msg = $Button2
    Case $msg = $Button2
    WinActivate("Unbenannt - Editor")
    WinClose("Unbenannt - Editor")
    WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    Send("!n")
    case $msg = $GUI_EVENT_CLOSE
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    ExitLoop
    EndSelect
    WEnd

    [/autoit]

    Fragt euch nicht, ob das programm sinn macht oder nicht, es ist einfach zum testen so...

    Ich hoffe ihr könnt mir helfen

    Grüsse aus der schweiz

    Greetz Scooby

    Einmal editiert, zuletzt von Scooby (4. August 2008 um 18:08)

  • Habe nach dem Do die $msg = GUIGetMsg() eingefügt. Leider kein erfolg...
    Sobald ich auf Start klicke, wird der Editor gestartet, und der Text ausgegeben immer und immerwieder, und es gibt keine möglichkeit es zu stoppen.

  • hier mal ein lösungsansatz

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Scooby\Desktop\test.kxf
    $Form1 = GUICreate("Test", 180, 50, 100, 187)
    $Button1 = GUICtrlCreateButton("Start", 10, 20, 70, 17, 0)
    $Button2 = GUICtrlCreateButton("Stop", 100, 20, 70, 17, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg()

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

    Switch $msg

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

    Case $Button1
    Run("notepad.exe")
    Do
    WinActivate("Unbenannt - Editor")
    WinWaitActive("Unbenannt - Editor")
    Send("Das ist ein Beispieltext.")
    until $Button2
    Case $Button2
    WinActivate("Unbenannt - Editor")
    WinClose("Unbenannt - Editor")
    WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    Send("!n")
    case $GUI_EVENT_CLOSE
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    ExitLoop
    EndSwitch
    WEnd

    [/autoit]

    So schreibt er zwar nur einmal in die Datei aber mehr war kurz vorm feierabend net drin ;)

  • Ich glaub das geht net weil sich das fenster ständig wieder mit winaktiv aktiviert und dann kann man den button nicht gut drücken

    [autoit]

    HotKeySet ( "{F1}", "ext" )

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

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Scooby\Desktop\test.kxf
    $Form1 = GUICreate("Form1", 284, 90, 193, 187)
    $Button1 = GUICtrlCreateButton("Start", -8, 48, 129, 41, 0)
    $Button2 = GUICtrlCreateButton("Stop", 152, 48, 129, 41, 0)
    $Label1 = GUICtrlCreateLabel("Autoklicker", 88, 8, 96, 28)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Button1
    Run("notepad.exe")
    Do
    $msg = GUIGetMsg()
    WinWaitActive ( "Unbenannt - Editor" )
    WinActivate ( "Unbenannt - Editor" )
    Send("Das ist ein Beispieltext.")
    until $msg = $Button2
    ;Case $Button2
    ; WinActivate("Unbenannt - Editor")
    ;WinClose("Unbenannt - Editor")
    ;WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    ;Send("!n")
    case $msg = $GUI_EVENT_CLOSE
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    ExitLoop
    EndSelect
    WEnd

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

    Func ext()
    Exit
    EndFunc

    [/autoit]

    wenn du richtig auf dem Stop button rumhämmerst beendet es auch irgendwann :)

    Drück f1 um das script zu beenden

    Du solltest ne funktion für das stoppen schreiben nen button ist da nicht angebracht ich kann dir mal eine editieren mom


    Edit: sooooo Einfach F2 drücken dann wird das ausgefürt was dein Button2 eigentlich machen sollte hab nur noch ein exit dran gehängt nachdem er den editor beendet hat.

    [autoit]

    HotKeySet ( "{F1}", "ext" )
    HotKeySet ( "{F2}", "button2" )

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

    #include <GUIConstants.au3>
    #include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Scooby\Desktop\test.kxf
    $Form1 = GUICreate("Form1", 284, 90, 193, 187)
    $Button1 = GUICtrlCreateButton("Start", -8, 48, 129, 41, 0)
    ;$Button2 = GUICtrlCreateButton("Stop", 152, 48, 129, 41, 0)
    $Label1 = GUICtrlCreateLabel("Autoklicker", 88, 8, 96, 28)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $dll = DllOpen("user32.dll")

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Button1
    Run("notepad.exe")
    Do
    $msg = GUIGetMsg()
    WinWaitActive ( "Unbenannt - Editor" )
    WinActivate ( "Unbenannt - Editor" )
    Send("Das ist ein Beispieltext.")
    until _IsPressed (71, $dll )
    ;Case $Button2
    ; WinActivate("Unbenannt - Editor")
    ;WinClose("Unbenannt - Editor")
    ;WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    ;Send("!n")
    case $msg = $GUI_EVENT_CLOSE
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    ExitLoop
    EndSelect
    WEnd
    DllClose($dll)

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

    Func ext()
    Exit
    EndFunc

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

    Func button2()
    Sleep ( 200 )
    WinActivate("Unbenannt - Editor")
    WinClose("Unbenannt - Editor")
    WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    Send("!n")
    Exit

    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von Greek (29. Juli 2008 um 21:25)

  • Bin jetzt vll etwas zu spät,
    aber:
    Wenn du auf Hotkeys verzichten und bei der GUI bleiben willst,
    dann Streich doch WinWaitActive, WinActivate und Send raus und
    nehm stattdessen ControlSend ;)

    mfg limette

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\Scooby\Desktop\test.kxf
    $Form1 = GUICreate("Form1", 284, 90, 193, 187)
    $Button1 = GUICtrlCreateButton("Start", -8, 48, 129, 41, 0)
    $Button2 = GUICtrlCreateButton("Stop", 152, 48, 129, 41, 0)
    $Label1 = GUICtrlCreateLabel("Autoklicker", 88, 8, 96, 28)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Button1
    Run("notepad.exe")
    Do
    $msg = GUIGetMsg()
    ControlSend( 'Unbenannt - Editor', '', 15, 'Das ist ein Beispieltext' & @CRLF )
    ;CtrlId mit AutoIt Window Info
    Sleep( 200 )
    until $msg = $Button2
    Case $msg = $Button2
    WinActivate("Unbenannt - Editor")
    WinClose("Unbenannt - Editor")
    WinWaitActive("Editor", "Der Text in der Datei Unbenannt wurde verändert")
    Send("!n")
    case $msg = $GUI_EVENT_CLOSE
    MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    ExitLoop
    EndSelect
    WEnd

    [/autoit]

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Vielen Dank für eure Antworten, die Version von Limette gefällt mir am besten. Und ist eigentlich auch so, wie ich mir das vorgestellt habe.
    Aber auch da funktioniert das ganze noch nicht richtig. Ich muss immernoch 2mal auf den Stop Button klicken. einmal um das Do...Until zu stoppen und 1mal um den Editor zu beenden. Geht das nicht auch mit nur einem klick?

    Ich habe auch versucht das @CRLF zu entfernen, und schon ging es wieder nicht mehr. ?(

    Greek
    Ich habe auch schon versucht ein Sleep(2000) einzufügen wegen dem winactivate. hat aber nichts gebracht. konnte, sobald die funktion gestartet wurde nichts mehr machen auf der GUI

  • Moin

    bei dem Script von limette
    unter until $msg = $Button2 einfach ContinueCase einfügen, das hat zur folge, das die anderen Cases auch noch geprüft werden.

    Wenn Du keine Leerzeile haben möchtest mach aus dem @CRLF ein @LF.

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • Ok, danke McPoldy, jetzt kann ich es Stoppen und beenden in einem,
    ABER ich kann es nicht mehr starten oder mit klick auf das X das Fenster schliessen.

    Komische sache...

  • Theoretisch funktioniert die Lösung von mir mit Zusatz des ContinueCase.

    Allerdings wird durch das ControlSend der Focus von der GUI genommen, weshalb es schwierig ist,
    den Button zu klicken :P
    Dann klickt man den auch aus versehen 2x, und zack, sitzt man in dem
    WinWAitActive vor dem Send('!n') fest !

    Warum der Focus von der GUI genommen wird.. hm. Keine Ahnung.
    Ein Vorschlag, der vll nicht zur Lösung, aber zur Verbesserung führt:

    Sleep verlängern,
    Button2 auf DISABLE setzen und nur mit Button1 wieder ENABLEn..
    Oder eben ne Abfrage, ob der Prozess 'notepad.exe' noch läuft.

    Ah, vll die GUI mit nem Always-On-Top attribut ausstatten ? ;)

    mfg, limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • limette ich weiss nicht genau was du meinst.

    @all ich habe schon fast alles probiert, sogar schon mit func etc. aber sobald die schleife einmal gestartet ist, lässt sie sich nicht mehr stoppen. sieht irgendwie so aus, als ob die schleife keine weiteren eingaben zu lässt.

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.12.1
    Author: Scooby

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

    Script Function: Loop Start/Stop Test script

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

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

    $startfenster = GUICreate("Startfenster", 150, 80)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")
    GUICtrlCreateLabel("Loop Start/Stop Test Script", 10, 10)

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

    $startbutton = GUICtrlCreateButton("Start", 10, 45, 60)
    GUICtrlSetOnEvent($startbutton, "start")

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

    $stop = GUICtrlCreateButton("Stop", 80, 45, 60)
    GUICtrlSetOnEvent($stop, "stop")

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

    $dummywindow = GUICreate("Dummy window for testing ", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    GUISwitch($startfenster)
    GUISetState(@sw_show)

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

    $loop = 0
    while 1
    sleep(100)
    WEnd

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

    func close() ;Fenster schliessen wenn X geklickt wird
    If @GUI_WinHandle = $startfenster Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Programm wird geschlossen...", 5)
    Exit
    ElseIf @GUI_WinHandle = $dummywindow Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Dummywindow wird geschlossen...", 5)
    GUISetState(@SW_HIDE)
    GUISwitch($startfenster)
    GUISetState(@SW_SHOW)
    EndIf
    EndFunc

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

    func start() ;Loop starten
    $loop = 1
    loopstat()
    check()
    EndFunc

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

    func stop() ;Loop stoppen
    $loop = 0
    ;MsgBox(0, "Stop", "Du hast Stop geklickt, Programm wird gestoppt...")
    loopstat()
    EndFunc

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

    func loop() ;Hier wird der Loop programmiert
    ;Do
    GUISwitch($dummywindow)
    GUISetState(@SW_SHOW)
    sleep(2000)
    Guiswitch($dummywindow)
    GUISetState(@SW_HIDE)
    sleep(2000)
    check()
    ; until $loop = 0
    EndFunc

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

    func check() ;Hier wird überprüft, ob $loop = 1
    if $loop = 1 Then
    loop()
    EndIf
    EndFunc

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

    func loopstat()
    GUICtrlCreateLabel($loop, 70, 25, 8, 14)
    GUICtrlSetBkColor(-1, 0x00ff00)
    EndFunc

    [/autoit]

    Komisch ist, wenn ich den loop ausklammere, dann läuft das ganze und auch die Eingaben funktionieren, zu sehen dank der func loopstat()

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.12.1
    Author: Scooby

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

    Script Function: Loop Start/Stop Test script

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

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

    $startfenster = GUICreate("Startfenster", 150, 80)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")
    GUICtrlCreateLabel("Loop Start/Stop Test Script", 10, 10)

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

    $startbutton = GUICtrlCreateButton("Start", 10, 45, 60)
    GUICtrlSetOnEvent($startbutton, "start")

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

    $stop = GUICtrlCreateButton("Stop", 80, 45, 60)
    GUICtrlSetOnEvent($stop, "stop")

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

    $dummywindow = GUICreate("Dummy window for testing ", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    GUISwitch($startfenster)
    GUISetState(@sw_show)

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

    $loop = 0
    while 1
    sleep(100)
    WEnd

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

    func close() ;Fenster schliessen wenn X geklickt wird
    If @GUI_WinHandle = $startfenster Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Programm wird geschlossen...", 5)
    Exit
    ElseIf @GUI_WinHandle = $dummywindow Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Dummywindow wird geschlossen...", 5)
    GUISetState(@SW_HIDE)
    GUISwitch($startfenster)
    GUISetState(@SW_SHOW)
    EndIf
    EndFunc

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

    func start() ;Loop starten
    $loop = 1
    loopstat()
    check()
    EndFunc

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

    func stop() ;Loop stoppen
    $loop = 0
    ;MsgBox(0, "Stop", "Du hast Stop geklickt, Programm wird gestoppt...")
    loopstat()
    EndFunc

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

    func loop() ;Hier wird der Loop programmiert
    ;Do
    GUISwitch($dummywindow)
    GUISetState(@SW_SHOW)
    sleep(2000)
    Guiswitch($dummywindow)
    GUISetState(@SW_HIDE)
    sleep(2000)
    check()
    ; until $loop = 0
    EndFunc

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

    func check() ;Hier wird überprüft, ob $loop = 1
    if $loop = 1 Then
    ;loop()
    EndIf
    EndFunc

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

    func loopstat()
    GUICtrlCreateLabel($loop, 70, 25, 8, 14)
    GUICtrlSetBkColor(-1, 0x00ff00)
    EndFunc

    [/autoit]

    Ohne Loop läuft es... also, die start und stop funktionen machen was sie sollen.

    Ach ja ich weiss, ist ein anderes Script, aber das problem ist das selbe, es lässt sich der loop nicht beenden.

    geht das den nicht, mit einem Button den loop starten und mit einem anderen den loop beenden?
    Wenn das geht, dann helft mir. muss nicht undbedingt in mein script integriert werden, das kann ich selbst. *hoff* :thumbup:

  • Wenn ich das richtig sehe ist da folgendes Problem:

    Wenn du die Do-Until-Schleife wieder "aktivierst" ruft sich die Funktion doch mehrmals selbst auf,
    über das 'check'.
    Versuch mal folgendes:
    Klammer den Aufruf von 'check' aus und deklariere auf jeden Fall die Variable $loop global !

    limette =)
    Edit: Kann sein dass das gerade komplett falsch sehe.. irgentwie verwirrt es mich, dass du den
    Code 2x gepostet hast, ich sehe da keinen Unterschied... *Augenreib*

    P.S.: Zu meinem Post davor:
    Wenn man in dem Script 2x auf den Button drückt hängt der, denn beim ersten mal macht er
    das Fenster zu und beim 2. Mal wartet er dann, bis diese Abfrage wieder kommt !
    Deshalb meinte ich, dass du den Stop-Button nur aktivieren, als 'klickbar' machen sollst,
    wenn bereits 'start' gedrückt wurde.
    Und dass der Stop-Button, wenn man ihn klickt, sich sozusagen selbst auf 'disable' stellt, um
    nicht noch einmal gedrückt zu werden ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Könnt ja mal Opt( 'TrayIconDebug', 1 ) einstellen und mal gucken.
    Habs selber nicht getestet :rolleyes:

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Passiert bei dem script überhaupt was? bei mir steht da nur ne grüne 1 bei stop ne grüne 0

    Wo liegt das problem, hab noch net so geblickt was du willst.

    Ja, in diesem fall hast du das 2. script genommen, in dem habe ich den loop auskommentiert. also siehst du nur ob die beiden buttons funktionieren.
    Entferne einfach in Zeile 76 das ; und schon erkennst du mein problem.

    limette
    der unterschied ist in Zeile 76

    • Offizieller Beitrag

    Ich habe Dein Script mal etwas geändert:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

    AutoIt Version: 3.2.12.1
    Author: Scooby

    Script Function: Loop Start/Stop Test script

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

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

    $startfenster = GUICreate("Startfenster", 150, 80)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")
    GUICtrlCreateLabel("Loop Start/Stop Test Script", 10, 10)

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

    $startbutton = GUICtrlCreateButton("Start", 10, 45, 60)
    GUICtrlSetOnEvent($startbutton, "start")

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

    $stop = GUICtrlCreateButton("Stop", 80, 45, 60)
    GUICtrlSetOnEvent($stop, "stop")

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

    $dummywindow = GUICreate("Dummy window for testing ", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    $display = GUICtrlCreateLabel('', 70, 25, 40, 14)
    GUICtrlSetBkColor(-1, 0x00ff00)

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

    GUISwitch($startfenster)
    GUISetState(@SW_SHOW)

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

    $loop = False
    While 1
    Sleep(100)
    If $loop Then loop()
    WEnd

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

    Func close() ;Fenster schliessen wenn X geklickt wird
    If @GUI_WinHandle = $startfenster Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Programm wird geschlossen...", 5)
    Exit
    ElseIf @GUI_WinHandle = $dummywindow Then
    MsgBox(0, "Beenden", "Du hast das rote X geklickt, Dummywindow wird geschlossen...", 5)
    GUISetState(@SW_HIDE)
    GUISwitch($startfenster)
    GUISetState(@SW_SHOW)
    EndIf
    EndFunc ;==>close

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

    Func start() ;Loop starten
    $loop = True
    EndFunc ;==>start

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

    Func stop() ;Loop stoppen
    $loop = False
    EndFunc ;==>stop

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

    Func loop() ;Hier wird der Loop programmiert
    Do
    GUICtrlSetData($display, $loop)
    GUISwitch($dummywindow)
    GUISetState(@SW_SHOW)
    Sleep(2000)
    GUISwitch($dummywindow)
    GUISetState(@SW_HIDE)
    Sleep(2000)
    until $loop = False
    EndFunc ;==>loop

    [/autoit]
  • Wow!!

    Danke Oscar.... So funktioniert es ja wirklich...

    Aber kannst du mir vielleicht erklären warum?

    MFG Scooby

    • Offizieller Beitrag

    Nun, der wesentliche Punkt ist der Aufruf der Loop-Funktion. Bei Dir wird die Loop-Funktion als Folge eines Events aufgerufen und durch die Do...Until-Schleife nicht mehr verlassen. Du blockierst sozusagen die Event-Steuerung.
    Bei mir hingegen wird die Loop-Funktion innerhalb der While...WEnd-Schleife aufgerufen (mit Start-/Abbruch-Bedingung). Die Event-Aufrufe bleiben somit frei und können zum ändern der Start-/Abbruchbedingung ($loop = True/False) genutzt werden.