[R] Fermeture d'une fenêtre-fille

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
GMH
Niveau 5
Niveau 5
Messages : 152
Enregistré le : dim. 24 juin 2012 13:56
Status : Hors ligne

[R] Fermeture d'une fenêtre-fille

#1

Message par GMH » lun. 30 avr. 2018 18:16

Bonjour,

Je ne parviens pas à fermer une fenêtre-fille contenant une boucle infinie, sans que la fenêtre-mère plante. Je souhaiterais sortir de la boucle et fermer la fenêtre-fille par le bouton ECHAP de mon clavier, tout en retrouvant la main sur la fenêtre-mère.

Code : Tout sélectionner

Func fenetreFille()
Local $hDLL = DllOpen("user32.dll")

While 1
	If _IsPressed("1B", $hDLL) then
		ExitLoop
		fermerFenetreFille()
	EndIf
	...
	Ici le code affichant les valeurs contenues dans un fichier texte, une à une avec un temps de pause entre chacun des affichages
	...
WEnd

EndFunc


Func fermerFenetreFille()
	FileClose($hFileOpen)
	GuiDelete($GUIfenetreFille)
EndFunc
Je vous remercie de votre aide.
Modifié en dernier par GMH le mar. 01 mai 2018 09:22, modifié 1 fois.

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

Re: [..] Fermeture d'une fenêtre-fille

#2

Message par walkson » lun. 30 avr. 2018 19:24

Bonjour,
à l'appel de la touche Echap, la gui se ferme automatiquement. Il faudra utiliser un autre raccourci comme F2
Un remarque sur votre code
fermerFenetreFille()   
ExitLoop
Je pense que c'est mieux ainsi :P
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

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

Re: [..] Fermeture d'une fenêtre-fille

#3

Message par mikell » lun. 30 avr. 2018 20:02

ESC est utilisé par défaut pour fermer la gui, mais rien n'interdit de changer ça, avec HotkeySet par exemple :P

#include <GUIConstantsEx.au3>

HotKeySet("{ESC}", "Tilt")

$gui = GUICreate("test", 400, 100)
GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
    Sleep(10)
WEnd

Func Tilt()
    MsgBox(0, "", "tilt")
EndFunc  

Cela dit, même sans hotkeyset ça ne pose pas vraiment de problème ^^

#include <Misc.au3>

Global $gui2

$gui = GUICreate("test", 400, 100)
GUISetState()

fenetreFille()

While 1
  Sleep(10)
WEnd

Func fenetreFille()
   $gui2 = GUICreate("fille", 200, 200, 200, 200)
   GUISetState()

   While 1
        If _IsPressed("1B") then
                fermerFenetreFille()
                ; ExitLoop
        EndIf
   WEnd
EndFunc

Func fermerFenetreFille()
        GuiDelete($gui2)
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 )

GMH
Niveau 5
Niveau 5
Messages : 152
Enregistré le : dim. 24 juin 2012 13:56
Status : Hors ligne

Re: [..] Fermeture d'une fenêtre-fille

#4

Message par GMH » mar. 01 mai 2018 07:11

Bonjour et merci pour vos réponses.
Toutes ces méthodes de fermeture de la fenêtre-fille fonctionnent bien. Le problème est que, après fermeture, je n'ai plus la main sur la fenêtre-mère. Celle-ci est plantée. Le problème se situe donc dans le code de la fenêtre-mère. Il doit y avoir une boucle qui a été contrariée lors de l'ouverture de la fenêtre-fille. Je vais regarder ça de plus près.
Je vous remercie encore.
==============================================================
J'avais, en effet, une boucle lancée dans la fenêtre-mère d'où je n'étais pas sorti lorsque j'ouvrais la fenêtre-fille. Je m'attelle à trouver une solution.

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

Re: [R] Fermeture d'une fenêtre-fille

#5

Message par TommyDDR » mer. 02 mai 2018 10:18

C'est parceque vous restez bloqué dans votre fonction "fenetreFille" à cause de votre while 1.
Il ne faut jamais mettre de boucle infinie dans une fonction, sinon, toute la gestion des évènements est mise en attente.
Et d'une manière plus générale, je vous conseille d'utiliser le mode évènementiel des GUIs -> Opt("GUIOnEventMode", 1)
Cela permettra d'utiliser les fonctions GUISetOnEvent (évènements de fenêtre) et GUICtrlSetOnEvent (évènements de controls) qui permettent d'associer une fonction à un événement précis : quand l’événement arrive, votre fonction est automatiquement lancée (sauf si vous avec bloqué le programme dans une boucle infini)
Dernier conseil, créez toutes vos fenêtre en début de script et affichez / cachez les sur demande au lieu de les recréer / détruire.
#include <GUIConstantsEx.au3>
#include <Misc.au3>

Opt("GUIOnEventMode", 1)

Global $gui
Global $gui2

$gui = GUICreate("test", 400, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, quit, $gui)
GUISetState()

$gui2 = GUICreate("fille", 200, 200, 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, fermerFenetreFille, $gui2)
fenetreFille()

While 1
        Sleep(10)
WEnd

Func fenetreFille()
   GUISetState(@SW_SHOW, $gui2)
EndFunc

Func fermerFenetreFille()
    GUISetState(@SW_HIDE, $gui2)
EndFunc

Func quit()
        Exit
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

GMH
Niveau 5
Niveau 5
Messages : 152
Enregistré le : dim. 24 juin 2012 13:56
Status : Hors ligne

Re: [R] Fermeture d'une fenêtre-fille

#6

Message par GMH » mer. 02 mai 2018 12:53

Bonjour et merci pour vos conseils. Quand on apprend, on ne prend pas toujours de bonnes habitudes.

Répondre