Page 1 sur 1

[R] Fenêtre dans une boucle

Posté : mer. 09 janv. 2019 18:02
par Gnifrus
Bonjour,

Je ne trouve pas de réponse à mon problème, aussi, je me permets de vous en faire part.
J'ai simplifié le code afin de ne garder que le principe même de fonctionnement.

Je souhaite afficher une fenêtre à chaque passage dans une boucle, et que la boucle continue une fois cette fenêtre refermée.
Voici mon code :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

For $i = 0 To 5
	ConsoleWrite($i & @CRLF)
	fenetre()
	ConsoleWrite($i & @CRLF)
Next

Func fenetre()
	$ihm = GUICreate("Ma fenêtre", 481, 276, 274, 500)
	GUISetState()
	GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
	While 1
		Sleep(10)
	WEnd
EndFunc   ;==>fenetre

Func sortie()
	GUIDelete()
EndFunc
Lorsque je ferme la fenêtre le code reste en suspens, mais ConsoleWrite n'affiche pas la suite...

Voilà, c'est sûrement très très ... bête, mais je ne vois pas...
Merci par avance à ceux ou celles qui m'aideront à me sortir de ce mauvais pas...

Bonne fin de journée,

Gnifrus

Re: Fenêtre dans une boucle

Posté : mer. 09 janv. 2019 21:58
par mikell
Voilà ce que fait ton code, dans l'ordre :
- $i = 0, affiche le ConsoleWrite, affiche la première fenêtre, et là ... rentre dans une boucle infinie
- et paf, coincé ... :mrgreen:

Re: Fenêtre dans une boucle

Posté : mer. 09 janv. 2019 22:09
par Gnifrus
Bonjour Mikell,

Merci tout d'abord de prendre la peine de me répondre.
Je comprends bien pourquoi mon code fait ça, mais il doit bien y avoir une possibilité pour commencer à exécuter du code dans une fonction, afficher une fenêtre ensuite au moyen d'un appel à une autre fonction, puis continuer le code principal quand cette fenêtre est fermée ?

Je continue à chercher avec un WinWait ou autre mais je ne trouve pas.
Peut-être le problème se situe-t-il au niveau de la boucle While 1 et faudrait-il autre chose, mais je ne trouve pas...

Je ne désespère pas...

Merci encore,
Bonne soirée,

Gnifrus

Re: Fenêtre dans une boucle  

Posté : mer. 09 janv. 2019 22:16
par mikell
Peut-être le problème se situe-t-il au niveau de la boucle While 1
Peut-être, oui :mrgreen:

En fait il faut trouver un moyen pour sortir de cette fichue boucle While quand tu fermes la fenêtre, donc introduire une variable dans la fonction sortie() qui sera lue dans la boucle While
Cette variable doit forcément être globale. Voilà un exemple

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)
Global $ihm

For $i = 0 To 5
   ConsoleWrite($i & @CRLF)
   fenetre()
   ConsoleWrite($i & @CRLF)
Next

Func fenetre()
   $ihm = GUICreate("Ma fenêtre", 481, 276, 274, 500)
   GUISetState()
   GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
   While $ihm
      Sleep(10)
   WEnd
EndFunc   ;==>fenetre

Func sortie()
   GUIDelete()
       $ihm = 0
EndFunc

mais on peut aussi utiliser une variable booléenne dédiée :

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)
Global $tilt

For $i = 0 To 5
   ConsoleWrite($i & @CRLF)
   fenetre()
   ConsoleWrite($i & @CRLF)
Next

Func fenetre()
        $tilt = 1
   $ihm = GUICreate("Ma fenêtre", 481, 276, 274, 500)
   GUISetState()
   GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
   While $tilt
      Sleep(10)
   WEnd
EndFunc   ;==>fenetre

Func sortie()
   GUIDelete()
       $tilt = 0
EndFunc

Re: Fenêtre dans une boucle

Posté : mer. 09 janv. 2019 22:23
par Gnifrus
Génial !!!

En fait, c'était tout ... bête !
Je tournais autour, sans arriver au résultat recherché !

Je suis super content, je vais pouvoir avancer !
C'est super cool !

Merci beaucoup Mikell, je clos le sujet.

Bonne soirée et bonne continuation,

Gnifrus

Re: [R] Fenêtre dans une boucle

Posté : jeu. 10 janv. 2019 11:28
par TommyDDR
N'étant pas fan des boucles infinies dans les fonctions, j'aurai plutôt fait quelque chose du genre :) :
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $ihm[6]
Global $idIhm = 0

For $i = 0 To UBound($ihm, 1) - 1
    creerFenetre($i)
Next

GUISetState(@SW_SHOW, $ihm[$idIhm])

While(True)
   If(BitAND(WinGetState($ihm[$idIhm]), 2) == 0) Then
      $idIhm = Mod($idIhm+1, UBound($ihm, 1))
      GUISetState(@SW_SHOW, $ihm[$idIhm])
   EndIf
   Sleep(10)
WEnd

Func creerFenetre($i)
    $ihm[$i] = GUICreate("Ma fenêtre " & $i, 481, 276, 274, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE, "sortie", $ihm[$i])
EndFunc   ;==>fenetre

Func sortie()
   For $i = 0 To UBound($ihm, 1) - 1
      If(@GUI_WinHandle == $ihm[$i]) Then
         GUISetState(@SW_HIDE, $ihm[$i])
         ExitLoop
      EndIf
   Next
EndFunc

Re: [R] Fenêtre dans une boucle

Posté : jeu. 10 janv. 2019 13:48
par Gnifrus
Bonjour TommyDDR,

Merci tout d'abord pour ta réponse.
J'ai bien regardé ton code, mais il ne correspond pas à ce que je voulais faire.

En effet, la proposition de Mikell correspond exactement à ce que je souhaitais faire, c'est à dire afficher quelque chose au moyen d'une boucle, puis ouvrir une fenêtre au moyen de l'appel d'une fonction, puis reprendre le quelque chose de la boucle initiale à la fermeture de cette fenêtre et revenir au début de cette boucle pour recommencer le nombre de fois désiré initialement.

Dans ton exemple, si je mets quelque chose dans la première boucle du programme principal, au tout début, il exécute toute la boucle en une seule fois puis affiche les fenêtres à la fin....alors que le but était d'afficher une première fois quelque chose de la boucle, puis la fenêtre, puis recommencer au début de la boucle en affichant le même quelque chose, puis une fenêtre...etc....

Merci toutefois d'avoir pris de ton temps pour m'aider, c'est cool.

Bonne continuation,

Gnifrus.

Re: [R] Fenêtre dans une boucle

Posté : jeu. 10 janv. 2019 16:47
par mikell
Je ne sais pas si c'est nécessaire pour le reste de ton code, mais note quand même qu'en choisissant le mode évènementiel tu te compliques singulièrement la tâche

#include <GUIConstantsEx.au3>

For $i = 0 To 5
        ConsoleWrite($i & @CRLF)
        fenetre()
        ConsoleWrite($i & @CRLF)
Next

Func fenetre()
        $ihm = GUICreate("Ma fenêtre", 481, 276, 274, 500)
        GUISetState()
        While 1
             Switch GuiGetMsg()
                Case $GUI_EVENT_CLOSE
                     Exitloop
             EndSwitch
        WEnd
EndFunc   ;==>fenetre

Re: [R] Fenêtre dans une boucle

Posté : jeu. 17 janv. 2019 08:53
par Gnifrus
Bonjour mikell,

Désolé pour ma réponse tardive, je te remercie pour ton dernier post.
En fait, ça fait tellement longtemps que j'ai commencé mon prog, que je ne sais plus pourquoi j'ai choisi cette option là...et c'est compliqué de tout reprendre en l'état actuel.(et surtout, j'ai tellement de trucs à ajouter que je n'ai pas envie de tout reprendre) :D

J'en prends note toutefois pour les programmes à venir...

Merci encore et très bonne journée,