更改TStringGrid单元格字体颜色

7

我需要在Delphi的TStringGrid中更改单元格的文本颜色。

只是一个单元格。 我该怎么做?

1个回答

14
您可以使用DrawCell事件来自行绘制单元格内容。
procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S: string;
  RectForText: TRect;
begin
  // Check for your cell here (in this case the cell in column 4 and row 2 will be colored)
  if (ACol = 4) and (ARow = 2) then
  begin
    S := Grid.Cells[ACol, ARow];
    // Fill rectangle with colour
    Grid.Canvas.Brush.Color := clBlack;
    Grid.Canvas.FillRect(Rect);
    // Next, draw the text in the rectangle
    Grid.Canvas.Font.Color := clWhite;
    RectForText := Rect;
    // Make the rectangle where the text will be displayed a bit smaller than the cell
    // so the text is not "glued" to the grid lines
    InflateRect(RectForText, -2, -2);
    // Edit: using TextRect instead of TextOut to prevent overflowing of text
    Grid.Canvas.TextRect(RectForText, S);
  end;
end;

(受这里的启发)


除了根据Remy的评论进行的编辑之外:由于问题询问了特定的单元格,因此您应该显示如何使用AColARow参数仅更改一个单元格(并可能解释对InflateRect的调用-作为建议,尽管您不需要一个单独的变量;您可以直接将Rect传递给InflateRect,因为它没有声明为const)。 - Ken White
2
@Ken 我添加了更多的解释和单元格检查。最初,我很想把“使用另一个提供更多格式化功能的组件”作为真正的答案,因为我发现自定义绘图总是有点危险,因为它可能会破坏本地的外观和感觉。也许最好的方法是自定义绘制所有单元格,而不是冒着其他单元格看起来不同的风险。至于Rect:我很谨慎。也许有人决定在方法的末尾添加代码,使用Rect,不知道我对值所做的更改。 - Heinrich Ulbricht
Heinrich,提问者应该知道在修改“Rect”时他们正在进行修改。如果有其他人在更改它,则应在这样做之前阅读现有代码。 :) 很好的编辑-对于在搜索中找到此答案的Delphi新手,它使答案更加自我解释。关于单元格颜色,您可以通过检查固定行和列并跳过它们,使用“clWindow”和“clWindowText”(或根据“State”使用“clHighlight”和“clHighlightText”),并且仅在不绘制单元格时调用“InflateRect”和“TextRect”。 - Ken White
噢,好吧。如果匆忙之中,有些事情是人们无法相信的 ;) - Heinrich Ulbricht
除非你想要绘制自己的固定行或列。 :) 这就是为什么我建议使用 clWindowclWindowText 系统颜色;主题颜色的更改应该已经为您处理了,而默认绘图在不更改任何内容的情况下应该可以处理其余部分。我有一个完整的示例,用于绘制带有货币值右对齐列的 TStringGrid,我在工作中使用它,它可以很好地响应主题,只需要大约十几行代码。并不是一直建议自定义绘制自己的网格;如果需要,最好使用自定义组件。 - Ken White
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接