HideWindow() et gadgets

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

HideWindow() et gadgets

Message par tatanas »

Bonjour à tous,

Je suis confronter à un problème auquel je n'avais pas été confronté sous Autoit. Le fonctionnement semble différer.
J'explique rapidement (le code qui reproduit le problème est en dessous) :
Une fenêtre principale avec un bouton qui appelle une procédure de traitement. Dans cette procédure j'affiche une seconde fenêtre qui était cachée à sa création et que je rends donc visible.
Soucis, dans cette seconde fenêtre, j'ai un bouton et ce bouton ne veut pas s'afficher. Il semblerait que le HideWindow() ne fasse réapparaitre que la window et non les gadgets.
Comment dois-je procéder ?

Code : Tout sélectionner

Procedure test()
	HideWindow(3, 0) ; show

	StartTime.q = ElapsedMilliseconds()

	Repeat
		Delay(100)
	Until ElapsedMilliseconds() - StartTime >= 5000

	HideWindow(3, 1) ; hide
EndProcedure


OpenWindow(1, 100,100,500,500,"test")
ButtonGadget(2, 10,10,100,100,"test")


OpenWindow(3, 0, 0, 160, 160, "", #WS_POPUP | #WS_BORDER | #PB_Window_Invisible | #PB_Window_WindowCentered, WindowID(1))
SetWindowColor(3, RGB(255,255,255))
ButtonGadget(4, 136, 2, 20, 20, Chr(10007))		



Repeat
	Event = WaitWindowEvent()
	Select Event
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 2
					test()
				Case 4
					Break
			EndSelect
	EndSelect
Until Event = #PB_Event_CloseWindow

End

Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: HideWindow() et gadgets

Message par Marc56 »

Créer une boucle d'évènement (unique) pour forcer la mise à jour de la fenêtre et des gadgets.
Une méthode (non valable dans un thread)

Code : Tout sélectionner

Procedure test()
    HideWindow(3, 0) ; show
    ...
    While WindowEvent() : Wend
    ...
(testé)

:idea: À stocker dans les modèles de code, ça sert souvent
:arrow: While WindowEvent() : Wend
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HideWindow() et gadgets

Message par Ar-S »

Salut,
Avec des Bind tu auras plus de libertés

Code : Tout sélectionner


Declare OpenWindow1()
Declare OpenWindow2()

Global.b count

Procedure TimerEvent()
  
  
  count +1
  If count <= 5
    SetWindowTitle(1, Str(count))
  ElseIf count > 5
    HideWindow(3,1)
    SetWindowTitle(1, "")
  EndIf
  
EndProcedure

Procedure test()
  OpenWindow2()
  Count=0
  
EndProcedure

Procedure Exit()
  CloseWindow(3)
  UnbindEvent(#PB_Event_Gadget, @exit(),3,4)
EndProcedure



Procedure OpenWindow1()
  OpenWindow(1, 100,100,500,500,"test")
  ButtonGadget(2, 10,10,100,100,"test1")
  
  AddWindowTimer(1,5,1000)
  
  BindEvent(#PB_Event_Gadget, @test(),1,2)
  BindEvent(#PB_Event_Timer, @TimerEvent(),1,5)
  
EndProcedure


 Procedure OpenWindow2()
 
  OpenWindow(3, 0, 0, 160, 160, "", #WS_POPUP | #WS_BORDER | #PB_Window_WindowCentered, WindowID(1))
  SetWindowColor(3, RGB(255,255,255))
  ButtonGadget(4, 136, 2, 20, 20, Chr(10007))      
  
  BindEvent(#PB_Event_Gadget, @exit(),3,4)
  
  
EndProcedure


OpenWindow1()

Repeat
   Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  
  UnbindEvent(#PB_Event_Gadget, @test(),1,2)
  UnbindEvent(#PB_Event_Timer, @TimerEvent(),1,5)
End
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: HideWindow() et gadgets

Message par MLD »

Bonjour tatanas

Pour infos une boucle est toujours bloquante.
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: HideWindow() et gadgets

Message par tatanas »

Merci pour ces réponses.

Je viens de trouver un autre moyen en forçant un rafraichissement de la fenêtre avec UpdateWindow_().
AutoIt doit probablement gérer cela en interne ce qui fait que je n'ai jamais rencontré ce problème.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: HideWindow() et gadgets

Message par Zorro »

@tatanas

pour ne pas t'embrouiller , voici ton exemple legerement ré-ecrit (plus propre)
prends l'habitude d'utiliser les Enumerations ça éclairci les choses ;)

là l'exemple est simple ,

on creer une fenetre avec ses gadgets
puis on creer la ou les fenetres filles, avec leur gadgets et on les cache ...

ensuite on attaque la boucle principale de la fenetre mere qui appelera par son gadget bouton la ou les fenetres filles
et chaque fenetres fille doit alors avoir sa propre boucle d'evenements ;)

Code : Tout sélectionner


Declare fenetre_fille()

Enumeration
		#win 
		#win2
		#bouton_test
		#bouton_quit		
EndEnumeration

; on creer une premiere fenetre mere avec ses gadgets
OpenWindow(#win, 100,100,500,500,"test")
ButtonGadget(#bouton_test, 10,10,100,100,"test")

;on creer une fenetre fille avec ses gadgets
OpenWindow(#win2, 0, 0, 160, 160, "", #WS_POPUP | #WS_BORDER | #PB_Window_Invisible | #PB_Window_WindowCentered, WindowID(#win))
SetWindowColor(#win2, RGB(255,255,255))
ButtonGadget(#bouton_quit, 136, 2, 20, 20, "X") 



; ici c'est la boucle principale qui gere la fenetre mere
Repeat
		Event = WaitWindowEvent(2)
		Select Event
						
				Case #PB_Event_Gadget
						Select EventGadget()
								Case #bouton_test
										fenetre_fille()         
						EndSelect
		EndSelect
Until Event = #PB_Event_CloseWindow




End


Procedure fenetre_fille()
		HideWindow(#win2, 0) ; show		
		; ici c'est la boucle principale de la fenetre fille
		Repeat
				Event=WaitWindowEvent(2)
				Select Event
						Case #PB_Event_Gadget
								Select EventGadget()
										Case #bouton_quit
												HideWindow(#win2, 1) ; hide
												break
								EndSelect
				EndSelect
		Until Event = #PB_Event_CloseWindow
EndProcedure

Dernière modification par Zorro le ven. 29/nov./2019 17:02, modifié 1 fois.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: HideWindow() et gadgets

Message par MLD »

@tatanas
excuse moi, je n'avais pas terminer ma réponse.
Je suppose que c'est ce que tu cherche comme fonctionnement :

Code : Tout sélectionner

Procedure test(num)
  StartTime.q = ElapsedMilliseconds()
  Repeat
      Delay(100)
      If ElapsedMilliseconds() - StartTime >= 5000
       HideWindow(3, 1) ; hide
       Break
      EndIf
  ForEver
EndProcedure

OpenWindow(1, 100,100,500,500,"test")
ButtonGadget(2, 10,10,100,100,"test")


OpenWindow(3, 0, 0, 160, 160, "", #WS_POPUP | #WS_BORDER | #PB_Window_Invisible | #PB_Window_WindowCentered, WindowID(1))
SetWindowColor(3, RGB(255,255,255))
ButtonGadget(4, 136, 2, 20, 20, Chr(10007))      

Repeat
  Event = WaitWindowEvent()
   Select Event
      Case #PB_Event_Gadget
         Select EventGadget()
           Case 2
              HideWindow(3, 0) ; show
              CreateThread(@test(),0)
            Case 4
               Break
         EndSelect
   EndSelect
Until Event = #PB_Event_CloseWindow

End
Zorro a raison met des énumérations.
Comme une boucle est bloquante je l'ai mis dans un Thread, ce qui revient un peu a un BindEvent en plus simple
A+ Michel
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HideWindow() et gadgets

Message par Ar-S »

Zorro,
ton code ne fonctionne qu'une fois (le bouton test).
Ton HideWindow(#win2, 1) sous le buttongadget est inutile vu qu'il ouvre sa fenêtre en invisible.
Pour fermer le prog il faut cliquer 2x sur la croix si tu as déjà ouvert/fermé la 1ere fenetre.

@MLD ça marche en thread mais l'utilisation d'un delay dans une boucle perso je trouve ça salle.
Attention à ton break qui ferme tout le prog et pas seulement la fenetre 2. (Peut-être est-ce ce qu'il veut ?)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: HideWindow() et gadgets

Message par MLD »

@Ar-s
Perso je n'aurais pas mis de delay. Mais j'ai reproduit ce que tatanas voulais.
A+
Michel
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: HideWindow() et gadgets

Message par Zorro »

Ar-S a écrit :Zorro,
ton code ne fonctionne qu'une fois (le bouton test).
Ton HideWindow(#win2, 1) sous le buttongadget est inutile vu qu'il ouvre sa fenêtre en invisible.
Pour fermer le prog il faut cliquer 2x sur la croix si tu as déjà ouvert/fermé la 1ere fenetre.
arf, j'avais juste oublié le Break dans la Procedure fenetre_fille()
forcement, ça restait dans la boucle d'event de la fenetre_fille
c'est corrigé .. merci
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: HideWindow() et gadgets

Message par tatanas »

Merci de toutes ces précisions. En fait j'ai écris ce bout de code rapidement juste pour montrer le soucis de rafraîchissement de la seconde gui. Soucis que je ne rencontrais pas sous AutoIt. Je suis en train de basculer un programme d'environ 20000 lignes d'Autoit vers Purebasic en même temps que je découvre PB.
D'ailleurs dans l'une de vos réponses je vois l'utilisation d'une thread. J'avais pensé à en utiliser une mais est ce que cette thread peut en appeler d'autres ?
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: HideWindow() et gadgets

Message par MLD »

@tatanas
Je ne te conseil pas d'appeler un thread dans un thread.(Je ne sait pas si ça fonctionne). Mais se serai vite un programme style spaghettis.
Pour infos ne met pas de delay dans une boucle. il vaut mieux retarder le démarage de la boucle.
Bon courage. A+
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: HideWindow() et gadgets

Message par Mesa »

@Tatana
Puisque tu apprends PB, tu peux utiliser les timer de cette façon (voir ci-dessous).

Je me permets aussi de t'avertir que tous les petits codes (de - de 20 lignes) fonctionneront bien... Mais dès que tu passera sur un gros projet (plusieurs milliers de lignes) alors c'est une tout autre histoire.
Sur de gros projet, je te déconseille d'utilise plusieurs boucles d'évènements. Autrement dit, essaie de créer ton code pour qu'il n'y ait qu'un seul "WaitWindowEvent()" (si possible), utiliser un timer plutôt que ElapsedMilliseconds(), etc.

Code : Tout sélectionner

;REM les numérotations des fenêtres et des gadgets sont indépendantes, une fenêtre '0' peut accueillir un gadget '0'
; voir la page "Les objets PureBasic" de la doc.



OpenWindow(0, 100,100,500,500,"test") 
ButtonGadget(0, 10,10,100,100,"test") 
AddWindowTimer(0, 1, 5000)


OpenWindow(1, 0, 0, 160, 160, "", #WS_POPUP | #WS_BORDER | #PB_Window_Invisible | #PB_Window_WindowCentered, WindowID(0)) 
SetWindowColor(1, RGB(255,255,255)) 
ButtonGadget(1, 136, 2, 20, 20, Chr(10007))       



Repeat 
  Event = WaitWindowEvent() 
  Select Event 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case 0 
          RemoveWindowTimer(0,1); pas indispensable mais on est sûr que le timer recommence à 0
          AddWindowTimer(0, 1, 5000);idem
          HideWindow(1, #False) 
        Case 1 
          HideWindow(1, #True);Break 
          
          
      EndSelect
    Case #PB_Event_Timer
      Select EventTimer()
        Case 1
          HideWindow(1, #True)
      EndSelect
  EndSelect 
Until Event = #PB_Event_CloseWindow 

End 
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: HideWindow() et gadgets

Message par Zorro »

Mesa a écrit : Je me permets aussi de t'avertir que tous les petits codes (de - de 20 lignes) fonctionneront bien... Mais dès que tu passera sur un gros projet (plusieurs milliers de lignes) alors c'est une tout autre histoire.
Sur de gros projet, je te déconseille d'utilise plusieurs boucles d'évènements.
je suis pas d'accords, la version que je donne fonctionnera sur les gros codes !
a partir du moment ou chaque boucle se trouves dans sa procedure .. le contexte est sauf puisque local a la procedure....

j'aimerai bien justement voir ta simple boucle avec pour son exemple
une centaine de gadget sur la fenetre A
et une centaine de gadgets sur la fenetre B ...

voir pourquoi pas ton code avec 10 fenetres differentes...(qui contiennent autant de gadgets.. bien sur )

tu verra que mon approche "Multi boucles" dans des procedures , sera beaucoup plus lisible qu'une simple boucle
qui tentera de tout gerer ... ;)


enfin... je crois :mrgreen:
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: HideWindow() et gadgets

Message par Marc56 »

Et surtout, comme on le dit tout le temps: utilise les constantes pour les identifiants d'objets (fenêtres, gadgets, handles de fichiers etc), car avec les numéros, tu va vite avoir des erreurs d'inattention difficiles à debbuguer. Le compilateur ne prévient pas qu'un numéro est déjà utilisé, il prendre le dernier.

Enumeration permet de gérer ces nombres automatiquement.

Les énumérations nommées sont très utiles pour continuer une séquence à plusieurs endroits du code ou si le source est sur plusieurs fichiers

:wink:
Répondre