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

Langage Delphi Discussion :

Supprimer un élément d'une TObjectList


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut Supprimer un élément d'une TObjectList
    Dans une TObjectList, je stocke une liste de fenêtres.
    Pas de problème dans la manipulation.

    Par contre, si je supprime un élément de ma liste avec MaListe.Remove(), j'ai une violation d'accès, après coup. En pas à pas, le remove fonctionne bien, la fenêtre correspondante est bien détruite, mais plus tard, une violation d'accès survient.
    Si je ne supprime pas d'élément, je n'ai pas de violation d'accès.

    Sachant que je ne passe que par ma liste pour accéder à mes fenêtres, je ne risque pas d'essayer de manipuler une fenêtre détruite auparavant.
    Donc, je ne comprend pas cette violation d'accès.
    Quelqu'un aurrait-il une explication, une piste ... ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    l'une des fenêtres qui reste dans ta liste n'a-t'elle pas pour parent une de celles supprimées ???
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Tu devrais mettre la valeur de la propriétés OwnsObjects de la liste à False. A priori, tes fenêtres sont certainement libérées par leur owner (application).

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Vi .... le Owner peut regler le probleme.
    Sinon verifie si tu utilise pas ta liste par index ... cad que tu recupere pas l'index de position dans la liste pour un acces rapide. sinon ca rique de planter quand l'index n'est pas mis a jour en meme temps que le remove.

    Solution bete .. mais parfois les erreur faut pas chercher plus loin que ca ^^
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par tourlourou
    l'une des fenêtres qui reste dans ta liste n'a-t'elle pas pour parent une de celles supprimées ???
    Non. Elles ont toutes le même rôle et ne s'utilise pas mutuellement.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par Pierre Castelain
    Tu devrais mettre la valeur de la propriétés OwnsObjects de la liste à False. A priori, tes fenêtres sont certainement libérées par leur owner (application).
    Mais, si je fais un Remove de mon élément, il faut que je détruise la fenêtre manuellement avec un Free, non ?

    Par contre, je n'ai pas précisé que quand je fais un Clear de ma liste, je n'ai pas d'erreurs.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par Clorish
    Sinon verifie si tu utilise pas ta liste par index ... cad que tu recupere pas l'index de position dans la liste pour un acces rapide.
    Comment faire autrement qu'utiliser un index pour naviguer dans ma liste ?


    Citation Envoyé par Clorish
    sinon ca rique de planter quand l'index n'est pas mis a jour en meme temps que le remove.
    Comment faire pour qu'il soit à jour ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Ben quand je parle d'index c'ets du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Index := List.add(Obj);
    List[Index].Top := ...;
    Suffit de mettre Index a -1 pour dire que ca ne sert plus

    MAintenant si tu parcours la liste de tes objets pour retrouver celui que tu souhaite modifier c autre chose .. .car tu tombera toujours dessus.

    Pour l'histoire du owner en fait 2 Solution. Soit il est a false et l'objet n'est pas libéré (la case du tableau n'est qu'une copie du pointeur de base)

    Si le owner est a true, il change le owner des objets en se les appropriant, donc il libere les objets lorsqu'ils sont detruits. LE free deviens inutil.

    Fait attention aussi a ne pas faire reference a la fariable Form2 : TForm2 par exemple car si elle est detruie ca pointera dans le vide ...
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    est-ce que tu testes la valeur de retour (-1 => pas trouvé) ?

    si ton objet est plusieurs fois dans la liste, seule la première occurrence est ôtée de la liste => l'objet pas libéré
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par Clorish
    MAintenant si tu parcours la liste de tes objets pour retrouver celui que tu souhaite modifier c autre chose .. .car tu tombera toujours dessus.
    Oui, c'est ce que je fais à chaque fois. Je parcours ma liste, pour rechercher la fenêtre qui m'intéresse.

    Citation Envoyé par Clorish
    Si le owner est a true, il change le owner des objets en se les appropriant, donc il libere les objets lorsqu'ils sont detruits. LE free deviens inutil.
    Donc, la situation en mémoire est propre, et la liste à jour, non ?
    C'est pour ca que je ne comprend pas d'où vient cette erreur ...


    Citation Envoyé par Clorish
    Fait attention aussi a ne pas faire reference a la fariable Form2 : TForm2 par exemple car si elle est detruie ca pointera dans le vide ...
    Tu parles de la variable qui m'a servie à créer l'objet avant de le stocker dans ma liste ?
    Non, je ne m'en sert plus après.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  11. #11
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par tourlourou
    si ton objet est plusieurs fois dans la liste, seule la première occurrence est ôtée de la liste => l'objet pas libéré
    C'est le même type de fenêtre, mais des objets différents :
    Si j'ai besoin de 10 fenêtres, je vais bien créer 10 objets, et stocker ces 10 objets dans ma liste.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  12. #12
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Donc, la situation en mémoire est propre, et la liste à jour, non ?
    C'est pour ca que je ne comprend pas d'où vient cette erreur ...
    Effectivement .. si tu cherche a liberer un objet apres un remove :p

    Pense a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Assigned(Object) Then FreeAndNil(Object);
    Et un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not Assigned(Object) Then Object := TObject.Create;
    Pour eviter tout problemes lors de la destruction/creation d'objet.
    Moi perso si l'objet est assigne lors de la construction par defaut, je le leibere ... et ensuite je tappe mon code de creation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If Assigned(Object) Then FreeAndNil(Object);
    Object := TObject.Create;
    Puisque de toute facon il a aucune raison d'exister avant ^^
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  13. #13
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    Citation Envoyé par Clorish
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If Assigned(Object) Then FreeAndNil(Object);
    Object := TObject.Create;
    On ne peut pas réutiliser une variable pour créer un nouvel objet ?
    Je pensais que c'était comme un pointeur.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    si, je m'en sers pour créer une collection d'objets que je passe un par un au fur et à mesure de leur création à un TObjectList qui les libère.
    donc pas de libération explicite de cette variable puisque sa dernière référence est passée à la liste
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Bien sur qu'on peut reutiliser une variable pour creer un nouvel objet .. mais pas n'importe comment ...

    Si tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    o := TMonObjet.Create;
    o := TMonObjet.Create;
    Ca marche tres bien .. sauf que o ne pointe plus sur mon premier objet mais sur mon 2e .... exactement comme les pointeur.
    D'ailleur exactement on se retrouve avec un objet cree en memoire que l'on ne pourra jamais manipuler ni liberer car on a perdu son adresse.

    Ce qui est juste c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tmp := TMonObjet.Create;
    o := Tmp;
    Tmp := TMonObjet.Create;
    o2 := Tmp;
    Avant d'affecter tmp avec une adresse d'un autre objet, on s'assure de garder une copie de la precedente adresse (comme les pointeurs ;op)

    Cett ecopie peut etre uen variable, ou inseree dans une liste, ou encore retrouvee grace a l'insertion automatique das les listes Controls/Components si le Parent/Owner d'un TControl/TComponent a ete specifié. mais ceci sont des cas particulier.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  16. #16
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 667
    Points : 7 002
    Points
    7 002
    Par défaut
    D'accord.
    C'est bien ce que je pensais (tu me rassures ).
    Donc, en stockant mes objets dans ma TObjectList, si je supprime un élément avec un Remove, l'object correspondant est supprimé.

    C'est la première fois que j'ai des problème avec la TObjectList. Je l'utilise assez souvent.

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  2. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08
  3. Réponses: 7
    Dernier message: 16/05/2006, 15h40
  4. Supprimer un élément d'une chaîne de caractères
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2006, 13h09
  5. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20

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