1

我正在运行 Lazarus 0.9.30.2。

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

我知道有关于如何在 Stackoverflow 中绘制 TStringGrid 单元格的答案(示例),其中谈到了使用字符串网格 DrawCell 事件来绘制单元格,但我不确定如何调用此过程。

是否有另一个过程来识别感兴趣的单元格(即识别单元格的“矩形”属性),设置我想要的颜色,然后调用网格的通用 DrawCell 过程来进行实际着色?

4

1 回答 1

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

于 2012-03-05T18:11:02.783 回答