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.
Version imprimable
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:
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:
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 ...Citation:
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... :wink:Code:
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]; }