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

FillRect不会在Delphi XE2中绘制完整的TStringGrid单元格,delphi,delphi-xe2,delphi-xe,tstringgrid,Delphi,Delphi Xe2,Delphi Xe,Tstringgrid,FillRect不会在Delphi XE2中绘制完整的TStringGrid单元格。默认颜色的左侧有3个像素的间隙,BiDiMode设置为bdLeftToRight。这个问题在我以前使用的Delphi6中不存在 procedure TShapeline.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin Stringgrid1.Canvas

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

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

我试图更改所有属性,包括DrawingStyle和不同的笔刷样式,绘制的矩形无法填充整个单元格。

关闭TStringGrid中的前4个选项:

goFixedVertLine goFixedHorizLine 政府热线 戈霍里兹林
然后它将不会绘制网格线,网格单元将直接绘制到边缘。刚刚在XE上试用过。

当DefaultDrawing=true并且启用了主题时,这是XE2中的预期行为。我不想在这里讨论好的或坏的-正如您可能已经注意到的,RigthToLeft模式的行为不同


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

您可以使用StringGrid1.CellRectACol来返回单元格的实际树,而不是使用参数Rect。

因为您自己正在绘制网格单元格,所以只需关闭网格属性DefaultDrawing,将其设置为false。

是否有办法确定要减少多少像素?我真的不喜欢这种情况下的硬编码值。从XP到Vista以及新的边框厚度,很多代码都被破坏了,它也会被破坏。@Marjan-这是VCL源TStringGrid.DrawCell中硬编码的“4”。它不是一种风格的属性,不是一个常数,。。只需“4”。谢谢你-将剩余的记录减少4像素就行了,解决了我的问题!在我们遇到这个问题并硬编码了一个修复程序之后,我们偶然发现了这个问题,该修复程序在Win2008 server或XP上不起作用,但在Win7上起作用。添加对默认图形和样式服务启用的检查允许我们在必要时适当地向左应用4像素移位。如果TStringGridSender.DefaultDrawing和StyleServices.Enabled启用,那么…我宁愿绘制自己的网格,也不愿依赖这种Windows绘图疯狂!这正是我现在在所有网格中所做的,即使我使用VCL样式。我可能应该将此图形封装在我自己的网格控件中…如果OP确实需要网格线怎么办?那么我的回答可能不会有帮助,但关闭固定线似乎有帮助。@Bruce,您的修复对XE是正确的,但对XE2不是。如果DefaultDrawing为true且StyleServices已启用,则TStringGrid.DrawCell中确实有一段代码执行ARect.Left:=ARect.Left+4。@Mike,我针对XE进行了测试,因为原始问题就是这样被标记的。我没有仔细阅读描述。我没有想到XE2会有所不同。伊克斯,真的。@Bruce,伊克斯是对的。这似乎真的会破坏很多现有的所有者绘制代码。我添加了delphi-xe2标记以供将来参考。哎呀,在OnDrawCell事件处理程序中,这是一个繁重的例程!显示的代码不绘制网格单元;它绘制网格单元的内容。如果禁用DefaultDrawing,则还必须输出文本和网格线,这需要编写更多的代码。只需将矩形调整几个像素就可以更容易地调整主题绘图添加的填充,如上所述。