Page 1 sur 1

[Resolu] doublons ou lignes identiques listicon

Publié : sam. 15/sept./2012 9:24
par micam
Bonjour,

Je relance à nouveau le même sujet, car malgré l'aide précieuse de G-Rom je n'arrive pas à faire ce que je voudrai.
J'ai rajouté une colonne dans mes listicon et je n'arrive pas à adapter l'exemple suivant que m'a fourni G-Rom.

Code : Tout sélectionner

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ListIcon_1
  #Button_1
  #ListIcon_2
EndEnumeration

Global NewMap m_Word.i()

Procedure add_word(word.s)
  
  If FindMapElement(m_Word(), word)
      m_Word(word) + 1 ; c'est un doublon
    Else
      m_Word(word) = 1 ; ce n'est pas un doublon
  EndIf 
  
  AddGadgetItem(#ListIcon_1,-1,word)
    
EndProcedure

Procedure.i word_occurence(word.s)
  If FindMapElement(m_Word(), word)
    ProcedureReturn m_Word(word)
  EndIf 
  ProcedureReturn 0
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 451, 230, 536, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_1, 25, 20, 220, 225, "Listicon 1", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_1), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    ButtonGadget(#Button_1, 265, 255, 210, 25, "afficher les lignes identiques")
    ListIconGadget(#ListIcon_2, 255, 20, 230, 225, "Listicon 2", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#ListIcon_2), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    add_word("six")
    add_word("trois")
    add_word("un")
    add_word("trois")
    add_word("quatre")
    add_word("deux")
    add_word("deux")
    add_word("un")
    add_word("un")
  EndIf
EndProcedure

OpenWindow_Window_0()
;{- Event loop
Repeat
  Select WaitWindowEvent()
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #Button_1
          ClearGadgetItems(#ListIcon_2)
          
          ; On parcours la première liste
          nb = CountGadgetItems(#ListIcon_1)
          
          For i = 0 To nb-1
            word$ = GetGadgetItemText(#ListIcon_1,i)
            If word_occurence(word$) > 1
              AddGadgetItem(#ListIcon_2,-1,word$)
            EndIf 
          Next 
        
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
Ce code marche très bien avec une colonne unique, mais je n'avait pas précisé que j'avais 2 colonnes, et là je n'arrive à rien.

Voici un exemple de ce que j'aimerai faire :

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ListIcon_TitreUnique
  #ListIcon_TitreEnDouble
  #Text_2
  #Text_3
  #Button_AfficherLesTitres
EndEnumeration

Structure Films
  Titre.s
  Code.s
EndStructure

Global NewList ListeFilms.Films() 
;}
;}

Procedure ListeTousLesFilms()
  ; cette liste est une liste exemple, mais peut contenir beaucoup plus de titres

  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "173400"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "201607"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "berlin"
  ListeFilms()\Code = "156238"
  
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "167235"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "44562"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "pollo"
  ListeFilms()\Code = "132413"
  
  ; ///////////////////////////////////
  ; Je n'arrive pas à trier la liste par ordre alphabétique
  SortList(ListeFilms(), #PB_Sort_Descending)
  ;///////////////////////////////
  
EndProcedure
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 493, 291, "Afficher les titres", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_TitreUnique, 5, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    ListIconGadget(#ListIcon_TitreEnDouble, 250, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    TextGadget(#Text_2, 80, 15, 85, 20, "Titres uniques")
    TextGadget(#Text_3, 325, 15, 95, 15, "Titre en doubles")
    ButtonGadget(#Button_AfficherLesTitres, 175, 250, 130, 30, "Afficher les titres")
    AddGadgetColumn(#ListIcon_TitreUnique, 1, "Code" , 60)
    AddGadgetColumn(#ListIcon_TitreEnDouble, 1, "Code" , 60)
  EndIf
EndProcedure

OpenWindow_Window_0()

;{- Event loop
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListIcon_TitreUnique
        Case #ListIcon_TitreEnDouble
        Case #Text_2
        Case #Text_3
        Case #Button_AfficherLesTitres
          
          ;/////////////////////////////////
          ; j'aimerai récupérer les éléments de la ListeFilms() séparer les titres uniques des titres en double 
          ; et les afficher par ordre alphabéthique dans les 2 listicon
          
          ; le code des AddGadgetItem(#ListIcon.. est là juste pour montrer ce que j'aimerai afficher
          
          ; afficher titres uniques par ordre alphabéthique
          AddGadgetItem(#ListIcon_TitreUnique,-1, "berlin" + Chr(10) + "156238")
          AddGadgetItem(#ListIcon_TitreUnique,-1, "pollo" + Chr(10) + "132413")
          
          ; afficher titres en double par ordre alphabéthique
          AddGadgetItem(#ListIcon_TitreEnDouble,-1, "paris" + Chr(10) + "201607")    
          AddGadgetItem(#ListIcon_TitreEnDouble,-1, "paris" + Chr(10) + "44562")
          AddGadgetItem(#ListIcon_TitreEnDouble,-1, "waterloo" + Chr(10) + "173400")    
          AddGadgetItem(#ListIcon_TitreEnDouble,-1, "waterloo" + Chr(10) + "167235") 
          
          ;//////////////////////////////////
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver

J'espère cette fois-ci être plus clair.
Merci d'avance de votre aide.

Re: doublons ou lignes identiques listicon pour super débuta

Publié : sam. 15/sept./2012 10:17
par falsam
Je répond en partie sur la façon de trier une list le tri :)

Code : Tout sélectionner

Structure Films
  Titre.s
  Code.s
EndStructure

Global NewList ListeFilms.Films() 
;}
;}

Procedure ListeTousLesFilms()
  ; cette liste est une liste exemple, mais peut contenir beaucoup plus de titres

  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "173400"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "201607"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "berlin"
  ListeFilms()\Code = "156238"
  
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "167235"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "44562"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "pollo"
  ListeFilms()\Code = "132413"
  
  ; ///////////////////////////////////
  ; Je n'arrive pas à trier la liste par ordre alphabétique
  ;SortList(ListeFilms(), #PB_Sort_Descending)
  ;///////////////////////////////
  SortStructuredList(ListeFilms(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(films\titre), #PB_Sort_String)
  
EndProcedure

ListeTousLesFilms()
ForEach ListeFilms()
  Debug ListeFilms()\Titre + " - "+ ListeFilms()\Code
Next

Re: doublons ou lignes identiques listicon pour super débuta

Publié : sam. 15/sept./2012 10:56
par falsam
maintenant la suite :)

Dans mon code précédent, ta liste est triée sur la colonne des titres.
Tu dois maintenant ajouter quelques ligne de code afin de chercher les doublons

Parcours de la liste
Lecture de l’élément en cours
Comparaison avec le précédent.
:?: Si titre identique
:arrow: On indique que l'enregistrement en cours est un doublon de l'enregistrement précédent
:arrow: On indique que l'enregistrement précédent est un doublon de l'enregistrement en cours
Poursuite du parcours de la liste.

Comment fait on ?
Un pointeur de liste

Code : Tout sélectionner

Global *FilmPrecedent.Films
Une modification de ta structure initiale

Code : Tout sélectionner

Structure Films
  Titre.s
  Code.s
  Doublon.b ;<== la modif
EndStructure
Apres le tri se trouvant dans ta procédure ListeTousLesFilms() on insère le code suivant afin de trouver les doublons

Code : Tout sélectionner

  SortStructuredList(ListeFilms(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(films\titre), #PB_Sort_String)
  
  ;Dédoublonnage 
  ForEach ListeFilms()
    If *FilmPrecedent<>0
    If *FilmPrecedent\Titre=ListeFilms()\Titre
      *FilmPrecedent\Doublon = #True
      ListeFilms()\Doublon = #True
    EndIf
    EndIf
 
    *FilmPrecedent = ListeFilms()
  Next
L'affichage consiste maintenant à répartir les éléments de ta liste de film soit dans la liste de gauche soit dans la liste de droite en fonction de la valeur de ListeFilms()\Doublon (#False, #True)

Code : Tout sélectionner

        Case #Button_AfficherLesTitres
          ForEach ListeFilms()
            If ListeFilms()\Doublon = #False
              AddGadgetItem(#ListIcon_TitreUnique,-1, ListeFilms()\Titre + Chr(10) + ListeFilms()\Code)
            Else
              AddGadgetItem(#ListIcon_TitreEnDouble,-1, ListeFilms()\Titre + Chr(10) + ListeFilms()\Code)
            EndIf
          Next
Le code complet

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ListIcon_TitreUnique
  #ListIcon_TitreEnDouble
  #Text_2
  #Text_3
  #Button_AfficherLesTitres
EndEnumeration

Structure Films
  Titre.s
  Code.s
  Doublon.b
EndStructure

Global NewList ListeFilms.Films()
Global *FilmPrecedent.Films
;}
;}


Procedure ListeTousLesFilms()
  ; cette liste est une liste exemple, mais peut contenir beaucoup plus de titres

  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "173400"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "201607"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "berlin"
  ListeFilms()\Code = "156238"
  
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "waterloo"
  ListeFilms()\Code = "167235"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "paris"
  ListeFilms()\Code = "44562"
  
  AddElement(ListeFilms())
  ListeFilms()\Titre = "pollo"
  ListeFilms()\Code = "132413"
  
  SortStructuredList(ListeFilms(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(films\titre), #PB_Sort_String)
  
  ;Dédoublonnage 
  ForEach ListeFilms()
    If *FilmPrecedent<>0
    If *FilmPrecedent\Titre=ListeFilms()\Titre
      *FilmPrecedent\Doublon = #True
      ListeFilms()\Doublon = #True
    EndIf
    EndIf
 
    *FilmPrecedent = ListeFilms()
  Next
  
 
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 493, 291, "Afficher les titres", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_TitreUnique, 5, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    ListIconGadget(#ListIcon_TitreEnDouble, 250, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    TextGadget(#Text_2, 80, 15, 85, 20, "Titres uniques")
    TextGadget(#Text_3, 325, 15, 95, 15, "Titre en doubles")
    ButtonGadget(#Button_AfficherLesTitres, 175, 250, 130, 30, "Afficher les titres")
    AddGadgetColumn(#ListIcon_TitreUnique, 1, "Code" , 60)
    AddGadgetColumn(#ListIcon_TitreEnDouble, 1, "Code" , 60)
  EndIf
EndProcedure

OpenWindow_Window_0()
ListeTousLesFilms()

;{- Event loop
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListIcon_TitreUnique
        Case #ListIcon_TitreEnDouble
        Case #Text_2
        Case #Text_3
        Case #Button_AfficherLesTitres
          ForEach ListeFilms()
            If ListeFilms()\Doublon = #False
              AddGadgetItem(#ListIcon_TitreUnique,-1, ListeFilms()\Titre + Chr(10) + ListeFilms()\Code)
            Else
              AddGadgetItem(#ListIcon_TitreEnDouble,-1, ListeFilms()\Titre + Chr(10) + ListeFilms()\Code)
            EndIf
          Next
              
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver

Re: doublons ou lignes identiques listicon pour super débuta

Publié : sam. 15/sept./2012 11:13
par MLD
Plus simple vite fait :lol:

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ListIcon_TitreUnique
  #ListIcon_TitreEnDouble
  #Text_2
  #Text_3
  #Button_AfficherLesTitres
EndEnumeration

Global Dim listfilms$(0)

;}
;}

Procedure ListeTousLesFilms()
  ; cette liste est une liste exemple, mais peut contenir beaucoup plus de titres

  ReDim listfilms$(1)
  ListFilms$(1)  = "waterloo,173400,"
  ReDim listfilms$(2)
  ListFilms$(2) = "paris,201607,"
  ReDim listfilms$(3)
  ListFilms$(3) = "berlin,156238,"
  ReDim listfilms$(4)
  ListFilms$(4) = "waterloo,167235,"
  ReDim listfilms$(5)
  ListFilms$(5) = "paris,44562,"
  ReDim listfilms$(6)
  ListFilms$(6) = "pollo,132413,"
SortArray(ListFilms$(),#PB_Sort_Ascending )

EndProcedure
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 493, 291, "Afficher les titres", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
    ListIconGadget(#ListIcon_TitreUnique, 5, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    ListIconGadget(#ListIcon_TitreEnDouble, 250, 45, 235, 190, "Titre", 170, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    TextGadget(#Text_2, 80, 15, 85, 20, "Titres uniques")
    TextGadget(#Text_3, 325, 15, 95, 15, "Titre en doubles")
    ButtonGadget(#Button_AfficherLesTitres, 175, 250, 130, 30, "Afficher les titres")
    AddGadgetColumn(#ListIcon_TitreUnique, 1, "Code" , 60)
    AddGadgetColumn(#ListIcon_TitreEnDouble, 1, "Code" , 60)
  EndIf
EndProcedure

OpenWindow_Window_0()
ListeTousLesFilms()
;{- Event loop
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ListIcon_TitreUnique
        Case #ListIcon_TitreEnDouble
        Case #Text_2
        Case #Text_3
        Case #Button_AfficherLesTitres
        For a.w = 1 To 6
         a$ =  StringField(ListFilms$(a),1,",") 
         c.w = 0
         For b.w = 1 To 6
          If StringField(ListFilms$(b),1,",") = a$
           
           c = c +1
          EndIf 
          Next 
          If c = 1
            AddGadgetItem(#ListIcon_TitreUnique,-1,a$ + Chr(10) + StringField(ListFilms$(a),2,",")) 
          Else 
            AddGadgetItem(#ListIcon_TitreEnDouble,-1,a$ + Chr(10) + StringField(ListFilms$(a),2,","))  
          EndIf
         Next 
          
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver

Pas de liste juste un tableau. A toi d'entré les films d'une manière plus adéquate. :wink:

Re: doublons ou lignes identiques listicon pour super débuta

Publié : sam. 15/sept./2012 11:27
par falsam
MLD a écrit :Pas de liste juste un tableau. A toi d'entré les films d'une manière plus adéquate.
C'est une question de gout. De plus si tu as des titres de films comme Adieu, monde cruel (1998) ton code n'est plus bon. Bien sur, on peut choisir un autre séparateur :)

Re: doublons ou lignes identiques listicon pour super débuta

Publié : mar. 18/sept./2012 9:37
par micam
Bonjour,

Les deux solutions vont très bien.
Merci de votre aide falsam et mld.