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 :

ButtonClick evenement d'un TButton dynamique


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut ButtonClick evenement d'un TButton dynamique
    Bonjour!

    Je veux faire un programme qui lit plusieurs codes (>120) d´un fichier texte (avec un TStringList), et puis, affiche les codes sur des TButtons. Le nombre de codes et alors de Boutons doit être variable. Quand les boutons sont cliqué, les codes doivent etre passé a un fonction qui est declare dans l'application principale.

    Alors j'essaye de faire un classe TBouton, qui consiste d'un TButton et son ButtonClick evenement. Mais je n´ai pas beaucoup d´experience sur les objects dynamique.

    Voici mon code:


    buttonz.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef boutonH
    #define boutonH
     
     
    class TBouton {
      public:
        TBouton(String zin);
        TButton *but;
        void __fastcall ButtonClick(TObject *Sender);
    };
     
    #endif
    buttonz.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
    #include <StdCtrls.hpp>
    #include "buttonz.h"
    #include "DynButUnit.cpp"
     
     
    TBouton::TBouton(String nom)
    {
      this->but = new TButton((void *)MainForm);
      this->but->Caption = nom;
    }
     
     
    void __fastcall TBouton::ButtonClick(TObject *Sender)
    {
         MainForm->Fonction(this->but->Caption);
    }
    unit1.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
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "buttonz.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TMainForm *MainForm;
    TBouton *Bouton[20];
     
    //---------------------------------------------------------------------------
    __fastcall TMainForm::TMainForm(TComponent* Owner)
            : TForm(Owner)
    {
      for (int i=0;   i<19; i++)  {
        Bouton[i] = new TBouton("Jaap");
        Bouton[i]->but->Top = i*30;
        Bouton[i]->but->Parent = MainForm;
      }
    }
    //---------------------------------------------------------------------------
     
    __fastcall TMainForm::Fonction(String zin)
    {
      Memo1->Lines->Add(zin);
    }
    Pour voir si ca marche Le fonction (MainForm->Fonction) affiche son parametre (les codes) sur un Memo. Il est declare dans unit1.h comme 'public'

    Problablement, ce code est plein d'erreurs, car quand je compile le programme, ca donne plusieurs warnings. Mais on peut executer et on voit les boutons. Mais quand je clique les bouton, rien se passe.

    Qui peut m'aider?

  2. #2
    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
    Tu as oublié de definir l'evenement du boutton, comme ceci dans le constructeur de ta classe TBouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this->but->OnClick = ButtonClick;

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Citation Envoyé par pottiez Voir le message
    Tu as oublié de definir l'evenement du boutton, comme ceci dans le constructeur de ta classe TBouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this->but->OnClick = ButtonClick;
    Merci pottiez ,

    Maintenant j'ai moins de 'warnings'. J'ai aussi corrigé un erreur dans la declaration de MainForm->Fonction. Maintenant c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall Fonction(String zin);
    Quand je clique les boutons, le Fonction est bien executé: je peux verifier avec un MessageBeep() ou un MessageBox(). Mais quand je veux changer le contenu (ou la visibilite) du Memo, le programme crash. C'est bizar, non?

  4. #4
    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
    Vous devriez n'avoir ni erreur ni warning.

    Il n'y a aucune raison pour que vous ne puissiez pas accéder à votre Memo donc donnez-nous l'instruction qui plante.

    Au lieu d'utiliser String, utilisez plutôt AnsiString qui est un bien meilleur objet pour C++ Builder.

    À bientôt
    Gilles

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Salut Gilles,

    OK, j'utilise AnsiString maintenant. Le erreur dit:

    Project DynaButton.exe raised exception class EAccessViolation with message 'Acces violation at adress 00401C9C in module 'DynaButton.exe'. Read of address 00002F0'. Process stopped. Use Step or Run to continu.

    On peut continuer, mais on ne voit rien sur le Memo...

  6. #6
    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 Flagada Voir le message
    Mais quand je veux changer le contenu (ou la visibilite) du Memo, le programme crash. C'est bizar, non?
    À quel moment vous exécutez ces instructions, où se trouve le code ? Je ne vois pas pourquoi vous n'accéderiez pas à votre Memo. Vous donnez le message d'erreur mais savez-vous l'instruction qui plante ?

    À bientôt
    Gilles

  7. #7
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Citation Envoyé par Gilles Louïse Voir le message

    À quel moment vous exécutez ces instructions, où se trouve le code ? Je ne vois pas pourquoi vous n'accéderiez pas à votre Memo. Vous donnez le message d'erreur mais savez-vous l'instruction qui plante ?


    OK, je donne le code complet du programme principale:


    DynButUnit.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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #ifndef DynButUnitH
    #define DynButUnitH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TMainForm : public TForm
    {
    __published:	// IDE-managed Components
            TMemo *Memo1;
            TButton *Button1;
            void __fastcall Fonction(AnsiString zin);
    private:	// User declarations
    public:		// User declarations
            __fastcall TMainForm(TComponent* Owner);
     
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TMainForm *MainForm;
    //---------------------------------------------------------------------------
    #endif




    DynButUnit.cpp (presque le même que untit1.cpp, voir plus haut)
    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
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "DynButUnit.h"
    #include "buttonz.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TMainForm *MainForm;
    TBouton *Bouton[20];
     
    //---------------------------------------------------------------------------
    __fastcall TMainForm::TMainForm(TComponent* Owner)
            : TForm(Owner)
    {
      for (int i=0;   i<19; i++)  {
        Bouton[i] = new TBouton("Jaap");
        Bouton[i]->but->Top = i*30;
        Bouton[i]->but->Parent = MainForm;
      }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TMainForm::Fonction(AnsiString zin)
    {
      MessageBeep(0);                                // pas de problème 
      Application->MessageBox("Salut!", MB_OK) ;     // pas de problème
     
    //-----------------------------------------------------------------
     
      Memo1->Lines->Add(zin);                        // crash!
      Memo1->Visible = false;                        // crash!
      Memo1->Lines->Add("allo!");                    // crash!
      Button1->Visible = false;                      // crash!
    }
    Le problème est TMainForm::Fonction(AnsiString zin). Tout les instructions en haut de la ligne s´execute normalement. Tout les instructions sous la ligne ne peuvent pas etre utilisé, sinon ca plante immediatement...?

  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 !

    Je pense qu'on a intérêt à dériver de TButton au lieu de modéliser TBouton comme cela est montré ici !
    Ne pas oublier que l'on peut ajouter un constructeur doté des paramètres utiles pour l'initialisation de l'objet.
    A ce stade du développement, on est "Concepteur" et non "Utilisateur" et par conséquent, on a le droit de fixer ses propres règles du jeu (dans les limites du jeu lui-même)!
    Pour la OnClick, si tous les boutons ont la même méthode, dans ce cas il suffit de la rajouter à la classe et de l'affecter à son OnClick, et ce, dans le constructeur !
    Ne pas oublier qu'en cas de méthode partagée par un ensemble d'objets, et ce, pour la méthode OnClick, le Bouton est donné par le Sender et non le this !

    A plus !

  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
    Citation Envoyé par Flagada Voir le message
    Button1->Visible = false;
    Votre code est correct, il est exécutable chez moi (C++ Builder6 Entreprise), mais vous rendez invisible un certain Button1, qui n'était pas dans l'énoncé. Si donc j'enlève cette instruction (ou si je rajoute un bouton portant ce nom), ça marche. Encore une fois, il n'y a aucune raison pour que vous n'accédiez pas à votre Memo.

    À bientôt
    Gilles

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

Discussions similaires

  1. Gerer les evenements de Contrôles créés dynamiquement
    Par celineSGH dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2008, 02h25
  2. Evenement avec control créé dynamiquement
    Par BoyzInDaProject dans le forum MFC
    Réponses: 2
    Dernier message: 01/05/2007, 00h52
  3. evenement sur bouton créé dynamiquement
    Par J@ckHerror dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/03/2007, 04h24
  4. Réponses: 2
    Dernier message: 02/08/2006, 23h54
  5. Réponses: 6
    Dernier message: 18/04/2005, 21h12

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