Multiple Gui

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
Misa10
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 14 avr. 2018 11:50
Status : Hors ligne

Multiple Gui

#1

Message par Misa10 » dim. 06 janv. 2019 15:28

Bonjour , donc mon obectif la est d'arrivé a faire plusieurs gui sans limite.

Pour deux GUI
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $g_hGUI2, $g_idButton2 ; Predeclare these variables

gui1()

Func gui1()
        Local $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Main") ; Run this function when the main GUI [X] is clicked
        Local $idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button1")
        Local $g_idButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button2")
        GUISetState()

        While 1
                Sleep(10)
        WEnd
EndFunc   ;==>gui1

Func gui2()
        Local $g_hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Secondary") ; Run this function when the secondary GUI [X] is clicked
        Local $idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button3")
        GUISetState()
EndFunc   ;==>gui2

Func On_Close_Main()
        Exit
EndFunc   ;==>On_Close_Main

Func On_Close_Secondary()
        GUIDelete($g_hGUI2)
        GUICtrlSetState($g_idButton2, $GUI_ENABLE)
EndFunc   ;==>On_Close_Secondary

Func On_Button1()
        MsgBox($MB_OK, "MsgBox 1", "Test from Gui 1")
EndFunc   ;==>On_Button1

Func On_Button2()
        GUICtrlSetState($g_idButton2, $GUI_DISABLE)
        gui2()
EndFunc   ;==>On_Button2

Func On_Button3()
        MsgBox($MB_OK, "MsgBox 2", "Test from Gui 2")
EndFunc   ;==>On_Button3

Tout marche parfaitement.
Mais Pour 3 GUI
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $g_hGUI2, $g_idButton2 ; Predeclare these variables
Global $g_hGUI3, $g_idButton4 ; Predeclare these variables

gui1()

Func gui1()
        Local $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Main") ; Run this function when the main GUI [X] is clicked
        Local $idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button1")
        Local $g_idButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button2")
        GUISetState()

        While 1
                Sleep(10)
        WEnd
EndFunc   ;==>gui1

Func gui2()
        Local $g_hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Secondary") ; Run this function when the secondary GUI [X] is clicked
        Local $idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button3")
        Local $g_idButton4 = GUICtrlCreateButton("Show Gui 3", 10, 60, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button4")
        GUISetState()
EndFunc   ;==>gui2

Func gui3()
        Local $g_hGUI3 = GUICreate("Gui 3", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_3") ; Run this function when the secondary GUI [X] is clicked
        GUISetState()
EndFunc   ;==>gui2

Func On_Close_Main()
        Exit
EndFunc   ;==>On_Close_Main

Func On_Close_Secondary()
        GUIDelete($g_hGUI2)
        GUICtrlSetState($g_idButton2, $GUI_ENABLE)
EndFunc   ;==>On_Close_Secondary

Func On_Close_3()
        GUIDelete($g_hGUI3)
        GUICtrlSetState($g_idButton4, $GUI_ENABLE)
EndFunc   ;==>On_Close_Secondary

Func On_Button1()
        MsgBox($MB_OK, "MsgBox 1", "Test from Gui 1")
EndFunc   ;==>On_Button1

Func On_Button2()
        GUICtrlSetState($g_idButton2, $GUI_DISABLE)
        gui2()
EndFunc   ;==>On_Button2

Func On_Button3()
        MsgBox($MB_OK, "MsgBox 2", "Test from Gui 2")
EndFunc   ;==>On_Button3

Func On_Button4()
        GUICtrlSetState($g_idButton4, $GUI_DISABLE)
        gui3()
EndFunc   ;==>On_Button2
Tout marche seule problèmes quand je ferme la 3 èmes GUI la deuxièmes ne se peux plus se fermer.

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 670
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: Multiple Gui

#2

Message par walkson » dim. 06 janv. 2019 19:04

Le problème vient des déclarations Global et Local
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $g_hGUI2, $g_idButton2 ; Predeclare these variables
Global $g_hGUI3, $g_idButton4 , $hGUI1; Predeclare these variables

gui1()
        While 1
                Sleep(100)
        WEnd
Func gui1()
         $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Main") ; Run this function when the main GUI [X] is clicked
        Local $idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button1")
        $g_idButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button2")
        GUISetState()
EndFunc   ;==>gui1

Func gui2()
        $g_hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_Secondary") ; Run this function when the secondary GUI [X] is clicked
        Local $idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button3")
        $g_idButton4 = GUICtrlCreateButton("Show Gui 3", 10, 60, 80, 30)
        GUICtrlSetOnEvent(-1, "On_Button4")
        GUISetState()
EndFunc   ;==>gui2

Func gui3()
       $g_hGUI3 = GUICreate("Gui 3", 200, 200, 650, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close_3") ; Run this function when the secondary GUI [X] is clicked
        GUISetState()
EndFunc   ;==>gui2

Func On_Close_Main()
        Exit
EndFunc   ;==>On_Close_Main

Func On_Close_Secondary()
        GUIDelete($g_hGUI2)
        GUICtrlSetState($g_idButton2, $GUI_ENABLE)
EndFunc   ;==>On_Close_Secondary

Func On_Close_3()
        GUIDelete($g_hGUI3)
        GUICtrlSetState($g_idButton4, $GUI_ENABLE)
EndFunc   ;==>On_Close_Secondary

Func On_Button1()
        MsgBox($MB_OK, "MsgBox 1", "Test from Gui 1")
EndFunc   ;==>On_Button1

Func On_Button2()
        GUICtrlSetState($g_idButton2, $GUI_DISABLE)
        gui2()
EndFunc   ;==>On_Button2

Func On_Button3()
        MsgBox($MB_OK, "MsgBox 2", "Test from Gui 2")
EndFunc   ;==>On_Button3

Func On_Button4()
        GUICtrlSetState($g_idButton4, $GUI_DISABLE)
        gui3()
EndFunc   ;==>On_Button2
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1800
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

Re: Multiple Gui

#3

Message par TommyDDR » lun. 07 janv. 2019 11:54

Si vous déclarez :
Global $g_hGUI2
Vous ne DEVEZ PAS par la suite redéclarer :
Local $g_hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
Sinon vous instanciez une NOUVELLE variable qui sera locale à la fonction (elle n'existera plus après la fin de la fonction), vous aurez donc une fenêtre avec laquelle vous n'avez plus son identifiant.

Si vous retirez simplement le mot "local", cela fonctionnera comme vous le voulez.

<dumbledore>
Cependant !
</dumbledore>

Je vous conseille aussi :
- D'éviter les "-1" pour identifier "le contrôle qui a été créé en dernier, préférez l'identifiant du bouton directement, cela vous évitera de perdre du temps à chercher des bugs si vous insérez de nouveaux contrôles entre ces 2 lignes de code.
- De nommer de la même logique vos variables (pas de $hGUI1 puis $g_hGUI2)
- De nommer vos fonctions de façon clair, on évitera les "On_ButtonX"


Pour l'utilisation que vous nous montrez, il est fortement recommandé de créer toutes les fenêtres et de les afficher / cacher lorsque vous en avez besoin, cela vous évite aussi de jouer avec les disable des boutons.

Voici votre script avec tous les changements que je vous ai conseillé, prenez le temps de regarder les différences pour comprendre ce qui a été fait ;)
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $hGUI1
Global $idButton1, $idButton2
Global $hGUI2, $idButton2 ; Predeclare these variables
Global $hGUI3, $idButton4 ; Predeclare these variables

gui1()
gui2()
gui3()

While(true)
        Sleep(10)
WEnd

Func gui1()
        $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
        GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $hGUI1) ; Run this function when the main GUI [X] is clicked
        $idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        $idButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
        GUICtrlSetOnEvent($idButton1, "ShowMsgBox1")
        GUICtrlSetOnEvent($idButton2, "ShowGui2")
                GUISetState(@SW_SHOW, $hGUI1)
EndFunc   ;==>gui1

Func gui2()
        $hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "HideGui2", $hGUI2) ; Run this function when the secondary GUI [X] is clicked
        $idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        $idButton4 = GUICtrlCreateButton("Show Gui 3", 10, 60, 80, 30)
        GUICtrlSetOnEvent($idButton3, "ShowMsgBox2")
        GUICtrlSetOnEvent($idButton4, "ShowGui3")
EndFunc   ;==>gui2

Func gui3()
        $hGUI3 = GUICreate("Gui 3", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "HideGui3", $hGUI3) ; Run this function when the secondary GUI [X] is clicked
EndFunc   ;==>gui2

Func quit()
        Exit
EndFunc   ;==>quit

Func HideGui2()
        ConsoleWrite("ko" & @CRLF)
    GUISetState(@SW_HIDE, $hGUI2)
EndFunc   ;==>HideGui2

Func HideGui3()
        GUISetState(@SW_HIDE, $hGUI3)
EndFunc   ;==>HideGui3

Func ShowMsgBox1()
        MsgBox($MB_OK, "MsgBox 1", "Test from Gui 1")
EndFunc   ;==>ShowMsgBox1

Func ShowGui2()
    GUISetState(@SW_SHOW, $hGUI2)
EndFunc   ;==>ShowGui2

Func ShowMsgBox2()
    MsgBox($MB_OK, "MsgBox 2", "Test from Gui 2")
EndFunc   ;==>ShowMsgBox2

Func ShowGui3()
        GUISetState(@SW_SHOW, $hGUI3)
EndFunc   ;==>ShowGui3
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5851
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Multiple Gui

#4

Message par mikell » lun. 07 janv. 2019 21:11

Je recommande de lire le post précédent plusieurs fois, pour bien s'imprégner de son contenu
Si un bouton 'like' avait existé ici j'aurais cliqué dessus Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Misa10
Niveau 3
Niveau 3
Messages : 38
Enregistré le : sam. 14 avr. 2018 11:50
Status : Hors ligne

Re: Multiple Gui

#5

Message par Misa10 » mar. 08 janv. 2019 21:12

TommyDDR a écrit :
lun. 07 janv. 2019 11:54
Si vous déclarez :
Global $g_hGUI2
Vous ne DEVEZ PAS par la suite redéclarer :
Local $g_hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
Sinon vous instanciez une NOUVELLE variable qui sera locale à la fonction (elle n'existera plus après la fin de la fonction), vous aurez donc une fenêtre avec laquelle vous n'avez plus son identifiant.

Si vous retirez simplement le mot "local", cela fonctionnera comme vous le voulez.

<dumbledore>
Cependant !
</dumbledore>

Je vous conseille aussi :
- D'éviter les "-1" pour identifier "le contrôle qui a été créé en dernier, préférez l'identifiant du bouton directement, cela vous évitera de perdre du temps à chercher des bugs si vous insérez de nouveaux contrôles entre ces 2 lignes de code.
- De nommer de la même logique vos variables (pas de $hGUI1 puis $g_hGUI2)
- De nommer vos fonctions de façon clair, on évitera les "On_ButtonX"


Pour l'utilisation que vous nous montrez, il est fortement recommandé de créer toutes les fenêtres et de les afficher / cacher lorsque vous en avez besoin, cela vous évite aussi de jouer avec les disable des boutons.

Voici votre script avec tous les changements que je vous ai conseillé, prenez le temps de regarder les différences pour comprendre ce qui a été fait ;)
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

Opt("GUIOnEventMode", 1)

Global $hGUI1
Global $idButton1, $idButton2
Global $hGUI2, $idButton2 ; Predeclare these variables
Global $hGUI3, $idButton4 ; Predeclare these variables

gui1()
gui2()
gui3()

While(true)
        Sleep(10)
WEnd

Func gui1()
        $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
        GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $hGUI1) ; Run this function when the main GUI [X] is clicked
        $idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        $idButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
        GUICtrlSetOnEvent($idButton1, "ShowMsgBox1")
        GUICtrlSetOnEvent($idButton2, "ShowGui2")
                GUISetState(@SW_SHOW, $hGUI1)
EndFunc   ;==>gui1

Func gui2()
        $hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "HideGui2", $hGUI2) ; Run this function when the secondary GUI [X] is clicked
        $idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        $idButton4 = GUICtrlCreateButton("Show Gui 3", 10, 60, 80, 30)
        GUICtrlSetOnEvent($idButton3, "ShowMsgBox2")
        GUICtrlSetOnEvent($idButton4, "ShowGui3")
EndFunc   ;==>gui2

Func gui3()
        $hGUI3 = GUICreate("Gui 3", 200, 200, 350, 350)
        GUISetOnEvent($GUI_EVENT_CLOSE, "HideGui3", $hGUI3) ; Run this function when the secondary GUI [X] is clicked
EndFunc   ;==>gui2

Func quit()
        Exit
EndFunc   ;==>quit

Func HideGui2()
        ConsoleWrite("ko" & @CRLF)
    GUISetState(@SW_HIDE, $hGUI2)
EndFunc   ;==>HideGui2

Func HideGui3()
        GUISetState(@SW_HIDE, $hGUI3)
EndFunc   ;==>HideGui3

Func ShowMsgBox1()
        MsgBox($MB_OK, "MsgBox 1", "Test from Gui 1")
EndFunc   ;==>ShowMsgBox1

Func ShowGui2()
    GUISetState(@SW_SHOW, $hGUI2)
EndFunc   ;==>ShowGui2

Func ShowMsgBox2()
    MsgBox($MB_OK, "MsgBox 2", "Test from Gui 2")
EndFunc   ;==>ShowMsgBox2

Func ShowGui3()
        GUISetState(@SW_SHOW, $hGUI3)
EndFunc   ;==>ShowGui3
Merci de ta réponse c'est la première fois que j'utilise plusieurs gui est du coup c'était juste un script de test pris sur le site autoit qui m'as bien été utile pour comprendre et c'est aussi ma première fois avec le mode évent ... Il y'a plusieurs choses que je ne comprends .

Quand je delete une GUI pourquoi rendre disable les contrôles alors que la GUI est delete ?


A quoi sert de guictrlsetonevent -1 un bouton ?

Pourquoi il déclare les variables au tout début du script qu'alors en mettant en global les variables ça marche tout aussi dans les fonctions ?

Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1800
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

Re: Multiple Gui

#6

Message par TommyDDR » mer. 09 janv. 2019 03:00

Quand je delete une GUI pourquoi rendre disable les contrôles alors que la GUI est delete ?
Si vous parlez de mon script, on ne delete pas de gui, on la cache seulement. En prévision de la réafficher si besoin.
Si vous parlez toujours de mon script, on ne disable pas les contrôles non plus.
A quoi sert de guictrlsetonevent -1 un bouton ?
GuiCtrlSetOnEvent sert à associer un évenement lors du clic sur un contrôle, cela peut être un bouton, un label, etc
le fait de mettre "-1" signifie "je veux associer ma fonction au dernier contrôle créé"
Or, en général lorsque vous programmez, vous savez par avance à quel contrôl vous voulez associer la fonction, c'est pourquoi on préfèrera mettre l'ID du contrôle directement au lieu de "-1"
Pourquoi il déclare les variables au tout début du script qu'alors en mettant en global les variables ça marche tout aussi dans les fonctions ?
Une variable déclaré en "global" et qui a vraiment une utilité globale (c'est à dire qui est utilisée dans plusieurs fonctions) DOIT être placée en début de script (je n'ai pas de cas en tête où ça ne doit pas être le cas).
En effet, si cette variable est appelée dans plusieurs fonction, mais qu'elle est déclarée à l'intérieur de l'une d'elle, cela vous oblige à appeler cette première fonction AVANT toutes les autres qui y font appel (vous allez juste vous ajouter de la difficulté de débuggage).
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

Répondre