1 pièce(s) jointe(s)
[Desktop] TStringGrid FMX et sélections
Bonjour,
ce post est en quelque sorte relié à ma question précédente grid/stringgrid vers presse-papier.
Constatant que l'option RangeSelect n'existait pas (concevable pour les OS non desktop pour des questions pratqiue de sélection, c'est quand même dommage)
et voulant tester l'helper que j'ai pondu (bientôt dispo ;)
je me suis lancé dans les évènements OnCellDraw et OnHeaderDraw pour tenter de visualiser les sélections au sein du tableau
Pièce jointe 621729
J'y suis presque ci-dessus les tests pour les 4 premiers boutons. Une seule chose ennuyeuse, objet de ma question.
Lorsque je clique sur un entête de colonne, celui-ci change bien de couleur conformément au code
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
|
procedure TFormTest.StringGrid1DrawColumnCell(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
aRowColor: TBrush;
aNewRectF: TRectF;
begin
aRowColor := TBrush.Create(TBrushKind.Solid, TAlphaColors.Alpha);
if rdbRowselected.IsChecked
AND (Cols.Contains(Column.Index) OR Rows.Contains(Row))
then aRowColor.Color := TAlphaColors.Blue
else aRowColor.Color := TAlphaColors.white;
aNewRectF := Bounds;
aNewRectF.Inflate(3, 3);
Canvas.FillRect(aNewRectF, 0, 0, [], 1, aRowColor);
Column.DefaultDrawCell(Canvas, Bounds, Row, Value, State);
aRowColor.free;
end;
procedure TFormTest.StringGrid1DrawColumnHeader(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
var
aRowColor: TBrush;
begin
aRowColor := TBrush.Create(TBrushKind.Solid, TAlphaColors.Alpha);
if Cols.Contains(Column.Index)
then aRowColor.Color := TAlphaColors.Blue
else aRowColor.Color := TAlphaColors.white;
Canvas.FillRect(Bounds, 0, 0, [], 1, aRowColor);
Column.DefaultDrawCell(Canvas, Bounds, 0, Column.Header,[]);
end;
procedure TFormTest.StringGrid1HeaderClick(Column: TColumn);
begin
if Cols.IndexOf(Column.Index)>-1
then cols.RemoveItem(Column.Index,TDirection.FromBeginning)
else Cols.Add(Column.Index);
end; |
Cependant les cellules ne se colorient pas immédiatement, il faut que je sélectionne une cellule (ou une autre colonne).
J'ai essayé sans succès les StringGrid1 BeginUpdate/EndUpdate, Repaint et même un positionnement sur une cellule par code (comme dans l'image), rien n'y fait !
Que me reste-t-il comme alternatives ?
En bonus :
- je pense mélanger les "couleurs" (lignes et colonnes) ou jouer sur l'opacité (ce qui aurait ma préférence)
- étudier une version "jouer avec le style" pour les changements de couleur