Tri TStringList

Présentation
Bonjour à tous.

Le tri alphabétique ne se fait pas correctement dans un TStringList lorsque des chaines contiennent des caractères accentués.
En attendant une implémentation dans une version ultérieure de Lazarus, voici de quoi vous dépanner.
Deux manières :
a) utiliser TLatinStringList (dans le zip) qui est dérivé de TStringList avec simplement un override de la fonction DoCompareText : remplacement, pour le tri, des caractères accentués par leur correspondant non accentué. L'avantage est que, pour une liste triée, l'ajout de nouvelles chaines va directement se faire au bon endroit. L'inconvénient est que les fonctions Find et IndexOf (qui utilisent DoCompareText) ne vont plus distinguer "élève" de "élevé". Ce qui peut poser problème si on interdit les duplicates.
b) utiliser un CustomSort avec une fonction faisant appel à la fonction RemoveAccent. Pour ceux qui ne connaissent pas la méthode, voir le fichier txt.

Merci d'avance pour vos commentaires
Thierry
Téléchargement
3  0 
Téléchargé 36 fois Voir les 5 commentaires
Détails
Catégories : Codes sources divers
Avatar de Thierry Dehant
Membre chevronné
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 17 juin 2016




Avatar de gvasseur58 gvasseur58 - Responsable Delphi https://www.developpez.com
le 18/06/2016 à 22:17
Citation Envoyé par ThWilliam Voir le message

Merci d'avance pour vos commentaires
Merci pour cette contribution qui va aider tous ceux qui se débattent avec les caractères UTF8 .
Avatar de ThWilliam ThWilliam - Membre chevronné https://www.developpez.com
le 19/06/2016 à 11:27
@gvasseur58 :

Chose promise, chose due.
http://www.developpez.net/forums/d1590624/autres-langages/pascal/lazarus/trouver-l-implementation-methode-tri-d-tstringlist-fouillis/

@Tous :

A la réflexion, je vous recommande la deuxième manière (CustomSort + function RemoveAccent) en laissant évidemment la propriété Sorted = false.
On évite ainsi les problèmes de duplicates.
CustomSort ne maintient pas un tri constant lors de l'ajout (modification) de ligne. Mais souvent, cela n'est pas nécessaire. On refait le tri au besoin.
Avatar de Francois_C Francois_C - Membre averti https://www.developpez.com
le 29/06/2016 à 18:59
Merci. C'est en effet un casse-tête permanent que ces caractère UTF8.
Hier je m’étonnais un peu de ne pouvoir remplacer des guillemets "" par des “” qu'en utilisant un StringReplace, qui est “élastique” avec les caractères de plusieurs octets. J'ai regardé le fichier texte utf8 en hexa, et j'ai vu que j'essayais de remplace $22 par $E2809C et $E2809D sans faire de place pour trois octets.
Tant qu'on se contentait de l'alphabet latin, on était quand même bien tranquille avec l'ANSI…
Avatar de ThWilliam ThWilliam - Membre chevronné https://www.developpez.com
le 29/06/2016 à 19:32
Citation Envoyé par Francois_C Voir le message
Merci. C'est en effet un casse-tête permanent que ces caractère UTF8.
Merci à toi.
Casse-tête ? Pour t'en convaincre encore plus, je t'invite à regarder tout ce qu'il faut coder pour mettre un mot en minuscules ! function UTF8LowerCase dans lazarus\components\lazutils\lazutf8.pas

Cordialement
Thierry
Avatar de gvasseur58 gvasseur58 - Responsable Delphi https://www.developpez.com
le 30/06/2016 à 21:59
Citation Envoyé par Francois_C Voir le message

Tant qu'on se contentait de l'alphabet latin, on était quand même bien tranquille avec l'ANSI…
Bien d'accord, mais le problème est qu'on s'est rendu compte que la Terre était aussi peuplée de très nombreux êtres étranges utilisant d'étranges signes pour écrire .
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Responsables bénévoles de la rubrique Lazarus : Alcatîz - Gilles Vasseur -