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;
Partager