2 fenêtres pour 1 evenement

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

2 fenêtres pour 1 evenement

Message 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.....
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: 2 fenêtres pour 1 evenement

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2145
Inscription : sam. 08/févr./2014 15:19

Re: 2 fenêtres pour 1 evenement

Message 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:
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: 2 fenêtres pour 1 evenement

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: 2 fenêtres pour 1 evenement

Message 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
Répondre