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.
我很难理解我试图在 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.