如何绘制TStringGrid不同颜色的所有列标题单元格?

时间:2012-03-05 07:02:16

标签: background-color lazarus tstringgrid

我正在跑Lazarus 0.9.30.2。

我有一个TForm,其中有一个TStringGrid。每个列标题都是一个TGridColumns对象,我在运行时动态添加到网格中。每个列标题都有一个与之关联的对象(我创建并存储在TList中)。我想绘制字符串网格的列标题单元格的背景,但我不希望所有单元格都是相同的颜色。根据与列标题关联的对象中的某个属性的值,颜色会有所不同。

我知道有关如何在Stackoverflow(example)中绘制TStringGrid单元格的答案,谈论使用字符串网格DrawCell事件绘制单元格,但我不知道如何调用此过程。

是否有正确的方法来识别感兴趣的细胞的另一个过程(即识别细胞的'Rect'属性),设置我想要的颜色,然后调用网格的常见DrawCell过程来进行实际着色?

1 个答案:

答案 0 :(得分:2)

为此目的,有一个更好的事件,OnPrepareCanvas。当单元格准备绘制自身时,将触发此事件,在该阶段,您可以修改某些画布属性,例如用于绘制背景的画笔颜色。所以你需要的是将颜色存储在某个地方:

type
  TTmColumnTitle = class(TTmObject)
  private
    FCellColor: TColor;
  public
    property CellColor: TColor read FCellColor write FCellColor;
  end;

并编写OnPrepareCanvas事件的处理程序:

procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  ColumnTitle: TTmColumnTitle;
begin
  if ARow = 0 then
  begin
    ColumnTitle := TTmColumnTitle(StringGrid1.Objects[ACol, ARow]);
    if Assigned(ColumnTitle) then
      StringGrid1.Canvas.Brush.Color := ColumnTitle.CellColor;
  end;
end;  

显示OnPrepareCanvas事件的对象检查器: