Page 1 sur 1

2 fenêtres pour 1 evenement

Publié : mer. 03/avr./2019 23:11
par Ekim
Bonsoirs à tous,

Je fais face à un problème dont je ne m'y attendais pas

Je ne sais pas si 2 fenêtres et leurs gadgets respectifs peuvent cohabiter dans la même boucle

Code : Tout sélectionner

Openwindow 1 et ses gadgets

Openwindow 2 et ses gadgets 

Repeat
	Event = WaitWindowEvent()
	WindowID = EventWindow()
	GadgetID = EventGadget()
	EventType = EventType()

....

until.....

Re: 2 fenêtres pour 1 evenement

Publié : jeu. 04/avr./2019 7:06
par Micoute
Bien entendu, mais il faut différencier les gadgets et en particulier les fenêtres, à moins qu'on veuille que tout s'arrête en même temps, s'il s'agît de deux fenêtres voisines, car s'il s'agît de deux fenêtres se chevauchant, la méthode n'est pas la même.

Re: 2 fenêtres pour 1 evenement

Publié : jeu. 04/avr./2019 7:36
par Marc56
Je ne sais pas si 2 fenêtres et leurs gadgets respectifs peuvent cohabiter dans la même boucle
  • Il ne doit de toute façon y avoir qu'une seule boucle d’événement par programme.
  • Chaque événement retourné par WaitWindowEvent() ou WindowEvent() contient deux informations:
    • L’événement
    • La fenêtre qui a retourné l’événement
  • On peut séparer soit au niveau fenêtre, soit au niveau Gadget()
  • Sans séparation, ce sont tous les événements identiques qui sont groupés

Code : Tout sélectionner

; Cas 1 n'importe quelle case de fermeture ferme toutes les fenêtres

EnableExplicit

Enumeration 
    #Win_0    
    #Win_1   
    #Win_2    
EndEnumeration

OpenWindow(#Win_0, 100, 100, 100, 100, "")
OpenWindow(#Win_1, 200, 200, 100, 100, "")
OpenWindow(#Win_2, 300, 300, 100, 100, "")

Repeat
    Select WaitWindowEvent()

        Case #PB_Event_CloseWindow
            Break

    EndSelect
ForEver

Code : Tout sélectionner

; Cas 2: Seule la fenête 0 ferme le programme, les autres ferment la fenêtre appelante

EnableExplicit

Enumeration 
    #Win_0    
    #Win_1   
    #Win_2    
EndEnumeration

OpenWindow(#Win_0, 100, 100, 100, 100, "")
OpenWindow(#Win_1, 200, 200, 100, 100, "")
OpenWindow(#Win_2, 300, 300, 100, 100, "")

Repeat
    Select WaitWindowEvent()

        Case #PB_Event_CloseWindow
            
            Select EventWindow()
                Case #Win_0 : Break
                Case #Win_1 : CloseWindow(#Win_1)
                Case #Win_2 : CloseWindow(#Win_2)
            EndSelect
            
    EndSelect
ForEver
Pour éviter les erreurs, une technique simple est de préfixer tous les gadgets en fonction de leur fenêtre. Ainsi pas de doublon possible. Ex #Win_0_Btn_Quit #Win_0_Btn_Save ...

:wink:

Re: 2 fenêtres pour 1 evenement

Publié : jeu. 04/avr./2019 10:36
par microdevweb
Bonjour Ekim,

Personnellement je n'utilise plus la boucle pour la gestion des événements mais les bind

Voici une exemple concret

Teste les boutons ainsi que les croix pour fermer les fenêtre :wink:

Code : Tout sélectionner

Enumeration ; id window
  #FORM_1
  #FORM_2
EndEnumeration
Enumeration ; id gadget
  #BT_1
  #BT_2
EndEnumeration
; GESTION DES EVENT
Procedure evClose()
  MessageRequester("Info","vous aller fermer la fenêtre "+GetWindowTitle(EventWindow()))
  CloseWindow(EventWindow())
  ; je teste si les deux fenêtre sont fermée et quitte alors
  ; le program
  If Not IsWindow(#FORM_1) And Not IsWindow(#FORM_2)
    End
  EndIf
EndProcedure

Procedure evBt_1()
  MessageRequester("Info","vous avez cliquer sur le bouton 1")
EndProcedure

Procedure evBt_2()
  MessageRequester("Info","vous avez cliquer sur le bouton 2")
EndProcedure

Procedure openForm_1()
  OpenWindow(#FORM_1,0,0,400,400,"FORM 1 ",#PB_Window_SystemMenu)
  ButtonGadget(#BT_1,150,175,100,50,"BUTTON_1")
  ; MISE EN PLACE DU CALLBACK POUR LA FENPETRE
  BindEvent(#PB_Event_CloseWindow,@evClose(),#FORM_1)
  ; CALLBACK BUTTON
  BindGadgetEvent(#BT_1,@evBt_1())
EndProcedure

Procedure openForm_2()
  OpenWindow(#FORM_2,400,0,400,400,"FORM 2 ",#PB_Window_SystemMenu)
  ButtonGadget(#BT_2,150,175,100,50,"BUTTON_2")
  ; MISE EN PLACE DU CALLBACK POUR LA FENPETRE
  BindEvent(#PB_Event_CloseWindow,@evClose(),#FORM_2)
  ; CALLBACK BUTTON
  BindGadgetEvent(#BT_2,@evBt_2())
EndProcedure

; ouverture des fenêtres
openForm_1()
openForm_2()
; MAIN LOOP
Repeat : WaitWindowEvent() : ForEver

Re: 2 fenêtres pour 1 evenement

Publié : jeu. 04/avr./2019 23:02
par Ekim
@Micoute @Marc56 donc se qu'il faut retenir c'est une boucle pour toutes les fenêtres mais il faut les différencier par leur variable et l'exemple "EventWindow()" est cool merci :wink:

Salut @microdevweb ta façon me fait beaucoup penser au vbscript))) je dis ça car je pratiquais beaucoup)) mais effectivement, la méthode simplifie les choses sur plusieurs façons, merci)

merci à vous les Basiciens :D