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 :

trier une objectlist


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut trier une objectlist
    Bonjour,

    J'ai delphi 2010.
    Je sais que beaucoup ont montré comment effectuer un sort sur une list ou objectlist mais en appliquant ces solutions j'ai toujours des erreurs.
    J'ai une class avec pour un des champs un énuméré et je voudrais trier en fonction de ce champ.
    Une petite difficulté (si vous ne savez pas la résoudre pas de problème).
    Si 2 éléments de la liste ont la même valeur énumérée on continue la comparaison sur un autre champ (string ou integer). J'ai une petite idée sur cette 2eme partie mais enfin...

    Pourriez-vous me donner la solution (définition du Tcomparer et touti quanti...)

    Merci beaucoup et merci d'avance

    Fred

  2. #2
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    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
    TItem = class
      enum: TMyEnum;
      Champ2: string;
    end;
     
     
    function compareTItem(i1, i2: Pointer): integer;
    var
      it1, it2: TItem;
    begin
      it1 := TItem(i1);  
      it2 := TItem(i2);
     
      Result := CompareValue(Ord(it1.enum), Ord(it2.enum)); //si tu veux trier dans le meme ordre qu'est l'enum
      if Result = 0 then
        Result := CompareText(it1.Champ2, it2.Champ2);
    end;
     
    MaList.Sort(compareTItem);

  3. #3
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    je ferais un truc comme ça a priori:

    on déclare des trucs utils
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    type
      TEnum = (eUn, eDeux, eTrois, eQuatre);
     
      TTest = class
      strict private
        FEnum: TEnum;
      public
        function ToString: string; override;
        property Enum: TEnum read FEnum write FEnum;
      end;
     
      TTestComparer = class(TComparer<TTest>)
      public
        function Compare(const Left, Right: TTest): Integer; override;
      end;
     
    { TTest }
     
    function TTest.ToString: string;
    begin
      case FEnum of
        eUn: Result := 'Un';
        eDeux: Result := 'Deux';
        eTrois: Result := 'Trois';
        eQuatre: Result := 'Quatre';
      end;
    end;
     
    { TTestComparer }
     
    function TTestComparer.Compare(const Left, Right: TTest): Integer;
    var
      e1, e2: Integer;
    begin
      e1 := Ord(Left.Enum);
      e2 := Ord(Right.Enum);
      if e1 = e2 then
        Result := 0
      else if e1 < e2 then
        Result := -1
      else
        Result := 1;
    end;
    on declare une liste de TTest en attribut de la form et biensur on la cree dans formcreate et detruit dans destroy...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FList: TObjectList<TTest>;
    on rempli la liste avec un jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      I: Integer;
      T: TTest;
    begin
      for I := 0 to 20 do
      begin
        T := TTest.Create;
        T.Enum := TEnum(Random(3));
        FList.Add(T);
      end;
    end;

    on la trie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      C: IComparer<TTest>;
    begin
      C := TTestComparer.Create;
      FList.Sort(C);
    end;
    on enumere dans un memo pour voir le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     var
      T: TTest;
    begin
      for T in FList do
        Memo1.Lines.Add(T.ToString);
    end;

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 298
    Points : 117
    Points
    117
    Par défaut trier un objectlist
    Merci beaucoup Akim (Kaféine)
    J'ai testé et ça marche à merveille...

    Encore merci.

    Fred

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

Discussions similaires

  1. [VB.NET] Trier une table de mon DataSet
    Par San Soussy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/03/2005, 18h30
  2. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 17h18
  3. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 13h44
  4. [langage] Trier une hastable
    Par Gogoye dans le forum Langage
    Réponses: 11
    Dernier message: 03/08/2004, 17h43
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 21h22

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