Bonsoir
Je me permets de faire une petite proposition, en me basant sur un truc que je suis en train de bricoler.
Donc, pour essayer de résumer correctement, en espérant ne pas trop être confus:
-> j'ai renseigné la propriété "Columns" du DBGrid, et donc défini de manière "statique" les champs qui allaient apparaître (puisque je n'ai besoin que de 11 champs, issus d'une requête avec un ADOQuery).
Cela me permets, pour chaque champs, de définir facilement et individuellement des paramètres particuliers: par exemple, dans le bout de code qui suit, les champs d'indice 6 a 10 ont une font en Webdings qui me permets de simuler de fausses cases a cocher, les autres ont leur propriété "ButtonStyle" a cbsEllipsis.
Je gère précisement les évènements OnCellClick() et OnEditButtonClick() afin de traiter les différents cas, en fonction de la colonne contenant la cellule selectionnée, afin de faire apparaitre soit un PopupMenu avec des valeurs issues d'une requete, soit une TFrame (un besoin particulier pour mon cas), soit a nouveau un mini-Popup afin de faire basculer la propriété True/False des fausses cases a cocher, etc ...
NB: J'aurais pu, aussi, utiliser la propriété "PickList" de chaque colonne; j'ai du mettre la propriété DefaultDrawing de la DBGrid a false et gérer le OnDrawColumnCell (uniquement a cause des fausses cases a cocher).
Un peu de code:
.cpp, OnDrawColumnCell
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
|
int i;
tagRECT t_rect;
t_rect.top = Rect.Top +1 ;
t_rect.bottom = Rect.Bottom;
t_rect.left = Rect.Left + (Rect.Width()/4);
t_rect.right = Rect.Left+ (3*(Rect.Width()/4));
switch(Column->Index)
{
case 6:
case 7:
case 8:
case 9:
case 10:
dbg_cat->Canvas->Brush->Color = clBtnFace;
switch(Column->Field->AsInteger)
{
case 0:
dbg_cat->Canvas->TextRect(Rect, Rect.Left, Rect.Top, "");
break;
case 1:
dbg_cat->Canvas->TextRect(Rect, Rect.Left + (Rect.Width()/3), Rect.Top, "a");
break;
default:
break;
}
DrawEdge(dbg_cat->Canvas->Handle, &t_rect, EDGE_SUNKEN, BF_RECT);
break;
default:
dbg_cat->DefaultDrawColumnCell(Rect, DataCol, Column, State);
break;
} |
.cpp, OnEditButtonClick
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
TPoint point;
point = ScreenToClient(Mouse->CursorPos);
switch(CurrCol)
{
case 0:
case 2:
frameSimple1->Top = point.y;
frameSimple1->Left = point.x;
frameSimple1->ed_frameSimple->Text = dbg_cat->Fields[CurrCol]->AsString;
frameSimple1->BasicText = dbg_cat->Fields[CurrCol]->AsString;
frameSimple1->infoSize->Caption = "Max size for text : " + IntToStr(dbg_cat->Fields[CurrCol]->Size) + " chars";
frameSimple1->SizeMax = dbg_cat->Fields[CurrCol]->Size;
frameSimple1->Visible = true;
break;
case 4:
PopupCat->Popup(point.x, point.y);
break;
default:
break;
} |
.cpp, OnCellClick
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
CurrCol = Column->Index;
TPoint point;
point = ScreenToClient(Mouse->CursorPos);
switch(CurrCol)
{
case 6:
case 7:
case 8:
case 9:
case 10:
PopupFlag->Popup((GB_action->Left + point.x), (GB_action->Top + point.y));
break;
default:
break;
} |
PS: CurrCol est un Integer déclaré en private dans le.h de la TForm, juste pour info: frameSimple1 est une TFrame (besoin particulier), PopupCat un TPopupMenu chargé dynamiquement; GB_action le TGrouBox contenant la DBGrid; dans le OnDrawColumnCell, je mets un "a" webdings a la place de la valeur du champs, ceci me donnant la "coche" de la fausse case a cocher, le reste est complété par DrawEdge.
Rien d'extraordinaire donc, mais c'est mignon et ca marche bien ...
Tu dois donc pouvoir reprendre, par ex, le coup du OnEditButtonClick et charger pour certains champs des listes (ou Popup) avec les valeurs devant être entrées dans la DBGrid, etc ...
En espérant t'aider,
@+
Partager