Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1702 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Trier une liste d'objets en utilisant TObjectList

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trier une liste d'objets en utilisant TObjectList

n°1103640
rabamar
Posté le 01-06-2005 à 08:32:01  profilanswer
 

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.

mood
Publicité
Posté le 01-06-2005 à 08:32:01  profilanswer
 

n°1103824
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-06-2005 à 10:35:19  profilanswer
 

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
n°1104362
rabamar
Posté le 01-06-2005 à 16:47:31  profilanswer
 

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

n°1104408
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-06-2005 à 17:08:09  profilanswer
 

À 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
n°1104838
rabamar
Posté le 02-06-2005 à 08:49:27  profilanswer
 

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.

n°1104867
antp
Super Administrateur
Champion des excuses bidons
Posté le 02-06-2005 à 09:33:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Trier une liste d'objets en utilisant TObjectList

 

Sujets relatifs
liste deroulanteCreer une liste de controls
trier avec sortcoment faire une liste box en vba sous excel???
Affichage puce dans une listeProbleme liste deroulante
mise en page dans liste déroulante[Access] vider liste deroulante
Liste applications installées sous Windows XPDécoupage de liste intelligent
Plus de sujets relatifs à : Trier une liste d'objets en utilisant TObjectList


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)