FillRect不绘制Delphi XE2中完整的TStringGrid单元格

问题描述:

FillRect不绘制Delphi XE2中完整的TStringGrid单元格。默认颜色左侧有3像素的间隙(BiDiMode设置为bdLeftToRight)。这个问题在我之前使用的Delphi 6中不存在。FillRect不绘制Delphi XE2中完整的TStringGrid单元格

procedure TShapeline.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
begin 
    Stringgrid1.Canvas.Brush.Color:=$00FF80FF; 
    StringGrid1.Canvas.FillRect(Rect); 
end; 

我试图改变所有属性(包括)和不同的画笔风格,彩绘矩形不填写完整的细胞。

关闭第4个选项中TStringGrid

  • goFixedVertLine
  • goFixedHorizLine
  • goVertLine
  • goHorizLine

然后,它会不会绘制网格线,和你网格单元将绘制到边缘。刚刚用XE试了一下。

+2

如果OP确实需要网格怎么办? – 2012-01-10 17:34:40

+0

然后我的答案可能不会帮助,但只是关闭固定线路似乎有帮助。 – 2012-01-10 17:36:38

+0

@布鲁斯,你的修复是正确的XE但不是XE2。 TStringGrid.DrawCell中的代码实际上是ARect.Left:= ARect.Left + 4,如果DefaultDrawing为true且StyleServices已启用。 – 2012-01-10 17:44:17

这时候DefaultDrawing = true和主题被启用,预计XE2行为(我不会争论的好坏在这里 - 你可能已经注意到,该行为是RigthToLeft模式不同...)。

解决方法是在调用FillRect之前检查此条件并将Rect.Left减少4个像素。

+1

没有办法找出有多少像素要递减?我真的不喜欢这些情况下的硬编码值。它会破解很多代码破解从XP到Vista和新的边界厚度。 – 2012-01-10 17:34:06

+2

@Marjan - 这是VCL源代码(TStringGrid.DrawCell)中的硬编码'4'。它不是风格的属性,不是一个常量,只是'4'。 – 2012-01-10 17:45:33

+2

@SertacAkyuz:嗨! (并感谢您的答案) – 2012-01-10 17:49:15

您可以使用StringGrid1.CellRect(ACol, ARow)来返回单元格的实际TRect,而不是使用参数Rect

+1

糟糕,这是OnDrawCell事件处理程序中的繁重程序! – NGLN 2012-01-11 15:36:38

由于您自己绘制网格单元,因此只需关闭网格属性DefaultDrawing,将其设置为false即可。

+1

显示的代码不绘制网格单元;它绘制网格单元的*内容*。如果关闭DefaultDrawing,则必须输出文本和网格线,这是更多的代码。如上面[Uwe的回答](http://stackoverflow.com/a/8807002/62576)中所述,将矩形调整几个像素以调整主题绘图添加的填充更容易。 – 2015-05-15 20:35:28