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 :

Delete de composant dans un GroupBox [Non suivi]


Sujet :

C++Builder

  1. #1
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut Delete de composant dans un GroupBox
    bonsoir,
    voici mon pb.
    J'insere dynamique des composants dans un group box et je les supprime, pour l'ajout ca va. Pour la suppression j'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TControl *temp;
    int nbControl = gbCat->ControlCount;
     
     for(int i= nbControl ; i>0;i--){
            temp = gbCat->Controls[i-1];
            gbCat->RemoveControl(temp);
     }
    Ca marche mais c lent. Avez vous une autre solution plus simple ou plus rapide. J'ai pas mal cherché mais pas trouvé de fonction qui remove tout les controles d'un coup.
    Merci.

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    T'as essayé le delete ?

  3. #3
    Membre Expert
    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
    Billets dans le blog
    1
    Par défaut
    bonjour,
    dans la construction dynamique des composants contenu dans le groupBox,
    il te suffit d'affecter la property Owner des composants crés avec le groupBox

    lors de la destruction de la GroupBox tous les composants contenu dans ce container seront automatiquement détruit
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     grpBox;    // Pointeur sur ta groupeBox crée statiquement
     TLabel *mlabel= new TLabel(grpBox);  // creation d'un object Label
     TButton* mbuton = new TButton(grpBox);
    




    Cordialement

    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut
    oui mais non car je ne delete pas le groupbox, je delete uniquement les controles que j'ai placé dedans.

  5. #5
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    En principe, on ne supprime pas les composants, sauf nécessité explicable, ce qui est rare, on joue simplement sur leur visiblité. De plus, la documentation déconseille d'utiliser RemoveControl.

    Donc pour rendre invisibles les composants un GroupBox, on peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i ;
    for(i=0;i<GroupBox1->ControlCount;i++) GroupBox1->Controls[i]->Visible=false;
    À bientôt
    Gilles

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Citation Envoyé par Gilles Louïse
    En principe, on ne supprime pas les composants, sauf nécessité explicable, ce qui est rare, on joue simplement sur leur visiblité. De plus, la documentation déconseille d'utiliser RemoveControl.
    La nécessité pourrait être que les contrôles sont totalement dynamiques en ce sens qu'ils sont chargés d'un fichier ou sur des évenements très dépendant du périmètre extérieur à l'application de manière générale.

    Sinon, effectivement, affecter un Owner à NULL à la création, puis supprimer le contrôle avec delete me semble adéquat.

    Au niveau vitesse, il se peut que ce soit le raffraichissement graphique qui ralentisse la chose.

    Tu devrais voir si tu ne pourrais pas locker la mise à jour graphique avec quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LockWindowUpdate(GroupBox1->Handle);
    // actions
    LockWindowUpdate(0);

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    SAlut !

    Dans cet exemple je crée dynamiquement 4 CheckBox pour le GroupBox1 :

    Le composant propriétaire des objets qui vont être détruits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TComponent *Proprietaire;
    Je crée le propriétaire et les CheckBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Proprietaire = new TComponent(Form1); //Form1 ou this selon que...
    TCheckBox *Cb;
    for(int j = 0; j < 4; j++)
        {
        Cb = new TCheckBox(Proprietaire);
        Cb->Parent = GroupBox1;
        Cb->Caption = "Essai " + IntToStr(j + 1);
        Cb->SetBounds(16, 24 + (j* 21), 100, 19);
        }
    Je détruit d'un coup d'un seul les CheckBox en détruisant leur propriétaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(Proprietaire != NULL)
        {
        delete Proprietaire;
        Proprietaire = NULL;
        }
    A plus !

  8. #8
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut
    Merci pour toutes vos réponses. En effet il est nécessaire que je delete les composants car ils sont crée dynamiquement à partir d'une base de donnée qui peut potentiellenement changer. Donc meme si c déconseillé, je le fait quand meme (un peu comme rouler à 150 sur un nationnale .
    Je ne pense pas que ce soit le jeu non plus de delete le GroupBox.
    Je pense donc que la bonne solution c'est de liquider tout simplement les controles inserés, dans le but d'un inserer d'autre juste apres.
    C'est pour cela que la rapidité compte, car effacé 15 controles puis en ajouter 15, cela peut poser des problèmes de vitesse, surtout si l'on fait tourner l'appli sur un pc pas vraiment vaillant.
    L'exemple que henderson montre n'est pas mal, je vais essayer et l'optimisation du rafraichissement par Greybird me parrait une bonne id, je teste tout cela et je vous dit.
    Merci les gars

  9. #9
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Il faudrait savoir si ce sont les mêmes composants ou non. Si ce sont les mêmes, il est alors possible de jouer sur leur visibilité seule. On peut même, si par exemple on connaît leur nombre maximum les créer en invisible au départ et ne jouer que sur leur visiblité, rien ne peut être plus rapide que cette technique.

    Si vous ne pouvez pas assigner un maximum possible, la visibilté au fil de l'eau convient aussi. Vous en créez e.g. 5 au départ, ensuite il en faut e.g. 7 donc on en rajoute 2, ensuite e.g. 3 seulement donc on en efface 4 et ainsi de suite.

    Il est très rare d'avoir à détruire des composants par delete, le fait que vos données viennent d'une base ne change pas, selon moi, cette règle. Il est très rare d'avoir à supprimer un composant pour ensuite avoir à le reconstruire.

    Mais je ne connais pas votre projet donc je ne peux pas en dire plus. En tout cas, des séries de delete et de new sont fatalement plus coûteuse en temps que de jouer sur la seule visiblité. Car dans ce cas soit vous faites réapparaître un composant invisible, soit le créez par new, ce qui en rajoute définitivement un.

    À bientôt
    Gilles

  10. #10
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Citation Envoyé par Greybird
    La nécessité pourrait être que les contrôles sont totalement dynamiques en ce sens qu'ils sont chargés d'un fichier ou sur des évenements très dépendant du périmètre extérieur à l'application de manière générale.
    Pour moi, ça ne change rien, on peut toujours créer une algorithmique qui reprenne l'existant et l'adapte en fonction des nouvelles nécessités.

    Dans ma réponse, je demandais s'il s'agissait des mêmes composants parce que dans ce cas, c'est assez facile.

    Mais je crois que dans tous les cas, c'est possible puisque vous passez situation S1 à une situation S2. Il est toujours possible d'utiliser S1 pour aller à S2 en n'utilisant que new et la visibilité. C'est ainsi que j'essaierais de procéder et pour éviter au maximum le delete. Il n'y a guère que le cas où le nombre d'éléments serait très grand qui poserait problème.

    Chacun fait comme il veut mais il existe obligatoirement un algorithme passant de S1 à S2 n'utilisant que new et la visibilté.

    À bientôt
    Gilles

  11. #11
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Il y a une solution simple :

    Mettre la GroupBox propriétaire (Owner) des CheckBox.
    Un propiétaire peut détruire tous ses composants avec la fonction DestroyComponents.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TCheckBox *Cb;
    for(int j = 0; j < 10; j++)
        {
        Cb = new TCheckBox(GroupBox1);
        Cb->Parent = GroupBox1;
        Cb->Caption = "Essai " + IntToStr(j + 1);
        Cb->SetBounds(16, 24 + (j* 21), 100, 19);
        }
    }
    Destruction de tous les composants dont la GroupBox est propriétaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        GroupBox1->DestroyComponents();
    }
    Ne pas confondre parent et owner (propriétaire)
    RemoveControl n'affecte que la propriété Parent elle ne détruit pas le composant.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  12. #12
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut
    alors CGi ta solution marche sauf que j'ai un pb, car en fait, je déclenche le DetroyComponents() sur un evenement OnClick() d'un bouton que je supprime, du coup il aime pas et il me plante une erreur ( exeption class EPrivilege with message 'Privilege Instruction' ) ce qui est plus ou moins normal car je suis dans l'evenement onclick. Donc je me demande comment faire ?

  13. #13
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut, pour résoudre ce probleme, tu peut faire un truc tout simple, c'est peut etre un peu bidouillage mais ca marche,
    tu met le code de l'evenement OnClick dans l'evenement OnTimer d'un composant Timer, ce Timer sera toujours inactif, et tu l'activera dans l'evenement OnClick du bouton, avec un temps très court du timer, ca passera comme si cété le click sauf que ca viendra juste apres le click, et donc plus dans l'événement OnClick. J'espere que tu as tout compris, sinon demande moi.
    PS : a la fin de la destruction, ne pas oublié de re désactiver le timer, sinon il va rééssayé de détruir ce qui est déja detruit.
    A plus

  14. #14
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut
    Ok, c'est bien car c'est exatement ce que j'ai et cela me parraissais vraiement bidouille, comme koi, il n'y a pas que moi qui bidouille . Merci.

  15. #15
    maw
    maw est déconnecté
    Membre averti
    Inscrit en
    Août 2003
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 19
    Par défaut
    sauf que cela ne marche toujours pas. Encore cette satané erreur de privilege

  16. #16
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans ce cas, utilise le TComponent Proprietaire pour les objets qui doivent disparaître.

    Le TSpeedButton pourra être détenu par le GroupBox.

    Dans la OnClick du SpeedButton il suffira d'appliquer la solution apportée par CGi :

    ...->DestroyComponents();
    Ce propriétaire ni le SpeedButton n'étant jamais détruit par cette manip pour reconstruire éventuellement le contenu du GroupBox !

    Pour info j'ai testé ainsi :

    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
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Prop = new TComponent(this);
    int j;
    TRadioButton *R;
    for(j = 0; j < 8; j++)
        {
        R = new TRadioButton(Prop);
        R->Parent = GroupBox1;
        R->SetBounds(16,20 + (j * 20),50,19);
        }
    TSpeedButton *S = new TSpeedButton(GroupBox1);
    S->Tag = 0; //pour le test
    S->Parent = GroupBox1;
    S->SetBounds(80,20,50,19);
    S->OnClick = SupprimerClick;
    }
    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
    void __fastcall TForm1::SupprimerClick(TObject *Sender)
    {
    TSpeedButton *Spd = (TSpeedButton*)Sender;
    //Destruction des objets
    Prop->DestroyComponents();
    int j;
    //Reconstruction d'objets selon le Tag
    if(Spd->Tag == 1)
        {
        TRadioButton *R;
        for(j = 0; j < 8; j++)
            {
            R = new TRadioButton(Prop);
            R->Parent = GroupBox1;
            R->SetBounds(16,20 + (j * 20),50,19);
            }
        }
    else
        {
        TCheckBox *Cb;
        for(j = 0; j < 8; j++)
            {
            Cb = new TCheckBox(Prop);
            Cb->Parent = GroupBox1;
            Cb->SetBounds(16,20 + (j * 20),50,19);
            }
        }
    //Prochaine reconstruction :
    Spd->Tag = Spd->Tag ^1;
    }
    A plus !

Discussions similaires

  1. Glisser un composant dans une GroupBox ou Onglet
    Par Maxime-B dans le forum Composants VCL
    Réponses: 3
    Dernier message: 24/08/2011, 10h05
  2. [VB.NET] Controles dans un GroupBox
    Par Poussera dans le forum Windows Forms
    Réponses: 11
    Dernier message: 15/10/2004, 12h54
  3. [C#] Ajouter son propre composant dans Design de VS.Net
    Par yannick_sch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/08/2004, 11h14
  4. [Delphi] Icone des composants dans la palette
    Par jacquesberger dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/04/2004, 15h42
  5. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44

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