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
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 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
Code:
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
Code:
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,
@+
;)