Trier une liste d'objets en utilisant TObjectList - Delphi/Pascal - Programmation
Marsh Posté le 01-06-2005 à 10:35:19
Tu dois lui fournir l'adresse d'une fonction qui déterminera le classement des éléments. Il ne peut pas deviner dans quel ordre sont placés les éléments
Dans l'aide de Sort, il y a un lien "exemple" en haut qui
donne ça :
function CompareNames(Item1, Item2: Pointer): Integer; |
Edit : et on voit en même temps une erreur dans l'aide : il devrait appeler @CompareNames et non @CompareText pour que ça fonctionne
Marsh Posté le 01-06-2005 à 16:47:31
ça marche mais j'ai encore une question.
Ci dessous le code de test. Je me rend compte que ma liste est bien triée sur le nom.
Par contre, dans la déclaration de l'objet, si j'inverse les lignes NOM et PRENOM alors ma liste est triée sur le prénom.
Pourquoi le tri est-il fait sur la deuxième propriété de l'objet ?
Vous remarquerez aussi que dans la fonction COMPARENAMES, j'ai mis de type TComponent au lieu de Pointer pour que ça fonctionne.
Merci.
Déclaration :
TPersonne = Class(TObject)
Public
prenom : String ;
nom : String ;
Age : Integer ;
end;
function CompareNames(Item1:TComponent ; Item2:TComponent): Integer;
Utilisation :
procedure TFichePrincipale.CollectionClick(Sender: TObject);
var
oPersonne : TPersonne;
ListePersonne : TObjectList; // Penser à ajouter l'unité ContNRS
begin
ListePersonne := TObjectList.Create ;
oPersonne :=TPersonne.Create ;
oPersonne.Prenom:='AA';
oPersonne.Nom :='ZZ' ;
oPersonne.Age:=69;
ListePersonne.Add(oPersonne);
oPersonne :=TPersonne.Create ;
oPersonne.Prenom:='BB';
oPersonne.Nom :='VV' ;
oPersonne.Age:=25;
ListePersonne.Add(oPersonne);
oPersonne :=TPersonne.Create ;
oPersonne.Nom :='CC' ;
oPersonne.Prenom:='TT';
oPersonne.Age:=37;
ListePersonne.Add(oPersonne);
ListePersonne.Sort(@CompareNames);
end;
function CompareNames(Item1: TComponent ; Item2: TComponent): Integer;
begin
Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name) ;
end;
Marsh Posté le 01-06-2005 à 17:08:09
À mon avis c'est justement parce que tu as mis TComponent au lieu de Pointer que ça fait ça
Tu transformes les pointeurs en TComponent alors que ce sont des TPersonne. La propriété Name de TComponent n'est pas au même endroit que celle de TPersonne, d'où l'erreur.
Marsh Posté le 02-06-2005 à 08:49:27
Mais quand je met Pointer, il me dit que j'ai des données incompatibles.
J'ai donc déclaré partout TPersonne au lieu de TComponent et Pointer et dans ce cas, je comprend mieux et ça marche.
Ma fonction devient :
function CompareNames(Item1: TPersonne ; Item2: TPersonne): Integer;
begin
Result := CompareText((Item1 as TPersonne).Nom, (Item2 as TPersonne).Nom) ;
end;
Je peux donc trier sur n'importe quelle propriété de mon objet.
Merci de ton aide.
Marsh Posté le 02-06-2005 à 09:33:25
t'as plus besoin du "as TPersonne" si tu précises déjà le type dans la fonction
Marsh Posté le 01-06-2005 à 08:32:01
Bonjour,
J'ai utilisé TObjectList pour stocker et maintenir une liste d'objets.
J'ai voulu trier ma liste et j'ai mis la ligne suivante :
MALISTE.SORT(............) avec MALISTE de type TObjectList
et la, il me demande un paramètre TLISTSORTCOMPARE de type TCOMPARE.
J'ai beau regarder l'aide en ligne ou le manuel et je ne comprend pas bien le paramètre attendu.
(j'ai un peu de mal avec l'aide en ligne)
C'est vrai que je débute en Delphi.
Pouvez-vous me donner une adresse où trouver ces infos ou si quelqu'un a un petit exemple simple.
Si vous pouvez me conseiller un bon site ou un bon bouquin d'explications, je suis preneur.
Merci.