Question portant cette fois-ci sur les TreeGadget ! :)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Question portant cette fois-ci sur les TreeGadget ! :)

Message par Joubarbe »

Bonsoir,

J'avance petit à petit dans mon programme et cette fois-ci, j'ai fait une fenêtre principale avec un bouton recherche, lequel une fois appuyée ouvre la fenêtre de sélection de recherche. Une fois cette sélection faite, le nom de la recherche apparaît sur l'écran principal. Cela marche bien une fois mais la deuxième, ça bug :(

Voici donc le code de de cette fenêtre de recherche :

Code : Tout sélectionner

        Case #bouton_recherche
          CloseWindow(#fenetre_gamescreen)
          If OpenWindow(#fenetre_recherche,1,1,800,600,"Recherche",#PB_Window_ScreenCentered)
            descriptionrecherche = "Cliquez sur une technologie pour en avoir la description..."
            CreateMenu(#menu_ecran,WindowID(#fenetre_recherche))
            MenuItem(#menu_item_revenir,"Fermer cette fenêtre")
            CreateGadgetList(WindowID(#fenetre_recherche))
            Frame3DGadget(#frame_main,20,1,760,560,"")
            Frame3DGadget(#frame_2,25,452,750,100,"")
            TextGadget(#text1,30,463,740,100,descriptionrecherche)
             
            ;TechTree :        TreeGadget(#techtree,25,10,750,445,#PB_Tree_AlwaysShowSelection)
            
            AddGadgetItem(#techtree,-1,"Culturel")
            AddGadgetItem(#techtree, -1,"Economique")
            AddGadgetItem(#techtree, -1,"Militaire")
            AddGadgetItem(#techtree, -1,"Scientifique")
            AddGadgetItem(#techtree, -1,"Social")
            AddGadgetItem(#techtree, -1,"Spirituel")
            
            recherche_selectionnee=GetGadgetItemText(#techtree,0,0)
            If recherche_selectionnee And #PB_Tree_Checked
              recherche_actuelle = recherche_selectionnee
            EndIf
              
            ;Boucle principale :
            Repeat
              Event = WaitWindowEvent()
              Select EventMenu()
                Case #menu_item_revenir
                  Break
              EndSelect
            ForEver
            CloseWindow(#fenetre_recherche)
            Goto GameScreen
          EndIf
Merci :oops:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Apparemment çà viendrait du CloseWindow(#fenetre_gamescreen).
Si tu fermes la fenêtre, il faut la ré-ouvrir après ton opération.

Et puis, conseil, évite les 'Goto' à tout prix.

Pour une application simple, à plusieurs fenêtres, regarde cet example :

Une procédure pour la fenêtre principale,
une autre pour la fenetre secondaire.
Quand la fenetre de recherche est ouverte, celle du dessous est 'bloquée' avec DisableWindow() mais reste toujours visible.

C'est la meilleure façon de faire, sauf si tu veux gérer les fenêtre en MEME temps mais je ne crois pas que ce soit nécéssaire dans ton cas.

Code : Tout sélectionner

Enumeration ; Id. Fenêtres
  #Fenetre_Application
  #Fenetre_Recherche
EndEnumeration

Enumeration ; Id. Gadgets
  #Bouton_Recherche
  #Bouton_Fermer
EndEnumeration

Procedure.l APP_Recherche()
  
  If OpenWindow(#Fenetre_Recherche, 125, 125, 200, 100, "Recherche", #PB_Window_SystemMenu, WindowID(#Fenetre_Application))
    
    DisableWindow(#Fenetre_Application, #True)
    
    If CreateGadgetList(WindowID(#Fenetre_Recherche))
      ButtonGadget(#Bouton_Fermer, 25, 25, 100, 25, "Fermer")
    EndIf
    
    Repeat
      
      Select WaitWindowEvent()
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Bouton_Fermer
              Break
          EndSelect
          
        Case #PB_Event_CloseWindow
          Break
          
      EndSelect
      
    ForEver
    
    CloseWindow(#Fenetre_Recherche)
    
    DisableWindow(#Fenetre_Application, #False)
    
  EndIf
  
EndProcedure
Procedure.l APP_Fenetre()
  
  If OpenWindow(#Fenetre_Application, 100, 100, 320, 240, "Programme", #PB_Window_SystemMenu)
    
    If CreateGadgetList(WindowID(#Fenetre_Application))
      ButtonGadget(#Bouton_Recherche, 25, 25, 100, 25, "Recherche")
    EndIf
    
    Repeat
      
      Select WaitWindowEvent()
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Bouton_Recherche
              APP_Recherche()
          EndSelect
          
        Case #PB_Event_CloseWindow
          Break
          
      EndSelect
      
    ForEver
    
    CloseWindow(#Fenetre_Application)
    
  EndIf
  
EndProcedure

APP_Fenetre()
Image
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

pourquoi tu met forever dans ta boucle Flype ?
moi quand je veux ouvrir une deuxieme fenetre je mets ceci dans la boucle de ma deuxieme fenetre :

Code : Tout sélectionner

Repeat
      Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
       Fermer_fenetre2=1  
      EndSelect
    Until fermer_fenetre2=1
    CloseWindow(#fenetre2)
    While WindowEvent():wend 


 
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Merci pour l'exemple :wink: Je n'arrive toutefois plus à faire marcher ces lignes là maintenant :

Code : Tout sélectionner

    
recherche_selectionnee=GetGadgetItemText(#techtree,0,0)
    If recherche_selectionnee And #PB_Tree_Selected
      recherche_actuelle = recherche_selectionnee
    EndIf
En rappelant que recherche_actuelle est affichée dans la fenêtre principale. Les deux variables sont déclarées en global.

(@bernard13 : l'utilisation d'un break me semble plus simple)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

"recherche_selectionnee" est de type string et "#PB_Tree_Selected" est de type entier, donc normal que cela ne marche pas.

C'est pas GetGadgetState() que tu devrais utiliser ? (si j'ai bien compris ce que tu voulais faire dans ces 3 lignes)
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Non car une une fois recherche_selectionnee définie (donc en sélectionnant un élément dans le TreeGadget), il y a dans la fenêtre principale une variable recherche_actuelle qui est affichée. Cette dernière prendrait donc (après sélection) la valeur de recherche_selectionnee. Et c'est donc bien du texte que je veux voir afficher.
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Euh, on m'a compris ? :oops:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est pas plutot çà que tu veux :

Code : Tout sélectionner

If GetGadgetItemState(#techtree, 0) = #PB_Tree_Selected 
  If GetGadgetItemText(#techtree, 0, 0) <> #Null$
    recherche_actuelle = GetGadgetItemText(#techtree, 0, 0) 
  EndIf
EndIf
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Code : Tout sélectionner

Procedure GF_RechercheScreen()
  
  DisableWindow(#fenetre_gamescreen,#True)
  If OpenWindow(#fenetre_recherche,1,1,800,600,"Recherche",#PB_Window_ScreenCentered)
    descriptionrecherche = "Cliquez sur une technologie pour en avoir la description..."
    CreateMenu(#menu_ecran,WindowID(#fenetre_recherche))
    MenuItem(#menu_item_revenir,"Fermer cette fenêtre")
    CreateGadgetList(WindowID(#fenetre_recherche))
    Frame3DGadget(#frame_main,20,1,760,560,"")
    Frame3DGadget(#frame_2,25,452,750,100,"")
    TextGadget(#text1,30,463,740,100,descriptionrecherche)
    TreeGadget(#techtree,25,10,750,445,#PB_Tree_AlwaysShowSelection)
    
    AddGadgetItem(#techtree,-1,"Culturel")
    AddGadgetItem(#techtree, -1,"Economique")
    AddGadgetItem(#techtree, -1,"Militaire")
    AddGadgetItem(#techtree, -1,"Scientifique")
    AddGadgetItem(#techtree, -1,"Social")
    AddGadgetItem(#techtree, -1,"Spirituel")
    
    If GetGadgetItemState(#techtree, 0) = #PB_Tree_Selected
      If GetGadgetItemText(#techtree, 0, 0) <> #Null$
        recherche_actuelle = GetGadgetItemText(#techtree, 0, 0)
      EndIf
    EndIf
    
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
      Select EventMenu()
        Case #menu_item_revenir
          Break
      EndSelect
    ForEver
    CloseWindow(#fenetre_recherche)
    SetActiveWindow(#fenetre_gamescreen)
    DisableWindow(#fenetre_gamescreen,#False)

  
EndProcedure
Je ne connaissais pas le " <> Null$ " mais cela ne fonctionne toujours pas :( (et là je ne vois vraiment pas pourquoi)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Plusieurs erreurs, en fait, dans ton code :

1/

If GetGadgetItemState(#techtree, 0) = #PB_Tree_Selected
If GetGadgetItemText(#techtree, 0, 0) <> #Null$
recherche_actuelle = GetGadgetItemText(#techtree, 0, 0)
EndIf
EndIf

Ce code doit être dans la boucle de gestion des évenements !!!
Un évenement est un évenement déclenché en temps réel par l'utilisateur.
Donc un utilisateur pouvant faire n'importe quoi, n'importe quand, les évenements ne sont pas enclenché au début du programme (avant la boucle) mais dans la boucle, vois-tu ?

2/

Repeat
Event = WaitWindowEvent()
Select EventMenu()
Case #menu_item_revenir
Break
EndSelect
ForEver

Il manque beaucoup de choses ici, en rapport avec 1/.

. Tu ne fais pas de tests sur 'Event'
. Tu ne fais pas de tests ni sur #PB_Event_Gadget, ni sur #PB_Event_Menu.

Code : Tout sélectionner

Enumeration ; Id. Fenêtres 
  #fenetre_gamescreen
  #Fenetre_Recherche 
EndEnumeration 
Enumeration ; Id. Gadgets 
  #Bouton_Recherche 
  #frame_main
  #frame_2
  #text1
  #techtree
EndEnumeration 
Enumeration ; Id. Menus 
  #menu_ecran
EndEnumeration 
Enumeration ; Id. Menus Items
  #menu_item_revenir
EndEnumeration 

Procedure.l GF_RechercheScreen() 
  
  DisableWindow(#fenetre_gamescreen,#True) 
  
  If OpenWindow(#Fenetre_Recherche, 1, 1, 800, 600, "Recherche", #PB_Window_ScreenCentered) 
    
    descriptionrecherche.s = "Cliquez sur une technologie pour en avoir la description..." 
    
    If CreateMenu(#menu_ecran, WindowID(#Fenetre_Recherche)) 
      MenuItem(#menu_item_revenir, "Fermer cette fenêtre") 
    EndIf
    
    If CreateGadgetList(WindowID(#Fenetre_Recherche)) 
      Frame3DGadget(#frame_main, 20,   1, 760, 560, "") 
      Frame3DGadget(#frame_2,    25, 452, 750, 100, "") 
      TextGadget   (#text1,      30, 463, 740, 100, descriptionrecherche) 
      TreeGadget   (#techtree,   25,  10, 750, 445, #PB_Tree_AlwaysShowSelection) 
      AddGadgetItem(#techtree, -1, "Culturel") 
      AddGadgetItem(#techtree, -1, "Economique") 
      AddGadgetItem(#techtree, -1, "Militaire") 
      AddGadgetItem(#techtree, -1, "Scientifique") 
      AddGadgetItem(#techtree, -1, "Social") 
      AddGadgetItem(#techtree, -1, "Spirituel") 
    EndIf
    
    Repeat 
      
      Select WaitWindowEvent() 
        
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #techtree
              Select EventType()
                Case #PB_EventType_Change
                  Position.l = GetGadgetState(#techtree)
                  If Position <> -1
                    Debug GetGadgetItemText(#techtree, Position, 0) 
                  EndIf
              EndSelect
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu() 
            Case #menu_item_revenir 
              Break 
          EndSelect 
          
      EndSelect
      
    ForEver 
    
    CloseWindow(#Fenetre_Recherche) 
    
  EndIf 
  
  DisableWindow(#fenetre_gamescreen, #False) 
  SetActiveWindow(#fenetre_gamescreen) 
  
EndProcedure
Procedure.l GF_Screen() 
  
  If OpenWindow(#fenetre_gamescreen, 100, 100, 320, 240, "Programme", #PB_Window_SystemMenu) 
    
    If CreateGadgetList(WindowID(#fenetre_gamescreen)) 
      ButtonGadget(#Bouton_Recherche, 25, 25, 100, 25, "Recherche") 
    EndIf 
    
    Repeat 
      
      Select WaitWindowEvent() 
        
        Case #PB_Event_Gadget 
          Select EventGadget() 
            Case #Bouton_Recherche 
              GF_RechercheScreen() 
          EndSelect 
          
        Case #PB_Event_CloseWindow 
          Break 
          
      EndSelect 
      
    ForEver 
    
    CloseWindow(#fenetre_gamescreen) 
    
  EndIf 
  
EndProcedure 

GF_Screen() 




@bernard13
pourquoi tu met forever dans ta boucle Flype ?
C'est juste une question de style, rien n'interdit de faire autrement.
Question d'habitude, question de concision. Ni plus ni moins.
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Bon bah là, je ne comprends vraiment plus rien... Que le premier code doit être dans la boucle de gestion des événements, ok.

Code : Tout sélectionner

        Case #PB_Event_Gadget
          Select EventGadget()
            Case #techtree
              Select EventType()
                Case #PB_EventType_Change
                  Position.l = GetGadgetState(#techtree)
                  If Position <> -1
                    Debug GetGadgetItemText(#techtree, Position, 0)
                  EndIf
              EndSelect
          EndSelect 
Tout ce morceau de code, je ne le comprends pas vraiment, j'ai regardé l'aide de PureBasic, je ne vois pas vraiment pourquoi il devrait être là. La vérification de l'état d'un GadgetItem, l'attribution de la variable recherche_actuelle et la constante #PB_Tree_Selected ne suffisent-elles pas ? Cela me paraît bien lourd pour signifier "lorsque tu cliques sur élément 1 du TreeGadget, il est écrit élément 1 sur une autre fenêtre, pareil pour élément 2 etc.".

(J'ai acheté le bouquin en anglais traitant du PureBasic, malheureusement, l'auteur ne traite que de la programmation jeu et je me rends compte que la prog. application est vraiment différente. Il n'y a pas un autre livre expliquant mieux ce domaine ?)

Quoiqu'il en soit, le code ne fonctionne pas.
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Si quelqu'un veut bien m'aider, qu'il n'hésite pas surtout :)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Ce bout de code te permet d'agir sur le programme en récupérant un état et de faire une action en fonction de cet état. C'est le genre de code que tu vas retrouver souvent dans tes boucles d'évènements.

Essayes comme ça, tu verras peut-être mieux son utilité :)

Code : Tout sélectionner

Case #PB_Event_Gadget 
          Select EventGadget() 
            Case #techtree 
              Select EventType() 
                Case #PB_EventType_Change 
                  Position.l = GetGadgetState(#techtree) 
                  If Position <> -1 
                    ;Debug GetGadgetItemText(#techtree, Position, 0)
                     
                    ; Comme ça c'est peut-être plus parlant, le debug ne servant qu'à te matérialiser ce qu'il se passe
                    ; après tu fais ce que tu veux comme action. De cette manière en cliquant sur un item, une info est
                    ; envoyée disant que ta variable a changée de valeur, puis tu affiches cette valeur.
                    ; mais tu peux faire ce que tu veux, afficher un texte complet, ouvrir un fichier,...etc
                    
                    descriptionrecherche.s = GetGadgetItemText(#techtree, Position, 0)
                    SetGadgetText(#text1, descriptionrecherche) 
                                 
                  EndIf 
              EndSelect 
          EndSelect 
@+
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.
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Si GetGadgetState récupère la valeur d'un élément sélectionné, qu'est-ce que GadgetItemState va récupérer ? (en référance à Position = GetGadgetState)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

- AddGadgetItem(): Ajoute un élément, et éventuellement une icône
- RemoveGadgetItem(): Efface un élément (et ses sous-élements)
- ClearGadgetItemList(): Supprime tous les éléments
- CountGadgetItems(): Renvoie le nombre d'éléments actuellement contenus dans le gadget.
- GetGadgetItemState(): Renvoie l'état de l'élément spécifié.
- SetGadgetItemState(): Change l'état de l'élément spécifié.
- GetGadgetItemText(): Renvoie le texte de l'élément spécifié.
- SetGadgetItemText(): Change le texte de l'élément spécifié.
- GetGadgetState(): Renvoie l'élément selectionné.
- SetGadgetState(): Change l'élément selectionné.
- GetGadgetText(): Renvoie le texte de l'élément sélectionné.
- SetGadgetText(): Change le texte de l'élément sélectionné.
- GetGadgetItemAttribute() avec l'attribut suivant:
La doc du TreeGadget
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