【问题标题】:How Can I Paint All The Column Title Cells Of A TStringGrid Different Colours?如何为 TStringGrid 的所有列标题单元格绘制不同颜色?
【发布时间】:2012-03-05 07:02:16
【问题描述】:

我正在运行 Lazarus 0.9.30.2。

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

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

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

【问题讨论】:

    标签: background-color lazarus tstringgrid


    【解决方案1】:

    为此目的有一个更好的事件,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 事件的对象检查器:

    【讨论】:

    • 感谢您的回答。我有一组网格,我为所有网格加载网格列并将 TTmColumnTitle 对象分配给单元格,作为 TForm1.Create 构造函数的一部分。 OnPrepareCanvas 事件在 TForm1.Create 之前调用,因此 'ColumnTitle := TTmColumnTitle(StringGrid1.Objects[ACol, ARow])' 返回一个 Nil 对象)。有没有办法在 OnPreparecanvas 事件之前移动网格列的加载,或者我可以在 TForm1.Create 之后以某种方式触发此事件?
    • 表单的OnCreate 事件在字符串网格的OnPrepareCanvas 之前被触发一次。 OnPrepareCanvas 在每个单元格被绘制时被触发,它不是一次完成,而是在单元格需要视觉刷新时触发。对于如何调用要触发的事件的问题,您可以使用例如StringGrid1.DrawRow(0);,但你所描述的很奇怪。事件由组件自动触发。您只编写在其处理程序中执行的代码。
    • 我认为您误解了组件事件处理,例如检查this tutorial。此外,您不需要覆盖表单的构造函数,您应该编写事件处理程序(请参阅我的答案中的屏幕截图)。您可以简单地用鼠标选择表单,转到Object InspectorEvents 选项卡,然后单击OnCreate 处的... 按钮并在那里编写代码。
    • 是的....我的构造函数错了。我按照您的指示进行了修复,现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2016-02-21
    • 2022-01-26
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多