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()