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

时间:2017-04-26 03:01:34

标签: delphi

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

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

2 个答案:

答案 0 :(得分:3)

FMX框架提供了一些方法来更改TGrid背景的外观。下面介绍两种方法,交替行颜色和每个单元的颜色。

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

这作为名为TGrid.Options的{​​{1}}属性中的presetable布尔项存在。默认颜色为浅灰色($ FFEEEEEE)。要更改此颜色,您可以添加AlternateRowBackground或右键单击网格,然后选择TStyleBookEdit Custom Style ...,然后更改Edit Default Style ...的{​​{1}}属性。这是一个颜色更改为Color的示例:

enter image description here

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

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

TBrush

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

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

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

的示例
TBrush

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

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

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

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

示例图片:

enter image description here

文本的颜色与this answer

相同

答案 1 :(得分:1)

请看这个例子。评论中的解释:

procedure TfrmOperationTab1.strgridHeartbeatsDrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
  bgBrush: TBrush;
begin
  try
    // if a cell contains word 'WARNING' then we want to paint its background in Pink color
    if Value.AsString.Contains('WARNING') then
    begin
      // Create pink brush
      bgBrush:= TBrush.Create(TBrushKind.Solid, TAlphaColors.Lightpink);
      // Paint the whole area
      Canvas.FillRect(Bounds, 0, 0, [], 1, bgBrush);
      bgBrush.Free;
    end;
  finally
  end;
  // IMPORTANT: let system draw all the other staff. If not called, then you wont see the content of your cell
  Column.DefaultDrawCell(Canvas, Bounds, Row, Value, State);
end;