2 pièce(s) jointe(s)
[DBGrid]: Problèmes au rectangle de sélection.
J'ai trois problèmes avec le rectangle de sélection de l'enregistrement en cours du composant DBGrid:
1- J'utilise la propriété
Code:
canvas.Brush.Style:=bsclear
pour assurer la transparence du rectangle de sélection et laisser son contour visible néanmoins lorsque le DBGrid est activé (à la première exécution ou après perte de focus) le rectangle de sélection prend la couleur blanche; il revient transparent en pointant sur un autre enregistrement.
2- en parcourant plusieurs enregistrements de la grille, l'affichage des données devient illisible (en utilisant la barre de défilement par exemple). (Voir l'image DBGRID1.png)
En évitant d'utiliser la commande
Code:
canvas.Brush.Style:=bsclear
cet effet ne se produit pas.
3-En sélectionnant la ligne i, ensuite la ligne i+1 et enfin n'importe quelle position, on remarque que le ligne supérieure de la ligne i+1 a obtenue la couleur du contour de sélection (Voir l'image DBGRID2.png). Ces couleur disparaissent si la grille perd le focus et se réactive (j'ai triché un peu en ajoutant DBGrid.Repaint dans les événements OnCellClic OnKeyUp) mais il y a surement mieux à faire.
Voici le Code utilisé:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| procedure TPrincipalForm.GridCarsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if gdSelected in State then //la modification de l'apparence du rectangle de selection
begin
With TDBGrid(Sender) do
begin
canvas.Pen.Width:=5;
canvas.Pen.Color:=clred;
canvas.Brush.Style:=bsclear; //le rectangle de selection devient transparent
TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
// trace la ligne du haut
Canvas.MoveTo(Rect.Left,Rect.Top);
Canvas.LineTo(Rect.Right,Rect.Top);
// trace la ligne du bas
Canvas.MoveTo(Rect.Left,Rect.Bottom);
Canvas.LineTo(Rect.Right,Rect.Bottom);
// cas de la première cellule
if DataCol = 0 then
begin
// on trace la coté gauche
Canvas.MoveTo(Rect.Left,Rect.Top);
Canvas.LineTo(Rect.Left,Rect.Bottom);
end;
// Cas de la dernière colonne
if DataCol = Columns.Count -1 then
begin
// On trace le coté droit
Canvas.MoveTo(Rect.Right,Rect.Top);
Canvas.LineTo(Rect.Right,Rect.Bottom);
end;
end;
end
else
begin //pour alterner les couleurs de la grille
if TDBGrid(Sender).datasource.dataset.RecNo mod 2 =0 then
TDBGrid(Sender).Canvas.Brush.Color:=clwhite
else
TDBGrid(Sender).Canvas.Brush.Color:=$00FDCCC1;
TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
end;
end; |