如何更改 Delphi TGrid Firemonkey 组件中单元格的颜色?

Ash*_*lar 4 delphi

我以 TGrid 列中的单元格为例。组件选项中没有颜色属性。颜色只能通过代码访问。代码必须放在 Draw Column Cell 事件中,但它是什么代码呢?我尝试使用与 VCL 组件中相同的过程,但 FMX 中的 Tcanvas 不包含画笔属性。网站上的其他类似问题仅提供有关如何处理颜色的推测。

是否有人成功更改了单元格(或其他组件)中的背景颜色?

Tom*_*erg 6

FMX框架提供了几种方法来更改TGrid. 下面给出了两种方法,交替行颜色和每个单元格的颜色。

交替行颜色,可选择使用样式

这在TGrid.Options名为的属性中作为可预设的布尔项存在AlternateRowBackground。默认颜色是浅灰色 ($FFEEEEEE)。要更改此颜色,您可以添加TStyleBook或右键单击网格并选择Edit Custom Style ...Edit Default Style ...然后更改 的Color属性gridstyle - alternatingrowbackground。这是颜色更改为 的示例Bisque

在此处输入图片说明

OnDrawColumnCell事件中的代码

这甚至为网格的每个单元格调用,并提供对绘制单元格背景的完全控制。事件处理程序的标题如下所示:

procedure TForm11.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF; const Row: Integer;
  const Value: TValue; const State: TGridDrawStates);
Run Code Online (Sandbox Code Playgroud)

对于绘画,我们需要一个TBrush,因此我们将其声明为局部变量:

var
  bgBrush: TBrush;
Run Code Online (Sandbox Code Playgroud)

我们现在准备应用一些特殊背景绘制的场景。首先是如何让默认绘图发生某些单元格状态。

  if (TGridDrawState.Selected in State) or
      (TGridDrawState.Focused in State) then
  begin
    Grid1.DefaultDrawColumnCell(Canvas, Column, Bounds, Row, Value, State);
    Exit;
  end;
Run Code Online (Sandbox Code Playgroud)

对于以下内容,我们将需要TBrush,因此我们创建它并管理其生命周期(在 Windows 平台上):

  bgBrush:= TBrush.Create(TBrushKind.Solid, TAlphaColors.White); // default white color
  try
  //
  // following code snippets go in here
  //
  finally
    bgBrush.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

接下来,不使用样式绘制交替行背景的示例

  if Odd(Row) then
    bgBrush.Color := TAlphaColors.MoneyGreen+$202020; // a very light green color
  Canvas.FillRect(Bounds, 0, 0, [], 1, bgBrush);
Run Code Online (Sandbox Code Playgroud)

然后是给定列的背景颜色示例

  case Column.Index of
    0: bgBrush.Color := TAlphaColors.lightBlue;
    1: bgBrush.Color := TAlphaColors.MoneyGreen;
  end;
  Canvas.FillRect(Bounds, 0, 0, [], 1, bgBrush);
Run Code Online (Sandbox Code Playgroud)

最后是一个由数据值决定的背景颜色的例子

  if Column.Index = 1 then
    if Value.AsOrdinal < 0 then  // negative 
      bgBrush.Color := TAlphaColors.Lightpink
    else
      bgBrush.Color := TAlphaColors.MoneyGreen;
  Canvas.FillRect(Bounds, 0, 0, [], 1, bgBrush);
Run Code Online (Sandbox Code Playgroud)

和一个示例图像:

在此处输入图片说明

文本的颜色与此答案相同