[R] Fenêtre dans une boucle

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
Gnifrus
Niveau 4
Niveau 4
Messages : 81
Enregistré le : mar. 14 juil. 2009 13:48
Localisation : Montauban
Status : Hors ligne

[R] Fenêtre dans une boucle

#1

Message 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
Modifié en dernier par Gnifrus le mer. 09 janv. 2019 23:00, 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: Fenêtre dans une boucle

#2

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Gnifrus
Niveau 4
Niveau 4
Messages : 81
Enregistré le : mar. 14 juil. 2009 13:48
Localisation : Montauban
Status : Hors ligne

Re: Fenêtre dans une boucle

#3

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Fenêtre dans une boucle  

#4

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Gnifrus
Niveau 4
Niveau 4
Messages : 81
Enregistré le : mar. 14 juil. 2009 13:48
Localisation : Montauban
Status : Hors ligne

Re: Fenêtre dans une boucle

#5

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Fenêtre dans une boucle

#6

Message 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
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Gnifrus
Niveau 4
Niveau 4
Messages : 81
Enregistré le : mar. 14 juil. 2009 13:48
Localisation : Montauban
Status : Hors ligne

Re: [R] Fenêtre dans une boucle

#7

Message 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.
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] Fenêtre dans une boucle

#8

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Gnifrus
Niveau 4
Niveau 4
Messages : 81
Enregistré le : mar. 14 juil. 2009 13:48
Localisation : Montauban
Status : Hors ligne

Re: [R] Fenêtre dans une boucle

#9

Message 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,
Répondre