[RESOLU] blocage 1ere fenêtre par la seconde + thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

[RESOLU] blocage 1ere fenêtre par la seconde + thread

Message par Malo »

Bonjour

J'ai fait un petit bout de programme "bateau" avec 2 versions pour présenter mon petit problème.

Le principe ; depuis les menus de la fenêtre principale l'utilisateur peut ouvrir une seconde
fenêtre et la laissée ouverte ou la fermer à sa convenance.

Quand la 2eme fenêtre est ouverte il doit pouvoir travailler sur les deux fenêtres.
Le problème est là , dans ce cas de figure on ne peut qu'écrire dans un StingGadget, les actions
sur les menus et les autres gadgets sont sans effets.

Dans la 2eme version , j'ai résolu mon problème en utilisant un Thread. Es-que c'est la seule
solution?

l'utilisation du Thread nécessite KillThread pour l'arrêter, mais quand je lit la doc , je vois
qu'il faut l'utiliser avec prudence.
Je pense que la libération des ressources du Thread doit correspondre à l'arrêt de la fenêtre?

Merci par avance pour vos explications et conseils.

Version 1

Code : Tout sélectionner

Global fetreListe
Global valideMenuP

Enumeration
#Fenetre_0
#Fenetre_1

#Fenetre_2
#LeMenu
#Quitter
#TraitementVegetaux
#TableauxV
#TraitementProteines
#TableauxP
#Combo_0
#Text_0
#Text_3
#Gout
#Frame3D_0
#Radio_0
#Radio_1
#Valider_0
#Text_0_2
#Gout_2
#Frame3D_0_2
#Radio_0_2
#Radio_1_2
#Valider_0_2

#ValF2
#SaisieF2
#Text_F2
#Quit_0_2
EndEnumeration


Declare CreerMenus()


Procedure Efface_Proteines()
FreeGadget(#Text_0_2)
FreeGadget(#Gout_2)
FreeGadget(#Frame3D_0_2)
FreeGadget(#Radio_0_2)
FreeGadget(#Radio_1_2)
FreeGadget(#Valider_0_2)
FreeGadget(#Combo_0)
FreeGadget(#Text_3)
EndProcedure



Procedure Efface_Vegetaux()
FreeGadget(#Text_0)
FreeGadget(#Gout)
FreeGadget(#Frame3D_0)
FreeGadget(#Radio_0)
FreeGadget(#Radio_1)
FreeGadget(#Valider_0)
EndProcedure

Procedure Fenetre_Vegetaux()

Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())

Efface_Proteines()

TextGadget(#Text_0, 20, 180, 100, 20, "Goût végétaux")
StringGadget(#Gout, 20, 200, 300, 25, "")
Frame3DGadget(#Frame3D_0, 400, 90, 100, 100, "Choix ")
OptionGadget(#Radio_0, 420, 110, 60, 20, "Fruits")
OptionGadget(#Radio_1, 420, 140, 60, 20, "Légumes")
ButtonGadget(#Valider_0, 200, 400, 80, 50, "Valider");

UseGadgetList(WindowID(#Fenetre_0))
EndProcedure




Procedure Fenetre_Proteines()


Debug "Fenetre_Proteines() :"+Str(GetActiveWindow())

TextGadget(#Text_3, 20, 90, 160, 20, "Pays")
ComboBoxGadget(#Combo_0, 20, 110, 200, 20)

AddGadgetItem(#Combo_0,0,"Angleterre")
AddGadgetItem(#Combo_0,-1,"France")
AddGadgetItem(#Combo_0,-1,"USA")
AddGadgetItem(#Combo_0,-1,"Brésil")
AddGadgetItem(#Combo_0,-1,"Espagne")
AddGadgetItem(#Combo_0,-1,"Maroc")


TextGadget(#Text_0_2, 20, 180, 100, 20, "Goût Viande")
StringGadget(#Gout_2, 20, 200, 300, 25, "")

Frame3DGadget(#Frame3D_0_2, 40, 280, 100, 100, "Choix ")
OptionGadget(#Radio_0_2, 50, 310, 60, 20, "viandes")
OptionGadget(#Radio_1_2, 50, 350, 60, 20, "Poissons")
ButtonGadget(#Valider_0_2, 200, 400, 80, 50, "Valider");


UseGadgetList(WindowID(#Fenetre_0))
EndProcedure





Procedure FenetreListeVegetaux()
If OpenWindow(#Fenetre_2,0,0,400,300,"Fenetre 2 : Tableau Végétaux", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	StickyWindow(#Fenetre_2,1)
	ButtonGadget(#Quit_0_2, 200, 150, 60, 30, "Quitter");
	Debug "ouvre FenetreListeVegetaux()"
	ButtonGadget(#ValF2, 200, 120, 60, 30, "Valider");
	ButtonGadget(#Quit_0_2, 200, 18, 60, 30, "Quitter");
	TextGadget(#Text_F2, 20, 160, 100, 20, leTxt$)
	StringGadget(#SaisieF2, 20, 200, 300, 25, "")
	
EndIf
Repeat
	Event = WaitWindowEvent ()
	Select Event
		Case #PB_Event_ActivateWindow
			If GetActiveWindow()=0
				;SetActiveWindow(#Fenetre_0)
				Debug "Fenetre 0 :"+Str(GetActiveWindow())
			ElseIf GetActiveWindow()=2
				Debug "Fenetre 2 :"+Str(GetActiveWindow())
				
				
			EndIf
		
		Case #PB_Event_Gadget
			Select EventGadget()
			
				Case #SaisieF2
					;Debug "OkF2"
					leTxt$=GetGadgetText(#SaisieF2)
					TextGadget(#Text_F2, 20, 160, 100, 20, leTxt$)
					;Debug leTxt$
				
				Case #Quit_0_2
				
					Event = #PB_Event_CloseWindow
				Case #ValF2
					Debug leTxt$
			EndSelect
	
	EndSelect

Until Event = #PB_Event_CloseWindow Or quitF2=1

CloseWindow ( #Fenetre_2 )
Debug "Quit"
SetActiveWindow(#Fenetre_0)
UseGadgetList(WindowID(#Fenetre_0))
EndProcedure





Procedure CreerMenus()
If CreateMenu(#LeMenu,WindowID(#Fenetre_0))
	MenuTitle("Fichier")
	MenuItem(#Quitter,"&Quitter")
	
	MenuTitle("Végétaux")
	MenuItem(#TraitementVegetaux,"&Traitement Végétaux")
	MenuItem(#TableauxV,"&Tableaux des Végétaux")
	
	
	MenuTitle("Protéines")
	MenuItem(#TraitementProteines,"&Traitement Protéines")
	MenuItem(#TableauxP,"&Tableaux des Protéines")
EndIf
EndProcedure







Procedure Fenetre_Generale()
If OpenWindow(#Fenetre_0,0,0,900,600,"Fenetre 1 : Aliments",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CreerMenus()
EndIf

Repeat
	Event = WaitWindowEvent ()
	Select Event
		
		Case #PB_Event_ActivateWindow
			SetActiveWindow(#Fenetre_0)
		
		Case #PB_Event_Gadget
			Select EventGadget()
			
				Case #Radio_0
					Debug "#Radio_0"
				Case #Radio_1
				
				Case #Valider_0
				
					Debug "Valider_0"
					Debug GetGadgetText(#Gout)
					;Main()
				Case #Radio_0_2
				
				Case #Radio_1_2
				
				
				Case #Valider_0_2
					Debug "Valider_2"
				
					Debug GetGadgetText(#Gout_2)
			
			
			EndSelect
		
		
		;----------------- Menu
		
		Case #PB_Event_Menu
		
			Select EventMenu()
				Case #Quitter
					Event = #PB_Event_CloseWindow
				Case #TraitementVegetaux

									DisableMenuItem(#LeMenu,#TableauxV , 0)
					Debug "menu V"
					;SetActiveWindow(#Fenetre_0)
					Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())
					
					Efface_Proteines()
					
					Fenetre_Vegetaux()
				Case #TraitementProteines
					DisableMenuItem(#LeMenu,#TableauxV , 1)
					;SetActiveWindow( #Fenetre_0 )
					
					Debug "menu P"
					If IsWindow(#Fenetre_2)>0
					
					
					Debug "menu P :liste vegetaux active"
					Event = #PB_Event_CloseWindow
					CloseWindow ( #Fenetre_2 )
					EndIf
					
					Efface_Vegetaux()
					Fenetre_Proteines()
					
				
				Case #TableauxV
					quitF2=0
					fetreListe=0
					If IsWindow(#Fenetre_2)>0
						Debug "liste vegetaux active"
					
					Else
						FenetreListeVegetaux()
					
					EndIf
			
			EndSelect
	EndSelect


Until Event = #PB_Event_CloseWindow
UseGadgetList(WindowID(#Fenetre_0))
EndProcedure



Fenetre_Generale()


Version 2 avec Thread

Code : Tout sélectionner

Global fetreListe
Global valideMenuP

Enumeration
#Fenetre_0
#Fenetre_1

#Fenetre_2
#LeMenu
#Quitter
#TraitementVegetaux
#TableauxV
#TraitementProteines
#TableauxP
#Combo_0
#Text_0
#Text_3
#Gout
#Frame3D_0
#Radio_0
#Radio_1
#Valider_0
#Text_0_2
#Gout_2
#Frame3D_0_2
#Radio_0_2
#Radio_1_2
#Valider_0_2

#ValF2
#SaisieF2
#Text_F2
#Quit_0_2
EndEnumeration


Declare CreerMenus()


Procedure Efface_Proteines()
FreeGadget(#Text_0_2)
FreeGadget(#Gout_2)
FreeGadget(#Frame3D_0_2)
FreeGadget(#Radio_0_2)
FreeGadget(#Radio_1_2)
FreeGadget(#Valider_0_2)
FreeGadget(#Combo_0)
FreeGadget(#Text_3)
EndProcedure



Procedure Efface_Vegetaux()
FreeGadget(#Text_0)
FreeGadget(#Gout)
FreeGadget(#Frame3D_0)
FreeGadget(#Radio_0)
FreeGadget(#Radio_1)
FreeGadget(#Valider_0)
EndProcedure

Procedure Fenetre_Vegetaux()

Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())

Efface_Proteines()

TextGadget(#Text_0, 20, 180, 100, 20, "Goût végétaux")
StringGadget(#Gout, 20, 200, 300, 25, "")
Frame3DGadget(#Frame3D_0, 400, 90, 100, 100, "Choix ")
OptionGadget(#Radio_0, 420, 110, 60, 20, "Fruits")
OptionGadget(#Radio_1, 420, 140, 60, 20, "Légumes")
ButtonGadget(#Valider_0, 200, 400, 80, 50, "Valider");

UseGadgetList(WindowID(#Fenetre_0))
EndProcedure




Procedure Fenetre_Proteines()


Debug "Fenetre_Proteines() :"+Str(GetActiveWindow())

TextGadget(#Text_3, 20, 90, 160, 20, "Pays")
ComboBoxGadget(#Combo_0, 20, 110, 200, 20)

AddGadgetItem(#Combo_0,0,"Angleterre")
AddGadgetItem(#Combo_0,-1,"France")
AddGadgetItem(#Combo_0,-1,"USA")
AddGadgetItem(#Combo_0,-1,"Brésil")
AddGadgetItem(#Combo_0,-1,"Espagne")
AddGadgetItem(#Combo_0,-1,"Maroc")


TextGadget(#Text_0_2, 20, 180, 100, 20, "Goût Viande")
StringGadget(#Gout_2, 20, 200, 300, 25, "")

Frame3DGadget(#Frame3D_0_2, 40, 280, 100, 100, "Choix ")
OptionGadget(#Radio_0_2, 50, 310, 60, 20, "viandes")
OptionGadget(#Radio_1_2, 50, 350, 60, 20, "Poissons")
ButtonGadget(#Valider_0_2, 200, 400, 80, 50, "Valider");


UseGadgetList(WindowID(#Fenetre_0))
EndProcedure





Procedure FenetreListeVegetaux(fetreListe)
If OpenWindow(#Fenetre_2,0,0,400,300,"Fenetre 2 : Tableau Végétaux", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	StickyWindow(#Fenetre_2,1)
	ButtonGadget(#Quit_0_2, 200, 150, 60, 30, "Quitter");
	Debug "ouvre FenetreListeVegetaux()"
	ButtonGadget(#ValF2, 200, 120, 60, 30, "Valider");
	ButtonGadget(#Quit_0_2, 200, 18, 60, 30, "Quitter");
	TextGadget(#Text_F2, 20, 160, 100, 20, leTxt$)
	StringGadget(#SaisieF2, 20, 200, 300, 25, "")
	
EndIf
Repeat
	Event = WaitWindowEvent ()
	Select Event
		Case #PB_Event_ActivateWindow
			If GetActiveWindow()=0
				;SetActiveWindow(#Fenetre_0)
				Debug "Fenetre 0 :"+Str(GetActiveWindow())
			ElseIf GetActiveWindow()=2
				Debug "Fenetre 2 :"+Str(GetActiveWindow())
				
				;DisableMenuItem(#LeMenu,#TableauxV , 1)
				;SetActiveWindow( #Fenetre_0 )
				
				;Debug "menu P"
				
				
				;Efface_Vegetaux()
				;UseGadgetList(WindowID(#Fenetre_0))
				;Fenetre_Proteines()
				
			EndIf
		
		Case #PB_Event_Gadget
			Select EventGadget()
			
				Case #SaisieF2
					;Debug "OkF2"
					leTxt$=GetGadgetText(#SaisieF2)
					TextGadget(#Text_F2, 20, 160, 100, 20, leTxt$)
					;Debug leTxt$
				
				Case #Quit_0_2
				
					Event = #PB_Event_CloseWindow
				Case #ValF2
					Debug leTxt$
			EndSelect
	
	EndSelect

Until Event = #PB_Event_CloseWindow Or quitF2=1

CloseWindow ( #Fenetre_2 )
Debug "Quit"
SetActiveWindow(#Fenetre_0)
UseGadgetList(WindowID(#Fenetre_0))
EndProcedure





Procedure CreerMenus()
If CreateMenu(#LeMenu,WindowID(#Fenetre_0))
	MenuTitle("Fichier")
	MenuItem(#Quitter,"&Quitter")
	
	MenuTitle("Végétaux")
	MenuItem(#TraitementVegetaux,"&Traitement Végétaux")
	MenuItem(#TableauxV,"&Tableaux des Végétaux")
	
	
	MenuTitle("Protéines")
	MenuItem(#TraitementProteines,"&Traitement Protéines")
	MenuItem(#TableauxP,"&Tableaux des Protéines")
EndIf
EndProcedure







Procedure Fenetre_Generale()
If OpenWindow(#Fenetre_0,0,0,900,600,"Fenetre 1 : Aliments",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CreerMenus()
EndIf

Repeat
	Event = WaitWindowEvent ()
	Select Event
		
		Case #PB_Event_ActivateWindow
			SetActiveWindow(#Fenetre_0)
		
		Case #PB_Event_Gadget
			Select EventGadget()
			
				Case #Radio_0
					Debug "#Radio_0"
				Case #Radio_1
				
				Case #Valider_0
					Debug GetGadgetText(#Gout)
					
				Case #Radio_0_2
				
				Case #Radio_1_2
				
				
				Case #Valider_0_2
				
					Debug GetGadgetText(#Gout_2)
			
			
			EndSelect
		
		
		;----------------- Menu
		
		Case #PB_Event_Menu
		
			Select EventMenu()
				Case #Quitter
					Event = #PB_Event_CloseWindow
				Case #TraitementVegetaux

									DisableMenuItem(#LeMenu,#TableauxV , 0)
					Debug "menu V"
					;SetActiveWindow(#Fenetre_0)
					Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())
					
					Efface_Proteines()
					Fenetre_Vegetaux()
					
				Case #TraitementProteines
					DisableMenuItem(#LeMenu,#TableauxV , 1)
					;SetActiveWindow( #Fenetre_0 )
					
					Debug "menu P"
					If IsWindow(#Fenetre_2)>0
						Debug "menu P :liste vegetaux active"
						CloseWindow ( #Fenetre_2 )
						KillThread(leThread)
						
					EndIf
					
					Efface_Vegetaux()
					Fenetre_Proteines()
					
				
				Case #TableauxV
					
					fetreListe=0
					If IsWindow(#Fenetre_2)>0
						Debug "liste vegetaux active"
					
					Else
						;FenetreListeVegetaux()
						leThread=CreateThread(@FenetreListeVegetaux(),fetreListe)
					EndIf
			
			EndSelect
	EndSelect


Until Event = #PB_Event_CloseWindow
UseGadgetList(WindowID(#Fenetre_0))
EndProcedure



Fenetre_Generale()

[*]
Dernière modification par Malo le mar. 27/juil./2010 14:22, modifié 2 fois.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: blocage 1ere fenêtre par la seconde + thread

Message par Geo Trouvpatou »

Salut.

Avec quel version de PB compiles-tu ?

Je n'ai pas bien compris ton problème donc j'ai voulu faire tourner ton exemple avec Thread et en faisant :
1) Ouverture du prog
2) Végétaux -> Traitement Végétaux
3) Végétaux -> Tableaux des Végétaux
4) Protéines -> Traitement Protéines
Ça plante.

Ensuite pour la version Threadée il y a un problème sur la gestion des évènements, parce qu'en faisant :
1) Ouverture du prog
2) Végétaux -> Tableaux des Végétaux
3) Clic sur la croix rouge de "Tableaux des Végétaux"
4) Toutes les fenêtres se ferment.

Essaies d'expliquer ton problème comme ci-dessus, étape par étape et on comprendra peut-être mieux le problème.

Est-ce que ton but est de pouvoir ouvrir et laisser ouvert :
La fenêtre "Végétaux" et la fenêtre "Protéines" et la fenêtre "Tableaux des Végétaux" et la fenêtre "Traitement Protéines"

Ou que la fenêtre "Tableaux des Végétaux" ait une interaction avec la fenêtre "Végétaux"
ET
la fenêtre "Traitement Protéines" ait une interaction avec la fenêtre "Protéines"

Normalement, tu n'as pas besoin d'utiliser de thread.
Ceux-ci sont utile si tu as de gros traitement à faire et que tu veux continuer à faire autre chose en même temps.

Maintenant si tu enregistres tes données dans une bdd et que cela prend 5 secondes à s'enregistrer, cela bloque ton application pendant ce laps de temps et tu ne peux plus rien faire.

[EDIT]Tiens sinon voilà un vieux code qui te montre qu'en mettant ses gadgets sur un ContainerGadget, on a juste à l'afficher/cacher cela évite les 10 FreeGadget que tu utilises.
Après, chacun sa façon de faire.

Code : Tout sélectionner

;{ Windows
Enumeration
    #Window_1
EndEnumeration
;}
;{ Gadgets
Enumeration
    #Container_01
    #Panel_cont01
    #Button_Cont01
    #Container_02
    #String_Cont2
    #Button_Menu01
    #Button_Menu02
    #Button_Cont02
EndEnumeration
;}

Procedure OpenWindow_Window_1()
    If OpenWindow(#Window_1, 408, 165, 400, 400, "Window_1", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
        ;If CreateGadgetList(WindowID(#Window_1))
            ButtonGadget(#Button_Menu01, 5, 34, 113, 22, "Menu 01")
            ButtonGadget(#Button_Menu02, 5, 61, 113, 22, "Menu 02")
            
            ContainerGadget(#Container_01, 134, 14, 260, 375, #PB_Container_Flat)
                ButtonGadget(#Button_Cont01, 63, 341, 131, 20, "OK")
                PanelGadget(#Panel_cont01, 17, 19, 224, 267)
                    ; Etape 1
                    AddGadgetItem(#Panel_cont01, -1, "Etape 1")
                    ; Etape 2
                    AddGadgetItem(#Panel_cont01, -1, "Etape 2")
            CloseGadgetList() ;<
        CloseGadgetList()
        
        
        ContainerGadget(#Container_02, 134, 14, 260, 375, #PB_Container_Flat)
            StringGadget(#String_Cont2, 29, 23, 208, 20, "")
            ButtonGadget(#Button_Cont02, 45, 297, 174, 23, "Valider")
        CloseGadgetList()
        
        HideGadget(#Container_01, 1) ; on camoufle d'entré sinon en passant la souris dessus le container on fait apparaitre les gadgets cachés.
    ;EndIf
EndIf
EndProcedure

OpenWindow_Window_1()

;{- Event loop
Repeat
    Select WaitWindowEvent()
            ; ///////////////////
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Button_Menu01 
                    HideGadget(#Container_01, 1) 
                    HideGadget(#Container_02, 0) 
                    
                Case #Button_Menu02 
                    HideGadget(#Container_02, 1) 
                    HideGadget(#Container_01, 0) 
            EndSelect
            ; ////////////////////////
        Case #PB_Event_CloseWindow
            Select EventWindow()
                Case #Window_1
                    CloseWindow(#Window_1)
                    Break
            EndSelect
    EndSelect
ForEver
;
;}
Je profite de cet edit pour dire que je serais aller au plus simple, c'est à dire faire 5 fenêtres, la principale qui permet d'ouvrir les 4 autres.

[EDIT2]En faisant une recherche qui n'avait absolument rien à voir avec ce post je suis tombé sur ce code de Chris qui montre ce que je voulais dire par : "je serais aller au plus simple, c'est à dire faire 5 fenêtres [...]"

Bye.
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: blocage 1ere fenêtre par la seconde + thread

Message par Warkering »

J'ai donner une solution semblable ici.
À toi de l'examiner un peu en profondeur! :wink:
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: blocage 1ere fenêtre par la seconde + thread

Message par Malo »

Merci à vous 2 pour votre réponse expresse

Je suis avec PB 4.5 Windows Vista

Fonctionnement:

Les 2 menus n'ont aucun lien entre eux sur la gestion de leur données. Ils ont chacun leur Gadgets et leur fenêtre2.
Le seul point commun sera l'affichage sur la fenêtre principale.


Prenons l'un des cas suivant :


-> Végétaux
-> Tableaux des Végétaux
ou

-> Végétaux

-> Traitement Végétaux
et
-> Tableaux des Végétaux

Quand fenêtre2 "Tableaux des Végétaux" est ouverte


Je dois pouvoir :

- saisir des informations sur une ou 2 fenêtres et les valider (renseigner une BD ou déclencher une action )

ou ( on change de menu )


-> Protéines

-> Traitement Protéines (qui a comme actions :
- Désactiver l'Item "Tableaux des Végétaux" (qui sera réactivé en cliquant sur Traitement Végétaux)
- Fermer la fenêtre "Tableaux des Végétaux" si elle est ouverte
- Effacer les gadgets de "Traitement Végétaux"
- Afficher ceux de "Traitement Protéines" )



Le problème avec la version (v1) sans Thread:

Quand la fenêtre2 "Tableaux des Végétaux" est ouverte, bien que je puisse cliquer sur
les menus et saisir dans un StringGadget, aucune des actions citées plus haut ne fonctionnent,
pourtant je vois bien que la fenêtre principale a bien reçue le focus.

Par contre si la fenêtre2 "Tableaux des Végétaux" est fermée je peux réaliser ces actions.


Pour la version avec Thread :

Chez moi elle fonctionne comme je le souhaite, mon intérrogation était l'utilisation
de KillThread. Bon normalement je comprend que je ne devrait pas en avoir besoin.



Bien que la méthode avec l'ouverture de fenêtres multiples semble intérressante, elle m'oblige quand même à gérer l'affichage ou non de
certaines fenêtres.Donc pour le moment je reste sur ma lancée.

Merci pour la suite de vos réponses.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: blocage 1ere fenêtre par la seconde + thread

Message par Geo Trouvpatou »

Est-ce que c'est ça que tu veux.
Tu vois qu'une seule et unique boucle suffit.

Code : Tout sélectionner

Enumeration #PB_Compiler_EnumerationValue
      #Fenetre_0
      #Fenetre_1
      
      #Fenetre_2
      #LeMenu
      #Quitter
      #TraitementVegetaux
      #TableauxV
      #TraitementProteines
      #TableauxP
      #Combo_0
      #Text_0
      #Text_3
      #Gout
      #Frame3D_0
      #Radio_0
      #Radio_1
      #Valider_0
      #Text_0_2
      #Gout_2
      #Frame3D_0_2
      #Radio_0_2
      #Radio_1_2
      #Valider_0_2
      
      #ValF2
      #SaisieF2
      #Text_F2
      #Quit_0_2
EndEnumeration


Declare CreerMenus()


Procedure Efface_Proteines()
      FreeGadget(#Text_0_2)
      FreeGadget(#Gout_2)
      FreeGadget(#Frame3D_0_2)
      FreeGadget(#Radio_0_2)
      FreeGadget(#Radio_1_2)
      FreeGadget(#Valider_0_2)
      FreeGadget(#Combo_0)
      FreeGadget(#Text_3)
EndProcedure



Procedure Efface_Vegetaux()
      FreeGadget(#Text_0)
      FreeGadget(#Gout)
      FreeGadget(#Frame3D_0)
      FreeGadget(#Radio_0)
      FreeGadget(#Radio_1)
      FreeGadget(#Valider_0)
EndProcedure



Procedure Fenetre_Vegetaux()
      
      Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())
      UseGadgetList(WindowID(#Fenetre_0))
      
      TextGadget(#Text_0, 20, 180, 100, 20, "Goût végétaux")
      StringGadget(#Gout, 20, 200, 300, 25, "")
      Frame3DGadget(#Frame3D_0, 400, 90, 100, 100, "Choix ")
      OptionGadget(#Radio_0, 420, 110, 60, 20, "Fruits")
      OptionGadget(#Radio_1, 420, 140, 60, 20, "Légumes")
      ButtonGadget(#Valider_0, 200, 400, 80, 50, "Valider");
      
EndProcedure




Procedure Fenetre_Proteines()
      
      Debug "Fenetre_Proteines() :"+Str(GetActiveWindow())
      UseGadgetList(WindowID(#Fenetre_0))
      
      TextGadget(#Text_3, 20, 90, 160, 20, "Pays")
      ComboBoxGadget(#Combo_0, 20, 110, 200, 20)
      
      AddGadgetItem(#Combo_0,0,"Angleterre")
      AddGadgetItem(#Combo_0,-1,"France")
      AddGadgetItem(#Combo_0,-1,"USA")
      AddGadgetItem(#Combo_0,-1,"Brésil")
      AddGadgetItem(#Combo_0,-1,"Espagne")
      AddGadgetItem(#Combo_0,-1,"Maroc")
      
      TextGadget(#Text_0_2, 20, 180, 100, 20, "Goût Viande")
      StringGadget(#Gout_2, 20, 200, 300, 25, "")
      
      Frame3DGadget(#Frame3D_0_2, 40, 280, 100, 100, "Choix ")
      OptionGadget(#Radio_0_2, 50, 310, 60, 20, "viandes")
      OptionGadget(#Radio_1_2, 50, 350, 60, 20, "Poissons")
      ButtonGadget(#Valider_0_2, 200, 400, 80, 50, "Valider");
      
EndProcedure



Procedure FenetreListeVegetaux()
      
      If OpenWindow(#Fenetre_2,0,0,400,300,"Fenetre 2 : Tableau Végétaux", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
            
            StickyWindow(#Fenetre_2,1)
            ButtonGadget(#Quit_0_2, 200, 150, 60, 30, "Quitter");
            Debug "ouvre FenetreListeVegetaux()"
            ButtonGadget(#ValF2, 200, 120, 60, 30, "Valider");
            ButtonGadget(#Quit_0_2, 200, 18, 60, 30, "Quitter");
            TextGadget(#Text_F2, 20, 160, 100, 20, leTxt$)
            StringGadget(#SaisieF2, 20, 200, 300, 25, "")
            
      EndIf
      
EndProcedure



Procedure CreerMenus()
      
      If CreateMenu(#LeMenu,WindowID(#Fenetre_0))
            MenuTitle("Fichier")
            MenuItem(#Quitter,"&Quitter")
            
            MenuTitle("Végétaux")
            MenuItem(#TraitementVegetaux,"&Traitement Végétaux")
            MenuItem(#TableauxV,"&Tableaux des Végétaux")
            
            
            MenuTitle("Protéines")
            MenuItem(#TraitementProteines,"&Traitement Protéines")
            MenuItem(#TableauxP,"&Tableaux des Protéines")
      EndIf
      
EndProcedure



Procedure Fenetre_Generale()
      If OpenWindow(#Fenetre_0,0,0,900,600,"Fenetre 1 : Aliments",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
            CreerMenus()
      EndIf
      
      
      ;UseGadgetList(WindowID(#Fenetre_0))
EndProcedure



Fenetre_Generale()



;-----DEBUT LOOP -----------------------------------------------------------------------------------------
Repeat
      evenement = WaitWindowEvent()
      
      ;/ Evènements Window
      If evenement = #PB_Event_CloseWindow
            Select EventWindow() 
                        
                  Case #Quitter : quit = 1
                        
                  Case #Fenetre_0 : quit = 1
                        
                  Case #Fenetre_2 : CloseWindow(#Fenetre_2)
                        
            EndSelect    
      EndIf
      
      
      
      ;/ Evènements Menu
      If evenement = #PB_Event_Menu
            Select EventMenu()
                        
                  Case #TraitementVegetaux
                        
                        DisableMenuItem(#LeMenu,#TableauxV , 0)
                        Debug "menu V"
                        Debug "Fenetre_Vegetaux() :"+Str(GetActiveWindow())
                   
                        Efface_Proteines()
                        Fenetre_Vegetaux()
                        
                  Case #TraitementProteines
                        DisableMenuItem(#LeMenu,#TableauxV , 1)
                        If IsWindow(#Fenetre_2) > 0
                              CloseWindow (#Fenetre_2)
                        EndIf
                        
                        Debug "menu P"
                        
                        Efface_Vegetaux()
                        Fenetre_Proteines()     
                        
                  Case #TableauxV
                        
                        FenetreListeVegetaux()
                        
            EndSelect
      EndIf
      
      
      
      ;/ Evènements Boutons (Gadget en général)
      If evenement =  #PB_Event_Gadget
            Select EventGadget()
                        
                        ; -  Fenetre_Generale()              
                  Case #Radio_0
                        Debug "#Radio_0"
                        
                  Case #Radio_1
                        
                  Case #Valider_0
                        Debug "Valider_0"
                        Debug GetGadgetText(#Gout)
                        
                  Case #Radio_0_2
                        
                  Case #Radio_1_2
                        
                  Case #Valider_0_2
                        Debug "Valider_2"
                        
                        Debug GetGadgetText(#Gout_2)
                        
                  Case #SaisieF2
                        ;Debug "OkF2"
                        leTxt$=GetGadgetText(#SaisieF2)
                        SetGadgetText(#Text_F2, leTxt$)  
                        
                  Case #ValF2
                        Debug leTxt$    
                        
                  Case #Quit_0_2 : CloseWindow(#Fenetre_2)      
                        
            EndSelect
      EndIf
      
Until quit = 1
;-----FIN LOOP --------------------------------------------------------------------------------------------
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: blocage 1ere fenêtre par la seconde + thread [RESOLU]

Message par Malo »

Merci GeoTrouvPatou

C'est exactement ce que je voulais, merci de m'avoir ouvert les yeux......
Je pensais que les évènements d'une fenêtre devait être gérés dedans.
De plus quelques commandes placées au mauvais endroit.......
Répondre