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

Delphi Discussion :

Utilisation de Sort d'un Objet TObjectList


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut Utilisation de Sort d'un Objet TObjectList
    Bonjour,

    Depuis peu, je me suis mis à la programmation objet !
    Afin de gérer une collection d'objets, j'ai utilisé un TObjectList.

    Dans ce dernier, j'ajoute différents objets qui sont soit de type TEntite ou TRelation... et j'ai besoin de trié cette collection d'objets de façon à avoir, lors de la lecture de la collection, tous les objets de type TEntite puis seulement ceux de TRelation.

    J'ai vu qu'il existait une méthode Sort mais je ne sais pas comment elle fonctionne. J'ai biensur regarder dans l'aide de Delphi et sur ce forum mais je n'avance pas pour autant.

    Donc pour résumer, mon programme créé des objets de type TEntite et TRelation qui sont stockés dans une collection que je dois trié selon la description si dessus.
    Pourriez vous me décrire la démarche à suivre?
    Est-ce cette méthode qu'il faut utiliser?

    J'espère que vous me suivez

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    tu dois implémenter une fonction de type TListSortCompare

    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
    function RelationEntiteListCompareProc (Item1, Item2: Pointer): Integer;
     
      function GetScore(AItem: Pointer): Integer;
      begin
        try
          if TObject(AItem).ClassType = TEntite then
             Result := -1;
          else
            if TObject(AItem).ClassType = TRelation then
               Result := 0;
            else
              Result := 1;
         except
           Result := 1;
         end;
      end;
     
    begin
      Result := GetScore(Item1) - GetScore(Item2);
    end;
    test j'ai pondu ça à l'instant je suis pas sur du calcul ... j'ai plus l'habitude du TStringListSortCompare qui semble être calculé dans l'autre sens ...
    Edit 1 : d'après le code, l'aide est fausse !
    Edit 2 : l'aide de Delphi 6 semble bonne, c'est de D7 non !
    Edit 3 : ces problèmes d'aide, m'ont poussé à testé, donc cela fonctionne ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TheList.sort(RelationEntiteListCompareProc );
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci d'avoir répondu si rapidement

    function RelationEntiteListCompareProc (Item1, Item2: Pointer): Integer;

    function GetScore(AItem: Pointer): Integer;
    La j'avoue ne pas trop comprendre pourquoi utiliser 2 fonctions
    Peux-tu m'en dire plus ?

    Je voyez plus un truc du genre :
    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
    function TCollectionDeTables.TrierTables(Item1, Item2: Pointer): Integer;
    begin
        try
          if TObject(Item1).ClassType > TObject(Item2).ClassType  then
             Result := -1;
          else
          begin
            if TObject(Item1).ClassType < TObject(Item2).ClassType then
               Result := 0;
            else
              Result := 1;
          end;
         except
           Result := 1;
         end;
    end;
    Merci

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Tu voulais utiliser la méthode Sort de la Liste non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TheList.sort(RelationEntiteListCompareProc );
    ton TrierTables c'est pareil que RelationEntiteListCompareProc , à partir que les opérateurs > sur les classtype, je n'en suis pas convaincu ...

    ensuite GetScore est une function interne à RelationEntiteListCompareProc, seule cette dernière peu y accèder

    sinon, c'est des procédures non objet par que Sort veut une function non objet ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ah ok!

    J'ai repris ton code et j'essaie de compiler mais apparemment je m'y prends mal !

    Alors voilà :

    J'ai différente classe :
    TBD
    TRelation
    TEntite
    TCollectionDeTables

    (J'ai simplifié).


    J'ai déclaré et implémenté la fonction TrierTables dans la classe TCollectionDeTables.(j'ai donc repris ton code)

    Ensuite, dans la classe TBD, j'ai une variables lesTables de type CollectionDeTables et c'est de la que je veux appeler la méthode Sort.

    Je fais donc, à partir de la classe TBD ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lesTables.Sort(lesTables.TrierTables);
    Cependant, j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Erreur] Bd.pas(51): Types incompatibles : 'procédure normale et pointeur de méthode'
    On ne peut pas faire de cette façon?

  6. #6
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Voici un exemple d'un TObjectList qui trie ses objets en fonction du nom de la classe :

    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
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, contnrs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
      TObjectListTriable = class(TObjectList)
      public
        procedure trierParClasse;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    function compareClassName(item1, item2 : pointer) : integer;
    begin
      if TObject(item1).className > TObject(item2).className then
        result := 1
      else if TObject(item1).className < TObject(item2).className then
        result := -1
      else
        result := 0;
    end;
     
    {$R *.dfm}
     
    { TObjectListTriable }
     
    procedure TObjectListTriable.trierParClasse;
    begin
      sort(@compareClassName);
    end;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      l : TObjectListTriable;
      i : integer;
    begin
      l := TObjectListTriable.Create(true);
      l.add(TButton.Create(nil));
      l.add(TForm.Create(nil));
      l.add(TEdit.Create(nil));
      l.add(TButton.Create(nil));
      l.add(TEdit.Create(nil));
      memo1.Lines.Add('Avant le tri :');
      for i := 0 to l.count - 1 do
        memo1.Lines.Add(intToStr(i) + ' : ' + l.items[i].className);
      l.trierParClasse;
      memo1.Lines.Add('Après le tri :');
      for i := 0 to l.count - 1 do
        memo1.Lines.Add(intToStr(i) + ' : ' + l.items[i].className);
      l.Free;
    end;
     
    end.
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Citation Envoyé par ero-sennin
    Cependant, j'ai une erreur
    C'est normal : La méthode TList.sort attend comme paramètre un pointeur sur une fonction et tu lui fournis un pointeur de méthode. Dans les exemples qui t'ont été donnés, regarde bien, c'est une simple fonction et non une méthode d'objet qui détermine la façon comparer 2 éléments de la liste.
    De plus, fait attention, ta fonction TrierTables me semble incorrecte : Le resultat doit être égal à 0 si tes deux items sont identiques. Regarde bien les exemples de fonction de ShaiLeTroll et de Bloon.
    Eb.

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Ah ok! Autant pour moi, je n'avais pas vraiment fait attention

    Merci à tous , et merci de m'avoir expliqué mon erreur!

    Sur ce, je tag


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. creer et utiliser une liste d'objets (TObjectList)
    Par Babylonne dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2007, 23h27
  2. [STL] Débutant : problème utilisation fonction Sort
    Par marcootz dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/08/2007, 20h19
  3. Réponses: 2
    Dernier message: 21/05/2007, 20h43
  4. utilisations de pointeurs sur des objets
    Par niarkyzator dans le forum Delphi
    Réponses: 21
    Dernier message: 13/12/2006, 09h42
  5. utilisation de sort()
    Par crischprolch dans le forum C++
    Réponses: 12
    Dernier message: 24/05/2006, 10h29

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