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 :

évènements sur plusieurs boutons crées dynamiquement


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut évènements sur plusieurs boutons crées dynamiquement
    bonjour (soir) à toutes et à tous

    dans mon application j'ai du créer 144 boutons (d'où le dynamique...)
    jusque là pas de problème

    ce que je voudrais faire c'est de mettre un évènement commun à tous ces boutons crées dynamiquement

    j'ai donc essayé quelque chose comme ça
    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
     
    	// création dynamique des boutons
    	for (int i = 1; i <= nbreCasesHauteur; i++)
    	{
    		for (int j = 1; j <= nbreCasesLargeur; j++)
    		{
    			// création du bouton
    			TButton *bu_bouton;
    			// la fenêtre est propriétaire du nouveau bouton
    			bu_bouton = new TButton(this);
    			// et c'est dans Form1 qu'il doit s'afficher
    			bu_bouton->Parent = Form1;
    			// ensuite on définit les autres propriétés
    			bu_bouton->Width = buWidth;
    			bu_bouton->Height = buHeight;
    			bu_bouton->Caption = "";
    			bu_bouton->Left = x;
    			bu_bouton->Top = y;
    			x += buWidth + 8;
    			bu_bouton->OnClick = "TForm1::bu_boutonClick";
    		}
    		y += buHeight + 8;
    		x = 8;
    	}
    c'est donc à la ligne
    bu_bouton->OnClick = "TForm1::bu_boutonClick";
    que ça plante
    que je voudrais mettre l'évènement sur le OnClick du bouton créé


    est-ce que quelqun peut m'aider??


    bonne soirée

  2. #2
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonsoir,

    Il me semble qu'il faut passer par une TActionList, définir une TAction, et faire qqchose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bu_bouton->OnClick = MaForm->MonAction->OnExecute;
    Mais je pense aussi que l'on peut définir une fonction dans le .H qui suive le prototype attendu par le "onClick(...)" et l'affecter a tes "bu_buttons"....
    QQchose comme:
    .H:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private: //pas sur, a voir
    
       void __fastcall MonClick(TObject *Sender);
    .CPP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //en amont
    void __fastcall MaForm::MonClick(TObject *Sender)
    {
       ShowMessage("Je suis un Bu_Bouton !!");
    }
    //puis dans ta boucle
    bu_bouton->OnClick = MaForm->MonClick;

    En esperant t'aider,
    @+

  3. #3
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    je test et redis demain

    merci et a+

  4. #4
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    en effet le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bu_bouton->OnClick = Form1->bu_buttonClick;
    marche parfaitement


    merci

    bonne soirée
    Geko

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    bonjour

    çà c etait une tres bonne question

    parcontre comment fais tu pour retrouver l index du bouton

    je m explique : par exemple , tu as 10 boutons créés dynamiquement et tu veux choper le 7 eme qui juste par hasard remplit une clause , comment concatenes tu cette variable '7' dans le nom du bouton ?

    j espere m etre bien expliquer

  6. #6
    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 le Tag !

    A plus !

  7. #7
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    pour ça j'ai entendu dire qu'on pouvait faire des tableaux d'objets

    mais j'ai absolument aucune idée de comment ça marche
    donc si quelqu'un sait je suis preneur


    bonne nuit
    Geko

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

    Soit en statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TEdit *TabEdit[10]; //En global ou ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int j...)
       {
       TabEdit[j] = new TEdit(this);
       }

    Ou bien en dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TEdit **TabEdit = NULL;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(TabEdit != NULL) delete [] TabEdit;
    TabEdit = new TEdit*[10];
     
    for(int j...)
       {
       TabEdit[j] = new TEdit(this);
       }

    Sinon on peut aussi utiliser une TList.

    Mais également un TComponent.
    Dans ce cas, la mise en liste est assurée par le TComponent propriétaire.
    On récupère alors les objets depuis la propriété Components !
    Normalement, le TComponent organise Components dans l'ordre de création (ce serait à vérifier).
    Juste pour montrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TComponent *TabEdit;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TabEdit = new TComponent(this);
    TEdit *E;
    for(int j = 0...)
        {
        E = new TEdit(TabEdit);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TEdit* E = (TEdit*)TabEdit->Components[n];

    A plus !

  9. #9
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    merci ça devrai résoudre un de mes problèmes
    je test tout de suite

  10. #10
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    me revoila
    j'ai essayé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // création d'un tableau 2dimensions pour stocker les boutons
    TButton *tabButton[nbreCasesLargeur][nbreCasesHauteur];
    mais ça me génère cette erreur
    [C++ Erreur] ufmMain.cpp(94): E2313 Expression constante nécessaire
    savez - vous pourquoi??

  11. #11
    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
    Citation Envoyé par Aide de BCB
    E2313 Expression constante nécessaire Erreur du compilateur
    Les tableaux doivent être déclarés avec une taille constante.
    Cette erreur est généralement causée par une faute de frappe dans une constante #define.

  12. #12
    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, il faudrait compter le nombre d'indirections...

    On a un premier tableau de pointeurs vers les lignes, chaque ligne est un tableau de pointeur vers TButton...

    On est double ou triple ??? Je ne peux pas tester en ce moment !

    A plus !

  13. #13
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Citation Envoyé par Mangacker Voir le message
    me revoila
    j'ai essayé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // création d'un tableau 2dimensions pour stocker les boutons
    TButton *tabButton[nbreCasesLargeur][nbreCasesHauteur];
    mais ça me génère cette erreur


    savez - vous pourquoi??
    Bonsoir,

    Pourquoi faire, au fait, un tableau a 2 dimensions ? Juste pour moi pour comprendre car ... ben, j'ai un cerveau lent (j'aime bien ce jeux de mots nul qui ne vole pas haut, au contraire du cerf-volant).
    Parceque dans le pire des cas, j'ai une idée (si si) mais bon, assez "perso" ... (quoi, qui a dit une usine a gaz ? ;-) )

    ++

  14. #14
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    la 2ème dimension du tableau n'est pas obligatoire
    c'est juste pour y accéder facilement car mes boutons sont tous placés sur une grille 2d

    mais si ça se peut pas de manière conventionnelle ya pas de problème je fairais sans

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

    Tu peux nous montrer ça Sunchaser ?

    Sinon pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TButton *tabButton[nbreCasesLargeur][nbreCasesHauteur];
    Ca ne peut s'envisager que comme une déclaration en statique à condition que les deux dimensions soient connues.

    A plus !

  16. #16
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par henderson Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TButton *tabButton[nbreCasesLargeur][nbreCasesHauteur];
    Ca ne peut s'envisager que comme une déclaration en statique à condition que les deux dimensions soient connues.

    A plus !
    ben justement j'ai fais la déclaration en statique et mes deux variables sont déclarées et je leurs ai attribué des valeurs quelques lignes en dessus

  17. #17
    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
    Et pourquoi tu n'utilise pas le std::vector, qui permet, lui, de créer des tableaux dynamique (sans connaitre le nombre d'occurrence)

  18. #18
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Citation Envoyé par henderson Voir le message
    Tu peux nous montrer ça Sunchaser ?
    Ben .... t'es sur maître henderson ?

    Juste une supposition: on pourrait imaginer utiliser un dérivé de TButton, pour lequel on spécifie dès la création les "coordonnées" qu'il aura dans la grille en 2D.
    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class TMButton: public TButton
    {
    typedef TButton inherited;
    private:
    //
    public:
     __fastcall virtual TMButton(Classes::TComponent* AOwner, int aX, int aY);
     int b_aX;
     int b_aY;
    };
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    __fastcall TMButton::TMButton(Classes::TComponent* AOwner, int aX, int aY) : TButton(Owner)
    {
    	b_aX = aX;
    	b_aY = aY;
    }
    //---------------------------------------------------------------------------
    Ensuite, à la création de chaque bouton, perso je stockerais dans une TList, afin de parcourir la TList et de comparer les valeurs de 'b_aX ' et 'b_aY' de chaque items en comparaison a la colonne/ligne de la grille 2D.
    On peut sinon parcourir a l'aide d'une boucle tous les objets de la form, du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = 0; i < TheForm->ControlCount ; i ++ )
    {
    	if (TheForm->Controls[i]->ClassNameIs("TMButton"))
    	{
    //etc,etc
    et accéder aux propriétés de ces boutons, etc ...

    @+

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

    Connues donc au sens de constantes !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int nbreCasesLargeur = 10;
    const int nbreCasesHauteur = 10;
    Ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define nbreCasesLargeur 10
    #define nbreCasesHauteur 10
    A ce moment là seulement, BCB accèptera de construire ton tableau.

    Sinon avec une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TButton ***tabButton;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tabButton = new TButton**[10];
    for(int y = 0; y < 10; y++)
        {
        tabButton[y] = new TButton*[10];
        for(int x = 0; x < 10; x++)
            {
            tabButton[y][x] = new TButton(this);
            tabButton[y][x]->Parent = this;
            //...
            }
        }
    Dans ce cas, ne pas oublier de gérer la destruction des tableaux !

    Sinon, on peut faire une liste de TList... avec un TComponent pour gérer l'ensemble (pour en gérer au moins la construction et la destruction).

    (On a du faire le tour des possibilités...)
    A plus !

  20. #20
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut gros problème de code
    rebonsoir à tous

    j'ai un problème dans ma fonction qui crée les boutons et j'arrive pas à trouver où elle est...
    est ce que quelqu'un est plus fort que moi à cache cache??

    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
     
    // création d'un tableau 2dimensions pour stocker les boutons
    TButton *tabButton[12][12];
     
    // création dynamique des boutons
    for (int i = 1; i <= nbreCasesHauteur; i++)
    {
    	for (int j = 1; j <= nbreCasesLargeur; j++)
    	{
    		// création du bouton
    		TButton *bu_button;
    		// la fenêtre est propriétaire du nouveau bouton
    		// i = la lettre pour la ligne
    		// j = le chiffre pour la colonne
    		tabButton[i][j] = new TButton(this);
    		// et c'est dans Form1 qu'il doit s'afficher
    		tabButton[i][j]->Parent = Form1;
    		// ensuite on définit les autres propriétés
    		tabButton[i][j]->Visible = false;
    		lettre = (i + 64);
    		tabButton[i][j]->Name = "bu_" + AnsiString(lettre) + AnsiString(j);
    		tabButton[i][j]->Width = buWidth;
    		tabButton[i][j]->Height = buHeight;
    		tabButton[i][j]->Left = x;
    		tabButton[i][j]->Top = y;
    		tabButton[i][j]->OnClick = Form1->bu_buttonClick;
    		tabButton[i][j]->Caption = "";  
    		tabButton[i][j]->Visible = true;
    		x += buWidth + 8;
    	}
    	y += buHeight + 8;
    	x = 8;
    }
    un indice cela me génère une violation d'accès

    bonne chance... lol...

Discussions similaires

  1. Action sur des boutons crées dynamiquement
    Par barthelus76 dans le forum SWT/JFace
    Réponses: 13
    Dernier message: 28/06/2007, 20h32
  2. OnClick sur un bouton créé dynamiquement
    Par Jeankiki dans le forum Delphi
    Réponses: 4
    Dernier message: 05/11/2006, 18h44
  3. OnClick d'un Bouton créée dynamiquement
    Par ero-sennin dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/06/2006, 13h52
  4. Réponses: 10
    Dernier message: 03/05/2006, 11h34
  5. Centrer un texte sur une image créée dynamiquement
    Par rigolman dans le forum Langage
    Réponses: 7
    Dernier message: 11/10/2005, 17h22

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