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.
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.
Je ne sais pas ce que ça donne, mais il y avait un post identique il y a quelques temps...
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; } //--------------------------------------------------------------------------
Bonjour
Un bout de code qui affiche une CB dans une cellule d'une grille, ici à la suite d'un clic dans une cellule.
Ici la combo a une largeur minimale donc peut dépasser des cellules.
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 }
La valeure présente dans la cellule est automatiquement sélectionnée dans la CB.
J'aime bien cette solution ...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.
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...
merci pour la tips orangina...
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]; }![]()
Partager