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 :

Creation dynamique d'un Item dans ComboBox dynamique dans TTabSheet dynamique


Sujet :

C++Builder

  1. #1
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut Creation dynamique d'un Item dans ComboBox dynamique dans TTabSheet dynamique
    Bonjour, j'ai un petit problème :

    Sur ma fiche il y a un TPageControl dans lequel j'ajoute dynamiquement des TTabSheet (j'en ajoute à la volée, le nombre n'est pas déterminé).
    Dans ce TTabSheet, je veux insérer un ComboBox dynamiquement, et dans ce ComboBox je veux ajouter des items ... dynamiquement encore.
    Le TPageControl n'est pas dynamique, il est posé sur la fiche.

    Voilà ce à quoi ça ressemble pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPageControl * PageControlY; // Composant géré par l'EDI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TTabSheet *New_Tab = new TTabSheet(PageControlY); // Nouvel onglet
    TComboBox *Combo_Valeurs = new TComboBox(new_tab); // Nouvelle ComboBox
    Combo_Valeurs->Parent = new_tab;
     
    // Ensuite, ajout d'un item dans la ComboBox
    Combo_Valeurs->AddItem("Axe 1", NULL /* Je sais pas ce qu'il veut en second paramètre ! */);
    La compilation se fait sans problème.
    A l'execution, (admettons que c'est un bouton qui execute l'ajout du tabshett et du combox), ça plante dès que ça arrive sur le AddItem.
    Le message d'erreur est le suivant :

    Le projet "MonProjet.exe" a provoqué une classe d'exception EInvalidOperation avec le message 'Le contrôle " n'a pas de fenêtre parente'. Processus Stoppé. Utilisez Pas à pas ou exécuter pour continuer.
    L'aide de borland sur le AddItem indique :
    Appelez AddItem pour ajouter une chaîne et son objet associé à la liste déroulante.

    Item représente la chaîne à ajouter à la liste déroulante.

    AObject est un objet associé à cette chaîne. Pour y accéder, utilisez la propriété Objects de l'objet TStrings qui implémente la propriété Items.
    Voilà, que dois-je faire ? Je ne sais pas quel TObject il veut. J'ai essayé 'this (soit le TPageControl) mais il n'en veut pas...
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Si tu veux ajouter uniquement des chaines dans tes Combobox, tu devrais essayer uniquement par qqchose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Combo_Valeurs->Items->Add(//string);
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il faudrait faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TTabSheet *Tab = new TTabSheet(this);
    Tab->PageControl = PageControl1;
    TComboBox *ComboBox = new TComboBox(this);
    ComboBox->Parent = Tab;
    //ComboBox->SetBounds(..., ..., ..., ...);
    ComboBox->Items->Add("Bla bla bla");
    //...
    ComboBox->ItemIndex = 0;
    A plus !

  4. #4
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Bonjour,

    Si tu veux ajouter uniquement des chaines dans tes Combobox, tu devrais essayer uniquement par qqchose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Combo_Valeurs->Items->Add(//string);
    @+
    J'avais oublié de dire que j'avais essayé cette solution et que ça ne marchait pas.
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  5. #5
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par henderson Voir le message
    Salut !

    Il faudrait faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TTabSheet *Tab = new TTabSheet(this);
    Tab->PageControl = PageControl1;
    TComboBox *ComboBox = new TComboBox(this);
    ComboBox->Parent = Tab;
    //ComboBox->SetBounds(..., ..., ..., ...);
    ComboBox->Items->Add("Bla bla bla");
    //...
    ComboBox->ItemIndex = 0;
    A plus !
    PARFAIT ! J'adore ce forum, il suffit de bien écrire lisiblement son problème et hop, tout est nickel.

    J'ai fait comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            TTabSheet * New_Tab = new TTabSheet(this);
            New_Tab->PageControl = PageControl1;
     
            TComboBox * New_ComboBox = new TComboBox(this);
            New_ComboBox->Parent = New_Tab;
            New_ComboBox->Align = alBottom; // Pour remplacer le SetBounds(..., ..., ..., ...) 
            New_ComboBox->Items->Add("Test");
            New_ComboBox->Items->Add("de trois");
            New_ComboBox->Items->Add("items");
            New_ComboBox->ItemIndex = 0;
    }
    Ce que j'aimerais savoir c'est pourquoi le owner est systématiquement le this ? Sachant que this est la fiche, est-ce que c'est pour permettre de publier le composant sur la fiche ?
    Visiblement, d'après le message d'erreur, on dirait que tous les contrôles doivent avoir une fenêtre parente, et c'est seulement par la suite qu'on leur affecte un parent, je me trompe ?
    Je ne comprends pas pourquoi ça ne serait pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTabSheet * New_Tab = new TTabSheet(PageControl1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TComboBox * New_ComboBox = new TComboBox(New_Tab);
    Et enfin, dernière question, pourquoi dans le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    New_Tab->PageControl = PageControl1;
    on n'appelle pas directement le constructeur de la manière suivante ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTabSheet * New_Tab = new TTabSheet(PageControl);
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Tu as raison !
    En fait, l'owner qui est passé dans le constructeur est celui qui est le plus en adéquation avec la destruction des objets.
    Si par exemple on a une destruction du TabSheet dans ce cas on a intérêt aussi à ce que le ComboBox soit détruit avec (on peut étendre à l'ensemble des composants dont le TabSheet est le Parent)!
    Donc tous tes owners tiennent la route.

    L'owner ne fait rien d'autre que d'être propriétaire du composant en l'ajoutant à sa liste Components.

    Pour ce qui est de la propriété TTabSheet::PageControl.
    Lorsque l'on affecte un TPageControl* à cette propriété, c'est un ensemble d'actions qui sont déclenchées :
    - le pointeur est affecté à la propriété
    - le TabSheet est enregistré dans la liste des Pages du PageControl (TPageControl::Pages)
    - le TabSheet se voit affecté le PageControl comme Parent.
    Il y a fort à parier d'ailleurs que la gestion graphique des TabSheet par le PageControl lui soit propre (on s'en doute un peu !!!) !

    En fait, c'était la seule ligne qui manquait dans ton code (je n'avais pas réfléchi au delà de mon propre test).

    A plus !

  7. #7
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Juste pour montrer que le Setter de la propriété PageControl de TTabSheet est encore plus puissant qu'on le pense :

    Sur une form : PageControl1 avec un TabSheet et PageControl2 sans TabSheet et un SpeedButton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    if(PageControl1->ActivePage != NULL)
        {
        TTabSheet *Tab = PageControl1->ActivePage;
        Tab->PageControl = PageControl2;
        }
    else
        {
        TTabSheet *Tab = PageControl2->ActivePage;
        Tab->PageControl = PageControl1;
        }
    }
    Puisqu'à l'évidence, il teste aussi si PageControl pointe sur un objet avant d'assigner le pointeur et si c'est le cas il le fait disparaître du PageControl initial pour le donner au nouveau PageControl !

    A plus !

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

Discussions similaires

  1. Une image dans un Jpanel dans un Jpanel dans un Jframe
    Par ThomasH dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 09/12/2009, 20h23
  2. Réponses: 3
    Dernier message: 04/04/2007, 22h45
  3. Réponses: 16
    Dernier message: 24/05/2006, 21h57
  4. [VBA-E] Sélectionner dynamiquement une ligne d'une ComboBox
    Par skual dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 22/02/2006, 16h02
  5. [VB.NET] Recherche d'item dans ComboBox
    Par arno2000 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/12/2005, 14h07

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