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 :

Dupliquer un TList avec les objets associés


Sujet :

Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Dupliquer un TList avec les objets associés
    Bonjour,

    Je travaille actuellement avec un TList. Mon problème c'est que je veux dupliquer ce TList pour en créer un deuxième. J'ai tenté la méthode Assign qui permet de notamment de dupliquer des TList, mais les deux TList pointent sur les mêmes objets. Donc si je modifie un objet via une liste, il est également modifié quand je l'utilise avec la deuxème liste.

    Auriez vous une idée pour faire ça ?

    Merci.

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    J'ai appliqué une solution brutale consistant à faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure DupliquerTList(Source, Cible : TList);
    var
      i : integer;
      MonPointeur : PMaClasse;
    begin
      Cible.Clear;
      for i:=0 to Source.Count-1 do
      begin
        New(MonPointeur);
        MonPointeur^ := PMaClasse(Source.Items[i])^;
        Cible.Add(MonPointeur);
      end;
    end;
    Si vous avez mieux je suis preneur, merci

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par declencher
    Bonjour,

    J'ai appliqué une solution brutale consistant à faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure DupliquerTList(Source, Cible : TList);
    var
      i : integer;
      MonPointeur : PMaClasse;
    begin
      Cible.Clear;
      for i:=0 to Source.Count-1 do
      begin
        New(MonPointeur);
        MonPointeur^ := PMaClasse(Source.Items[i])^;
        Cible.Add(MonPointeur);
      end;
    end;
    Si vous avez mieux je suis preneur, merci

    Chapeau !
    Je ne pense pas qu'il y ait d'autres solutions : j'aurais aussi pensé à quelque chose dans ce style là.
    Bidouilleuse Delphi

  4. #4
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Nous allons donc dire que c'est résolu

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Attention, il peut y avoir des pertes de mémoire avec ce code
    il faudrait plutot faire:

    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
    procedure DupliquerTList(Source, Cible : TList);
    var
      i : integer;
      MonPointeur : PMaClasse;
    begin
     
      // désallocation totale ici, au lieu du clear
      for i := 0 to Cible.count - 1 do
        dispose( PMaClasse(Cible.Items[i]) ); 
      Cible.Clear;
     
      for i:=0 to Source.Count-1 do
      begin
        New(MonPointeur);
        MonPointeur^ := PMaClasse(Source.Items[i])^;
        Cible.Add(MonPointeur);
      end;
    end;
    De plus, visiblement il s'agit de classes, si tes classes liées ont la méthode "Assign()" il serait peut être plus judicieux de remplacer l'allocation mémoire par une instanciation, puis une assignation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NouvelObjet := MaClasse.Create()
      NouvelObjet.Assign( MaClass( Source[ i ] ) );
      Cible.Add( NouvelObjet )
    Sans oublier la désallocation de 'Cible' avant ce code, dans le même esprit que la 1ere version. (mais avec un Free)

    bon code !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Tout a fait exacte, il y a un risque de fuite mémoire. Je vais corriger mon code de ce pas. Merci

    (Ma classe n'a pas de méthode Assign.)

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/05/2010, 07h44
  2. Problème avec les objets d'une map
    Par demonia dans le forum C++
    Réponses: 2
    Dernier message: 27/11/2007, 20h37
  3. filtre sur les objets associés
    Par benoit_lamare dans le forum Hibernate
    Réponses: 6
    Dernier message: 20/03/2007, 09h35
  4. Réponses: 1
    Dernier message: 21/10/2005, 13h08
  5. Pb avec les objets???
    Par bliml dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/04/2005, 15h39

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