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 :

Boutons dans une ligne de tableau


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut Boutons dans une ligne de tableau
    Bonjour !

    J'ai un souci quant à la conception d'un petit prog. Je vais essayer de résumer.

    J'aimerais avoir une fiche dans laquelle je disposerais un genre de tableau (premier problème) dont je connais pour l'instant le nombre de ligne mais je peux à tout instant ajouter ou enlever une ligne dynamiquement (deuxième problème). Chacune de ces lignes comporterait un ou plusieurs boutons, et des TEdit (troisième problème).

    Je m'étais dit que le best serait de pouvoir construire une class (ou un composant) qui comporte les fonctionnalités (boutons, TEdit ...) que je pourrais donc créer ou détruire de façon dynamique. Seulement, j'ai aucune idée de comment je pourrais faire. Je sais comment je pourrais créer dynamiquement un bouton ou tout autre composant, mais un ensemble de composants liés ??? Par exemple, une fois la ligne créée, j'aimerais que le bouton de cette ligne lance une routine générique sur cette ligne et la modifie.

    Ensuite, mon deuxième souci est de savoir comment disposer le tout ? Le truc serait par exemple comme je le disais, de pouvoir construire un tableau (je parle au niveau affichage, pas un conteneur) dont je fais varier le nombre de lignes, un peu à la façon d'un DBGrid.

    Le but de la chose serait :
    Chaque ligne représente un article acheté, le nombre d'articles et son prix, ainsi que deux boutons, un bouton d'achat et un bouton de vente. Ainsi, je voudrais être en mesure d'ajouter des nouveaux articles (nouvelle ligne) avec les même renseignements et fonctionnalités. Pour chaque article, avec les boutons je serai en mesure d'augmenter ou diminuer le nombre d'articles, ou carrément enlever la ligne.

    Je ne sais pas si c'est suffisamment clair, sinon je pourrais essayer de faire un beau petit dessin pour vous montrer le résultat au niveau affichage pour montrer plus clairement la ligne/class que je voudrais créer et dont je n'ai absolument aucune idée de comment faire

    @+

  2. #2
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    un petit up si des fois y'en aurait qui ont des idées....

    Le but ici est comme je le disais, de créer un tableau (visuel) dynamique dans lequel je pourrais ajouter/enlever des lignes, chaque étant fonctionnelle, c'est-à-dire que par exemple elle comporte un bouton, une case à cocher, un TEdit....

    J'ai creusé un petit peu plus et on dirait que ça serait peut-être possible en me faisant un composant home made, le tableau serait par exemple une suite de ces composants (une ligne du tableau) et pour faire en sorte que ça ressemble à un tableau, faudrait que je gère leur position.

    Ce sont là des pistes que j'explore, quelqu'un aurait une autre idée ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Par défaut
    bonjour,

    Intéressant exercice

    Vous pouvez faire un tableau du composant ancêtre commun à TButton et TEdit. sans doute TWinControl.
    Et gérer dynamiquement les positions et tailles des composants. Et plus délicats, leurs évènements...

    Essayer d'abord de générer dynamiquement un bouton et un edit pour leur faire faire ce que vous voulez.
    Après seulement, essayez de les gérer dans un tableau que vous afficherez.
    Vous aurez besoin de bonnes notions sur l'héritage et le transtypage...

    bon courage.

  4. #4
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Bonjour Seb

    Je suis heureux que tu trouves mon problème un intéressant exercice.... je ne sais pas si tu es prof ou si tu as suivi quelque cours de prog, mais c'est loin d'être mon cas !! Je suis un simple "autodidacte" et je me bidouille, ou du moins j'essaie, des petits progs maison à temps perdu.

    Une question qui me vient suite à ton commentaire, serait-il possible par exemple, de me faire une class qui "comprendrait" par exemple un bouton et un TEdit tout simplement, ou bien devrais-je faire un nouveau composant (ce qui compliquerait énormément ma tâche puisque j'aurais encore d'autres trucs à apprendre comme une grand [] )

    @+

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut androz
    Pour ton tableau le plus simple est d'utiliser un StringGrid

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    salut,

    Tu peux créer tes lignes dynamiquement et les stoker par exemple dans un vecteur STL. Je ne sais pas comment sont gérée tes colonnes (toujours identique ou non), mais pour chaque ligne tu pourrais stocker les boutons et edit via un TObjectList.

    Ca donnerait qqch comme ça (écrit sans test):
    Dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      #include <vector>
      using namespace std;
     
      typedef vector<TObjectList*> vRows; // Un TObjectlist par ligne
      typedef vRows::iterator         iRows;  // Un iterateur sur les lignes pour les parcourir
      vRows mesLignes;
    Dans le .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
     
      // Créer une nouvelle ligne
      TObjectList *ligne=new TObjectList;
      for (int i=0;i<5;++i) {
        TButton *bouton=new TButton(this);  // Le "this" assure que ma fiche s'occupera du delete, sinon tu devras le gérer toi-même. Tu peux aussi mettre le "monStringGrid" à la place
        if (bouton) {
          bouton->Parent=monStringGrid;   // Dans quel composante afficher le bouton
          // Calculer ici sa position dans le tableau en s'aidant du stringgrid
          bouton->Left=.... 
          bouton->Top=...
          bouton->Width=...
          bouton->Height= ...
          // Associer un événement au click du bouton
          bouton->OnClick=...
          // Associer le bouton à la liste
          ligne->Add(bouton);
        }
      }
      // Associer la ligne aux autres
      mesLignes->push_back(ligne);

  7. #7
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    hey hey merci pour vos réponses !

    Je vais essayer des trucs comme ça on verra là où j'arrive

    Je me suis encore pas mis dans la prog étant donné que je butais sur ce problème majeur de conception, alors pendant ce temps je paufinais mon projet perso

    Je vous en redonne des news !

  8. #8
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Génial tout ça !!

    Une question cependant encore.... Comment je peux trouver le numéro de la ligne à laquelle appartient le bouton sur lequel je viens de presser ?

    Un gros merci !!

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Tu es obligé de parcourir tout ton tableau:

    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
     
    void __fastcall ButtonClick(TObject *Sender) {
      int maLigne=-1;
      int maColonne=-1;
      // Parcourir toutes les lignes
      for (int ligne=0;ligne<mesLignes.size();++ligne) {
         // Rechercher le bouton dans la ligne
         int colonne=mesLignes[ligne]->IndexOf(Sender);
         if  (colonne>=0) {
           maLigne=ligne;
           maColonne=colonne;
           break;
         }
      }
      // Not found ?
      if (maLigne<0) {
         // erreur
      }
      // Le bouton est à la position (maLigne;maColonne)
      ...
    };

  10. #10
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Hello
    Ca me semble une bonne solution en effet, mais je crois que j'ai trouvé un peu plus simple peut-être, ou du moins plus comme je pensais le faire

    Tout d'abord, je me construit une classe qui hérite de la classe TObject pour reprendre le concept du vecteur de TObjectList. Remarquez, j'aurais tout aussi bien pu faire un vecteur de ma classe, ce que je vais surement faire à terme mais bon là est pas ma question pour l'instant.

    Dans ma classe, j'ai donc par exemple un bouton et plusieurs données que je vais pouvoir ainsi mettre dans le StringGrid. Ce qui est pratique dans ma classe, c'est qu'à chaque fois que j'ajoute une ligne donc à chaque fois que je crée un nouvel élément du vecteur, j'ai une variable dans ma classe qui me donne la position dans le vecteur, soit le numéro de la ligne correspondante. Ainsi, lorsque j'appuierai sur le bouton, j'ai plus qu'à prendre la valeur de cette variable puisque le bouton et la variable position sont dans la même classe. Ça c'était pour ma petite astuce.

    Seulement voila. Dans ma classe donc, j'ai un bouton. Je voudrais associer une fonction OnClick à ce bouton. J'ai donc un truc comme ça dans le header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class maClasse : public TObject{
      public :
         int rang;
         TButton *Button1;
     __published:
        void __fastcall EvenementOnClick(TObject *Sender);
    }
    et dans le cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall maClasse::EvenementOnClick(TObject *Sender)
    {
      Form1->Edit1->Text = this->rang;
    }
    et quelquepart dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    maClasse *cLigne = new maClasse;
    cLigne->rang = Form1->StringGrid1->RowCount+1;
    cLigne->Button1=new TButton(Form1->StringGrid1);
    cLigne->Button1->OnClick=EvenementOnClick;
    J'ai a priori pas de souci à la compilation (si j'ai bien retanscrit mon code en version light...), mais par contre, il ne se passe absolument rien quand j'appuie sur le fameux bouton créé par ma classe.
    J'arrive pas à voir où je fais une connerie....??

    J'ai essayé voir si je me plantais pas en appelant la fonction, mais si je crée un bouton dans ma fiche et que je lui affecte dans le code ladite fonction (sans passer par l'éditeur de propriétés de l'IDE) ça marche. Donc je sais pas où est ma bêtise.



    Merci !!!

  11. #11
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Bon j'ai trouvé d'où venait le souci, mais je sais pas comment le résoudre (au passage, désolé si je cause un peu tout seul, mais généralement, poser mes questions sur le forum c'est la moitié du chemin vers leur résolution par moi-même, alors j'en profite, et pis si je peux servir à d'autres qui peut-être un jour auraient le même souci....)

    Donc mon problème vient d'une ligne que j'ai pas notée ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cLigne->Button1->Parent=StringGrid1;
    Je suis obligé de déclarer le bouton ainsi si je veux gérer sa position à l'intérieur de la TStringGrid. Si je change le code (pour voir) comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cLigne->Button1->Parent=Form1;
    alors là tout se passe super bien, ma fonction EvenementOnClick est bien appelée et donne le résultat escompté...

    Des idées ?? (avec un peu de chance je devrais trouver dans les 5 minutes après avoir posté mon message )

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Tu fais référence à une méthode "EvenementOnClick" qui est externe à ta classe... A moins d'une erreur de transcription, c'est donc une autre méthode qui est liée. Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    maClasse *cLigne = new maClasse;
    cLigne->rang = Form1->StringGrid1->RowCount+1;
    cLigne->Button1=new TButton(Form1->StringGrid1);
    cLigne->Button1->OnClick=cLigne->EvenementOnClick;

  13. #13
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Merci encore Patrick, mais malheureusement c'était bien une erreur de transcription

    Ma ligne de code qui affecte la fonction à l'évènement OnClick est bien comme tu l'as corrigée, d'ailleurs sinon j'aurais surement eu une erreur à la compilation ce qui n'est pas le cas. Le problème vient apparemment comme je l'ai identifié de la définition de la propriété Parent du controle.... suivant s'il fait partie de la fiche ou de la StringGrid, la fonction est reconnue ou non.

  14. #14
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Bon finalement, je vais changer de stratégie et procéder à la manière d'un démineur en utilisant un TDrawGrid à la place.... ça me semble plus répondre à ce que je veux faire.

    Merci encore !!

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

Discussions similaires

  1. [MySQL] Ajout de commentaires dans une ligne de tableau
    Par Morronight dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 11/05/2011, 10h42
  2. [ZF 1.11] Plusieurs lignes de table SQL dans une ligne de tableau de données
    Par CinePhil dans le forum Zend Framework
    Réponses: 1
    Dernier message: 21/02/2011, 16h14
  3. Réponses: 4
    Dernier message: 13/09/2010, 15h45
  4. [RegEx] Récupération dans une ligne de tableau
    Par nazoreen dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2009, 20h15
  5. Réponses: 2
    Dernier message: 26/06/2009, 12h55

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