我想在 C++ Builder 5 的 StringGrid 小部件(20 行和 2 列)底部添加由运行时日志生成的新条目。
StringGrid 小部件是否有任何属性可以在最底行添加新条目之前自动删除最顶行中的条目,以防固定大小的 StringGrid 的所有行都被数据占用。
如果您需要我提供任何其他信息,请通知我。
非常感谢
索拉布·耆那教
我想在 C++ Builder 5 的 StringGrid 小部件(20 行和 2 列)底部添加由运行时日志生成的新条目。
StringGrid 小部件是否有任何属性可以在最底行添加新条目之前自动删除最顶行中的条目,以防固定大小的 StringGrid 的所有行都被数据占用。
如果您需要我提供任何其他信息,请通知我。
非常感谢
索拉布·耆那教
正如我在 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
对于您正在尝试做的事情来说,这确实不是最佳选择。我强烈建议改用TListView
invsReport
模式。这就是我在日志查看器中使用的,它工作得很好,尤其是在OwnerData=true
虚拟TStringGrid
模式TListview
下TStringGrid
(
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...