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

C++Builder Discussion :

problème de destruction de composants dynamique


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut problème de destruction de composants dynamique
    Bonjour,

    Je fabrique des composants suivant le principe suivant :
    J'ai un TList qui stocke d'autre Tlist qui eux pointent vers les composants que je crée (un TList contient tous les composants d'un nouvel onglet d'un pagecontrol).

    Voici un bout du code :
    Dans le .h :
    Dans le cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TList *ListeComp = new TList();
    TTabSheet *pTabSheet = new TTabSheet(PageControl1);
    pTabSheet->PageControl = PageControl1; //je ne sais pas si cette ligne est utile
    ListeComp->Add(pTabSheet);
    TScrollBox *TempScrollBox3 = new TScrollBox(pTabSheet);
    ListeComp->Add(TempScrollBox3);
     
    PageList->Add(ListeComp);
    PageControl1->ActivePage = pTabSheet;
    Jusque la pas de problème mais pour supprimer les composants dans le FormClose :
    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
    TList *TempList;
    for (int A = 0; A < PageList->Count; A++)
        {
        TempList = (TList *)PageList->Items[A];
        for (int I = 0; I < TempList->Count; I++)
            {
            delete TempList->Items[I];
            }
        }
    TempList = NULL;
    for (int I = 0; I < PageList->Count; I++)
        {
        delete (TList *)PageList->Items[I];
        }
    delete PageList;
    Toutes ces lignes passent correctement mais le programme plante jusqte après. J'ai essayé de mettre un bouton qui supprime mes composants avec ce bout de code, mais les composants ne disparaissent pas et le programme plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TList *TempList;
    for (int A = 0; A < PageList->Count; A++)
        {
        TempList = (TList *)PageList->Items[A];
        for (int I = 0; I < TempList->Count; I++)
            {
            delete TempList->Items[I];
            }
        }
    TempList = NULL;
    Je ne comprend plus. Comment faire pour garder les pointeur et détruire les composants pointé par ceux-ci sachant que je ne connait pas par avance le nombre de composants ni leur type, ni leur nom?

    Merci

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour, dans ta TList tu essaye de stocker des objects de types différents
    ce n'est pas posssible
    par ailleur ton code de destruction n'est pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ListeComp->Add(pTabSheet); 
    ListeComp->Add(TempScrollBox3);
    utilise plutôt la classe TObjectList,
    elle est précue pour stocker des objects de la VCL de types différents
    pour la libération de la liste il suffit simplement de détruire la liste ce qui va automatiquement libérer tous les ptr stockés ainsi que la mémoire associée

    cordialement

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    J'ai trouvé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TComponentList *ListeComp = new TComponentList();
    TTabSheet *pTabSheet = new TTabSheet(PageControl1);
    pTabSheet->PageControl = PageControl1;
    ListeComp->Add(pTabSheet);
    TScrollBox *TempScrollBox3 = new TScrollBox(pTabSheet);
    ListeComp->Add(TempScrollBox3);
    PageList->Add(ListeComp);
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (0 < PageList->Count)
          {
          delete (TComponentList *)PageList->Items[0];
          PageList->Delete(0);
          PageList->Capacity = PageList->Count;
          }
    delete PageList;
    J'utilise un TComponentList qui détruit les composants vers lesquel il pointe lors de sa destruction. Par compte, si l'on fait pareil avec le TList, il détruit le pointeur (on a plus de trace pour retrouver le pointeur) mais il ne détruit pas les composants. Le TComponentList correspond parfaitement à ce qu'il me faut à savoir une liste servant à gérer des composants.

    Merci pour ton coup de main Si tu ne m'avait pas parlé de TObjectList, je n'aurait jamais trouvé ce TComponentList.

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par DjmSoftware
    bonjour, dans ta TList tu essaye de stocker des objects de types différents
    ce n'est pas posssible
    C'est tout à fait possible, et n'entrave en rien le fonctionnement du programme. Bien entendu, si on a besoin de connaïtre le type de l'objet après coup, et qu'ils ne sont pas stockés dans la TList d'une manière qui permette de le faire, cela n'est vraiment pas conseillé. Dans les autres cas, il n'y a aucun problème.

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,

    Greybird a écrit:
    C'est tout à fait possible, et n'entrave en rien le fonctionnement du programme. Bien entendu, si on a besoin de connaïtre le type de l'objet après coup, et qu'ils ne sont pas stockés dans la TList d'une manière qui permette de le faire, cela n'est vraiment pas conseillé. Dans les autres cas, il n'y a aucun problème.
    La classe TList a été concue pour stocker des pointeurs de type <void>
    il est naturellement possible de stocker d'autre types de ptr en les <castant>


    le problème se situe lors de la destruction de la liste car il n'est plus possible de connaitre le type de ptr stockés raison pour laquelle j'ai posté que ce n'était pas possible

    le résultat sera la création de memory leak

    la VCL possède d'autre types de classes de List par exemple TComponentList,TObjectList permettant de stocker des ptr de types différents mais ayant comme classe de base respectivement TComponent et TObject

    cordialement

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

Discussions similaires

  1. Problème de destruction dynamique d'Applet
    Par EvAyla dans le forum Applets
    Réponses: 1
    Dernier message: 13/06/2007, 21h48
  2. Probléme de gestion de composant dynamique
    Par 6BORG dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/08/2006, 17h40
  3. [FLASH MX] Nom de composant dynamique
    Par bobgeldof7 dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2004, 23h07
  4. [THandle][DLL] Composant dynamique et THandle
    Par el_diablos dans le forum Langage
    Réponses: 10
    Dernier message: 01/07/2004, 15h01
  5. [JTabbedPane] Accès à des composants dynamiques
    Par SamRay1024 dans le forum Composants
    Réponses: 8
    Dernier message: 26/05/2004, 13h04

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