§ 18. Компоненты для работы с таблицами

18.1. Компонент StringGrid

Компонент таблица строк — StringGrid предназначен для обработки данных, представленных в табличной форме. На панели компонентов Additional компонент StringGrid изображен в виде , имя объекта StringGrid. Компонент StringGrid, помещенный на форму, получает имя  StringGridN, где N — номер 1, 2, 3… (пример 18.1).

Компонент StringGrid предназначен в первую очередь для отображения в таблице текстовой информации. Однако его можно использовать и для отображения  графической информации. Свойства компонента приведены в примере 18.2. За многие свойства компонента StringGrid отвечает свойство Options (см. Приложение).

Данные таблицы могут быть доступны, как только для чтения, так и для редактирования. При установке компонента на форму, ячейки таблицы в первом столбце и первой строке фиксированы и недоступны для редактирования, остальные ячейки можно редактировать. Фиксированные ячейки используются в основном для подписей заголовков столбцов и строк. При появлении полос прокрутки фиксированные ячейки остаются на месте.

В компоненте StringGrid реализована адресация каждой отдельной ячейки по ее номеру столбца и строки[1]. Содержимое ячейки (i, j), где i — номер столбца, j — номер строки, имеет вид:

StringGrid1 -> Cells[i][j] 

Номера столбцов и строк начинаются с 0. Столбец и строка с номером нуль по умолчанию принадлежат фиксированной зоне.

В момент выбора пользователем ячейки наступает событие OnSelectCell. В обработчик этого события передаются номера столбца (ACol) и строки (ARow) выделенной ячейки, а также логический параметр CanSelect — допустимость выбора. Параметр CanSelect можно использовать для запрета выделения ячейки, задав его значение false. А параметры ACol и ARow могут использоваться для какой-то реакции программы на выделение пользователя.

Пример 18.3. Создать проект, в котором при выборе ячейки таблицы, в ней будет прописываться адрес.

Этапы выполнения задания

  1. Разместить на форме компонент StringGrid.
  2. Установить у свойства DrawingStyle значение gdsClassic.
  3. Задать цвет для фиксированных и редактируемых ячеек.
  4. В событии OnCreate для формы подписать строки и столбцы.
  5. Написать обработчик события OnSelectCell, в котором необходимо прописывать ее адрес.

Компонент StringGrid можно применять для решения задач, использующих двумерные массивы.

Пример 18.4. Создать проект, в котором будет вычисляться сумма элементов двумерного массива. Элементы массива задаются случайным образом.

Этапы выполнения задания

  1. Разместить на форме компонент StringGrid, а также компоненты: LabeledEdit (2), Label, BitBtn (2), Memo.
  2. Убрать фиксированные строки и столбцы (значения свойств FixedCols и FixedRows равны 0).
  3. Для кнопки BitBtn 2 установить значение Enabled — false.
  4. В событии OnClick для компонента BitBtn1 (Random) изменить размеры таблицы в соответствии с введенными значениями и заполнить ячейки таблицы случайными числами. После заполнения таблицы сделать доступной кнопку Сумма.
  5. В событии OnClick для компонента BitBtn2 (Сумма) посчитать сумму элементов таблицы и вывести ее значение в компонент Label1.

Иногда при работе требуется очистить все ячейки таблицы от текста. Метода, который это делает для таблицы, нет. Можно в цикле обратиться к каждой ячейке и присвоить ей значение пустой строки или использовать метод, который очищает значение столбца:

for (int i = StringGrid1 -> FixedCols; 
    i < StringGrid1 -> ColCount; i++)
    StringGrid1 -> Cols[i] -> Clear();



[1] Обратите внимание на то, что первым указывается номер столбца, а вторым номер строки (по аналогии с адресацией ячеек в Excel)

Пример 18.1. Компонент StringGrid на форме:

Пример 18.2. Свойства компонента StringGrid.

Свойство

Описание

ColCount

Количество столбцов

RowCount

Количество строк

DefaultColWidth

Ширина столбцов

DefaultRowHeight

Высота строк

FixedCols

Количество зафиксированных столбцов слева

FixedRows

Количество зафиксированных строк сверху

GridLineWidth

Толщина линии, ограничивающая ячейки

Options

Определяют группу параметров компонентов

Font

Шрифт отображения содержимого ячеек

Color

Цвет таблицы

FixedColor

Цвет фиксированных ячеек

DrawingStyle

Стиль отображения таблицы

Свойства Color и FixedColor работают, если у свойства DrawingStyle выбрано значение gdsClassic.

При необходимости установки ширины и высоты отдельных столбцов и (или) строк используют свойства:

  • RowHeights - массив, содержащий высоты строк. То есть, например, RowHeights[5] - высота строки с индексом 5.
  • ColWidths - массив, содержащий ширины столбцов. То есть, например, ColWidths[5] - ширина строки с номером 5.

Значения для этих свойств настраиваются в обработчике события OnCreate для формы, так же, как и надписи заголовков, располагающиеся в строках и столбцах фиксированной зоны таблицы.

Пример 18.3. Форма на этапе проектирования:

Обработчик события OnCreate для формы.

void __fastcall TForm1::
FormCreate(TObject *Sender)

{

  for(int i = 1;

  i < StringGrid1 -> ColCount; i++)

    StringGrid1 -> Cells[i][0] =

    "столбец " + IntToStr(i);

  for(int i = 1;

  i < StringGrid1 -> RowCount; i++)

    StringGrid1 -> Cells[0][i] =

    "строка " + IntToStr(i);

}

Обработчик события OnSelectCell для таблицы.

void __fastcall TForm1::

StringGrid1SelectCell(TObject *Sender,

int ACol, int ARow, bool &CanSelect)

{

  StringGrid1 -> Cells[ACol][ARow] =

  IntToStr(ACol) + ";" + IntToStr(ARow);

}

Работающее приложение:

Пример 18.4. Форма на этапе проектирования:

Обработчик события OnClick для кнопки BitBtn1.

void __fastcall TForm1::BitBtn1Click
               (TObject *Sender)

{

  n = StrToInt(LabeledEdit1 -> Text);

  m = StrToInt(LabeledEdit2 -> Text);

  StringGrid1 -> RowCount = n;

  StringGrid1 -> ColCount = m;

  for (int i = 0; i < m; i++)

  for (int j = 0; j < n; j++)

    StringGrid1 -> Cells[i][j] =

      rand() % 20;

  BitBtn2 -> Enabled = true;

}

Обработчик события OnClick для кнопки BitBtn2.

void __fastcall TForm1::

BitBtn2Click(TObject *Sender)

{

  int s = 0;

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      s += StrToInt(StringGrid1 

          -> Cells[i][j]);

  Label1 -> Caption = "Sum = " + IntToStr(s);

}

Работающее приложение: