1

Delphi TStringGrid 在 Embracedero Delphi 10.4 中显示不正确(带有不需要的列间距)。我尝试了设置中的所有内容 - 禁用边距,禁用 Ctl3D,字体设置,... - 我还尝试创建一个全新的 StringGrid,但列间距仍然存在问题。

重现代码:

procedure TForm5.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ARow = 0 then
  begin
    StringGrid1.Canvas.Brush.Color := $808080;
    StringGrid1.Canvas.FillRect(Rect)
  end;
end;

Delphi StringGrid中不需要的列间距示例

4

2 回答 2

3

这是一个已知问题,即单元格Rect.LeftOnDrawCell发生 a 时TStringGrid偏移 4 个像素。可能(但未记录)使输出文本数据更容易,这需要与单元格边界有一个小的偏移量。

请注意,TDrawGrid没有此偏移量。

对于单元格的背景绘画,您可以使用该CellRect()功能

procedure TForm5.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    if ARow = 0 then
    begin
      Canvas.Brush.Color := $C0C0C0;
      Canvas.FillRect(CellRect(ACol, ARow));
    end;

    // text output using `Rect` follows
    // ...
  end;
end;
于 2021-01-03T17:55:23.757 回答
0

我在表单上放置了一个 TStringGrid 并使用您显示的代码分配了一个 OnDrawCell 事件,但这并不能完全重现您的问题:我只得到一个未在单元格之间绘制的像素。

为了解决这个问题,我将矩形的宽度和高度放大了一个像素:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
    Rect: TRect; State: TGridDrawState);
var
    R : TRect;
begin
    R := Rect;
    Inc(R.Right);
    Inc(R.Bottom);
    if ARow = 0 then
        StringGrid1.Canvas.Brush.Color := $808080
    else
        StringGrid1.Canvas.Brush.Color := $A0A0A0;

    StringGrid1.Canvas.FillRect(R)
end;

如您所见,我添加了一个检查以绘制大于 0 的行,以查看行方向上的相同行为。

于 2021-01-11T14:59:11.457 回答