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 :

Tri sur dérivé de TObjectList<T> ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut Tri sur dérivé de TObjectList<T> ?
    Bonjour,

    Je cherche à trier une liste dérivée d'une liste qui dérive de TObjectList<T>.
    Pour que ce soit plus clair, voici mon code :
    Code Delphi : 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Generics.Defaults, Generics.Collections;
     
    type
      TMyComparer = class;
     
      TMyLevel1 = class
      public
        Property1: string;
      end;
     
      TMyLevel1List = class(TObjectList<TMyLevel1>);
     
      TMyLevel2 = class(TMyLevel1)
      public
        Property2: Integer;
      end;
     
      TMyLevel2List = class(TMyLevel1List)
      public
        procedure Sort; reintroduce;
      end;
     
      TMyComparer = class(TComparer<TMyLevel2>)
        function Compare(const ALevelLeft, ALevelRight: TMyLevel2): Integer; override;
      end;
     
      TForm1 = class(TForm)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TMyLevel2List }
     
    procedure TMyLevel2List.Sort;
    var
      Comparer: TMyComparer;
    begin
      Comparer := TMyComparer.Create;
      try
        inherited Sort(Comparer);
      finally
        Comparer.Free;
      end;
    end;
     
    { TMyComparer }
     
    function TMyComparer.Compare(const ALevelLeft, ALevelRight: TMyLevel2): Integer;
    begin
      if ALevelLeft.Property2 < ALevelRight.Property2 then
        Result := -1
      else if ALevelLeft.Property2 > ALevelRight.Property2 then
        Result := 1
      else
        Result := 0;
    end;
     
    end.
    Une idée de comment faire cela ?

    Merci

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    les trie se font toujours au meme niveau
    pour faire ce que tu veut il te faut creer une liste de liste

    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
    TMyEndLevel = Class
    Public  
      Property nom : String ...;
    end;
     
    TMyLstLevel = class(TObjectList<TMyEndLevel>);
     procedure Sort; reintroduce;
    end;
     
    TMyInerLevel = Class(TMyEndLevel)
      Property Lst : TMyLstLevel...
    end;
     
     
    procedure TMyLstLevel.Sort;
    var
      Comparer   : IComparer<TMyEndLevel>;
      Comparison : TComparison<TMyEndLevel>;
    begin
        Comparison := function(const ItemLevel1, ItemLevel2 : TMyEndLevel): Integer
           begin
                        if ItemLevel1 as  TMyInerLevel Then
                        begin
                           ItemLevel1.List.Sort; // on lance le trie sur le 1 item
                           ItemLevel2.List.Sort;  // on lance le trie sur le 2 item   
                        end; 
                        result :=  CompareText(ItemLevel1.Nom, ItemLevel2.Nom);// on Compare au premier niveau
                   end;
     
        Comparer := TComparer<TMyEndLevel>.Construct(Comparison);
        inherited Sort(Comparer);
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Sort personalisé ou sort sur index.
    Par elraton dans le forum C++
    Réponses: 11
    Dernier message: 09/01/2007, 01h09
  2. Problème avec Sort() sur un TList
    Par ViNzZz dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2006, 14h45
  3. [XSLT]Sort sur un attribut dont la valeur est en param
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 07/11/2005, 16h16
  4. Sort sur un élément distinct
    Par Martin lalande dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2005, 19h05
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15

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