Page 1 sur 1

[R] sortir d'une boucle

Posté : ven. 09 mai 2014 15:46
par pumilio
Bonjour,

J'aimerais savoir s'il est possible de sortir de la boucle dans mon exemple suivant :

Je voudrais qu'en cliquant sur le bouton "Annuler" je sorte de la boucle dans la quelle je suis entré en cliquant sur le bouton "Lancer".

Code : Tout sélectionner

$Gui = GUICreate("test")
$lancer = GUICtrlCreateButton("Lancer", 150, 100, 100, 30)
$annuler= GUICtrlCreateButton("Annuler", 150, 200, 100, 30)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $lancer
            For $i = 0 to 60
                sleep(1000)
            Next
        Case $msg = $annuler
            ExitLooP
    EndSelect
WEnd
 
Merci pour votre aide

Re: [..] sortir d'une boucle

Posté : ven. 09 mai 2014 16:34
par mikell
Tu ne peux pas commander la sortie d'une boucle For en mode GuiGetMsg, faut un GuiRegisterMsg ou utiliser le mode évènementiel
Exemple
► Afficher le texte

Re: [..] sortir d'une boucle

Posté : ven. 09 mai 2014 17:02
par TommyDDR
Tout comme mikell, je ne peux que vous conseiller le mode événementiel qui rendra votre code plus claire et tout aussi puissant (voir plus).

Re: [..] sortir d'une boucle

Posté : lun. 12 mai 2014 09:00
par pumilio
Merci beaucoup,

J'ai revu tout mon programme en utilisant GUICtrlSetOnEvent. Cela m'a ouvert de nouveaux horizons.

Re: [R] sortir d'une boucle

Posté : ven. 24 mai 2019 17:34
par corrs78
Bonjour,
je déterre ce sujet car j'ai ce problème de sortie de boucle; or votre solution ne fonctionne pas chez moi.
Je suppose que c'est à cause du while qui affiche ma GUI ?!
#include <GUIConstantsEx.au3>
Opt("GuiOnEventMode", 1)
Global $stop = 0

GUICreate("My GUI")
$label = GUICtrlCreateLabel("", 10, 30, 50, 20)
$btn = GUICtrlCreateButton("Stop", 10, 50, 50, 20)
GUICtrlSetOnEvent($btn, "_stop")
$btn2 = GUICtrlCreateButton("Start", 70, 50, 50, 20)
GUICtrlSetOnEvent($btn2, "_start")
GUISetState()

While 1
   sleep(10)
WEnd

Func _start()
   For $i = 1 to 1000
     If $stop Then Exitloop
     GuiCtrlSetData($label, $i)
     Sleep(300)
   Next
   Msgbox(0,"", "stopped")
EndFunc

Func _stop()
  $stop = 1
EndFunc
 
Merci et bon WE

Re: [R] sortir d'une boucle

Posté : ven. 24 mai 2019 18:40
par jchd
C'est en effet ailleurs qu'il faut mettre le corps du code, les fonctions de gestion d'events doivent rester simplissimes :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>

Opt("GuiOnEventMode", 1)

Global $stop = 1, $cnt = 0

Local $gui = GUICreate("My GUI")
Local $label = GUICtrlCreateLabel("", 10, 30, 50, 20)
GuiCtrlSetData($label, $cnt)
Local $btn1 = GUICtrlCreateButton("Count", 70, 50, 50, 20)
GUICtrlSetOnEvent($btn1, _count)
Local $btn2 = GUICtrlCreateButton("Stop", 10, 50, 50, 20)
GUICtrlSetState ($btn2, $GUI_DISABLE)
GUICtrlSetOnEvent($btn2, _stop)
Local $btn3 = GUICtrlCreateButton("Restart", 130, 50, 50, 20)
GUICtrlSetState ($btn3, $GUI_DISABLE)
GUICtrlSetOnEvent($btn3, _restart)
GUISetOnEvent($GUI_EVENT_CLOSE, __exit)
GUISetState()

While 1
    sleep(10)
    While Not $stop
		$cnt += 1
		GuiCtrlSetData($label, $cnt)
		Sleep(300)
	WEnd
WEnd

Func _count()
	$stop = 0
	GUICtrlSetState ($btn1, $GUI_DISABLE)
	GUICtrlSetState ($btn2, $GUI_ENABLE)
	GUICtrlSetState ($btn3, $GUI_ENABLE)
EndFunc

Func _stop()
	$stop = 1
	GUICtrlSetState ($btn1, $GUI_ENABLE)
	GUICtrlSetState ($btn2, $GUI_DISABLE)
	Msgbox(0,"", "stopped")
EndFunc

Func _restart()
	$cnt = 0
	GuiCtrlSetData($label, $cnt)
EndFunc

Func __exit()
	Exit
EndFunc

Re: [R] sortir d'une boucle

Posté : ven. 24 mai 2019 22:39
par mikell
corrs78 a écrit : ven. 24 mai 2019 17:34Je suppose que c'est à cause du while qui affiche ma GUI ?!
Pas vraiment. C'est surtout que tu ne peux pas interrompre par OnEvent une fonction si elle a elle-même été lancée par OnEvent
Mais c'est pas mort pour autant, tu as encore le GuiRegisterMsg qui est hiérarchiquement un cran au-dessus (comme je l'ai récemment mentionné dans le message #2, il y a 5 ans et 2 semaines 8) )


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

Opt("GuiOnEventMode", 1)
Global $stop = 0

GUICreate("My GUI")
$label = GUICtrlCreateLabel("", 10, 30, 50, 20)
$btn = GUICtrlCreateButton("Stop", 10, 50, 50, 20)
; GUICtrlSetOnEvent($btn, "_stop")
$btn2 = GUICtrlCreateButton("Start", 70, 50, 50, 20)
GUICtrlSetOnEvent($btn2, "_start")
GUISetState()

GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

While not $stop
        sleep(10)
WEnd

Func _start()
        For $i = 1 to 1000
          If $stop Then Exitloop
          GuiCtrlSetData($label, $i)
          Sleep(300)
        Next
        Msgbox(0,"", "stopped")
EndFunc

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
 #forceref $hWnd, $Msg, $lParam
   If BitAND($wParam, 0xFFFF) = $btn Then $stop = 1
  Return 'GUI_RUNDEFMSG'
EndFunc