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 :

création d'un composant apres l'execution


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut création d'un composant apres l'execution
    salut
    je veux déclarer un nombre de edit dans une application apres l'execution
    par exemple qand je lance l'plication je trouve un tedit ou j'écrit par exemple 5
    apres que je click sur un bouton je doit créé 5 tedit selon le nombre x que je lence
    et merci

  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,

    Dans un premier temps:

    Il y a des exemples dans la FAQ : ici par exemple.

    Sinon, voir du côté des "astuces" sous C++Builder, et faire une recherche dans ce forum, car le sujet me semble avoir été abordé pas mal de fois.

    Et après, postes le code que tu n'arrives pas a faire tourner ....

    @+
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    non je n'arrive pas a elaborer un code j'ai aucune idée

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    salut,
    comme il t'a dit sunchaser la réponse est le Faq,
    par exemple tu peux faire 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
     
    #define MAX_EDIT 30; // nombre maxi de Edit.
    TEdit *edit[MAX_EDIT];
    int Compteur_Edit=0;//pour compter le nombre de Edit créer et l'incrémenter apres chaque création
    void __fastcall TForm1::Button1Click(Sender: TObject);
    {
       // La fenêtre est propriétaire du nouveau bouton
       edit[Compteur_Edit]= new TButton(this);
    Compteur_Edit++;
    edit[Compteur_Edit]->Parent=Form1;
       //a toi de te débrouiller pour le placer dans la Form1 selon ton Compteur_Edit.
       edit[Compteur_Edit]->Caption = "Edit num"+IntToStr(Compteur_Edit);
     
    }
    a toi de le tester et de voir ce que ça donne
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  5. #5
    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
    Salut,
    Donc rapidement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     TEdit *pEd;
     for (int i = 0; i < Edit1->Text.ToInt() ; i++ )
     {
    	pEd = new TEdit(this);
    	pEd->Parent = this;
    	pEd->Name = "MyNewEdit" + IntToStr(i+1);
    	pEd->Text = "Je suis l'Edit n° " + IntToStr(i+1);
    	pEd->Left = (pEd->Width*i) + 5;
    	pEd->Top = (pEd->Height*i) + 5;
     }
    Par exemple ...

    Bon courage,
    @+
    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

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    merci bouceau mon ami
    je veux une chose
    ajouter un comontaire sur cette ligne
    TEdit *pEd;

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    je modifie sur le ton code il est bien marcher j'ai compri que le parent est celui contien les méthode comme ça
    pEd = new TEdit(Panel1);
    pEd->Parent = Panel1;

    mais que ce que sa veux dir new TEdit(this); quelle son role

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    Edit->Parent=this;
    veut dire que lorsque tu va créer le Edit sachant que le parent de celui la sera l'objet courant (this) ( TEdit(this) est le constructeur de la classe TEdit), pour dire que ton TEdit sera dans la From1 ( si la fiche sur la quelle tu travail est Form1).
    Une chose à faire (à titre de conseil) est de jeter un coup d'oeil sur l'aspect Orienté Objet.

    Bon Courage Abouishaq
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    voire ce lien signification du parent
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    merci pour ton explication et pour ça
    TEdit *pEd

  11. #11
    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 !

    TEdit *pEd;
    C'est une simple déclaration d'un pointeur vers un objet TEdit qui à ce stade ne pointe sur rien.
    En fait on s'en sert dans la méthode comme d'un lien temporaire permettant de fixer les propriétés des objets nouvellement créés et dont on récupère l'adresse en mémoire avec new (c'est un peu plus compliqué mais ... c'est un bon résumé !).
    Si on avait placé cette déclaration dans la boucle for, il y a de grandes chances pour que BCB empile autant de pointeurs que d'objets créés, au fur et à mesure, ce qui ne servirait strictement à rien (en dehors peut-être de mettre la panique au niveau de la pile)!
    Dans la boucle for, à chaque instanciation d'un TEdit l'adresse du TEdit précédent est perdue.

    Par ailleurs pour bien différencier l'Owner (propriétaire) et le Parent, voir l'aide pour :
    TComponent::Owner et TComponent::Components
    TWinControl::Parent et TWinControl::Controls

    En ce qui concerne l'Owner des TEdit (leur propriétaire), dans la boucle on leur donne un "this" comme propriétaire :

    pEd = new TEdit(this);
    Le this est (l'adresse de) l'instance d'une classe dont la méthode est membre.
    Si la méthode est membre de Form1 alors le this correspond à Form1.

    Maintenant, réfléchissons un peu !
    Si chaque TEdit créé devait présenter cette même possibilité de créer, à son tour, N TEdit dont il sera propriétaire, alors on obtiendrait une arborescence de TEdit croissante au fur et à mesure des besoins.
    Le TEdit "feuille" est alors celui dont sa propriété Components est vide (ComponentCount == 0) et le TEdit racine (Edit1) est celui dont le propriétaire n'est pas du type TEdit.

    En voici l'illustration : sur la form (Form1) et un seul TEdit (Edit1)

    Voici la classe de la form extraite de son .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
        TEdit *Edit1;
        void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
        void __fastcall Edit1DblClick(TObject *Sender);
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
        __fastcall TForm1(TComponent* Owner);
     
        // une méthode récursive dont on va faire usage, est déclarée ici
        void __fastcall ResetEdit(TEdit *Edit);
    };
    Voici les méthodes, extraites du .cpp :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    //-- OnKeyPress de Edit1 permet de créer N TEdit sur un RETURN
     
    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
    {
    if(Key == VK_RETURN)
        {
        // Tous nos Edits partagent cette même méthode
        // l'Edit concerné est donnée par Sender
        TEdit *Proprietaire = (TEdit*)Sender;
        // Pour interdire d'en créer d'autres
        // ici, uniquement pour une question graphique
        if(Proprietaire->ComponentCount != 0)
            {
            ShowMessage("On attend que ça sèche pour passer la deuxième couche !");
            return; // pas la peine d'aller plus loin
            }
        int n = Proprietaire->Text.ToIntDef(0); //retourne 0 si "" ou si Text...
        if(n != 0)
            {
            // déclaration d'un pointeur
            TEdit *pEdit; 
            // récupération du rectangle graphique de l'Edit source
            TRect R = Proprietaire->BoundsRect;
            // et c'est parti : 
            for(int j = 0; j < n; j++)
                {
                pEdit = new TEdit(Proprietaire);
                // on traite les propriétés de l'objet nouvellement créé
                pEdit->Parent = Proprietaire->Parent;
                pEdit->SetBounds(R.Right,
                                 R.Bottom,
                                 Proprietaire->Width,
                                 Proprietaire->Height);
                // Chaque Edit est à l'image de son créateur
                pEdit->OnKeyPress = Edit1KeyPress;
                pEdit->OnDblClick = Edit1DblClick;
                // on se prépare pour l'objet suivant...
                R.Bottom = R.Bottom + Proprietaire->Height;
                }
            }
        // pour éviter le bell, qui plus est, on vient d'exploiter RETURN !
        Key=0; 
        }
    else
        {
        // on filtre les infos du clavier
        // on accèpte VK_BACK :
        if(Key == VK_BACK) return; 
        // ensuite, ainsi que des chiffres, et uniquement les chiffres :
        if((Key < '0') || (Key > '9')) Key=0;
        }
    }
     
    //-- Méthode récursive dont on aura déclaré le prototype dans la classe de TForm1
     
    void __fastcall TForm1::ResetEdit(TEdit *Edit)
    {
    Edit->Color = clWhite;
    for(int j = 0; j < Edit->ComponentCount; j++)
        {
        // on est dans un processus récursif
        // la méthode s'appelle elle-même pour traiter chaque Edit
        // ainsi que tous les Edit qu'il détient qui eux-mêmes... ... ...
        ResetEdit( (TEdit*)Edit->Components[j] );
        }
    }
     
    //--OnDblClick de Edit1
     
    void __fastcall TForm1::Edit1DblClick(TObject *Sender)
    {
    // On re-initialise la couleur de chaque Edit
    ResetEdit(Edit1);
     
    // On modifie la couleur en remontant vers la racine
    // REM : Sender est l'objet concerné par l'événement
    // ici, c'est l'Edit sur lequel on vient de double-cliquer
    TComponent *Cible = (TEdit*)Sender;
    //On remonte l'arborescence d'Owner en Owner
    while( Cible->ClassNameIs("TEdit") )
        {
        ((TEdit*)Cible)->Color = clLime;
        Cible = Cible->Owner;
        }
    }
    //--

    A l'usage, et ici ce code ne sert qu'à montrer, on peut en créer 5 avec Edit1 puis en créer 2 (en 1 et en 5), puis 2 (pour 1 de 1 et 5) etc... pour une question de mise en place graphique (sans quoi ... on aurait une usine à gaz au niveau du code) car ici on a, à un moment donné, une superposition d'objets (à cause du positionnement simpliste qui est utilisé) !
    Pour donner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Edit1
         Edit_a
         Edit_b Edit_aa
         Edit_c Edit_ab Edit_aaa
         Edit_d         Edit_aab
         Edit_e 
                Edit_ea
                Edit_eb
                       Edit_eaa
                       Edit_eab
    Lorsque l'on double-click sur l'un des Edit, on en montre l'arborescence, depuis ce qu'il est dans l'arborescence en remontant jusqu'à la racine (Edit1)

    A plus !

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 44
    Points : 29
    Points
    29
    Par défaut
    merci bouceau pour t'a explication

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    ne pas oublier Résolu si c'est bon pour toi .
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

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

Discussions similaires

  1. Création de composant a l'execution
    Par popeyes dans le forum Composants VCL
    Réponses: 15
    Dernier message: 11/05/2021, 23h55
  2. Création dynamique de composants et destruction
    Par cpdump dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/01/2005, 17h57
  3. aide sur création d'un composant
    Par laetus dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/07/2004, 10h45
  4. Création d'un composant et couleurs
    Par gibet_b dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/07/2004, 13h44
  5. Xterm se fermant après l'éxécution d'un programme ?
    Par Clemaster dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 29/03/2004, 15h49

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