我正在跑Lazarus 0.9.30.2。
我有一个TForm,其中有一个TStringGrid。每个列标题都是一个TGridColumns对象,我在运行时动态添加到网格中。每个列标题都有一个与之关联的对象(我创建并存储在TList中)。我想绘制字符串网格的列标题单元格的背景,但我不希望所有单元格都是相同的颜色。根据与列标题关联的对象中的某个属性的值,颜色会有所不同。
我知道有关如何在Stackoverflow(example)中绘制TStringGrid单元格的答案,谈论使用字符串网格DrawCell事件绘制单元格,但我不知道如何调用此过程。
是否有正确的方法来识别感兴趣的细胞的另一个过程(即识别细胞的'Rect'属性),设置我想要的颜色,然后调用网格的常见DrawCell过程来进行实际着色?
答案 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
事件的对象检查器: