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 :

Méthode sort d'un TObjectList


Sujet :

Delphi

  1. #1
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 47
    Par défaut Méthode sort d'un TObjectList
    Bonjour,
    je suis débutant, j'aimerais améliorer ma méthode de trie de mon TObjectList
    en vous remercient d'avance,
    voici mon code:

    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
    function compare(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;
     
    procedure TForm1.Button1Click(Sender: TObject);var
      Liste : TListeDeTrucs;
      i : integer;
    begin
     Liste := TListeDeTrucs.Create(true);
     Liste.Add(TTruc.Create('A'));
    Liste.Add(TTruc.Create('C'));
    Liste.Add(TTruc.Create('D'));
    Liste.Add(TTruc.Create('B'));
    Liste.Sort(@compare);
      for i := 0 to Liste.count - 1 do
       begin 
        showMessage(Liste.items[i].libelle);
       end;
      Liste.Free;
    end;
    le résultat:
    D,B,A,C
    alors, que je voudrais A,B,C,D
    merci d'avance

  2. #2
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Bonjour,

    Effectivement, dans ta fonction Compare tu ne fais pas la comparaison sur la propriété Libelle mais sur la propriété ClassName de l'objet.

    ( ClassName renvoie une chaine de caractère indiquant le type de l'objet )

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function compare(item1, item2 : pointer) : integer;
    var
      truc1: TTruc; absolute item1;
      truc2: TTruc; absolute item2;
    begin
      Result := CompareText(truc1.Libelle, truc2.Libelle);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 47
    Par défaut remerciements
    Bonsoir,
    Un grand merci pour vos réponses,
    merci Paul THOTH, pour votre exemple, je vais le mettre en place.
    Je m'y étais très mal pris , car, j'avais essayé une fonction de ce même genre.
    Un grand merci
    Cordialement

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    On peut directement typer les arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Compare(Truc1, Truc2 : TTruc) : integer;
    begin
      Result := CompareText(Truc1.Libelle, Truc2.Libelle);
    end;

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    On peut directement typer les arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Compare(Truc1, Truc2 : TTruc) : integer;
    begin
      Result := CompareText(Truc1.Libelle, Truc2.Libelle);
    end;
    tu n'as pas l'erreur E2010 Types incompatibles : 'Pointer' et 'TTruc' ? lors de l'appel à TList.Sort(Compare) ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Non, pas d'erreur.

    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
    type
      TProc = procedure(p :pointer);
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        procedure CallProc(aProc :TProc);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure Proc(aForm: TCustomForm);
    begin
      aForm.Caption := 'Andnotor';
    end;
     
    procedure TForm1.CallProc(aProc: TProc);
    begin
      aProc(Self);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CallProc(@Proc);
    end;

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ok, en ajoutant @ devant le nom de la fonction tu peux passer ce que tu veux (avec $T- ce qui est par défaut) mais du coup tu peux utiliser effectivement n'importe quoi, même une variable si tu veux...je ne recommande pas cette approche
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Je te rejoins, c'est sûr que se passer du contrôle de type doit être fait avec une grande prudence.

    Cela dit, le fait que TObjectList.Sort n'ait pas été surchargé est surprenant du fait justement de l'incohérence des arguments. Déclarer des pointeurs sur TList.Sort est logique mais pas sur TObjectList.Sort qui sont effectivement des TObject.
    A la première lecture, je me suis d'ailleurs dis que tu t'étais trompé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function compare(item1, item2 : pointer) : integer;
    var
      truc1: PTruc; absolute item1;
      truc2: PTruc; absolute item2;
    J'ai pris un raccourci mais il y en a aussi dans le code original

  10. #10
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il y a des choses plus évoluées maintenant comme IComparer ou une fonction anonyme.

    ceci dit je suppose que TTruc est une classe, donc c'est bien des TTruc et non des PTruc qu'il faut utiliser
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ceci dit je suppose que TTruc est une classe, donc c'est bien des TTruc et non des PTruc qu'il faut utiliser
    C'est ça, une supposition, logique sur TObjectList mais toujours qu'une supposition. Il n'y aurait aucune ambiguïté si TObject était utilisé.

  12. #12
    Inactif  
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 47
    Par défaut Remerciements
    Bonjour,
    Merci à tous pour votre aide,
    J'ai résolu mon problème,
    Discussion résolue
    cordialement à tous et bon codding

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

Discussions similaires

  1. Pb méthode sort sur une feuille protégée
    Par skan_one dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/04/2009, 11h48
  2. Erreur avec la méthode Sort
    Par phal2ip dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 20/10/2008, 09h21
  3. Réponses: 4
    Dernier message: 13/08/2008, 22h16
  4. [Lazarus] Méthode sort dans une TList
    Par pduceux dans le forum Lazarus
    Réponses: 1
    Dernier message: 21/06/2007, 17h43
  5. Runtime.getRuntime().exec(String) méthode sort
    Par devAd dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2006, 13h53

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