ListIcon et style LVS_SORT...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

ListIcon et style LVS_SORT...

Message par tatanas »

Bonjour à tous,

Je me retrouve confronté un problème avec une ListIcon.
Contrairement à Autoit où il suffit d'ajouter le style LVS_SORTASCENDING lors de la création de la listview pour obtenir un tri auto de cette dernière, cela ne fonctionne pas en Purebasic.
Pourtant je n'ai pas lu de limitation particulière sur MSDN concernant l'usage de ces styles.
Même en tentant après coup avec un GetWindowLong_/SetWindowLong_ (ce dont j'aurais besoin d'ailleurs), cela fait disparaître les items.
Le seul moyen est-il de trier la listicon après chaque ajout d'item via une fonction créée à cet effet ?

Exemple :

Code : Tout sélectionner

Window_0 = OpenWindow(#PB_Any, 0, 0, 400, 400, "", #PB_Window_SystemMenu)
ListIcon_0 = ListIconGadget(#PB_Any, 30, 16, 302, 324, "Column 1", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection); | #LVS_SORTASCENDING)
AddGadgetColumn(ListIcon_0, 1, "Column 2", 100)

old_style.l = GetWindowLong_(GadgetID(ListIcon_0), #GWL_STYLE)
SetWindowLong_(GadgetID(ListIcon_0), #GWL_STYLE, old_style | #LVS_SORTASCENDING)

AddGadgetItem(ListIcon_0, -1, "10" + Chr(10) + "fsgfhg")
AddGadgetItem(ListIcon_0, -1, "20" + Chr(10) + "detrtgrz")
AddGadgetItem(ListIcon_0, -1, "5" + Chr(10) + "hgjhyj")
AddGadgetItem(ListIcon_0, -1, "1" + Chr(10) + "bdbhgfjk")

Repeat
	Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Merci d'éclairer ma lanterne.

PS : en fouinant sur le forum, j'ai trouvé ce topic (viewtopic.php?f=1&t=13253&view=previous) qui ne parle pas spécialement du style Sort mais qui l'utilise. Vous remarquerez que son code était probablement fonctionnel à l'époque mais ne l'est plus avec la dernière version de PB.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: ListIcon et style LVS_SORT...

Message par Marc56 »

Bonjour tatanas,

Pour faire des EXE léger et compatibles avec 3 OS, PB n'implémente pas toutes les fonctionnalités des objets de chaque interface. On ne peux donc se référer au MSDN.

Une bonne pratique de codage est de ne jamais stocker directement les données dans un objet graphique, mais de les stocker dans un Tableau ou mieux, dans une Liste. Ces deux types de stockage ont des options de tri intégrés rapides.

Voir: SortArray, SortList, SortStructuredArray, SortStructuredList

:wink:
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: ListIcon et style LVS_SORT...

Message par tatanas »

Donc les styles #LVS_SORTASCENDING et #LVS_SORTDESCENDING ne sont plus supportés ?

Je vais donc essayer les listes que je n'ai pas encore eu l'occasion d'utiliser.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: ListIcon et style LVS_SORT...

Message par kernadec »

bjr tatanas
je vois que tu as utilisé une fonction API dans ton code
j ai un code d'exemple de Michael Vogel qui utilise aussi l'API Windows
qui semble être le mode que tu cherche, reste plus qu'a bricoler une procedure
pour obtenir les deux sens de tri :D

Ps:pour le tri auto : Il est préférable de trier les données vous-même avant de les ajouter au gadget. :wink:

Cordialement

Code : Tout sélectionner

;############## tri lesticon par Michael Vogel forum german
EnableExplicit
;sort order,0 ascending/listicongadget cols
;Global cols=4

Procedure SortSwapItems(id,item1,item2,cols)
  Protected c
  Protected t.s
  
  For c=0 To cols-1
    t=GetGadgetItemText(id,item1,c)
    SetGadgetItemText(id,item1,GetGadgetItemText(id,item2,c),c)
    SetGadgetItemText(id,item2,t,c)
  Next c
  
  c=GetGadgetItemState(id,item1)
  SetGadgetItemState(id,item1,GetGadgetItemState(id,item2))
  SetGadgetItemState(id,item2,c)
  
EndProcedure
Procedure SortCompare(s1.s,s2.s)
  
  Protected t1.s=RSet(s1,24)
  Protected t2.s=RSet(s2,24)
  
  If UCase(t1)<UCase(t2)
    ProcedureReturn -1
  ElseIf UCase(t1)>UCase(t2)
    ProcedureReturn 1
  EndIf
  
  ProcedureReturn 0
  
EndProcedure
Procedure SortItems(id,order,col,cols,left,right)
  
  Protected l=left
  Protected r=right
  
  Protected t.s=GetGadgetItemText(id,(l+r)/2,col)
  
  While l<=r
    If order
      While SortCompare(GetGadgetItemText(id,l,col),t)>0 And l<right
        l+1
      Wend
      While SortCompare(GetGadgetItemText(id,r,col),t)<0 And l<right
        r-1
      Wend
    Else
      While SortCompare(GetGadgetItemText(id,l,col),t)<0 And l<right
        l+1
      Wend
      While SortCompare(GetGadgetItemText(id,r,col),t)>0 And l<right
        r-1
      Wend
    EndIf
    If l<=r
      SortSwapItems(id,l,r,cols)
      l+1
      r-1
    EndIf
  Wend
  
  If left<r
    SortItems(id,order,col,cols,left,r)
  EndIf
  
  If l<right
    SortItems(id,order,col,cols,l,right)
  EndIf
  
EndProcedure
Procedure SortItemsNow(id,col)
  
  Protected Title.s=GetGadgetItemText(id,-1,col)
  Protected i,Order
  Protected Columns=SendMessage_(SendMessage_(GadgetID(id),#LVM_GETHEADER,0,0),#HDM_GETITEMCOUNT,0,0)
  
  #OrderSymbolSpace="  ";   "__"
  #OrderSymbolLen=4     ;      "__/"
  
  i=Columns
  While i
    i-1
    Title=GetGadgetItemText(id,-1,i)
    Order=FindString(Right(Title,2),"/",1)
    If Order
      Title=Left(Title,Len(Title)-#OrderSymbolLen)
    EndIf
    If col=i
      Order=(Order+2)&1
      SortItems(id,0*Order,col,Columns,0,CountGadgetItems(id)-1)
      Title=Title+#OrderSymbolSpace+Mid("/\/",0*Order+1,2)
    EndIf
    SetGadgetItemText(id,-1,Title,i)
  Wend
  
  ProcedureReturn #True
  
EndProcedure
Procedure windowCallback(win,msg,wParam,lParam)
  
  Protected *phdr.NM_LISTVIEW
  
  If msg=#WM_NOTIFY
    *phdr=lParam
    If *phdr\hdr\code=#LVN_COLUMNCLICK
      SortItemsNow(GetDlgCtrlID_(*phdr\hdr\hwndfrom),*phdr\isubItem)
    EndIf
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
  
EndProcedure


;-driver
OpenWindow(0,0,0,620,500,"Adding items..",13107201)
SetWindowCallback(@windowCallback())

;create the listicongadget

ListIconGadget(1,0,0,620,500,"Column 0",150,1073807369)
AddGadgetColumn(1,1,"Column 1",150)
AddGadgetColumn(1,2,"Column 2",150)
AddGadgetColumn(1,3,"Column 3",150)

Global item.l
Global i.s
Global n

;fill it with random data
For item=0 To 99
  i.s=""
  i + Str(Random(2))+":"+RSet(Str(Random(59)),2,"0")+"'"+RSet(Str(Random(59)),2,"0")+"''"
  i + #LF$
  
  i + Str(Random(59))+"'"+RSet(Str(Random(59)),2,"0")+"''"
  i + #LF$
  
  i + Str(Random(20))+","+RSet(Str(Random(59)),2,"0")+"km"
  i + #LF$
  
  For n=0 To 9
    i.s + Chr('A' + Random(25))
  Next n
  
  AddGadgetItem(1,-1,i)
  WindowEvent()
Next item

i=Str(item) + " items,click header to sort in ascending/descending order"
SetWindowTitle(0,i)

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
End

tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: ListIcon et style LVS_SORT...

Message par tatanas »

Merci pour les infos.
Pour l'instant je n'ai besoin que d'une listicon simple à 2 colonnes que je remplis par l'intermédiaire d'un fichier ini. Je passerai par une List structurée pour faire le tri initial et un tri à chaque ajout manuel d'élément.
Répondre