J'utilise le code suivant pour afficher une case à cocher dans un DBGrid. Il fonctionne (au moins était prévu) à la fois sur le thème et non sur le thème de style VCL (testé dans XE2, XE7 et Berlin):Delphi: Cochez une case dans un DBGrid (sur le thème)
uses Vcl.Themes;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState: Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
CtrlStateXP: Array[Boolean] of TThemedButton = (tbCheckBoxUncheckedNormal, tbCheckBoxCheckedNormal);
var
CheckBoxRectangle : TRect;
Details: TThemedElementDetails;
begin
if Column.Field.DataType = ftBoolean then
begin
Column.Title.Alignment := taCenter;
Column.Alignment := taCenter;
TDBGrid(Sender).Canvas.FillRect(Rect);
if ThemeServices.ThemesEnabled then
begin
Details := ThemeServices.GetElementDetails(CtrlStateXP[Column.Field.AsBoolean]);
ThemeServices.DrawElement(TDBGrid(Sender).Canvas.Handle, Details, Rect);
end
else
begin
CheckBoxRectangle.Left := Rect.Left + 2;
CheckBoxRectangle.Right := Rect.Right - 2;
CheckBoxRectangle.Top := Rect.Top + 2;
CheckBoxRectangle.Bottom := Rect.Bottom - 2;
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;
end;
end;
Il fonctionne très bien, sauf quand je me déplace sur les lignes, le style devient 'étrange', comme ci-dessous:
Toute aide? Merci.
Le FillRect ne semble pas correct. Ne devrait-il pas y avoir des services thématiques pour dessiner les antécédents des parents? –