Bonjour,
Mon but est de trier une liste d'objets sur plusieurs champs de ces objets.
J'ai créé une liste spécifique heritée de TList qui contient uniquement le même type d'objet.
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 { TListeMaClass } TListeMaClass = class(TList) private FOwnsObjects: Boolean; protected function GetItem(Index: Integer): TMaClass; procedure Notify(Ptr: Pointer; Action: TListNotification); override; public constructor Create(AOwnsObjects: Boolean); overload; function Add(AMaClass: TMaClass): Integer; // Extract supprime un objet de la liste sans le libéré et retourne cet objet function Extract(Item: TMaClass): TMaClass; // Remove supprime un objet de la liste en le libérant et retourne son indice avant destruction function Remove(AMaClass: TMaClass): Integer; function IndexOf(AMaClass: TMaClass): Integer; function First: TMaClass; function Last: TMaClass; procedure Insert(Index: Integer; AMaClass: TMaClass); // Efface la liste et crée une copie de chaque objet de la liste passée en paramètre // et les ajoute à la liste procedure Assign(AListA: TListeMaClass); property Items[Index: Integer]: TMaClass read GetItem; default; property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects; end;
Imaginons ma Classe
Je voudrais pouvoir trier ma liste sur le Champs1 puis Champs2 puis Champs3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 TMaClass = class private FChamps1: String; FChamps2: Integer; FChamps3: Real; public property Champs1: String read FChamps1 write FChamps1; property Champs2: String read FChamps2 write FChamps2; property Champs3: String read FChamps3 write FChamps3; end;
Exemple
Après le tri des champs(1, 2, 3) mes objets MaClass devront être dans l'ordre MaClass4, MaClass3, MaClass2, MaClass1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 MaClass1.Champs1 := 'BB'; MaClass2.Champs1 := 'AA'; MaClass3.Champs1 := 'AA'; MaClass4.Champs1 := 'AA'; MaClass1.Champs2 := 2; MaClass2.Champs2 := 4; MaClass3.Champs2 := 4; MaClass4.Champs2 := 2; MaClass1.Champs3 := 2.5; MaClass2.Champs3 := 2.2; MaClass3.Champs3 := 2.1; MaClass4.Champs3 := 2.1;
J'ai essayé avec des Sort genre
mais les sorts qui suivent ne gardent pas celui des précédents.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function CompareChamps1(Item1, Item2: Pointer): Integer; begin Result := CompareStr(TMaClass(Item1).Champs1, TMaClass(Item2).Champs1); end; ... procedure TListeMaClass.Tri123; begin Sort(@CompareChamps3); Sort(@CompareChamps2); Sort(@CompareChamps1); end;
Quelqu'un aurait déjà fait des tris sur plusieurs champs ?
Partager