Empécher la création d'une nouvelle Gui fille

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 685
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Empécher la création d'une nouvelle Gui fille  

#1

Message par walkson » jeu. 27 juin 2019 18:04

Bonjour,
Sous la forme évènementielle, je cherche à empêcher la création d’une nouvelle Gui à partir de la Gui mère car si je clique sur le bouton "créer", une nouvelle gui fille se crée
J’ai deux solutions, soit vérifier l’existence de l’Handle de la Gui créée (voir le code qui suit), soit modifier une variable lors de la création de la Gui
Ma question est : existe-t-il une autre méthode ?
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $h = 350, $Form2 = ""

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Create", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
Global $Button2 = GUICtrlCreateButton("Del", 148, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button2Click")
GUISetState(@SW_SHOW)

While 1
 Sleep(100)
WEnd
Func sortie()
        Exit
EndFunc
Func Button1Click()
        If Not $Form2 Then
                $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST)
                GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
                GUISetState(@SW_SHOW)
        EndIf
EndFunc
Func Button2Click()
        If $Form2 Then
                GUIDelete($Form2)
                $Form2 = ""
        EndIf
EndFunc
 
Merci pour vos réponses
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

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

Re: Empécher la création d'une nouvelle Gui fille

#2

Message par mikell » ven. 28 juin 2019 06:25

Hello
S'il ne doit y avoir qu'une seule gui fille, personnellement j'utilise en général quelque chose comme ça

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $h = 350, $Form2

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Create", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)

While 1
 Sleep(100)
WEnd
Func sortie()
        Exit
EndFunc
Func Button1Click()
        If Not $Form2 Then
                GuiCtrlSetData($Button1, "Del")
                $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST)
                GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
                GUISetState(@SW_SHOW)
       Else
                GuiCtrlSetData($Button1, "Create")
                GUIDelete($Form2)
                $Form2 = 0
       EndIf
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 )

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

Re: Empécher la création d'une nouvelle Gui fille

#3

Message par walkson » ven. 28 juin 2019 14:37

Bonjour Michel
Oui, le code est plus simple mais mon exemple est mauvais. Le GUIDelete($Form2) aurait du être sur la gui fille comme pour une fermeture ordinaire.
Ce que je recherche c'est une fonction qui empêche une seconde instance à l'image de singleton mais je ne sais pas si cela existe pour une gui ?
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#4

Message par Tlem » ven. 28 juin 2019 15:19

Bonjour Walkson.
J'ai beau relire tes deux messages, je n'arrive pas à comprendre ton souhait.

Déjà pour éclaircir certaines choses, la deuxième GUI crée par ton code, n'est pas une GUI fille car tu n'utilise pas le flag "Parent" de GUICreate().

Ensuite tu dit : "Ce que je recherche c'est une fonction qui empêche une seconde instance ...... pour une gui ?". Est-ce que tu pourrait expliquer un peux mieux, car là je ne vois pas de quelle seconde instance tu parle.

J'ai testé ton code et si je clique plusieurs fois sur le bouton "Create", je n'ai pas de nouvelle GUI crée, c'est toujours la même et l'ID ne change pas.
L'ID change uniquement si tu supprime la GUI et que tu la re-génère. Si c'est cela ton problème, il suffit de ne pas supprimer la GUI, mais de la masquer avec GUISetState (@sw_hide, $Form2).
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#5

Message par walkson » ven. 28 juin 2019 15:44

Bonjour Tlem
un petit exemple avec le problème
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $h = 350, $Form2 = 0

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Create", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)

While 1
 Sleep(100)
WEnd
Func sortie()
        Exit
EndFunc
Func Button1Click()
                $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST,$Form1)
                GUISetOnEvent($GUI_EVENT_CLOSE, "sortieFille")
                GUICtrlCreateButton("Del", 48, 144, 97, 41)
                GUICtrlSetOnEvent(-1, "sortieFille")
                GUISetState(@SW_SHOW)
                $h += 100
EndFunc
Func sortieFille()
                GUIDelete($Form2)
EndFunc
 
Ce qui donne une nouvelle gui à chaque clic sur "Create" et c'est cela que je veux éviter avec ses conséquences désastreuses.
D'où ma question, existe t'il une fonction qui reconnait la présence de $Form2 (que je nommais "fille" pour la distinguer de $Form1) et empêche la création d'une nouvelle gui (doublon)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#6

Message par Tlem » ven. 28 juin 2019 17:07

Comme déjà expliqué, il est normal qu'une nouvelle GUI soit créée puisque tu supprime la première. Si tu veux garder la GUI il faut la masquer.
Je pense savoir quel est ton problème de base. Il s'agit du positionnement de la fenêtre suite à plusieurs création de GUI ...

Voilà ton code modifié et une solution pour conserver GUIDelete :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $h = 350, $Form2 = 0

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Ouvre", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)

While 1
 Sleep(100)
WEnd
Func sortie()
        Exit
EndFunc
Func Button1Click()
			If $Form2="" Then
                $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST,$Form1)
                GUISetOnEvent($GUI_EVENT_CLOSE, "sortieFille")
				GUICtrlCreateLabel("ID = " & $Form2, 50, 50)
                GUICtrlCreateButton("Ferme", 28, 144, 70, 41)
                GUICtrlSetOnEvent(-1, "sortieFille")
                GUICtrlCreateButton("Masque", 108, 144, 70, 41)
                GUICtrlSetOnEvent(-1, "masqueFille")
                GUISetState(@SW_SHOW, $Form2)
                $h += 100
			Else
				GUISetState(@SW_SHOW, $Form2)
			EndIf
EndFunc
Func sortieFille()
                GUIDelete($Form2)
				$Form2=""
				;$h -= 100   <= Cette solution résoudrait ton problème de positionnement de GUI tout en gardant le GUIDelete.
EndFunc
Func masqueFille()
                GUISetState(@SW_HIDE, $Form2)
EndFunc
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#7

Message par TommyDDR » ven. 28 juin 2019 22:03

Pourquoi créer la gui lors du clic ?
Personnellement je créé toutes mes gui au lancement du programme et je les affiche / met à jour au besoin.
Comme ça, pas besoin de se soucier si une gui doit être créé ou pas.

Exemple :
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)

Global $h = 350

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Create", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")

Global $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST,$Form1)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortieFille")
GUICtrlCreateButton("Del", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "sortieFille")

GUISetState(@SW_SHOW, $Form1)

While 1
 Sleep(100)
WEnd

Func sortie()
        Exit
EndFunc

Func Button1Click()
        If(Not(BitAND(WinGetState($Form2), 2) == 2)) Then
                WinMove($Form2, "", Default, $h)
                GUISetState(@SW_SHOW, $Form2)
                $h += 100
        EndIf
EndFunc

Func sortieFille()
        GUISetState(@SW_HIDE, $Form2)
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

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

Re: Empécher la création d'une nouvelle Gui fille

#8

Message par mikell » ven. 28 juin 2019 22:17

Je ne comprends pas vraiment en quoi ça pose problème. Il y a des tas de façons d'empêcher la création d'une 2ème gui "fille" tant qu'une 1ère existe : en testant une variable booléenne, en désactivant le bouton "Create" avec un $GUI_DISABLE ou avec un GUICtrlSetOnEvent(bouton, "") ...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#9

Message par Tlem » ven. 28 juin 2019 22:45

Comme indiqué dans mon message précédent, je pense que le problème de walkson concerne le positionnement de la GUI fille.
Problème non présent si comme il se doit, on ne supprime pas la GUI fille. ^^

+1 avec Tommy, je crée moi aussi toutes mes GUIs et je les affiche/Masque selon les besoins.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#10

Message par mikell » sam. 29 juin 2019 11:46

Problème non présent si comme il se doit, on ne supprime pas la GUI fille
De toute façon, il faut bien rajouter un moyen pour empêcher la création d'une 2ème gui fille. D'après ce que j'ai lu dans les messages précédents, littéralement :
Ce qui donne une nouvelle gui à chaque clic sur "Create" et c'est cela que je veux éviter avec ses conséquences désastreuses.
D'où ma question, existe t'il une fonction qui reconnait la présence de $Form2 (que je nommais "fille" pour la distinguer de $Form1) et empêche la création d'une nouvelle gui (doublon)
c'est ça la vraie question non ? éviter un doublon si une 1ère gui fille est présente, masquée ou pas
Je pige pas cette histoire de positionnement. S'il n'y a qu'une gui fille, ce n'est pas un problème
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#11

Message par Tlem » sam. 29 juin 2019 14:01

Dans la fonction Button1Click() il y a calcul de h. Donc à chaque itération h augmente de 100 (en tout cas, c'est ce que j'en déduit car les explications sont un peu vagues).

Envoyé de mon Smartphone en utilisant Tapatalk

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#12

Message par walkson » sam. 29 juin 2019 15:43

Bonjour,
Ça fait plaisir de voir que l’on se penche sur mon problème pendant que je vaque à d’autres occupations !

Michel a raison, le $h += 100 était uniquement pour visualiser (éviter les superpositions) et la position de la gui fille n’a pas d’importance. Ce qui importe, c’est d’éviter un doublon.

L’idée de créer une gui fille dès le début est problématique à l’intérieur de mon programme et demande à effacer toutes les options, édit et autres, ce qui complique la chose. Détruire la gui et la recréer est plus simple dans mon cas.

Pour faire rapide (j’aurais peut-être dû commencer par-là), mon programme liste les fichiers d’un dossier dans une ListView (LV). Dans la LV, je note des commentaires et autres infos. Par le bouton « enregistrer », s’ouvre une gui avec différentes options et c’est là que vient mon problème. Ma souris fait parfois des doubles clics et je me retrouve avec 2 guis et plein de problèmes !

Il y a la solution de Michel ($GUI_DISABLE) ou les 2 solutions en début de mon post mais qui demandent 2 interventions (($GUI_DISABLE, $GUI_ENABLE par exemple) d’où l’idée de repérer la gui et éviter un doublon lors de sa création. Après avoir épluché l’aide, j’ai trouvé _WinAPI_IsWindow ( $hWnd ) et ça m’a fait « tilt » dans ma tête. Si la gui est créée, elle a un handle d’où 2 solutions IsHWnd( $Form2) ou WinExists( $Form2) et dans Func Button1Click() simplement If IsHWnd( $Form2) Then Return 0 et là, pas de doublon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $h = 350, $Form2 = 0

Global $Form1 = GUICreate("Form1", 395, 213, -1, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "sortie")
Global $Button1 = GUICtrlCreateButton("Create", 48, 144, 97, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)

While 1
 Sleep(100)
WEnd
Func sortie()
        Exit
EndFunc
Func Button1Click()
                ;If WinExists( $Form2) Then Return 0 ;autre solution
                If IsHWnd( $Form2) Then Return 0
                $Form2 = GUICreate("Form", 213, 213, -1, $h, -1, $WS_EX_TOPMOST,$Form1)
                GUISetOnEvent($GUI_EVENT_CLOSE, "sortieFille")
                GUICtrlCreateButton("Del", 48, 144, 97, 41)
                GUICtrlSetOnEvent(-1, "sortieFille")
                GUISetState(@SW_SHOW)
                $h += 100
EndFunc
Func sortieFille()
                GUIDelete($Form2)
EndFunc
 
Je crois que la chaleur me ramollit les neurones :mrgreen: En tout cas merci de vous êtes penché sur mon problème et pardon d'avoir tardé à répondre.
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#13

Message par Tlem » sam. 29 juin 2019 17:46

Bonjour walkson.
Peut-être plus simplement, lorsque tu fait ton GuiDelete, met $form2 à zéro, ensuite, avant de créer la GUI, il te suffit de tester la valeur de $form2.

Si $form2 <> de 0 la GUI existe.

Par contre le truc de la souris qui fait un double clic, j'aimerai voir, parce que moi avec les codes testés, j'ai beau cliquer deux fois, je n'ai qu'une seule GUI qui apparaît... ^^

Envoyé de mon Smartphone en utilisant Tapatalk

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#14

Message par walkson » sam. 29 juin 2019 19:12

Bonjour Thierry,
C'est aussi une solution (je pensai que guidelete() mettait $Form2 à 0 automatiquement, ce qui est faux)
Pour le double clic, je n'ai pas eu de problème avec les codes ici mais avec mon programme, oh que si !
C'est d'autant plus dérangeant que sur la LV, quand je double-clique sur une ligne, le fichier s'ouvre et quand je clique simple + Entrée, j'ai un édit pour le commentaire qui s'ouvre. C'est un peu la pagaille avec cette souris :roll:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11407
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: Empécher la création d'une nouvelle Gui fille

#15

Message par Tlem » sam. 29 juin 2019 19:15

Ben, change de souris. ^^

Envoyé de mon Smartphone en utilisant Tapatalk

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

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

Re: Empécher la création d'une nouvelle Gui fille

#16

Message par mikell » dim. 30 juin 2019 19:19

... ou répare-la !
Le clic gauche qui se transforme en double-clic, c'est la maladie des souris Logitech et j'ai dû changer les switch des 2 miennes :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 )

Répondre