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
Code : Tout sélectionner
#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(-1, "_stop")
GUISetState()
For $i = 1 to 1000
If $stop Then Exitloop
GuiCtrlSetData($label, $i)
Sleep(300)
Next
Msgbox(0,"", "stopped")
Func _stop()
$stop = 1
EndFunc
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 = 0GUICreate("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)WEndFunc _start
() For $i = 1 to 1000 If $stop Then Exitloop GuiCtrlSetData($label, $i) Sleep(300) Next Msgbox(0,"", "stopped")EndFuncFunc _stop
() $stop = 1EndFunc
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

)
#include <GUIConstantsEx.au3>#include <WindowsConstants.au3>Opt("GuiOnEventMode", 1)Global $stop = 0GUICreate("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)WEndFunc _start
() For $i = 1 to 1000 If $stop Then Exitloop GuiCtrlSetData($label, $i) Sleep(300) Next Msgbox(0,"", "stopped")EndFuncFunc _WM_COMMAND
($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam If BitAND($wParam, 0xFFFF) = $btn Then $stop = 1 Return 'GUI_RUNDEFMSG'EndFunc