我以TGrid列中的单元格示例为例。组件选项中没有颜色属性。颜色只能通过代码访问。代码必须放在Draw Column Cell事件中,但它代码是什么代码?我尝试使用与VCL组件相同的过程,但FMX中的Tcanvas不包含画笔属性。网站上的其他类似问题并未提供有关如何处理颜色的推测。
是否有人成功更改了单元格(或其他组件)中的背景颜色?
答案 0 :(得分:3)
FMX
框架提供了一些方法来更改TGrid
背景的外观。下面介绍两种方法,交替行颜色和每个单元的颜色。
交替的行颜色,可选择使用样式
这作为名为TGrid.Options
的{{1}}属性中的presetable布尔项存在。默认颜色为浅灰色($ FFEEEEEE)。要更改此颜色,您可以添加AlternateRowBackground
或右键单击网格,然后选择TStyleBook
或Edit Custom Style ...
,然后更改Edit Default Style ...
的{{1}}属性。这是一个颜色更改为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);
我们现在准备应用一些特殊背景图的场景。首先是如何让某些单元状态的默认绘图。
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);
示例图片:
文本的颜色与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;