Page 1 sur 1

Comment n'afficher que le thème demandé dans une liste

Publié : sam. 26/août/2017 10:41
par Micoute
Bonjour à tous,

j'essaie de faire un questionnaire de culture générale et dans ce questionnaire il y à 6 thèmes : Monde, Arts, Sciences, Spectacles, Histoire et Sport, j'aimerais que ma liste n'affiche que le thème choisi afin d'en choisir une question.

J'aimerais aussi que quelqu'un me dirige dans la bonne direction, je pense que ça ne doit pas être très compliqué, mais je ne trouve pas la solution, je travaille avec un fichier json, mais ça ne doit pas être un écueil non plus.

Je vous remercie tous par avance de votre aide bienveillante

Code : Tout sélectionner

;Questionnaire de culture générale

XIncludeFile "D:\Programmation\Prg Perso\M\Modules\MesGadgets.pb"

UseModule MesGadgets

Enumeration
  #Fenetre_principale
EndEnumeration

Enumeration
  #Ctn_Choix_Question
  #Lst_Elements
  #Btn_Monde
  #Btn_Arts
  #Btn_Spectacles
  #Btn_Histoire
  #Btn_Sciences
  #Btn_Sports
  #Theme
  #Sujet
  #Edt_Question
  #Edt_Reponse
  #Ctn_Boutons
  #Btn_Maj
  #Btn_Nouveau
  #Btn_Supprimer
  #Btn_Quitter
  #Txt_Titre
  #Txt_Signature
EndEnumeration

Enumeration Fichiers
  #FichierJSON
EndEnumeration

Enumeration
  #Police
  #Police2
EndEnumeration 

Structure Element
  Theme.s    ;Thème choisi
  Sujet.s    ;De quel sujet parle-t'on?
  Question.s ;Question
  Reponse.s  ;Réponse à mémoriser
EndStructure 

Global NewList Elements.Element(), Evenement, Fichier.s = "D:\Programmation\Donnees\Culture_generale.Json" 
Global.iGadget *Btn_Monde, *Btn_Arts, *Btn_Spectacles, *Btn_Histoire, *Btn_Sciences, *Btn_Sports, *Btn_Quitter
Declare Charger_Elements()
Declare GestionEvenements()
Declare Nouvel_Element()
Declare Selection_Element()
Declare Supprimer_Element()
Declare Maj_Element()
Declare Sauvegarder_Elements()
Declare Quitter()
Declare Init_Questionnaire()

LoadFont(#Police, "Arial", 25, #PB_Font_Bold)
LoadFont(#Police2, "Arial", 12)

;Chargement des éléments existants
Procedure Charger_Elements()
  If ReadFile(#FichierJSON, Fichier)
    CloseFile(#FichierJSON)
    
    ;Lecture du fichier JSON
    LoadJSON(#FichierJSON, Fichier, #PB_JSON_NoCase)
    
    ;Extraction de le chaîne JSON vers la liste chaînée Elements
    ExtractJSONList(JSONValue(#FichierJSON), Elements())
    
    ;Affichage de la liste des éléments
    ForEach Elements()
      With Elements()
        AddGadgetItem(#Lst_Elements, -1, \Theme + #LF$ + \Sujet + #LF$ + \Question + #LF$ + \Reponse)
        SetGadgetItemData(#Lst_Elements, CountGadgetItems(#Lst_Elements) - 1, ListIndex(Elements()))
      EndWith
    Next
  EndIf 
EndProcedure

Procedure GestionEvenements()
  Protected Evenement = EventType()
  
  Select Evenement
    Case #PB_EventType_Change
      If Trim(GetGadgetText(#Theme)) <> ""
        DisableGadget(#Btn_Nouveau, #False)
        ;DisableGadget(#Btn_Maj, #False)
      Else
        DisableGadget(#Btn_Nouveau, #True)
        DisableGadget(#Btn_Maj, #True)
      EndIf    
  EndSelect  
EndProcedure

;Nouvel élément (raz des champs)
Procedure Nouvel_Element()
  SetWindowData(#Fenetre_principale, 0) ;C'est une création
  
  SetGadgetText(#Theme, "")
  SetGadgetText(#sujet, "")
  SetGadgetText(#Edt_Question, "")
  SetGadgetText(#Edt_Reponse, "")
  
  DisableGadget(#Btn_Nouveau, #True)
  ;DisableGadget(#Btn_Maj, #True)
  DisableGadget(#Btn_Supprimer, #True)
  
  SetGadgetText(#Btn_Maj, "Ajouter")
  SetActiveGadget(#Theme) 
EndProcedure

;Une question est sélectionnée dans la liste
Procedure Selection_Element()
  Protected Item = GetGadgetState(#Lst_Elements)
  
  If Item <> -1
    SelectElement(Elements(), GetGadgetItemData(#Lst_Elements, Item))
    With Elements()
      SetGadgetText(#Theme, \Theme)
      SetGadgetText(#Sujet, \Sujet)
      SetGadgetText(#Edt_Question, \Question)
      SetGadgetText(#Edt_Reponse, \Reponse)
    EndWith
  EndIf
  
  ;C'est une modif
  SetWindowData(#Fenetre_principale, 1)
  
  DisableGadget(#Btn_Nouveau, #False)
  DisableGadget(#Btn_Maj, #False)
  DisableGadget(#Btn_Supprimer, #False)
  
  SetGadgetText(#Btn_Maj, "Modifier")
  SetActiveGadget(#Theme)
EndProcedure

;Suppression d'une question
Procedure Supprimer_Element()
  If MessageRequester("Information", "Etes vous sûr de supprimer une question ?" + #CRLF$ + "cette action est irrémédiable !", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
    SetWindowData(#Fenetre_principale, 3) ;C'est une suppression
    Maj_Element()
  EndIf
EndProcedure

Procedure Maj_Element()
  Protected.s Theme = GetGadgetText(#Theme)
  Protected.s Sujet = GetGadgetText(#Sujet)
  Protected.s Question = GetGadgetText(#Edt_Question)
  Protected.s Reponse = GetGadgetText(#Edt_Reponse)
  
  Select GetWindowData(#Fenetre_principale)
    Case 0 ; Création
      AddElement(Elements())
      With Elements()
        \Theme = Theme
        \Sujet = Sujet
        \Question = Question
        \Reponse = Reponse
        AddGadgetItem(#Lst_Elements, -1, \Theme + #LF$ + \Sujet + #LF$ + \Question + #LF$ + \Reponse)
        SetGadgetItemData(#Lst_Elements, CountGadgetItems(#Lst_Elements) - 1, ListIndex(Elements()))
      EndWith
      
    Case 1 ;Modif
      With Elements()
        \Theme = Theme
        \Sujet = Sujet
        \Question = Question
        \Reponse = Reponse
        
        SetGadgetItemText(#Lst_Elements, ListIndex(Elements()), \Theme, 0)
        SetGadgetItemText(#Lst_Elements, ListIndex(Elements()), \Sujet, 1)
        SetGadgetItemText(#Lst_Elements, ListIndex(Elements()), \Question, 2)
        SetGadgetItemText(#Lst_Elements, ListIndex(Elements()), \Reponse, 3)
      EndWith
      Nouvel_Element()
      
    Case 3 ;Suppression
      RemoveGadgetItem(#Lst_Elements, ListIndex(Elements()))
      DeleteElement(Elements())
      
      ;Mise à jour de liaison ListIconGadget <-> Elements()
      ForEach Elements()
        SetGadgetItemData(#Lst_Elements, ListIndex(Elements()), ListIndex(Elements()))
      Next
  EndSelect 
EndProcedure

;Sauvegarde automatique à la fermeture de l(application
Procedure Sauvegarder_Elements()
  
  ;Création d'un objet JSON
  CreateJSON(#FichierJSON)
  
  ;insertion de la liste chaînée "Elements()" dans l'objet
  InsertJSONList(JSONValue(#FichierJSON), Elements())
  
  ;sauvegarde du fichier
  SaveJSON(#FichierJSON, Fichier, #PB_JSON_PrettyPrint)
  
  ;Libérer les données
  FreeJSON(#FichierJSON)
  
  ;Libérer la liste
  FreeList(Elements())
  
EndProcedure

Procedure Quitter()
  Select EventType()
    Case #PB_EventType_LeftClick
      CloseWindow(#Fenetre_principale)
      Sauvegarder_Elements()
      End
  EndSelect    
EndProcedure

Procedure Init_Questionnaire()
  If OpenWindow(#Fenetre_principale, 0, 0, 1455, 950, "", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
    
    SetGadgetFont(#PB_Default, FontID(#Police))
    
    TextGadget(#Txt_Titre, 15, 10, 1430, 50, "", #PB_Text_Center|#SS_CENTERIMAGE)
    
    ContainerGadget(#Ctn_Choix_Question, 10, 70, 1435, 420, #PB_Container_Raised)
    *Btn_Monde = GadgetCouleurBouton(#Btn_Monde, 10, 10, 200, 50, "Monde")
    *Btn_Arts =GadgetCouleurBouton(#Btn_Arts, 220, 10, 200, 50, "Arts")
    *Btn_Spectacles = GadgetCouleurBouton(#Btn_Spectacles, 430, 10, 200, 50, "Spectacles")
    *Btn_Histoire = GadgetCouleurBouton(#Btn_Histoire, 640, 10, 200, 50, "Histoire")
    *Btn_Sciences = GadgetCouleurBouton(#Btn_Sciences, 850, 10, 360, 50, "Science et techniques")
    *Btn_Sports = GadgetCouleurBouton(#Btn_Sports, 1220, 10, 200, 50, "Sports")
    
    ListIconGadget(#Lst_Elements, 10, 70, 1410, 340, "Thème", 200, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#LVS_NOCOLUMNHEADER)
    AddGadgetColumn(#Lst_Elements, 1, "Sujet", 180)
    AddGadgetColumn(#Lst_Elements, 2, "Question", 1000)
    
    CloseGadgetList()
    
    
    StringGadget(#Theme, 10, 500, 710, 50, "")
    StringGadget(#Sujet, 730, 500, 715, 50, "")
    EditorGadget(#Edt_Question, 10, 560, 710, 230, #PB_Editor_WordWrap)
    EditorGadget(#Edt_Reponse, 730, 560, 715, 230, #PB_Editor_WordWrap)
    
    ContainerGadget(#Ctn_Boutons, 10, 800, 1435, 80, #PB_Container_Raised)
    ButtonGadget(#Btn_Maj, 10, 10, 200, 50, "Ajouter")
    ButtonGadget(#Btn_Nouveau, 220, 10, 200, 50, "Nouveau")
    ButtonGadget(#Btn_Supprimer, 430, 10, 200, 50, "Supprimer")
    *Btn_Quitter = GadgetCouleurBouton(#Btn_Quitter, 640, 10, 200, 50, "Quitter")
    CloseGadgetList()
    
    TextGadget(#Txt_Signature, 10, 890, 1435, 50, "", #PB_Text_Center|#SS_CENTERIMAGE)
    
    SetGadgetText(#Txt_Titre, "Choisissez une thématique")
    SetGadgetText(#Txt_Signature, "Questionnaire de culture générale - Logiciel créé par Micoute")
    
    ;Polices
    SetGadgetFont(#Lst_Elements, FontID(#Police2))
    SetGadgetFont(#Edt_Question, FontID(#Police2))
    SetGadgetFont(#Edt_Reponse, FontID(#Police2))
    
    ;Couleurs
    SetWindowColor(#Fenetre_principale, $FF5DF4)
    
    SetGadgetColor(#Txt_Titre, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    SetGadgetColor(#Txt_Titre, #PB_Gadget_FrontColor, $5DFFFC)
    SetGadgetColor(#Txt_Signature, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    SetGadgetColor(#Txt_Signature, #PB_Gadget_FrontColor, $5DFFFC)
    
    SetGadgetColor(#Lst_Elements, #PB_Gadget_BackColor, $FFE6FD)
    SetGadgetColor(#Theme, #PB_Gadget_BackColor, $FFE6FD)
    SetGadgetColor(#Sujet, #PB_Gadget_BackColor, $FFE6FD)
    SetGadgetColor(#Edt_Question, #PB_Gadget_BackColor, $FFE6FD)
    SetGadgetColor(#Edt_Reponse, #PB_Gadget_BackColor, $FFE6FD)
    
    SetGadgetColor(#Ctn_Boutons, #PB_Gadget_BackColor, $FFE6FD)
    
    
    *Btn_Monde\SetGadgetColor(#PB_Gadget_BackColor, $FFA7CD)
    *Btn_Arts\SetGadgetColor(#PB_Gadget_BackColor, $26C8F5)
    *Btn_Spectacles\SetGadgetColor(#PB_Gadget_BackColor, $FFA7FD)
    *Btn_Histoire\SetGadgetColor(#PB_Gadget_BackColor, $A7FFFD)
    *Btn_Sciences\SetGadgetColor(#PB_Gadget_BackColor, $FFD6A7)
    *Btn_Sports\SetGadgetColor(#PB_Gadget_BackColor, $A7FFB7)
    *Btn_Quitter\SetGadgetColor(#PB_Gadget_BackColor, $FF)
    *Btn_Quitter\SetGadgetColor(#PB_Gadget_FrontColor, $FFFF)
    
    ;Contrôle de la saisie
    BindGadgetEvent(#Edt_Question, @GestionEvenements())
    
    ;Mise en place d'une nouvelle question
    BindGadgetEvent(#Btn_Nouveau, @Nouvel_Element())
    
    ;Une question est sélectionnée
    BindGadgetEvent(#Lst_Elements, @Selection_Element())
    
    ;Ajout ou modification d'une question
    BindGadgetEvent(#Btn_Maj, @Maj_Element())
    
    ;Suppression d'une question
    BindGadgetEvent(#Btn_Supprimer, @Supprimer_Element())
    
    ;Fermeture de l'application et sauvegarde automatique
    BindGadgetEvent(#Btn_Quitter, @Quitter())
    
    Charger_Elements()
    
  EndIf
EndProcedure

Init_Questionnaire()

;- Boucle
Repeat
  Evenement = WaitWindowEvent()      
Until Evenement = #PB_Event_CloseWindow


Re: Comment n'afficher que le thème demandé dans une liste

Publié : sam. 26/août/2017 11:27
par microdevweb
Bonjour micoute,

Voici une exemple

Code : Tout sélectionner

Enumeration 
  #Main_Form
EndEnumeration
Enumeration 
  #Cb_Them
  #Cb_Question
EndEnumeration
Structure sTheme
  Themes.s
  List question.s()
EndStructure
Global NewList mesThemes.sTheme()
; Ajout de quelques thèmes
AddElement(mesThemes())
With mesThemes()
  \Themes="Géo"
  AddElement(\question())
  \question()="Q Geo 1"
  AddElement(\question())
  \question()="Q Geo 2"
  AddElement(\question())
  \question()="Q Geo 3"
  AddElement(mesThemes())
  \Themes="Histoire"
  AddElement(\question())
  \question()="Q Histoire 1"
  AddElement(\question())
  \question()="Q Histoire 2"
  AddElement(\question())
  \question()="Q Histoire 3"
  ;etc
EndWith
Procedure RemplisQuestion()
  ClearGadgetItems(#Cb_Question)
  ChangeCurrentElement(mesThemes(),GetGadgetItemData(#Cb_Them,GetGadgetState(#Cb_Them)))
  With mesThemes()
    ForEach \question()
      AddGadgetItem(#Cb_Question,-1,\question())
    Next
    SetGadgetState(#Cb_Question,0)
  EndWith
EndProcedure
Procedure RemplisThem()
  Protected i
  ForEach mesThemes()
    AddGadgetItem(#Cb_Them,-1,mesThemes()\Themes)
    ; Je mémorise l'adress
    SetGadgetItemData(#Cb_Them,i,@mesThemes())
    i+1
  Next
  SetGadgetState(#Cb_Them,0)
EndProcedure

OpenWindow(#Main_Form,0,0,800,600,"Teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ComboBoxGadget(#Cb_Them,0,0,200,30)
ComboBoxGadget(#Cb_Question,210,0,200,30)
RemplisThem()
RemplisQuestion()
BindGadgetEvent(#Cb_Them,@RemplisQuestion())

Repeat
  WaitWindowEvent()
Until Event()=#PB_Event_CloseWindow



Re: Comment n'afficher que le thème demandé dans une liste

Publié : sam. 26/août/2017 12:31
par Micoute
Merci infiniment microdevweb, finalement ce n'est pas si compliqué un affichage conditionnel, mais quand on n'a pas l'esprit, ça n'est pas si facile.