Page 1 sur 1
[..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 14:37
par Anthony
Bonjour à tous,
Voilà tout est dans le titre.
Pour être un peu plus précis ces 2 boucles For Next exécutent un travail différent très important en 2 étapes mais je dois pouvoir faire stop ou quitter sur les deux étapes de travail.
Là je sèche, çà parait simple mais j'aurais besoin d'une piste
Merci
#include <GuiConstants.au3>;~ #include <GUIConstantsEx.au3>Opt("GuiOnEventMode", 1)Global $StopGUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)Global $Label = GUICtrlCreateLabel("0", 10, 30, 150, 20)Global $idBtn = GUICtrlCreateButton("Start", 10, 50, 50, 20)Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)GUICtrlSetOnEvent( $idBtn, "_Start")GUICtrlSetOnEvent( $idBtn2, "_Stop")GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")GUISetState()While 1 Sleep(100)WEndFunc _Start
() ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Start()"& @CRLF) $Stop = 0 _Working
()EndFuncFunc _Working
() ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 1/2"& @CRLF) For $i = 0 to 250 If $Stop Then Exitloop;~ If $Stop Then Return GuiCtrlSetData($Label, "Job 1 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 2/2"& @CRLF) For $i = 0 to 250 If $Stop Then Exitloop;~ If $Stop Then Return GuiCtrlSetData($Label, "Job 2 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)EndFuncFunc _Stop
() ; <<< Ne fonctionne pas pendant la boucle For Next ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Stop()"& @CRLF) $Stop = 1EndFuncFunc _Exit
() ; <<< Ne fonctionne pas pendant la boucle For Next ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Exit()"& @CRLF) GUIDelete() ExitEndFunc
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 17:02
par walkson
Bonjour,
Il y a peut être plus simple
Code : Tout sélectionner
#include <GuiConstants.au3>
;~ #include <GUIConstantsEx.au3>
#include <WinAPI.au3>
Opt("GuiOnEventMode", 1)
Global $Stop
GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label = GUICtrlCreateLabel("0", 10, 30, 150, 20)
Global $idBtn = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)
GUICtrlSetOnEvent( $idBtn, "_Start")
GUICtrlSetOnEvent( $idBtn2, "_Stop")
GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")
GUISetState()
AdlibRegister("MyAdLibFunc",250)
While 1
Sleep(100)
WEnd
Func _Start()
ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Start()"& @CRLF)
$Stop = 0
_Working()
EndFunc
Func _Working()
ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 1/2"& @CRLF)
For $i = 0 to 250
If $Stop Then Exitloop
;~ If $Stop Then Return
GuiCtrlSetData($Label, "Job 1 ligne " & $i)
Sleep(10)
Next
ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 2/2"& @CRLF)
For $i = 0 to 250
If $Stop Then Exitloop
;~ If $Stop Then Return
GuiCtrlSetData($Label, "Job 2 ligne " & $i)
Sleep(10)
Next
ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc
Func _Stop() ; <<< Ne fonctionne pas pendant la boucle For Next
ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Stop()"& @CRLF)
$Stop = 1
EndFunc
Func _Exit() ; <<< Ne fonctionne pas pendant la boucle For Next
ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Exit()"& @CRLF)
GUIDelete()
Exit
EndFunc
Func MyAdLibFunc()
$hWin = _WinAPI_GetFocus()
$id = _WinAPI_GetDlgCtrlID($hWin)
If $id = $idBtn2 And $Stop = 0 Then _Stop()
EndFunc
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 18:11
par Anthony
Coucou walkson çà fait un petit bout

On touche au but...
J'ai regardé la fonction Adlib que tu as rajouté et quand dans For Next (Ligne 35 $Stop = 0) $Stop reste à 1 dans Func MyAdLibFunc() (Ligne 74) ce qui ne permet pas de continuer le job 2
Adlib peut il récupérer la fonction pour quitter durant le Job 1 & 2 ?
#include <GuiConstants.au3>#include <WinAPI.au3>Opt("GuiOnEventMode", 1)Global $StopGUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)Global $Label = GUICtrlCreateLabel("0", 10, 30, 150, 20)Global $idBtn = GUICtrlCreateButton("Start", 10, 50, 50, 20)Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)GUICtrlSetOnEvent( $idBtn, "_Start")GUICtrlSetOnEvent( $idBtn2, "_Stop")GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")GUISetState()AdlibRegister("MyAdLibFunc",250)While 1 Sleep(100)WEndFunc _Start
() ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Start()"& @CRLF) $Stop = 0 _Working
()EndFuncFunc _Working
() ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 1/2"& @CRLF) For $i = 0 to 500 If $Stop Then $Stop = 0 ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 1/2 $Stop="&$Stop& " $i"&$i& @CRLF) Exitloop EndIf GuiCtrlSetData($Label, "Job 1 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 2/2"& @CRLF) For $i = 0 to 500 If $Stop Then $Stop = 0 ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Working() Step 2/2 $Stop="&$Stop& " $i"&$i& @CRLF) Exitloop EndIf GuiCtrlSetData($Label, "Job 2 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)EndFuncFunc _Stop
() ; <<< Ne termine pas Job 2 pendant la boucle For Next ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Stop()"& @CRLF) $Stop = 1EndFuncFunc _Exit
() ; <<< Ne fonctionne pas pendant les deux boucles For Next Job 1 & 2 ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId
&" _Exit()"& @CRLF) GUIDelete() ExitEndFuncFunc MyAdLibFunc
() $hWin = _WinAPI_GetFocus() $id = _WinAPI_GetDlgCtrlID($hWin) If $id = $idBtn2 And $Stop = 0 Then _Stop
();~ ConsoleWrite( "Line=" & @ScriptLineNumber & " $hWin=" &$hWin& @CRLF);~ ConsoleWrite( "Line=" & @ScriptLineNumber & " @SEC=" &@SEC& @CRLF);~ ConsoleWrite( "Line=" & @ScriptLineNumber & " $Stop="&$Stop & @CRLF)EndFunc
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 18:30
par mikell
IL faut remettre $stop à 0 avant la 2ème boucle, voyons !
Quoique, personnellement je préfère WM_COMMAND
Idem pour pouvoir fermer la gui pendant la boucle, ça serait avec WM_SYSCOMMAND, mais franchement j'en vois pô bien l'utilité...
#include <GuiConstants.au3>#include <WindowsConstants.au3>Global $stop = 0GUICreate("My GUI", 300, 200);, Default, Default, -1, $WS_EX_ACCEPTFILES)Global $Label = GUICtrlCreateLabel("0", 10, 30, 150, 20)Global $idBtn1 = GUICtrlCreateButton("Start", 10, 50, 50, 20)Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)GUISetState()GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _Exit
() Case $idBtn1 _Start
() EndSwitchWEndFunc _Start
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Start()"& @CRLF) $stop = 0 _Working
()EndFuncFunc _Working
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 1/2"& @CRLF) For $i = 0 to 250 If $stop Then Exitloop GuiCtrlSetData($Label, "Job 1 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 2/2"& @CRLF) $stop = 0 For $i = 0 to 250 If $stop Then Exitloop GuiCtrlSetData($Label, "Job 2 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)EndFuncFunc _Stop
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Stop()"& @CRLF) $Stop = 1EndFuncFunc _Exit
() ; <<< Ne fonctionne pas pendant la boucle For Next ConsoleWrite( "Line=" & @ScriptLineNumber & " _Exit()"& @CRLF) GUIDelete() ExitEndFuncFunc _WM_COMMAND
($hWnd, $Msg, $wParam, $lParam) Switch BitAND($wParam, 0x0000FFFF) ; idfrom Case $idBtn2 _Stop
() EndSwitch Return 'GUI_RUNDEFMSG'EndFunc
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 19:26
par walkson
Adlib peut il récupérer la fonction pour quitter durant le Job 1 & 2 ?
Le plus simple est de rajouter un bouton Exit et dans la fonction
If $id = $idBtn3 Then _Exit()
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 19:30
par walkson
Quoique, personnellement je préfère WM_COMMAND
Moi aussi mais il est en mode événementiel
Re: [..] Sortir d'un For Next avec cette structure
Posté : dim. 04 sept. 2022 20:38
par Anthony
Merci tous les deux, je vais regarder çà avant de me coucher, bon appétit.
Re: [..] Sortir d'un For Next avec cette structure
Posté : lun. 05 sept. 2022 08:06
par mikell
walkson a écrit : ↑dim. 04 sept. 2022 19:30
Quoique, personnellement je préfère WM_COMMAND
Moi aussi mais il est en mode événementiel
Je pensais qu'il utilisait le mode événementiel juste pour essayer de résoudre le problème
Mais le GUIRegisterMsg($WM_COMMAND,...) est tout à fait compatible avec ce mode aussi
#include <GuiConstants.au3>#include <WindowsConstants.au3>Opt("GuiOnEventMode", 1)Global $stop = 0GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)Global $Label = GUICtrlCreateLabel("0", 10, 30, 150, 20)Global $idBtn1 = GUICtrlCreateButton("Start", 10, 50, 50, 20)Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)GUISetState()GUICtrlSetOnEvent( $idBtn1, "_Start")GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")While 1 Sleep(100)WEndFunc _Start
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Start()"& @CRLF) $stop = 0 _Working
()EndFuncFunc _Working
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 1/2"& @CRLF) For $i = 0 to 250 If $stop Then ConsoleWrite( " _Working() Step 1 stoppé à $i = " & $i & @CRLF) Exitloop EndIf GuiCtrlSetData($Label, "Job 1 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 2/2"& @CRLF) $stop = 0 For $i = 0 to 250 If $stop Then ConsoleWrite( " _Working() Step 2 stoppé à $i = " & $i & @CRLF) Exitloop EndIf GuiCtrlSetData($Label, "Job 2 ligne " & $i) Sleep(10) Next ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)EndFuncFunc _Stop
() ConsoleWrite( "Line=" & @ScriptLineNumber & " _Stop()"& @CRLF) $Stop = 1EndFuncFunc _Exit
() ; <<< Ne fonctionne pas pendant la boucle For Next ConsoleWrite( "Line=" & @ScriptLineNumber & " _Exit()"& @CRLF) GUIDelete() ExitEndFuncFunc _WM_COMMAND
($hWnd, $Msg, $wParam, $lParam) Switch BitAND($wParam, 0x0000FFFF) ; idfrom Case $idBtn2 _Stop
() EndSwitch Return 'GUI_RUNDEFMSG'EndFunc