首页 > 解决方案 > 在运行时在 C++ Builder 中的 StringGrid 底部添加新条目

问题描述

我想在 C++ Builder 5 的 StringGrid 小部件(20 行和 2 列)底部添加由运行时日志生成的新条目。

StringGrid 小部件是否有任何属性可以在最底行添加新条目之前自动删除最顶行中的条目,以防固定大小的 StringGrid 的所有行都被数据占用。

如果您需要我提供任何其他信息,请通知我。

非常感谢

索拉布·耆那教

标签: c++builderstringgrid

解决方案


正如我在 Embarcadero 论坛上告诉你的那样......

您所要求的没有公共财产/方法。您只需RowCount根据需要设置/增加属性,然后手动上移属性的内容,Cells最后填写底部行。

if (StringGrid1->RowCount < SomeMaxValue)
    StringGrid1->RowCount = StringGrid1->RowCount + 1;

for(int row = 1; row < StringGrid1->RowCount; ++row)
{
    for(int col; col < StringGrid1->ColCount; ++col)
    {
        StringGrid1->Cells[col][row-1] = StringGrid1->Cells[col][row];
    }
}

// fill in StringGrid1->Cells[...][StringGrid1->RowCount-1] for the last row as needed...

但是,TStringGrid确实有一个受保护 DeleteRow()的方法,但是受到保护,您需要使用访问器类来访问它,例如:

class TStringGridAccess : public TStringGrid
{
public:
    void RemoveRow(int row) { TStringGrid::DeleteRow(row); }
};

if (StringGrid1->RowCount > 0)
    ((TStringGridAccess*)StringGrid1)->RemoveRow(0);

StringGrid1->RowCount = StringGrid1->RowCount + 1;
for(int row = 1; row < StringGrid1->RowCount; ++row)
{
    for(int col; col < StringGrid1->ColCount; ++col)
    {
        StringGrid1->Cells[col][row-1] = StringGrid1->Cells[col][row];
    }
}

// fill in StringGrid1->Cells[...][StringGrid1->RowCount-1] for the last row as needed...

也就是说,TStringGrid对于您正在尝试做的事情来说,这确实不是最佳选择。我强烈建议改用TListViewinvsReport模式。这就是我在日志查看器中使用的,它工作得很好,尤其是在OwnerData=true虚拟TStringGrid模式TListviewTStringGrid

if (ListView1->Items->Count > 0)
    ListView1->Items->Items[0]->Delete();

TListItem *Item = ListView1->Items->Add();
// fill in Item->Caption (column 0) and Item->SubItems (columns 1+) as needed...

推荐阅读