Je suis en train de regrouper des codes en D7, C++Buider2007 et BCBXE3 sous Delphi XE2

Ce matin, j'ai remarqué un bug sur le dessin d'un CheckBox dans un TDBGrid
Je n'ai pas trouvé cela sur l'EDN QualityCentral

Test simple, un TDBGrid avec deux colonnes
Une sur un Boolean, la seconde sur une String

le bug c'est qu'il y a une perte de la couleur de fond sur les colonnes suivantes (le bug est différent selon le sens de défilement)
Dans un thème comme Carbon qui est un thème foncé, c'est TRES visible !

le DrawElement doit changer un contexte qui n'est pas rétabli pour le dessin des cellules suivantes


Voici un code brut, en réalité, j'ai une classe TDBGridSLTAssistant qui me fournit un code réutilisable (et un peu plus riche que celui fourni)
J'ai inclus mon patch sur un StyleColor foncé pour afficher des checkbox sans style !

J'ai essayé de changer SetBkMode TRANSPARENT ou OPAQUE = toujours bug
J'ai essayé de mémoriser les TColor du Pen et Brush = toujours bug

J'ai vu d'autre code similaire mais utilisant plutôt de l'héritage et surcharge du DrawCell
Une extrémité que je veux éviter !

Avec le code suivant :
- Pouvez-vous reproduire le bug ?
- Avez-vous une idée de correction en restant dans un OnDrawColumnCell


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
//------------------------------------------------------------------------------
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  uState: UINT;
  tbState: TThemedButton;
  Details: TThemedElementDetails;
  StyleColor: TColor;
  StyleAllowed: Boolean;
begin
  if Assigned(Column.Field) and (Column.Field.DataType = ftBoolean) then
  begin
   (* if StyleServices.Enabled then
    begin
      Details := StyleServices.GetElementDetails(tgCellNormal);
      StyleServices.GetElementColor(Details, ecFillColor, StyleColor);
      // Un bug sur DrawElement d'un TThemedButton dans un DBGrid provoque sur les thèmes foncés une perte de la couleur de fond !
      StyleAllowed := StyleColor > $00AAAAAA;
    end
    else
      StyleAllowed := False;   *)
    StyleAllowed := True;
 
    if StyleAllowed then
    begin
      // Force un fond opaque pour cacher le texte !
      TDBGrid(Sender).Canvas.Brush.Style := bsSolid;
      TDBGrid(Sender).Canvas.FillRect(Rect);
 
      tbState := tbCheckBoxUncheckedNormal;
      if Column.Field.AsBoolean then
        tbState := tbCheckBoxCheckedNormal;
 
      Details := StyleServices.GetElementDetails(tbState);
      StyleServices.DrawElement(TDBGrid(Sender).Canvas.Handle, Details, Rect, nil);
    end
    else
    begin
      uState := DFCS_BUTTONCHECK;
      if Column.Field.AsBoolean then
        uState := uState or DFCS_CHECKED;
 
      TDBGrid(Sender).Canvas.FillRect(Rect);
      DrawFrameControl(TDBGrid(Sender).Canvas.Handle, Rect, DFC_BUTTON, uState);
    end;
  end;
end;