Page 1 sur 1
[R] Bug avec les GUI
Posté : sam. 07 févr. 2009 20:01
par erreur
Bonjour,
mon problème est le suivant:
Je voudrais pouvoir créer un GUI dans une fonction(ici menu), et que quand on click sur un bouton une autre fonction(ici GUI2) se lance et crée une autre GUI, quand on quitte cette GUI la fonction principale(ici menu) se relance, mais voila le problème est que à ce moment une autre GUI se forme qui est identique à la première(se qui est assez gênant)et la première ne fonctionne plus.
Voila un exemple de code pour illustrer mon problème:
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
menu() ;Fonction principale
func menu() ; Lancer la fonction pricipale
$GUI1 = guicreate("Fenêtre1",200,65) ;Créer la GUI1
GUIsetstate(@SW_SHOW) ;La montrer
$bouton_creer = GUIctrlcreatebutton("Créer",75,20,50,25) ;Créer le boutton
while 1
$nmsg = GUIgetmsg()
switch $nmsg
case $GUI_EVENT_CLOSE
Exit ;Quitter
case $bouton_creer
GUI2() ;Aller à la fonction GUI2
endswitch
wend
EndFunc
func GUI2() ; Lancer la fonction GUI2
$GUI2 = guicreate("Fenêtre2",200,65) ;Créer la GUI2
GUIsetstate(@SW_SHOW) ;La montrer
$bouton_quitter = GUIctrlcreatebutton("Quitter",75,20,50,25) ;Créer le boutton
while 1
$nmsg = GUIgetmsg()
switch $nmsg
case $GUI_EVENT_CLOSE
If WinActive("Fenêtre2") Then ;Quitter la GUI2 si on click sur sa croix
GUIDelete($GUI2)
ElseIf WinActive("Fenêtre1") Then ;Quitter tout si on clik sur la croix de la GUI1
Exit
EndIf
menu() ;Retour à la fonction priencipale
case $bouton_quitter
If WinActive("Fenêtre2") Then ;Quitter la GUI2 si on click sur sa croix
GUIDelete($GUI2)
ElseIf WinActive("Fenêtre1") Then ;Quitter tout si on clik sur la croix de la GUI1
Exit
EndIf
menu() ;Retour à la fonction principale
endswitch
wend
EndFunc
Merci pour votre aide.
Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 22:28
par Tlem
La coloration syntaxique du code est réservée aux forums :
Pensez à bien lire les règles du forum.
Profitez en aussi pour regarder les exemples fournis avec l'installation de AutoIt (
C:\Program Files\AutoIt3\Examples\GUI).
Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 22:33
par erreur
Excusez-moi, mais pouvez vous m'aider car je n'arrive pas à résoudre mon problème.
Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 23:04
par Tlem
Si vous avez bien lu mon message, vous y voyez un lien vers le répertoire des exemples fournit avec AutoIt.
Dans ces exemple, vous avez un exemple d'affichage de fenêtres qui répond à votre question.
Un minimum de lecture vous permettra de trouver la solution.
Si vous n'y arrivez pas, alors voici une piste :
► Afficher le textePiste
Évidement je ne vais pas vous servir la solution toute prète, mais presque

:
Dans votre seconde GUI :
Lorsque vous la fermez/quittez, vous devez
l'effacer et
quitter la boucle de message.
Retrouvez les commandes en question et vous aurez la solution.
Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 23:26
par erreur
Je suis désolé mais je ne comprend vraiment pas. Pourriez-vous (sans me le dire si vous ne voulez pas) m'aider un peu plus?
Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 23:54
par Tlem
Réfléchissez et lisez.
Demain il fera jour.

Re: [...] Bug avec les GUI
Posté : sam. 07 févr. 2009 23:59
par erreur
Désolé mais j'ai du mal, je suis aller regarder le lien mais je ne comprend pas.Pourriez-vous être un peu plus explicite?
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 00:09
par Tlem
Bonne nuit ...

Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 00:10
par erreur
Bon j'ai compris vous ne m'en direz pas plus, n'est ce pas?
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 00:13
par erreur
Est-ce que je doit m'inspirer de sa: child.au3?
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 00:23
par Iste
Bon, alors, voyons voir ce que fait ce script ;
Il appel la fonction menu() qui crée une GUI
Quand on clic, il appel la fonction GUI2() qui crée une autre GUI
Et quand on ferme la 2em GUI, on r'appel la fonction menu() (qui, je le rappel, crée une GUI)
Hum... on crée, crée, efface et recrée, ben oui, au final on a une GUI de trop ^^
Si tu veux acctualiser la 1er fenetre, supprime la avant de la recrer
ligne 45 et 54, rajoute guidelete($GUI1) avant menu()

Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 00:50
par erreur
Oui j'ai déjà essayé mais sa ne fonctionne pas, sa bug.
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 01:03
par erreur
Bon voila le seul moyen que j'ai trouvé:
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
$GUI1 = guicreate("Fenêtre1",200,65) ;Créer la GUI1
GUIsetstate(@SW_SHOW,$gui1) ;La montrer
$bouton_creer = GUIctrlcreatebutton("Créer",75,20,50,25) ;Créer le boutton
$GUI2 = guicreate("Fenêtre2",200,65) ;Créer la GUI2
$bouton_quitter = GUIctrlcreatebutton("Quitter",75,20,50,25) ;Créer le boutton
while 1
$nmsg = GUIgetmsg(1)
switch $nmsg[0]
case $GUI_EVENT_CLOSE
if $nmsg[1] = $gui2 Then
GUIsetstate(@SW_HIDE,$gui2) ;Cacher Gui2
elseif $nmsg[1] = $gui1 Then
Exit
EndIf
case $bouton_creer
if $nmsg[1] = $gui1 Then
GUIsetstate(@SW_SHOW,$gui2) ;Montrer la GUI2
EndIf
case $bouton_quitter
if $nmsg[1] = $gui2 Then
GUIsetstate(@SW_HIDE,$gui2) ;Cacher Gui2
elseif $nmsg[1] = $gui1 Then
Exit
EndIf
endswitch
wend
Est-ce correcte?
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 01:44
par Iste
hum oui effectivement, le fait de creer et supprimer une gui dans deux fonction differentes pose probleme... désolé ^^'
Sinon, ton script est un bon exemple !
Mais en faisant ca, tu es bien concient que la fenetre 2 est jute caché, et donc ce n'est pas une nouvelle qui apparait a chaque foi (c'est important si tu y ajoute des input ou autre qui doivent etre "neuf" a chaque foi)
Par contre, comme il n'y a plus de probleme de fonction, maintenant tu peux essayer :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
$bouton_quitter = -2
$GUI2 = -2
$GUI1 = guicreate("Fenêtre1",200,65) ;Créer la GUI1
GUIsetstate() ;La montrer
$bouton_creer = GUIctrlcreatebutton("Créer",75,20,50,25) ;Créer le boutton
while 1
$nmsg = GUIgetmsg(1)
switch $nmsg[0]
case $GUI_EVENT_CLOSE
if $nmsg[1] = $gui2 Then
GUIDelete($gui2) ;Supprimer la Gui2
elseif $nmsg[1] = $gui1 Then
Exit
EndIf
case $bouton_creer
if $nmsg[1] = $gui1 Then
$GUI2 = guicreate("Fenêtre2",200,65) ;Créer la GUI2
$bouton_quitter = GUIctrlcreatebutton("Quitter",75,20,50,25) ;Créer le boutton
GUIsetstate() ;La montrer
EndIf
case $bouton_quitter
if $nmsg[1] = $gui2 Then
GUIDelete($gui2) ;Supprimer la Gui2
elseif $nmsg[1] = $gui1 Then
Exit
EndIf
endswitch
wend
Mais comme je te l'ai dis en MP, sans connaitre le but du code, je ne peux que tordre tes exemple pour essayer de faire au mieux
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 10:36
par Tlem
Iste vous avait donné presque la solution.
Selon votre 1er exemple :
Dans la fonction GUI2() et dans la partie
case $GUI_EVENT_CLOSE
Vous avez fait :
GUIDelete($GUI2)
Ce qui supprime l'affichage de cette fameuse deuxième fenêtre (ça c'est bon).
Mais le problème c'est que si vous ne faites rien d'autre, vous resterez prisonnier de la boucle de message de la GUI2 !!!
Vous devez donc faire en sorte de supprimer la GUI2
puis sortir de la boucle.
La commande de sortie c'est
Exit.
La boucle en Anglais c'est
Loop.
Donc la sortie de la boucle c'est : ........

Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 10:52
par erreur
ExitLoop, à oui sa fonctionne merci beaucoup.
Re: [..] Bug avec les GUI
Posté : dim. 08 févr. 2009 10:57
par Tlem
Pourquoi la re-créer puisqu'elle existe déjà ?
Re: [R] Bug avec les GUI
Posté : dim. 08 févr. 2009 14:37
par Iste
Peso je prefere le 2em script (avec une boucle unique, et pas des fonction un peu partout) ^^'
Sinon, recreer une fenetre c'est un moyen radicale de la mettre à jour
Enfin, moi j'en connais pas d'autre (à part mettre à jour les trucs un à un), mais si il existe une fonction "guimise_a_jour", j'aimerais bien la connaitre ^^
Re: [R] Bug avec les GUI
Posté : dim. 08 févr. 2009 18:32
par erreur
J'utilise des fonctions car c'est beaucoup plus pratique pour se repérer.
Re: [R] Bug avec les GUI
Posté : dim. 08 févr. 2009 18:53
par Tlem
@Iste
Ok pour la mise à jour d'une GUI, mais dans ce cas il ne faut pas mettre la boucle de message dans la fonction, mais à l'extérieur et on récupère les messages de chaque GUI en utilisant les fonctions avancées de la boucle de message avec :
GUIGetMsg(1)
Sinon, si vous avez 3 GUI ou plus, vous devrez avoir autant de boucle de message, et là ...
Autre solution, le
mode événementiel. Mais là il vous faudra bien penser l'interface. Après c'est du gâteau.
