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

Langage Delphi Discussion :

[D7] Tri de liste


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut [D7] Tri de liste
    Bonjour,

    j'ai une liste de type TList dans laquelle j'ajoute des Lignes de type PLIgne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Type
      PLigne = ^TLigne ;
      TLigne = Record
        Nom     : String ;
        Largeur : Integer ;
        Hauteur : Integer ;
      End;
     
    Var
      Liste : TList ;
      LMax  : Integer ;
    j'ajoute les 3 lignes suivantes que j'affiche dans un ListBox

    AAA 100 100
    000 200 200
    _AA 300 300
    je trie la liste avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    { ===================================================================== }
    Function FonctionTri(Item1,Item2:Pointer):Integer ;
    // Tri selon la 1ere colonne : Nom
    Begin
      If PLigne(Item1).Nom < PLigne(Item2).Nom Then
        Result := -1
      Else
        If PLigne(Item1).Nom > PLigne(Item2).Nom Then
          Result := 1
        Else
          Result := 0 ;
    End;
    { ===================================================================== }
    procedure TriListe;
    // Tri suivant la colonne 1 : Nom
    Var
      i : Integer ;
    begin
      Liste.Sort(FonctionTri) ;
      MAJListBox ;
    end;
    { ===================================================================== }
    après mise à jour de LB1, j'obtiens
    000 200 200
    AAA 100 100
    _AA 300 300
    je voudrais obtenir :
    _AA 300 300
    000 200 200
    AAA 100 100
    car normalement _ est avant 0 (comme dans l'explorateur de fichiers)

    Comment dois je modifier ma fonction de tri ?

    Voici le code de mon test :

    TestListe.zip

    Merci
    A+
    Charly

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    car normalement _ est avant 0 (comme dans l'explorateur de fichiers)
    Heu, pas dans la table des caractères, avant le 'a' ou plus exactement avant le '`'
    Tu pourrais toujours soustraire le '_' avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Function FonctionTri(Item1,Item2:Pointer):Integer ;
    // Tri selon la 1ere colonne : Nom
    var s1,s2;
    Begin
      s1:=Replacestr(PLigne(Item1).Nom,'_','',[rfreplaceAll];
      s2:=Replacestr(PLigne(Item2).Nom,'_','',[rfreplaceAll];
      If s1< s2 Then
        Result := -1
      Else
        If s1 > s2 Then
          Result := 1
        Else
          Result := 0 ;
    End;

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut
    Ok, merci Serge,

    mais ce qui m'interpelle, c'est que si je fais LB1.Sorted := True, j'obtiens le _ avant le 0 :

    _AA 300 300
    000 200 200
    AAA 100 100
    Dans l'explorateur de fichiers c'est pareil, le _ est avant le 0, le a, le ...

    Je vais utiliser ta solution, mais je me demande comment Windows fait pour obtenir cet ordre de tri ?

    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut
    Merci Serge,

    ça marche bien avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      s1 := StringReplace(PLigne(Item1).Nom,'_',' ',[rfreplaceAll]);
      s2 := StringReplace(PLigne(Item2).Nom,'_',' ',[rfreplaceAll]);
    on peut aussi remplacer ' ' par Char(1) pour être sûr d'être en premier ?

    je vais tester avec d'autres caractères comme ~ par exemple.

    Mon objectif est d'obtenir le même ordre que celui de la ListBox LB1 quand elle est triée.

    A+
    Charly

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut
    J'ai testé avec LB1 triée et aussi avec le gestionnaire de fichiers :

    l'ordre est : # , _, ~ , puis 0, ..., A, ... et a, ...

    je n'avais jamais vu que cet ordre n'était pas celui de l'ASCII !

    A+
    Charly

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    pour un tri plus intelligent il faut passer par une fonction de comparaison comme CompareText() ... et il faut peut-être laisser tomber Delphi 7

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut
    J'utilise D10.4 pour mes nouvelles applis mais là c'est une vielle appli que je voulais modifier !

    j'ai testé CompareText :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    { ===================================================================== }
    Function FonctionTri(Item1,Item2:Pointer):Integer ;
    // Tri selon la 1ere colonne : Nom
    Var
      s1, s2 : String ;
    Begin
      s1 := PLigne(Item1).Nom ;
      S2 := PLigne(Item2).Nom ;
      Result := CompareText(s1, s2) ;
    End;
    { ===================================================================== }
    Mais cela me donne l'ordre suivant :

    #AA 300 300
    000 200 200
    AAA 100 100
    _AA 300 300
    ~AA 300 300
    Alors que LB1.sorted:= true (et aussi le tri du gestionnaire de fichiers) donne :

    #AA 300 300
    _AA 300 300
    ~AA 300 300
    000 200 200
    AAA 100 100
    Bon ce n'est pas encore ce que je veux. Je vais laisser tomber le tri !

    A+
    Charly

  8. #8
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 480
    Points
    480
    Par défaut
    Et si dans ta petite fonction de tri tu utilises "AnsiCompareStr" à la place de CompareText, cela correspond à ce que tu cherches ?

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 410
    Points : 3 174
    Points
    3 174
    Par défaut
    Ah oui ! merci Blonde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    { ===================================================================== }
    Function FonctionTri(Item1,Item2:Pointer):Integer ;
    // Tri selon la 1ere colonne : Nom
    Var
      s1, s2 : String ;
    Begin
      s1 := PLigne(Item1).Nom ;
      S2 := PLigne(Item2).Nom ;
      Result := AnsiCompareStr(s1, s2) ;
    End;
    { ===================================================================== }
    Fonctionne à merveille !

    Merci
    A+
    Charly

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

Discussions similaires

  1. Requête, tri sur liste de choix
    Par seb.kepka dans le forum Access
    Réponses: 1
    Dernier message: 15/05/2006, 15h47
  2. Algo de tri par liste chainée
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 30/12/2005, 15h05
  3. quel est le meilleur algo de tri de liste ?
    Par sony351 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/07/2005, 03h00
  4. [langage] tri avancé, liste de listes
    Par schnecke dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2004, 15h00
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 21h25

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