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 :

Comment insérer un ComboBox dans un cellule StringGrid [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut Comment insérer un ComboBox dans un cellule StringGrid
    Je voudrais insérer un ComboBox dans un cellule StringGrid pour effectuer des multichoix, quelqu'un peut me donner un coup de main?
    merci d'avance.

  2. #2
    Membre averti

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Je ne sais pas ce que ça donne, mais il y avait un post identique il y a quelques temps...

  3. #3
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Oui c'est une astuce visuelle interessante,
    qui a l'avantage de ne pas utiliser de composant spécifique quand on a juste besoin que de cette option.

    Ca fait deplacer une seule combobox a l'endroit de la cellule selectionnée...(la combobox doit être cependant en avant plan par rapport à la StringGrid et il faut adapter la taille des lignes de la StringGrid à la hauteur de la combobox).

    juste une petite correction cependant sur le calcul de la position
    ainsi qu'un ajout visuel (pour faire disparaître la combobox quand on est plus dans la colonne voulue,et mettre la valeur selectionnée dans la cellule):

    //mettre la combobox a visible=false par defaut
    //DefaultRowHeight à 20; pour une combo avec police par defaut



    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
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
            TStringGrid * StringGrid = (TStringGrid *)Sender;
     
            if ( StringGrid->Focused() && State.Contains(gdSelected))
            {
              if(ACol==3){ //combo par exemple sur la colonne 3
                        ComboBox1->Visible=true;
                        ComboBox1->Width  = Rect.Width()+2;  //+2 correction visuelle
                        ComboBox1->Left   = StringGrid->Left + Rect.left+2;
                        ComboBox1->Top    = StringGrid->Top + Rect.top+2;
                        curr_row=ARow;   //variable int à gerer à l'extérieure de la fonction
                        curr_col=ACol;
     
              }else{ComboBox1->Visible=false;}
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ComboBox1Change(TObject *Sender)
    {
          StringGrid1->Cells[curr_col][curr_row] = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
          ComboBox1->Visible=false;
    }
    //--------------------------------------------------------------------------

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Points : 75
    Points
    75
    Par défaut
    Bonjour

    Un bout de code qui affiche une CB dans une cellule d'une grille, ici à la suite d'un clic dans une cellule.
    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
     
    				//---------------------------------------------------------------------------
    				// Affiche la combobox sur la cellule de la StringGrid et garde la colonne et la ligne dans la propriété Tag
    				void AfficheCBEditor(TStringGrid* Grid, TComboBox *CBEditor)
    				{
    				   if (CBEditor == NULL) return;			// sécurité : si pas de combo fin
     
    				   TRect   Rect = Grid->CellRect(Grid->Col,Grid->Row);    		// les coordonnées de la cellule
    				   CBEditor->Visible = false;                                   // combo non visible
    				   CBEditor->Top = Grid->Top + Rect.Top + Grid->GridLineWidth;  // la combo s'affiche dessus la cellule
    				   CBEditor->Left = Grid->Left + Rect.Left + Grid->GridLineWidth;
    				   CBEditor->Height = (Rect.Bottom - Rect.Top) + 1;
    				   CBEditor->Width = (Rect.Right - Rect.Left) + 1;
    				   int min = CBEditor->Canvas->TextWidth("XXX") + GetSystemMetrics(SM_CXVSCROLL);  //	mini = 3lettres + la flèche
    				   if (CBEditor->Width < min) CBEditor->Width = min;			 // largeur mini pour la combo
    				   CBEditor->Tag =MAKELONG (Grid->Col, Grid->Row);               // pour conserver la ligne cliquée (et la colonne)
    				   CBEditor->ItemIndex = CBEditor->Items->IndexOf(Grid->Cells[Grid->Col][Grid->Row]);	// je sélectionne le texte de la cellule
    				   CBEditor->Visible = true;                                     // la rendre visible
    				   CBEditor->BringToFront();     // au 1er plan
    				}
    Ici la combo a une largeur minimale donc peut dépasser des cellules.
    La valeure présente dans la cellule est automatiquement sélectionnée dans la CB.

  5. #5
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Ici la combo a une largeur minimale donc peut dépasser des cellules.
    La valeure présente dans la cellule est automatiquement sélectionnée dans la CB.
    J'aime bien cette solution ...

    juste à noter que pour ceux qui ne savent pas :
    (pour acceder aux valeurs ( colonne et grille mises dans le Tag de la combobox) : il faut utiliser LOWORD et HIWORD...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm1::ComboBox1Change(TObject *Sender)
    {
          TComboBox * Cbx = (TComboBox*)Sender;
          int curCol = LOWORD((DWORD)Cbx->Tag);
          int curRow = HIWORD((DWORD)Cbx->Tag);
          StringGrid1->Cells[curCol][curRow] = Cbx ->Items->Strings[Cbx ->ItemIndex];
     
    }
    merci pour la tips orangina...

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2011, 12h12
  2. Réponses: 1
    Dernier message: 07/10/2009, 09h58
  3. Réponses: 19
    Dernier message: 09/06/2009, 12h07
  4. JTable : comment insérer un bouton dans une cellule ?
    Par donyas dans le forum Composants
    Réponses: 2
    Dernier message: 08/08/2006, 15h54
  5. Comment insérer une image dans une cellule d'un TDrawGrid ?
    Par kanux dans le forum Composants VCL
    Réponses: 4
    Dernier message: 15/01/2005, 18h58

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