[R] sortir d'une boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
pumilio
Niveau 3
Niveau 3
Messages : 32
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

[R] sortir d'une boucle

#1

Message 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
Modifié en dernier par pumilio le lun. 12 mai 2014 09:01, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] sortir d'une boucle

#2

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] sortir d'une boucle

#3

Message 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).
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
pumilio
Niveau 3
Niveau 3
Messages : 32
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

Re: [..] sortir d'une boucle

#4

Message par pumilio »

Merci beaucoup,

J'ai revu tout mon programme en utilisant GUICtrlSetOnEvent. Cela m'a ouvert de nouveaux horizons.
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 13 août 2007 17:38
Localisation : Yvelines
Status : Hors ligne

Re: [R] sortir d'une boucle

#5

Message 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
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] sortir d'une boucle

#6

Message 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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] sortir d'une boucle

#7

Message 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  
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre