En cherchant une solution pour trier une liste en cliquant sur l'entête, je me suis aperçu d'un problème de tri avec des caractères accentués. Le problème est-il connu, y a-t- il une solution ?
je vous met 2 programmes mettant en évidence ce problème de tri, Jérome est toujours après Jules. le premier pour Mac avec sélection d'entête, ma solution est assez simple, et un programme universel avec boutons.
Sélection par entête
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
Code : Tout sélectionner
EnableExplicit
Global quit,liste = 10 , event, Gadget, triNom = 11, tripreNom = 12
Structure Person
nom.s
prenom.s
id.i
EndStructure
Global Dim tabTries.Person(2)
tabTries(0)\nom = "Léger" : tabTries(0)\prenom = "Jules" : tabTries(0)\id = 7
tabTries(1)\nom = "Leger" : 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 "Classement"
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, 40, WindowWidth(0) - 20, WindowHeight(0) - 20, "Nom", 110)
AddGadgetColumn(liste, 1, "Prenom", 100)
AddGadgetColumn(liste, 2, "ID", 100)
ButtonGadget(triNom , 10 , 3 , 100, 30, "tri nom" )
ButtonGadget(triprenom , 110 , 3 , 100, 30, "tri prenom" )
AfficheListe()
Repeat
event = WaitWindowEvent()
Gadget = EventGadget();
Select Event
Case #PB_Event_CloseWindow
quit = 1
Case #PB_Event_Gadget
Select Gadget
Case triNom
TriAppel("Nom")
AfficheListe()
Case triPrenom
TriAppel("Prenom")
AfficheListe()
Case liste ; liste
Define SelectedColumn
Select EventType()
Case #PB_EventType_LeftDoubleClick ; Edite tireur
Debug "ligne selectionnée"
Case #PB_EventType_LeftClick ; clic gauche
EndSelect
EndSelect
EndSelect
Until quit =1