[R] Bouton qui reste cliqué - lié fenetre fille ?

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

[R] Bouton qui reste cliqué - lié fenetre fille ?

#1

Message par SurPriseS »

Bonjour,
Après des années d'absence :o (oui tout le monde s'en fout :D).
Je me suis décider à refaire mon script d'installation auto de logiciels... Plus complet tout ça, mais j'en parlerais ailleurs le moment venu !
Bref !
J'ai un bug plutôt étrange, que je pense lié à ma gestion d'une fenêtre fille...
Ma boucle :
;__________________________________

;____________________ Boucle
;__________________________________


While 1

   $msg = GUIGetMsg(1)
   Select
    Case $msg[0] = $GUI_EVENT_CLOSE
        If $msg[1] = $Form2_listeclient Then    ; fenêtre fille
            GUIDelete($Form2_listeclient)      ; on ferme la fenêtre fille
        Else       ; fenêtre principale
            Exit    ; on se barre
        EndIf


   ;__________________________________
   ;----------Boutons Fenetre client
   ;__________________________________


      Case $msg[0] = $button_recherche_client
         _select_client()

      Case $msg[0] = $button_edit_client
;~          _select_client()
         MsgBox(0,0,"")

   ;__________________________________
   ;----------Boutons Fenetre fille selection utilisateur
   ;__________________________________


      Case $msg[0] = $Button_sel_client_create
         _sel_client_create()

      Case $msg[0] = $Button_sel_client_select
         _sel_client_select()


 EndSelect
WEnd
Et un bout du mystère :
$id_client = IniRead( @ScriptDir & "\ini\cfg.ini", "config", "id_client", "" )



   if $id_client = 0 Then

      Dim $33[1][10] ;variable vide
      Global $infoclient = GUICtrlCreateGroup("Info Client :", $coord1, $coord2, 410, 280)
                $button_recherche_client = GUICtrlCreateButton("Créer/Rechercher", 295,240,120,25)

   Else
      _Lecture_clients_SQL2($sConnectionString, "SELECT * FROM clients WHERE `id` = '"&$id_client&"'")
      Global $infoclient = GUICtrlCreateGroup("Info Client : " & $id_client, $coord1, $coord2, 410, 280)
                 $button_edit_client = GUICtrlCreateButton("Editer", 295,280,120,25)
   EndIf

En gros si dans la fonction j'ai un $id_client = 0, je n'est aucun problème tout s'exécute normalement, si par contre j'ai un $id_client autre que 0, ça bug, la fenêtre fille s'affiche en boucle.... Si je supprime le bouton
$button_edit_client = GUICtrlCreateButton("Editer", 295,280,120,25)
tout fonctionne normalement.... J'ai supprimé la partie SQL aussi pour voir, ça fait exactement pareil, par contre tout est OK si il n'y à plus ce bouton... (que je le mette dans le IF ou pas d'ailleurs...)

Je tourne en rond depuis hier dessus (et je suis sur que c'est un truc super con...), je comprend pas où ça m.... et pourquoi sur ce bouton, je pense que c'est lié à ma gestion de la boucle (j'avais trouvé ça ici mais je l'ai peut être mal utilisé....)

J'ai pas mis le script au complet vu qu'il y'a une base MySQL dedans mais je pourrais si c'est nécessaire en supprimant les partie lié à la gestion de la base !

Merci d'avance !
Modifié en dernier par SurPriseS le ven. 22 déc. 2023 15:41, modifié 2 fois.
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [..] Bug étrange lié fenetre fille

#2

Message par Nine »

Difficile à dire avec juste des petits bouts de programme. Toi, ça te dit quelque chose parce que tu connais ton code, tandis que nous...

Ça serait vraiment plus facile de t'aider si tu pouvais nous concocter un script qui roulerait sans problème (avec le strict minimum dedans).
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2087
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Bug étrange lié fenetre fille

#3

Message par TommyDDR »

Même avis que Nine, il faut poster un code permettant à minima de l'exécuter pour voir votre problème
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [..] Bug étrange lié fenetre fille

#4

Message par SurPriseS »

Tout à fait ;)
J'ai fait un premier jet comme ça si jamais une erreur grossière apparaissait !

Le bug est un peu diffèrent du coup en ayant virer la partie SQL... Mais il apparais quand même.... (en gros le script ne fonctionne pas du tout, avec le même type de problème qu'avant, alors qu'avec ma version SQL, si id_client = 0, il fonctionne normalement)

Donc pour moi le problème est dans "pages\_clients.au3" ou dans ma gestion de la fenêtre fille (Func _select_client dans _clients.au3) ou au niveau de la boucle while (auto.au3)
      Case $msg[0] = $button_recherche_client
         _select_client()

      Case $msg[0] = $button_edit_client
         MsgBox(0,0,"")
C'est les 2 boutons qui reste cliqué en permanence...

Pour changer le problème il faut aller dans "ini\cfg.ini" et changer la valeur de id_client (le script ne lance pas la même chose à 0 ou 1) et l'erreur est sur un bouton différent...

Merci !
Fichiers joints
Config - Boot - Nettoyage V3 - Copie.zip
(53.05 Kio) Téléchargé 101 fois
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [..] Bouton qui reste cliqué - lié fenetre fille ?

#5

Message par Nine »

Ok, le problème c'est quand il n'y a aucune activité sur le GUI, la valeur de retour de GUIGetMsg est 0. Toutes tes variables globales ne sont pas initialisées au départ, donc elles sont toutes à 0. Alors le premier Select/Case que tu utilises avec une variable non-initialisée est déclenché. Dans ton cas, c'est le bouton de recherche de client.

Pour résoudre ton problème, tu dois revoir la création de ton GUI, c'est à dire, repenser comment les différentes composantes se lient entre elles.

Bonne chance.
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [..] Bouton qui reste cliqué - lié fenetre fille ?

#6

Message par SurPriseS »

Hum !
Merci beaucoup pour l'info !
J'ai fait un truc très con, mais ça à l'air de marcher, j'ai passé les variables à 1 à l'initialisation (pour les boutons), ça marche... je pense que c'est peut être pas la "bonne" solution....
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [..] Bouton qui reste cliqué - lié fenetre fille ?

#7

Message par Nine »

1 c'est correct, car le premier contrôle aura la valeur 3, donc aucune chance de conflit.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Bouton qui reste cliqué - lié fenetre fille ?

#8

Message par mikell »

@Nine
Je n'ai pas trop suivi mais un ContinueLoop en début du Slect si GUIGetMsg = 0, est-ce que ça pourrait le faire ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [..] Bouton qui reste cliqué - lié fenetre fille ?

#9

Message par SurPriseS »

Ah ok, je comprend mieux (je fait ça pour m'amuser et m'aider au boulot, la programmation, c'est pas trop mon truc !)
Il y'a une solution plus propre ? ou c'est lié à ma façon de découper l'interface ? (c'étais le bordel, trop de ligne pour moi sur la même page)
Mettre une variable négative -1 par exemple, limiterais tout risque de conflit ? ou de toute façon la création de la fenêtre fait qu'on passe au dessus de 1 ?

Merci !
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#10

Message par Nine »

@mikell Oui, ou encore gérer le message $GUI_EVENT_NONE comme un autre message, ça fait peut-être un peu plus élégant :wink:

@SurPriseS Il n'y a que des solutions qui marchent. Si tu es confortable avec ton approche, j'y vois pas de mal. Peut-être un petit conseil à envisager, tu pourrais transformer ton GUI en onEvent, ça éliminerait sans doute un paquet de soucis avec tes variables globales (j'aime vraiment pas l'utilisation de variables globales quand on peut s'en passer)...
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#11

Message par SurPriseS »

Ok merci pour les réponses ;)
Je connais pas onEvent, je regarderais si c'est plus propre :) Tant qu'à tout refaire autant essayer de faire plus propre, même si en effet tant que ça marche .... !
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#12

Message par SurPriseS »

Bonjour !
Et bonne fêtes à tous !
J'ai regarder vite fait le mode onEvent, ça à l'air intéressant, mais dans mon cas, je préfère que l'interface principale soit bloqué le temps de l'exécution d'une fonction, hors si j'ai bien compris le mode onEvent, n'est pas bloquant... Ou il pourrais y avoir une fonction pour bloqué l'interface sur les actions que je souhaite bloquante ? (mais ça mérite peut être un autre sujet ?)

Merci
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#13

Message par Nine »

En fait seule la boucle principale du GUI est interruptible. Les événements ne le sont pas.
Voici un example facile à comprendre :

Code : Tout sélectionner

#include <GUIConstants.au3>

Opt("GUIOnEventMode", True)

Local $hGUI = GUICreate("Example")
GUISetOnEvent($GUI_EVENT_CLOSE, Terminate)
Local $idB1 = GUICtrlCreateButton("B1", 20, 20, 100, 25)
GUICtrlSetOnEvent(-1, B1)
Local $idB2 = GUICtrlCreateButton("B2", 20, 120, 100, 25)
GUICtrlSetOnEvent(-1, B2)
GUISetState()

Local $iCount = 0

While Sleep(150)
  $iCount += 1
  If Not Mod($iCount, 5) Then ConsoleWrite("Main " & $iCount & @CRLF)
WEnd

Func Terminate()
  Exit
EndFunc

Func B1()
  For $i = 1 To 20
    ConsoleWrite("B1 " & $i & @CRLF)
    Sleep(150)
  Next
EndFunc

Func B2()
  ConsoleWrite("B2" & @CRLF)
EndFunc
Comme tu peux le constater, tu ne peux pas interrompre B1 en pressant B2. Au même titre tu ne peux pas fermer le GUI tant que B1 roule...
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#14

Message par SurPriseS »

Oui, je pense que je l'avais compris comme ça ;)
Mais ce que je voulais dire c'est que je ne veux pas qu'on puisse cliquer sur un deuxième bouton alors qu'une action est déjà en cours...
Je ne sais pas si c'est possible...
En tout cas, je vais faire des tests avec ce système, j'ai toujours des problèmes avec mes boutons...
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 104
Enregistré le : ven. 17 avr. 2020 01:23
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#15

Message par Nine »

Bien sûr que c'est possible, il s'agit de mettre les boutons (ou tout autre contrôle) à DISABLE avec GUICtrlSetState au début de la fonction et de les remettre à ENABLE à la fin.

ps. tu peux même mettre tout le GUI à DISABLE avec GUISetState

pps. ce que je fais lorsque la fonction dure un peu longtemps, je change le curseur avec GUISetCursor($MCID_WAIT, $GUI_CURSOR_OVERRIDE) durant l'exécution.
Modifié en dernier par Nine le mar. 26 déc. 2023 18:05, modifié 1 fois.
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#16

Message par SurPriseS »

Je pensais utiliser la première méthode, je ne connaissait pas la seconde ! ça seras plus simple et devrais parfaitement faire l'affaire !
Merci !
Globalement j'ai tout passer sur le onEvent, ça fonctionne presque (enfin tout mes boutons fonctionne correctement, c'est déjà un gros plus !)
Je ne comprend pas pourquoi il ne veux pas me fermer ma GUI principal... le $GUI_EVENT_CLOSE semble ne pas faire effet sur la GUI principale... (ok sur les fenêtres filles...)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2087
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#17

Message par TommyDDR »

Le GUISetOnEvent prend en 3ème paramètre le handle de la fenêtre voulue (par défaut, la dernière créé).
Il faut donc définir un GUISetOnEvent ( $GUI_EVENT_CLOSE, blabla ) pour chaque GUICreate.
Si vous n'y arrivez toujours pas, même réponse que plus haut : montrez nous votre code reproduisant le problème évoqué.

De manière générale, lorsque vous avez un problème : postez un code pouvant reproduire le problème, n'attendez pas que quelqu'un vous le demande (vous gagnerez du temps sur les réponses et vous nous en faites gagner par la même occasion :bisou: )
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#18

Message par SurPriseS »

TommyDDR, pour la dernière partie j'étais entrain d'éditer mon message et j'ai du partir rapidement... Je règle quelques problèmes annexes (que je comprend :lol: ) et j'essaye de modifier une version pour supprimer la partie mysql et vous la poster ;)
Il faut donc définir un GUISetOnEvent ( $GUI_EVENT_CLOSE, blabla ) pour chaque GUICreate.
Je vais revérifier mais normalement, c'est bien ce que j'ai fait !
SurPriseS
Niveau 6
Niveau 6
Messages : 289
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#19

Message par SurPriseS »

Voila un bout du script.
Globalement il n'y as que la boucle principal d'active, le gros du code est désactivé
Fichiers joints
Config - Boot - Nettoyage V3 - Copie (2) OnEvent.zip
(63.63 Kio) Téléchargé 100 fois
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2087
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [R] Bouton qui reste cliqué - lié fenetre fille ?

#20

Message par TommyDDR »

Quand je parlais d'un code pour reproduire, je parlais de supprimer tous les bouts inutiles pour avoir un code minimal.
Surtout quand vous avez 1000 includes qui font des Run(), RunWait(), RegWrite()
En général on évite de faire exécuter autre chose à ceux qui vous aident :3
J'ai pas le temps de faire ce nettoyage pour le moment mais déjà :
if $screen_res_H < 901 Then
    Global $Form1 = GUICreate("Installation / Config Auto", 800, 600, 192, 50)
    GUISetOnEvent($GUI_EVENT_CLOSE, Terminate,$Form1)
    GUISetState()
    $edit_cmd =  GUICtrlCreateEdit("", 10, 550 , 780, 40, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY+ $ES_OEMCONVERT)

Else
    Global $Form1 = GUICreate("Installation / Config Auto", 800, 800, 192, 50)
    $edit_cmd = GUICtrlCreateEdit("", 10, 550, 780, 240, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY + $ES_OEMCONVERT)
EndIf
Si votre résolution est >= 901, vous ne faites pas de GUISetOnEvent, donc déjà vous avez un comportement radicalement différent suivant la résolution.
Vous avez les variables à votre disposition, servez-vous en :
Local $formHeight = 800
Local $editHeight = 240

if $screen_res_H < 901 Then
    $formHeight = 600
    $editHeight = 40
EndIf

Global $Form1 = GUICreate("Installation / Config Auto", 800, $formHeight, 192, 50)
GUISetOnEvent($GUI_EVENT_CLOSE, Terminate,$Form1)
GUISetState()
$edit_cmd =  GUICtrlCreateEdit("", 10, 550 , 780, $editHeight, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY+ $ES_OEMCONVERT)
Essayez de poster un code minimal fonctionnel (juste les fenêtres) :)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Répondre