【问题标题】:C++ Builder TStringGrid row colorsC++ Builder TStringGrid 行颜色
【发布时间】:2019-06-28 08:46:59
【问题描述】:

我在 C++ Builder 项目中使用的 TStringGrid 组件似乎默认交替行颜色。偶数行具有灰色背景,而奇数行具有白色背景。如何禁用这种交替着色,以便所有行都具有相同的背景颜色?

它是这样的:

这里是 DFM 中的对应条目:

  object StringGrid1: TStringGrid [0]
    Left = 0
    Top = 0
    Width = 744
    Height = 300
    Align = alClient
    FixedCols = 0
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    Options = [goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goRowSelect]
    ParentFont = False
    TabOrder = 0
    OnSelectCell = StringGrid1SelectCell
    ColWidths = (
      64
      64
      64
      64
      64)
  end

【问题讨论】:

  • 标准c++builder/delphi TStringGrid 没有交替的行颜色。也许您正在使用来自另一个组件集的字符串网格?请在设计器中右键单击表单,从弹出菜单中选择View as Text,然后将内容复制粘贴到您的问题中。
  • @TomBrunberg 完成。您需要整个文件的内容还是只需要 TStringGrid 条目?
  • 感谢您的编辑。我真的很惊讶。我无法测试,因为我没有 C++Builder 第 6 版。但是在 Delphi 第 7 版中测试我无法重现。我可能错了,但我很确定早期版本(从 v.1 开始)中的字符串网格也没有该功能,因为我使用了 OnDrawCell() 事件来绘制交替颜色(来自我们的 .dfm看到在你的情况下也没有使用)。我只能建议也许字符串网格不是Delphi/C++Builder 字符串网格。你能用 std 组件在新项目中重现它吗?
  • 或者,如果你继承了C++Builder环境和项目,可能是更早的程序员,修改了标准组件?
  • @TomBrunberg 我在工作中使用 C++Builder 6,并且可以确认库存 TStringGrid 没有任何对交替单元格颜色的本机支持,您必须使用 OnDrawCell 事件来执行该操作手动

标签: c++builder c++builder-6


【解决方案1】:

我不知道您使用的是哪个版本的 VCL,但是回到过去,当我使用很棒且非常有用的 TStringGrid 组件时,我做了与自定义着色单元格相关的完全相同的事情,正如您想要的那样做。我认为这是与行为相关的变化,而不是属性。 你需要:

重载 TStringGrid 的虚函数,用于从 TStringGrid 的特定派生类中绘制单元格

或者,

在包含要修改的 TStringGrid 的 TForm 实例上,更改该特定 TStringGrid 的行为。

所以,基本上你可以选择,创建从 TStringGrid 派生的新类并通过覆盖单元格绘制函数来更改行为,或者通过在强大的 ObjectInspector 的帮助下覆盖网格的行为来更改现有的特定 TStringGrid 实例,如果它仍然这样称呼。

当然,最好是创建一个新类并从 TStringGrid 派生它,然后直接在 Form(Parent container) 上使用它,以后可以随时重用, 但它包含一些额外的工作。也许,作为起点,最好使用对象检查器更改您已经在 ParetContainer(可能是 TForm)上放置的特定 TStringGrid 实例的行为。如果这些指导对你来说还不够,我可以在这里放一些对你更有帮助的代码示例。

【讨论】:

    【解决方案2】:

    您应该使用事件 OnDrawCell。这是工作示例:

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
        if( ( ARow % 2 ) == 0 )
        {
            if( ARow == 0 )
                StringGrid1->Canvas->Brush->Color = clBlue;
            else
                StringGrid1->Canvas->Brush->Color = clGray;
            StringGrid1->Canvas->FillRect( Rect );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2011-12-24
      • 2012-11-22
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多