Canvas.FillText 在 TGrid.OnDrawColumnCell 事件处理程序中不工作

Canvas.FillText not working in TGrid.OnDrawColumnCell event handler

我很难理解我试图在 Delphi 10.3 中开发的 FireMonkey 所有者绘制的网格中发生的事情。

我已将 Grid1.DefaultDrawing 属性 设置为 False 并将以下事件处理程序分配给 Grid1.OnColumnCellDraw:

procedure TFormFolderCptPairArray.Grid1DrawColumnCell1(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
var
  Grid: TGrid;
  ColIndex, RowIndex: integer;
  CellStr: string;
  CellStringSize: TSizeF;
  CellStrPosn: TPointF;
  CellStrRect: TRectF;
begin
  {Retrieve Grid reference:}
  Grid:= Sender as TGrid;
  {Retrieve column and row indices:}
  ColIndex:= Column.Index;
  RowIndex:= Row;
  {Determine text to be drawn in cell:}
  GetGridCellText(ColIndex, RowIndex, CellStr);
  {Determine cell text position and bounds:}
  if CellStr<>'' then
    begin
      {Calculate size of cell string:}
      CellStringSize.cx:= Canvas.TextWidth(CellStr);
      CellStringSize.cy:= Canvas.TextHeight(CellStr);
      {Calculate posn of cell string:}
      if ColIndex=0 then
        begin
          {Align to centre}
          CellStrPosn.x:= (Bounds.Left + Bounds.Right - CellStringSize.cx) / 2;
        end
      else
        case (ColIndex-1) mod CFolderFieldCount of
          0:  CellStrPosn.x:= Bounds.Left + CCellMargin;    {Align to left}
          1..4: CellStrPosn.x:= (Bounds.Left +
                Bounds.Right - CellStringSize.cx) / 2 ;  {Align to centre}
          5:  CellStrPosn.x:= Bounds.Right - CCellMargin - CellStringSize.cx;
                           {Align to right}
        end;
      CellStrPosn.y:= (Bounds.Top + Bounds.Bottom - CellStringSize.cy) / 2;
      {Draw cell text:}
      {Calculate cell strings bounding rect:}
      CellStrRect.Left:= CellStrPosn.x;
      CellStrRect.Top:= CellStrPosn.y;
      CellStrRect.Right:= Bounds.Right - CCellMargin;
      CellStrRect.Bottom:= CellStrRect.Top +  CellStringSize.cy;
      Canvas.FillText(CellStrRect,  CellStr, True, 1.0, [], TTextAlign.Leading);
    end;
end;

在我第一次尝试时,我没有明确设置 Grid1.DefaultDrawing 属性,所以它默认为 True。但是我分配了事件处理程序。

在某个阶段,我获得了一些在网格单元格中呈现的文本,但它非常微弱且颜色错误。看起来好像控件在呈现文本后被涂上了一些半透明的背景颜色,从而将文本颜色从指定的黑色字体颜色更改为粉红色。

这只有在我删除 OnGetCell 值事件处理程序时才会发生。当这个处理程序被分配给网格时,文本由控件自动呈现,但不是我想要的样子,这就是为什么我想用自定义 OnDrawColumnCell 事件处理程序覆盖自动单元格绘制的原因。

在我最近的尝试中,我将 Grid1.DefaultDrawing 设置为 False。我发现相同的代码或多或少没有产生任何可见的文本。但是,如果已将 OnGetValue 事件处理程序分配给网格,则单击单元格时,正确的文本会短暂地以褪色的颜色出现。

任何人都可以提出可能阻止 OnDrawColumnCell 事件处理程序呈现文本的原因吗?

您没有设置文本的颜色。

例如(就在 Canvas.FillText() 之前:

  Canvas.Fill.Color := TAlphaColors.Black;

来自 Canvas.FillText() 的文档:

FillText is implemented by the TCanvas descendants to display a text string with the specified alignment, current font, and brush specified by the Fill and Font properties.