Компонент TStringGrid не позволяет задать нулевое количество строк

Компонент TStringGrid в C++ Builder описывает таблицу. Он является надстройкой над двумерным массивом строк. В целом это очень удобный класс, и я часто пользуюсь им. Но у него есть одна особенность, которая иногда доставляет неудобства. Речь идет о невозможности создания таблицы с нулевым количеством строк. На первый взгляд идея таблицы с нулевым количеством строк может показаться странной: зачем нужна такая таблица? Но давайте по порядку. Рассмотрим следующий код:

StringGrid1->RowCount = 0;
int i = StringGrid1->RowCount;

Что окажется в переменной i? На первый взгляд там должен оказаться ноль, но реально там будет единица. Дело в том, что компонент TStringGrid сам корректирует значение свойства RowCount. Он не позволяет заносить в него ноль, и изменяет нулевое значение на единицу. При этом программист никак не уведомляется о такой корректировке.

Чтобы понять, когда это может быть важно, рассмотрим небольшой пример:

int i = StringGrid1->RowCount;
StringGrid1->RowCount++;
StringGrid1->Cells[0][i] = IntToStr(i);

При каждом вызове этого кода в таблицу добавляется новая строка и выводится ее номер. Несмотря на свою краткость и красоту у него есть один недостаток: первая строка всегда остается пустой. Это происходит из-за описанного выше поведения компонента TStringGrid. Не скажу, что данный недостаток является серьезной проблемой, но результат работы программы внешне смотрится не очень красиво. Для исправления ситуации приходится задействовать статическую переменную. Например так, как показано ниже.

static bool isFirst = true;
int i;

if(isFirst)
  i = 0;
else
{
  i = StringGrid1->RowCount;
  StringGrid1->RowCount++;
}

isFirst = false;

StringGrid1->Cells[0][i] = IntToStr(i);

Код стал более громоздким и менее читабельным, но теперь строки нумеруются правильно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *