Page 1 sur 1

Liste avec entête cliquabe

Publié : dim. 23/avr./2023 21:13
par Bmld76
Bonsoir,

Je voulais avoir des entêtes cliquables pour faire un tri. J'ai fait des recherches mais les codes proposés ne fonctionnaient plus sauf celui-ci que je viens de découvrir.
https://www.purebasic.fr/english/viewto ... 24#p596324

Je poste tout de même ma solution un peu différente et assez simple à intégrer.

Code : Tout sélectionner

EnableExplicit
Global quit,liste = 10 , event, Gadget

Structure Person
  nom.s
  prenom.s
  id.i
EndStructure

Global Dim tabTries.Person(2)
tabTries(0)\nom =  "Lager" : tabTries(0)\prenom = "Jules" : tabTries(0)\id = 7
tabTries(1)\nom =  "Lager" : tabTries(1)\prenom = "Jérome" : tabTries(1)\id = 12
tabTries(2)\nom =  "Garcia" : tabTries(2)\prenom = "Luca" : tabTries(2)\id = 2

Procedure TriAppel(Critere.s)
  Define i
  Debug Critere
  
  For i = 0 To 2
   Debug  tabTries(i)\nom +" "+tabTries(i)\prenom
 Next  
 
  Select Critere
    Case "Nom"
      SortStructuredArray(tabTries(), #PB_Sort_Ascending, OffsetOf(Person\nom), TypeOf(Person\nom))
    Case "Prenom"
      SortStructuredArray(tabTries(), #PB_Sort_Ascending, OffsetOf(Person\prenom), TypeOf(Person\prenom))
    Case "Id"
      SortStructuredArray(tabTries(), #PB_Sort_Ascending, OffsetOf(Person\id), TypeOf(Person\id))
  EndSelect 
  
EndProcedure

Procedure AfficheListe()
  Define i
  ; vide la liste
  For i = 0 To 2
    RemoveGadgetItem(liste, 0)
  Next
  ; lit les data
  For i = 0 To 2
    AddGadgetItem(liste, -1, tabTries(i)\nom + #LF$ + tabTries(i)\prenom + #LF$ + tabTries(i)\id) 
  Next
EndProcedure


OpenWindow(0, 200, 100, 600, 300, "Disable highlight example")
ListIconGadget(liste, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Nom", 110)
AddGadgetColumn(liste, 1, "Prenom", 100)
AddGadgetColumn(liste, 2, "Id", 100)
CocoaMessage(0,  GadgetID(liste), "setAllowsColumnSelection:", #YES) ; autorise la selection de colonne
CocoaMessage(0, GadgetID(liste), "setSelectionHighlightStyle:", -1); -1 pas de surlignement  / surlignement   
AfficheListe()

Repeat
  event = WaitWindowEvent()
  Gadget = EventGadget();
  
  Select Event
    Case #PB_Event_CloseWindow
      quit = 1
    Case #PB_Event_Gadget     
      Select Gadget
          
        Case liste ; liste 
          Define SelectedColumn
          Select  EventType() 
            Case #PB_EventType_LeftDoubleClick                    ; Edite tireur
              Debug "ligne selectionnée"
            Case #PB_EventType_LeftClick   ; clic gauche 
              SelectedColumn = CocoaMessage(0,  GadgetID(Liste) , "selectedColumn")  
              Debug SelectedColumn
              If SelectedColumn = -1
                Debug "Aucune colonne de sélectionnée"
                CocoaMessage(0, GadgetID(liste), "setSelectionHighlightStyle:", 0); -1 pas de surlignement  / surlignement
              Else
                Debug "colonne  sélectionnée"
                ;selection d'une colonne > tri 
                CocoaMessage(0, GadgetID(liste), "setSelectionHighlightStyle:", -1); -1 pas de surlignement  / surlignement
                TriAppel(GetGadgetItemText(Gadget,-1,SelectedColumn))            ;Select SelectedColumn
                AfficheListe()
              EndIf
              
          EndSelect
      EndSelect
      
      EndSelect
    Until quit =1

Re: Liste avec entête cliquabe

Publié : ven. 28/avr./2023 22:28
par Bmld76
Si vous utilisez une liste avec des cases à cocher, seul ma solution fonctionne.