ListView sans doublon, mais ListIcon avec

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

ListView sans doublon, mais ListIcon avec

Message par Micoute »

Bonjour à tous,

je viens ici pour solliciter votre aide, car j'essaie de faire un annuaire de mes praticiens, pour aller droit au but, je souhaite que les professions qui sont en doublons n'apparaissent qu'une seul fois dans ma listview de praticiens, mais s'affichent dans ma listicon quand une profession est sélectionnée, par exemple je clique sur Infirmière et ça m'en affiche 3.

Je vous remercie tous par anticipation

Code : Tout sélectionner

Enumeration Fichiers
  #FichierJSON
EndEnumeration  

Enumeration
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Liste_praticiens
  #ListIcon_Affichage
  #Str_Affichage
  #Txt_Annuaire
  #Txt_par
  #Txt_Date
  #Btn_Quitter
  #Cvs
EndEnumeration

Enumeration Polices
  #Police_Txt
  #Police_Lst
  #Police_Btn
EndEnumeration  


;Structure d'un praticien
Structure praticien
  Nom.s
  Prenom.s
  Profession.s
  Tel.s
  Adresse.s
  CodePostal.s
  Ville.s
EndStructure

Declare Charger_praticiens()
Declare Programme_principal()
Declare Quitter()

Global Evenement, i
Global Btn_SourisPresse, DecalageX, DecalageY, Quitter

;Création d'une liste vierge pour les praticiens
Global.praticien NewList Provis(), NewList praticiens(), NewList Annuaire()
Global Dim Profession.praticien(0), quantite
Global$ FichierJson = "D:\Programmation\Donnees\praticiens 2.json"

Programme_principal()

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


Macro TrierListeStruc(_NomListe_, _Options_, _Champ_Structure_)
  ; Cette macro simplifie l'utilisation de la fonction intégrée SortStructuredList().
  SortStructuredList(_NomListe_, _Options_, OffsetOf(_Champ_Structure_), TypeOf(_Champ_Structure_))
EndMacro


;Chargement des praticiens existants
Procedure Charger_praticiens()
  
  If ReadFile(#FichierJSON, FichierJson)
    CloseFile(#FichierJSON)
    
    ;Lecture du fichier JSON
    LoadJSON(#FichierJSON, FichierJson, #PB_JSON_NoCase)
    
    ;Extraction de la chaine JSON vers la liste chainée praticiens
    ExtractJSONList(JSONValue(#FichierJSON), praticiens())
    
    TrierListeStruc(praticiens(), #PB_Sort_Ascending, praticien\Profession)
    
    ;Affichage de la liste des praticiens
    ForEach praticiens()
     With praticiens() 
        AddGadgetItem(#Liste_praticiens, -1, \Profession)
        SetGadgetItemData(#Liste_praticiens, CountGadgetItems(#Liste_praticiens) - 1, ListIndex(praticiens()))
      EndWith
    Next
    
  EndIf
EndProcedure

Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 0, 0, 1200, 640, "", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
    CanvasGadget(#Cvs, 0, 0, 1200, 640, #PB_Canvas_Container)
    StartDrawing(CanvasOutput(#Cvs))
    Box(0, 0, 1200, 640, $FF0000)
    StopDrawing()
    ListViewGadget(#Liste_praticiens, 10, 10, 380, 620)
    ListIconGadget(#ListIcon_Affichage, 400, 10, 790, 220, "Téléphone", 150, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon_Affichage, 1, "Nom", 320)
    AddGadgetColumn(#ListIcon_Affichage, 2, "Ville", 320)
    StringGadget(#Str_Affichage, 400, 240, 790, 60, "", #PB_String_ReadOnly)
    TextGadget(#Txt_Annuaire, 400, 310, 790, 80, "Annuaire des praticiens",#SS_CENTERIMAGE|#SS_CENTER)
    TextGadget(#Txt_par,     400,  390, 790, 80, "par Micoute",#SS_CENTERIMAGE|#SS_CENTER)
    TextGadget(#Txt_Date,    400,  470, 790, 80, "5 juillet 2019",#SS_CENTERIMAGE|#SS_CENTER)
    ButtonGadget(#Btn_Quitter, 1040, 570, 150, 60, "Quitter")
    CloseGadgetList()
    
    LoadFont(#Police_Txt, "Times New Roman", 50, #PB_Font_Italic)
    LoadFont(#Police_Lst, "Arial Nova", 15, #PB_Font_Bold)
    LoadFont(#Police_Btn, "Arial Nova", 20, #PB_Font_Bold)
    
    For i = #Txt_Annuaire To #Txt_Date
      SetGadgetColor(i, #PB_Gadget_BackColor, $FF0000)
      SetGadgetColor(i, #PB_Gadget_FrontColor, $00FFFF)
      SetGadgetFont(i, FontID(#Police_Txt))
    Next i
    
    SetGadgetFont(#Btn_Quitter, FontID(#Police_Btn))
    SetGadgetFont(#ListIcon_Affichage, FontID(#Police_Lst))
    SetGadgetFont(#Liste_praticiens, FontID(#Police_Lst))
    SetGadgetFont(#Str_Affichage, FontID(#Police_Lst))
    
    Charger_praticiens()
    
  EndIf
EndProcedure

Procedure Remplir_Page_Annuaire()
  Protected Item = GetGadgetState(#Liste_praticiens)
  
  ClearGadgetItems(#ListIcon_Affichage)
  
  If Item <> -1
    SelectElement(praticiens(), GetGadgetItemData(#Liste_praticiens, Item))
    With Praticiens()
      AddGadgetItem(#ListIcon_Affichage, -1, \Tel+ #LF$ + \Nom + #LF$ + \Ville)
    EndWith  
  EndIf
EndProcedure

;- Boucle
Repeat
  Evenement = WaitWindowEvent()
  Select Evenement
      
    Case #PB_Event_Gadget
      Select EventGadget()        
        Case #Cvs  
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              Btn_SourisPresse = 1
              DecalageX = DesktopMouseX() - WindowX(#Fenetre_principale)
              DecalageY = DesktopMouseY() - WindowY(#Fenetre_principale)
              
            Case #PB_EventType_MouseMove
              If Btn_SourisPresse
                ResizeWindow(#Fenetre_principale,
                             DesktopMouseX() - DecalageX,
                             DesktopMouseY() - DecalageY,
                             #PB_Ignore, #PB_Ignore)
              EndIf
              
            Case #PB_EventType_LeftButtonUp
              Btn_SourisPresse = 0
          EndSelect
          
        Case #Liste_praticiens
          Remplir_Page_Annuaire()
        Case #ListIcon_Affichage
        Case #Str_Affichage
        Case #Btn_Quitter
          Quitter()
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Fenetre_principale
          CloseWindow(#Fenetre_principale)
          Break
      EndSelect
  EndSelect
ForEver

Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: ListView sans doublon, mais ListIcon avec

Message par microdevweb »

Bonjour Micoute,

Je ne suis pas certain d'avoir bien compris ta demande mais voici un bout de code

Code : Tout sélectionner

Structure job
  name.s
  ; etc
EndStructure
Structure praticien
  name.s
  job.job
  ; etc
EndStructure

Global NewList myPraticiens.praticien()
Global NewMap job.s()
#FORM = 0
#LST = 0
With myPraticiens()
  AddElement(myPraticiens())
  \name = "pra 1"
  \job\name = "infirmière"
  AddElement(myPraticiens())
  \name = "pra 2"
  \job\name = "infirmière"
  AddElement(myPraticiens())
  \name = "pra 3"
  \job\name = "médecin"
  AddElement(myPraticiens())
  \name = "pra 3"
  \job\name = "kiné"
EndWith

Procedure evList()
  Protected *address = GetGadgetItemData(#LST,GetGadgetState(#LST))
  If *address
    ChangeCurrentElement(myPraticiens(),*address)
    With myPraticiens()
      Protected j.s = \job\name
      ForEach myPraticiens()
        If \job\name = j
          Debug \name+"   "+\job\name
        EndIf
      Next
    EndWith
  EndIf
EndProcedure

OpenWindow(#FORM,0,0,800,600,"Teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListIconGadget(#LST,0,0,800,600,"Nom",400)
AddGadgetColumn(#LST,1,"Job",400)
ForEach myPraticiens()
  With  myPraticiens()
    ; je regarde ici le job à déjà été ajouté
    If Not FindMapElement(job(),\job\name)
      AddMapElement(job(),\job\name)
      AddGadgetItem(#LST,-1,\name+Chr(10)+\job\name)
      ; je mémorise l'adresse de l'élément de la liste
      SetGadgetItemData(#LST,i,@myPraticiens())
      i + 1
    EndIf
  EndWith
Next

BindGadgetEvent(#LST,@evList())

Repeat
  WaitWindowEvent()
Until Event() = #PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: ListView sans doublon, mais ListIcon avec

Message par Micoute »

Merci beaucoup microdevweb, c'est une très belle ébauche qui me donne des idées.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: ListView sans doublon, mais ListIcon avec

Message par venom »

Bonjour,

Après tu as tout ce qui est préférence et json







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: ListView sans doublon, mais ListIcon avec

Message par Micoute »

Tout à fait, et c'est j'ai choisi json.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre