Trier une liste d'objets en utilisant TObjectList

Trier une liste d'objets en utilisant TObjectList - Delphi/Pascal - Programmation

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.

Reply

Marsh Posté le 01-06-2005 à 08:32:01   

Reply

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;
begin
  Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  List1.Sort(@CompareText);
end;


Edit : et on voit en même temps une erreur dans l'aide : il devrait appeler @CompareNames et non @CompareText pour que ça fonctionne :D


Message édité par antp le 01-06-2005 à 10:36:26

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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;

Reply

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 :D
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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

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.

Reply

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 ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed