根据另一列中的值更改 Delphi TGrid(FireMonkey)的背景色

l2osamch  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(97)

我正试图弄清楚如何根据数据集中包含的另一列中的值来更改 Delphi TGrid(FMX)的背景颜色。显然有“DrawColumnBackground”事件用于此目的,但我不知道如何访问网格/数据集中的另一个值来确定渲染的颜色。我已经附上了一张图片,显示“RowMod”列,应用于确定背景颜色,而不是替代BG颜色正在使用。

procedure GridDrawColumnBackground(Sender: TObject; const Canvas: TCanvas; const Column: TColumn;
  const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
  OldKind: TBrushKind;
  OldColor: TAlphaColor;
begin
  if [Get-RowMod-Value] = 1 then  // <-- How to get this cell value?
  begin
    OldKind := Canvas.Fill.Kind;
    OldColor := Canvas.Fill.Color;

    Canvas.Fill.Color := TAlphaColorRec.Yellow;
    Canvas.Fill.Kind := TBrushKind.Solid;
    Canvas.FillRect(Bounds, 0, 0, AllCorners, 1);

    Canvas.Fill.Color := OldColor;
    Canvas.Fill.Kind := OldKind;
  end;
end;

bybem2ql

bybem2ql1#

这个案例将突出一些意想不到的事情:TGrid不存储数据值,而是显示数据!
在假期,我不会解释如何做,但给予你一个链接网格和Livebindings(法语),我解释如何覆盖这一点

0s7z1bwu

0s7z1bwu2#

我最终切换到了一个带有DrawColumnCell事件的TStringGrid,如下所示。没有任何简单的方法来做,否则,所以将不得不处理的细胞绘图手动这将提供更大的灵活性,在一些实质性的编码为代价。

procedure StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates);
const
  EvenColor: TAlphaColor = $20FFFFFF;
  OddColor: TAlphaColor = $20000000;
var
  R: TRectF;
begin
  // Draw the cell background
  if StringGrid1.Cells[2, Row] = '1' then
    Canvas.Fill.Color := OddColor
  else
    Canvas.Fill.Color := EvenColor;
  R := Bounds;
  R.Inflate(3, 3);
  Canvas.FillRect(R, 0, 0, AllCorners, 1.0);

  // Draw the cell text
  Canvas.Fill.Color := TAlphaColorRec.Black;
  Canvas.FillText(Bounds, Value.AsString, False, 1, [], TTextAlign.Leading, TTextAlign.Center);
end;

生成的网格如下图所示。为了实现选中行的高亮显示,需要在TAlphaColor中设置Alpha透明度,我将其设置为32(十六进制代码的前2位为#20或$20)。

相关问题