Fenêtres multiples, ouvertures et fermetures aléatoires...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Fenêtres multiples, ouvertures et fermetures aléatoires...

Message par Jacobus »

Bonjour tout le monde,
Je me demande si c'est moi ou s'il y a un problème avec les fenêtres multiples. J'ai dû rater un truc, mais quand même ça m'interpelle...
Essayez ce code simple et dites moi si ça vous le fait aussi. Les problèmes surviennent à la fermeture des fenêtres.
Dans cet exemple, je fais apparaître la fenêtre seconde puis la referme et là ça bug si je veux rouvrir la fenêtre puis la fermer. Même la fenêtre mère ne se ferme pas, il faut cliquer trois fois sur la croix ou le bouton.
Précisons que j'ai les mêmes problèmes si j'appelle mes fenêtres dans des procédures et dans du code plus complexe, ou encore en "thread"
Arf, ça fait un brin que je cherche en vain... :?

Version PB : 5.42 et Windows 10

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 220, 120, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ButtonGadget  (1, 10, 30, 200, 30, "Fermer")
  
  ButtonGadget  (2, 10, 70, 200, 30, "Fenêtre seconde")
   
   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 
              CloseWindow(0)
              End 
              
           Case 2
             If OpenWindow(1, 0, 0, 220, 120, "Fenêtre seconde", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
               ButtonGadget  (3, 10, 30, 200, 30, "Fermer")
                Repeat
                 Event1 = WaitWindowEvent()         
                 Select Event1
                   Case #PB_Event_Gadget
                     Select EventGadget()
                       Case 3
                         CloseWindow(1)
                     EndSelect
                 EndSelect
                Until Event1 = #PB_Event_CloseWindow
             EndIf 
             
              
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow
  End 
 EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par Ar-S »

Regarde la gestion des évènements :

Code : Tout sélectionner

Enumeration 0 ; Id. Fenêtres
		#FENETRE1
		#FENETRE2
EndEnumeration
Enumeration 0 ; Id. Gadgets
		#FEN1_BOUTON
		#FEN1_FERMER
		#FEN2_FERMER
EndEnumeration

If OpenWindow(#FENETRE1, 0, 0, 640, 480, "Fenêtre 1", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)      
				ButtonGadget(#FEN1_BOUTON, 5,  5, 100, 22, "Ouvrir Fenêtre 2")
				ButtonGadget(#FEN1_FERMER, 5, 45, 100, 22, "Quitter")
 		Repeat            
				Evenement.l = WaitWindowEvent()            
				Select EventWindow()                        
						;=====================================================
						;== EVENEMENTS DE LA FENETRE PRINCIPALE
						;=====================================================
						
						Case #FENETRE1                        
						Select Evenement                                    
								Case #PB_Event_Gadget                                    
								Select EventGadget()                                                
										Case #FEN1_BOUTON
										If OpenWindow(#FENETRE2, 0, 0, 320, 240, "Fenêtre 2", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
														ButtonGadget(#FEN2_FERMER, 5, 5, 100, 22, "Fermer")
										EndIf                                                
										Case #FEN1_FERMER
										Break                                                
								EndSelect
								
								Case #PB_Event_CloseWindow
								Break
								
						EndSelect
						
						;=====================================================
						;== EVENEMENTS DE LA FENETRE SECONDAIRE
						;=====================================================
						
						Case #FENETRE2                        
						Select Evenement                                    
								Case #PB_Event_Gadget                                    
								If EventGadget() = #FEN2_FERMER
										CloseWindow(#FENETRE2)
								EndIf                                    
								Case #PB_Event_CloseWindow                                    
								CloseWindow(#FENETRE2)                                    
						EndSelect                        
				EndSelect            
		ForEver      
EndIf

~~~~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
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par microdevweb »

Bonsoir Jacobus,

Depuis la version 5.31 il existe une gestion d'événements beaucoup plus puissante
BindEvent,BindGadgetEvent,BindMenuEvent

Ci-dessous un petit exemple avec ouverture de fenêtre à la volée (+ de 30 fenêtres si tu veux), j'espère que cela te sera utile

Code : Tout sélectionner

Enumeration 
    #MainForm
    #MainBtAddNewForm
EndEnumeration
Global NewList gListForm.i()
Procedure Exit()
    End
EndProcedure
Procedure CloseForm()
    Protected *IdForm=GetWindowData(GetActiveWindow())
    CloseWindow(GetActiveWindow())
    ChangeCurrentElement(gListForm(),*IdForm)
    DeleteElement(gListForm())
EndProcedure
Procedure AddNewForm()
    Protected flag=#PB_Window_SystemMenu
    Protected Y=100
    Static X
    AddElement(gListForm())
    Protected title$="Form "+Str(ListSize(gListForm()))
    gListForm()=OpenWindow(#PB_Any,X,Y,200,200,title$,flag)
    ; Memorise l'id de la liste pour supprimer l'élément à la fermeture
    SetWindowData(gListForm(),@gListForm())
    BindEvent(#PB_Event_CloseWindow,@CloseForm(),gListForm())
    X+20
    StickyWindow(gListForm(),#True)
EndProcedure
Procedure OpenMainForm()
    Protected flag=#PB_Window_SystemMenu|#PB_Window_Maximize
    OpenWindow(#MainForm,0,0,800,600,"Teste",flag)
    ButtonGadget(#MainBtAddNewForm,50,20,150,30,"Add new form")
    ; Place un callback pour quitter le programme
    BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
    ;Place un callback pour ouvrir une nouvelle fenêtre
    BindGadgetEvent(#MainBtAddNewForm,@AddNewForm())
EndProcedure
OpenMainForm()
Repeat:WaitWindowEvent():ForEver
Dernière modification par microdevweb le ven. 25/mars/2016 23:45, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par falsam »

Une autre méthode différente de celle d'Ar-s

On teste l'ensemble des gadget dans un seul événement #PB_Event_Gadget.
On teste l'ensemble des fenêtres dans un seul événement #PB_Event_CloseWindow

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 220, 120, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget  (1, 10, 30, 200, 30, "Fermer")
  ButtonGadget  (2, 10, 70, 200, 30, "Fenêtre seconde")
  
  ;Boucle evenementielle de ton application
  Repeat 
    Event = WaitWindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        ;Il y a eu un évenement sur un gadget
        ;Tu as 3 gadgets. Teste l'ensemble de tes gadgets ici
        Select EventGadget()
          Case 1 
            ;Fermeture de l'application 
            CloseWindow(0)
            End
            
          Case 2 
            ;Ouverture de la fenetre secondaire SI elle n'est pas déja ouverte
            If Not IsWindow(1)
              If OpenWindow(1, 0, 0, 220, 120, "Fenêtre seconde", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
                ButtonGadget  (3, 10, 30, 200, 30, "Fermer")
              EndIf
            EndIf 
            
          Case 3
            ;Fermeture de la fenetre secondaire 
            CloseWindow(1)
            
        EndSelect
        
      Case #PB_Event_CloseWindow 
        ;Une fenetre est fermé : Laquelle ?
        Select EventWindow()
            ;Il y a deux fenetres dans ton codes. Teste les deux fenetres ici
            
          Case 0 
            ;C'est la fenetre principale : Fermeture de l'application
            End
            
          Case 1
            ; C'est la fenetre secondaire : On ferme cette fenetre
            CloseWindow(1)
            
        EndSelect
    EndSelect
    
  ForEver
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par microdevweb »

@Falsam,

ça plante si tu clique sur fermer :wink:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par falsam »

Normal il manquait un end. C'est corrigé.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par Jacobus »

Merci les gars pour votre réactivité et toutes ces réponses très explicites :)
Il faut que je réapprenne certaines façons de faire...
C'est vrai qu'il faut que je me familiarise avec la nouvelle version de PB et toutes ses nouvelles commandes... j'ai du retard à rattraper et du code à mettre à jour :roll:
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par Ar-S »

j'ai du retard à rattraper et du code à mettre à jour
JE serai toi je les reprendrai de 0, ça ne sera pas plus long (peut-être moins) et ça te permettra de prendre en main les nouvelles façons de faire. :wink:
Bon courage.
~~~~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
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Fenêtres multiples, ouvertures et fermetures aléatoires.

Message par Jacobus »

Ar-S a écrit :
j'ai du retard à rattraper et du code à mettre à jour
JE serai toi je les reprendrai de 0, ça ne sera pas plus long (peut-être moins) et ça te permettra de prendre en main les nouvelles façons de faire. :wink:
Bon courage.
Salut Ar-S,
Pour un petit code ok, mais pour certains de mes progs c'est plus de 50 000 lignes! 8O
Je me vois mal tout refaire... j'ai plus autant de temps pour ça. Mais bon avec de la patience je vais y arriver. J'ai déjà remis quelques routines à jour.
Je suis actuellement sur une boîte mail (nouveau pour moi) et ça fonctionne très très bien (grâce à vos interventions :wink: ), un petit code de 3000 lignes pour me refaire la main :)
Je publierais le code pour ceux que ça intéresse...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre