首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi:在DBGrid (主题)中放置一个复选框

Delphi:在DBGrid (主题)中放置一个复选框
EN

Stack Overflow用户
提问于 2017-03-16 21:40:24
回答 1查看 2.3K关注 0票数 1

我使用下面的代码在DBGrid中显示一个复选框。它在主题和非主题的VCL风格(在XE2,XE7和柏林测试)中都能工作(至少是预期的):

代码语言:javascript
运行
复制
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;

它工作得很好,除了当我移动到行上时,样式变得“奇怪”,就像bellow:

有什么帮助吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-18 02:22:27

经过一些尝试和研究,我设法自己适应了这个方法,只添加了以下几行:

代码语言:javascript
运行
复制
  if not (gdFocused in State) then
    Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);

在这里我将分享完整的方法。它可能对某些人有用:-)

代码语言:javascript
运行
复制
uses Vcl.Themes;

procedure CheckBoxGrid(FieldName: String; ValueCheck: Variant; Grid: TDBGrid; const Rect: TRect; 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
  R: TRect;
  Details: TThemedElementDetails;
begin
  if Column.FieldName = FieldName then
  begin
    Column.Title.Alignment := taCenter;
    Column.Alignment := taCenter;
    Grid.Canvas.FillRect(Rect);

    if StyleServices.Enabled then
    begin
      Details := StyleServices.GetElementDetails(CtrlStateXP[Column.Field.Value = ValueCheck]);
      StyleServices.DrawElement(Grid.Canvas.Handle, Details, Rect);

      if not (gdFocused in State) then
        Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
    end
    else
    begin
      R := Rect;
      InflateRect(R, -2, -2);
      DrawFrameControl(Grid.Canvas.Handle, R, DFC_BUTTON, CtrlState[Column.Field.Value = ValueCheck]);
    end;
  end;
end;​
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42835758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档