Добавление новой записи в нижней части StringGrid в C ++ Builder во время выполнения - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу добавить новые записи, сгенерированные журналами во время выполнения, из моего программного обеспечения в нижней части виджета StringGrid (20 строк и 2 столбца) в C ++ Builder 5.

Существует ли свойство виджета StringGrid который может автоматически удалить запись в самой верхней строке перед добавлением новой записи в самой нижней строке, если все строки фиксированного размера StringGrid заняты данными.

Пожалуйста, сообщите мне, если вам нужна какая-либо другая информация от меня.

Большое спасибо

Saurabh Jain

1 Ответ

2 голосов
/ 21 апреля 2020

Как я говорил вам на форумах Embarcadero ...

Не существует publi c свойства / метода для того, что вы запрашиваете. Вам просто нужно установить / увеличить свойство 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...

Однако * У 1012 * есть защищенный 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 в режиме vsReport. Это то, что я использую в своей программе просмотра журналов, и она работает очень хорошо, особенно в виртуальном режиме (OwnerData=true), и выглядит просто более естественно, чем TStringGrid, поскольку TListview - это оболочка для нативного Windows контроль, тогда как 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...
...