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 :

Duplication de record contenant des objets


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 310
    Points : 184
    Points
    184
    Par défaut Duplication de record contenant des objets
    Bonjour, j'ai un ojet qui contient une liste de record , qui elle même contiens des ojets.
    Lorsque je veux la dupliquez tout semble bien se passer, hors j'ai rapidement des EAccesViolation, je pense que cela vien de mon clonage qui duplique bien les champs normaux mais ne duplique mais pas les bjets qu'il réasigne dans l'objet cloné dsans le dupliquer.

    Quelqu'un pourrait il m'aider
    merci d'avance

    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
     
     TConfigRegistre = Record
     
     
        oid : String;                  
        nom_mib : String;              
        designation_registre : String; 
        valeur_reference : Variant;    
        valeurs_actives : String;      
        valeurs_inactives : String;    
        comportement : TComportement;  
        comportements : TListeComportementRegistre; // Mon objet dérivé de TLIST
        valeur_type : TASN1Type;       
     
        valeur : Variant;             
        valeur_type_retour: TASN1Type; // Type énuméré
        deja_alerte : Boolean;         
     
      end;
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    function TConfigListeRegistre.Clone: TConfigListeRegistre;
    const
      STR_PROC = 'TConfigListeRegistre.Clone';
    var
      ConfigListeRegistre : TConfigListeRegistre;
      ConfigRegistre : pConfigRegistre;
      i : integer;
      ListeComportement : TListeComportementRegistre;
    begin
     
      Result := nil;
     
      try
     
          ConfigListeRegistre := TConfigListeRegistre.Create;
     
          for I := 0 to Count - 1 do
          begin
     
            ConfigRegistre := Self[i];
     
            if assigned(TConfigRegistre(Self[i]^).comportements) then
            begin
     
              ListeComportement := ConfigRegistre.comportements.Clone;
              TConfigRegistre(Self[i]^).comportements := ListeComportement;
     
              ListeComportement.onError := ConfigListeRegistre.doError;
              ListeComportement.OnTrace := ConfigListeRegistre.doTrace;
     
            end;
     
            ConfigListeRegistre.Ajouter(ConfigRegistre^);
     
          end;
     
          Result := ConfigListeRegistre;
     
      except on E: Exception do
     
        DoError (STR_UNITE,STR_PROC,E.Message);
     
      end;
     
    end;

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Ah ben oui, ça m'étonne pas que ça plante. Ton code c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            ConfigRegistre := Self[i];
     
            if assigned(TConfigRegistre(Self[i]^).comportements) then
            begin
     
              ListeComportement := ConfigRegistre.comportements.Clone;
              TConfigRegistre(Self[i]^).comportements := ListeComportement;
     
              ListeComportement.onError := ConfigListeRegistre.doError;
              ListeComportement.OnTrace := ConfigListeRegistre.doTrace;
     
            end;
     
            ConfigListeRegistre.Ajouter(ConfigRegistre^);
    Ce qu'il fait, c'est que s'il faut dupliquer les comportements de l'élément, tu dupliques correctement ces comportements, mais tu assignes la nouvelle liste à l'élément original. Et à la fin, tu ajoute ConfigRegistre^, qui pointe toujours sur ce même élément.

    Donc en fait ta version clônée contient bien ce que tu veux, mais tu as modifier ta liste de base

    Il te faut copier l'élément avant de faire tes traitements dessus, comme ceci :
    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
    var
      ConfigListeRegistre: TConfigListeRegistre;
    begin
      ...
      for ... do
      begin
        ConfigRegistre := PConfigRegistre(Self[i])^;
     
        if assigned(ConfigRegistre.comportements) then
        begin
          ListeComportement := ConfigRegistre.comportements.Clone;
          ConfigRegistre.comportements := ListeComportement;
     
          ListeComportement.onError := ConfigListeRegistre.doError;
          ListeComportement.OnTrace := ConfigListeRegistre.doTrace;
        end;
     
        ConfigListeRegistre.Ajouter(ConfigRegistre);
      end;
      ...
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Problème sur Array list contenant des objets
    Par patrice cognet dans le forum C#
    Réponses: 3
    Dernier message: 09/11/2008, 18h13
  2. [Tableaux] Tri de tableau contenant des objets
    Par erehcab dans le forum Langage
    Réponses: 10
    Dernier message: 07/10/2008, 19h22
  3. set contenant des objets non constants
    Par 5kippy dans le forum SL & STL
    Réponses: 6
    Dernier message: 10/11/2007, 13h01
  4. Réponses: 2
    Dernier message: 04/07/2007, 10h17
  5. Réponses: 1
    Dernier message: 23/06/2006, 10h10

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