IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Trouver l'implémentation de la méthode de tri d'un TStringList : quel fouillis ! [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut Trouver l'implémentation de la méthode de tri d'un TStringList : quel fouillis !
    Bonjour à tous.

    Si j'ajoute 3 items dans un TListBox : "elle", "éléphant", "voiture"
    Et que je trie le ListBox, j'obtiens un ordre parfait : "éléphant", "elle", "voiture".

    Ceci aussi bien sous Linux que sous Windows.

    Je fais la mème chose dans un TStringList (sorted) et j'obtiens dans l'ordre : "elle", "voiture", "éléphant".
    C'est à dire le même résultat qu'en utilisant la fonction UTF8CompareText qui considère bien sûr que le "é" vient après le "v".

    Pourtant, TStringList est une classe dérivée de TStrings, tout comme la propriété Items d'un ListBox.
    On est donc en droit de s'attendre à ce que la méthode de tri soit la même !!?

    Je pars donc à la recherche de l'implémentation de la méthode, et là, quel fouillis ! Un chat n'y retrouverait pas ses petits !

    TStringList n'est déclaré que dans le fichier "classesh.inc". Aucune implémentation de méthode.
    De inc en inc, je ne trouve que des "widgetclass", des "registerclass" ou autres trucs du genre...

    J'en déduis que Lazarus utilise les méthodes natives de l'OS. Bon, d'accord si c'est ce qu'il y a de plus performant, mais je préférerais tout de même une véritable implémentation, ne serait-ce que pour mon intérêt personnel de voir le code utilisé. Et ne serait-ce pas un gage de meilleure compatibilité entre OS ?

    Donc, ma question : pourquoi la méthode de tri d'un TStringList n'est-elle pas la même que celle utilisée, par exemple, dans un ListBox ?

    Merci.

    Cordialement
    Thierry

  2. #2
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Bonjour !

    Citation Envoyé par ThWilliam Voir le message
    Pourtant, TStringList est une classe dérivée de TStrings, tout comme la propriété Items d'un ListBox.
    On est donc en droit de s'attendre à ce que la méthode de tri soit la même !!?
    Eh bien non . Si une classe donnée a toujours le même comportement, deux classes dérivées n'ont pas forcément le même comportement... Items de TListBox est de type TStrings, ce qui lui permet d'être compatible avec les différents descendants dont TStringList. "Compatible" ne signifie pas "identique"...

    Citation Envoyé par ThWilliam Voir le message
    Je pars donc à la recherche de l'implémentation de la méthode, et là, quel fouillis ! Un chat n'y retrouverait pas ses petits !

    TStringList n'est déclaré que dans le fichier "classesh.inc". Aucune implémentation de méthode.
    De inc en inc, je ne trouve que des "widgetclass", des "registerclass" ou autres trucs du genre...
    Eh bien encore non . TStringList est bien implémenté dans classesh.inc à partir de la ligne 1005 (Lazarus 1.6 Free Pascal 3.0)

    Citation Envoyé par ThWilliam Voir le message
    J'en déduis que Lazarus utilise les méthodes natives de l'OS. Bon, d'accord si c'est ce qu'il y a de plus performant, mais je préférerais tout de même une véritable implémentation, ne serait-ce que pour mon intérêt personnel de voir le code utilisé. Et ne serait-ce pas un gage de meilleure compatibilité entre OS ?
    TListBox est bien celui de l'OS, d'où l'appel au widget après un test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if HandleAllocated then
    TStringList est implémenté en Pascal dans l'unité déjà mentionnée.

    Donc, ma question : pourquoi la méthode de tri d'un TStringList n'est-elle pas la même que celle utilisée, par exemple, dans un ListBox ?
    Ce ne sont pas les mêmes classes qui sont en jeu. En revanche, là où je suis d'accord avec toi, c'est que l'introduction de l'UTF8 a semé (un peu) le bazar dans la gestion des chaînes. C'est un passage obligé, mais qui ne simplifie pas le travail du programmeur. Je préfère le comportement de Delphi qui sait trier de manière correcte les chaînes, y compris celles qui contiennent des caractères accentués.

    Une solution serait de reprendre la méthode de tri de TStringList (puisque c'est elle qui donne des résultats faux pour nos lettres accentuées).

    La méthode de comparaison est virtuelle (on peut donc la modifier dans les classes qui descendent de TStringList) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure TStringList.Sort;
    begin
      CustomSort(@StringListAnsiCompare);
    end;
    Il faut par conséquent écrire une fonction (pas une méthode puisqu'elle ne dépend pas d'une classe) qui remplacera celle par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function StringListAnsiCompare(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := List.DoCompareText(List.Strings[Index1], List.Strings[Index2]);
    end;
    Ensuite, en supposant que la nouvelle fonction s'appelle MyStringCompare, il suffira de surcharger TStringList.Sort de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure TStringList.Sort;
    begin
      CustomSort(@MyStringCompare);
    end;
    Les éventuels résultats m'intéressent !
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour Gilles et merci pour ta réponse.

    deux classes dérivées n'ont pas forcément le même comportement...
    C'est évident. En fait, je pensais que la méthode de tri était développée dans TStrings, ce qui n'est pas le cas puisque la fonction DoCompareText n'est que virtuelle.
    Mea culpa.

    TStringList est bien implémenté dans classesh.inc à partir de la ligne 1005
    Chez moi (Lazarus 1.6 sous win7), l'implémentation n'est faite que dans le fichier stringl.inc (de fait, à partir de la ligne 1005).
    Je n'avais pas pensé à consulter ce fichier. Encore une fois, mea culpa !

    Je préfère le comportement de Delphi qui sait trier de manière correcte les chaînes, y compris celles qui contiennent des caractères accentués.
    A qui le dis-tu !!!

    Enfin, puisque je sais maintenant que Lazarus n'a pas développé de méthode de tri tenant compte correctement des accents, je retourne à mon ancien système : un CustomSort avec une fonction perso qui, pour le tri, remplace les caractères accentués par leur correspondant non accentué.

    Encore merci.

    Cordialement
    Thierry

  4. #4
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Encore merci.
    De rien !

    En revanche, si ta méthode personnelle pouvait être partagée, ce serait sympathique pour tout le monde .

    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  5. #5
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par gvasseur58 Voir le message
    En revanche, si ta méthode personnelle pouvait être partagée, ce serait sympathique pour tout le monde .
    Je n'y manquerai pas !

  6. #6
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Implémentation de la méthode PLS
    Par ToTo13 dans le forum Langage
    Réponses: 4
    Dernier message: 15/06/2007, 09h31
  2. Réponses: 4
    Dernier message: 30/05/2007, 14h35
  3. [Méthode de tri][Arbre binaire] Problème dans l'ordre total
    Par jgavard dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 24/04/2007, 16h55
  4. Un classique des méthodes de tri
    Par bros_70 dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2007, 17h03
  5. Réponses: 1
    Dernier message: 02/03/2007, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo