Основные свойства компонента StringGrid

Col и Row показывают номера столбца и строки выделенной ячейки
RowCount, ColCount Количество строк и столбцов
AnslString Cells [int ACol][int ARow] Строка, содержащаяся в ячейке с номером столбца ACol и номером строки ARow
TStrings* Cols [int Index] Список строк, содержащихся в ячейках столбца с номером Index
TStrings* Rows [int Index] Список строк, содержащихся в ячейках строки с номером Index

Таблица StringGrid состоит из выделенных серым цветом FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно для редактирования, и меняется только программно. Для установки количества фиксированных ячеек можно изменить значение свойств FixedCols и FixedRows в окне свойств Object Inspector. Или поменять количество фиксированных строк и столбцов программно, написав в коде программы команды

StringGrid1-> FixedCols=1; // устанавливает 1 фиксированный столбец

StringGrid1-> FixedRows=1; // устанавливает 1фиксированную строку

Количество строк в StringGrid равно StringGrid1->RowCount.

Количество столбцов в StringGrid равно StringGrid1->ColCount

Общее количество строк и столбцов в таблице можно установить вручную в окне Object Inspector, отредактировав свойства RowCount и ColCount, а можно изменить программно в ходе выполнения программного кода, написав следующие команды:

StringGrid1->RowCount=5 //устанавливаем общее кол-во строк равное 5

StringGrid1->ColCount=7 //устанавливаем общее кол-во столбцов равное 7

Эти свойства доступны как для записи (при установке количества строк и столбцов), так и для чтения (при проверке размер таблицы).

Если ячейки не помещаются в таблице, появляются полосы прокрутки.

За многие свойства компонента StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False - то нет.

Свойство Значение
goFixedVertLine Наличие вертикальных разделительных линий между "фиксированными" ячейками
goFixedHorzLine Наличие горизонтальных разделительных линий между "фиксированными" ячейками
goVertLine Наличие вертикальных разделительных линий между "обычными" ячейками
goHorzLine Наличие горизонтальных разделительных линий между "обычными" ячейками
goRangeSelect Возможность выделить диапазон ячеек
goDrawFocusSelected Закрашивание ячейки с фокусом ввода
goRowSizing Возможность менять высоту строк мышкой
goColSizing Возможность менять ширину столбцов мышкой
goRowMoving Возможность менять номер строки, то есть перемещать её, мышкой
goColMoving Возможность менять номер столбца, то есть перемещать его, мышкой
goEditing Возможность редактировать содержимое ячейки с клавиатуры
goTabs При значении True фокус смещается на следующую ячейку в таблице, False - на следующий компонент
goRowSelect Выделяется вся строка с "фокусированной" ячейкой
goAlwaysShowEditor При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False - сначала необходимо щёлкнуть по ней мышкой (прим.: не действует при goRowSelect=True)
goThumbTracking При значении True перемещение "бегунка" прокрутки мышкой вызывает немедленное перемещение ячеек, False - ячейки перемещаются только при отпускании "бегунка"


Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение в True. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент:

StringGrid1->Options<<goEditing; //Включаем редактирование, //другие элементы не трогаем

StringGrid1->Options=StringGrid1->Options[goEditing];

//Выключаем редактирование, другие элементы не трогаем

StringGrid1->Options=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect]; //Задаём список необходимых элементов

Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.

Компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки.

Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид:

StringGrid1->Cells[i][j]

и доступно как для чтения, так и для записи. Например:

StringGrid1->Cells[i][j]=”Hello”; - записывает слово в ячейку с координатами I и j.

A=StringGrid1->Cells[i][j]; - считывает содержимое ячейки с координатами I и j в переменную A.

Номера столбцов (i) и строк (j) отсчитываются от 0.

Выделенная ячейка таблицы имеет:

номер столбца: StringGrid1->Col

номер строки: StringGrid1->Row

поэтому содержимое выделенной ячейки будет адресоваться так:

S=StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row];

Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании:

StringGrid1->LeftCol Номер столбца, видимого самым левым

StringGrid1->TopRow Номер строки, видимой самой верхней

StringGrid1->VisibleColCount Количество столбцов, видимых в рамках таблицы

StringGrid1->VisibleRowCount Количество строк, видимых в рамках таблицы

У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек

DefaultRowHeight - высота строк по умолчанию

DefaultColWidth - ширина столбцов по умолчанию

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

RowHeights[i] - массив, содержащий высоты строк с номером i

ColWidths[i] - массив, содержащий ширины столбцов с номером i

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

Так как таблица StringGrid, в отличие от, например, компонента ListBox, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:

int i, j;

{

for (i=1;i<StringGrid1->RowCount;i++) //Заголовки строк не трогаем

for (j=1;j<StringGrid1->ColCount;j++) //Заголовки столбцов не трогаем

StringGrid1->Cells[j][i]=” ”;

}

Хотя, есть метод для очищения содержимого целого столбца или строки:

StringGrid1->Cols[i]->Clear(); //Очищается столбец с номером i

StringGrid1->Rows[i]->Clear(); //Очищается строка с номером i

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

int i, j;

{

for (i=1;i<StringGrid1->RowCount;i++) //Заголовки столбцов не трогаем

{

StringGrid1->Rows[i]->Clear();

StringGrid1->Cells[0][i]="Заголовок строки i";

}

}

Определение суммы всех ячеек

int summa = 0;

for(int i = 1; i < StringGrid1->RowCount; i++){ // число строк

for(int j = 1; j < StringGrid1->ColCount; j++){ // число стобцов

summa += StringGrid1->Cells[i][j].ToInt();

}

}

Label1->Caption = summa; // Вывод суммы всех чисел

Динамическое создание компонента StringGrid и установка его размеров

TStringGrid *Grid = new TStringGrid(GridForm);

Grid->ColCount = Count + 1;

Grid->RowCount = Count + 1;

// заполняем StringGrid значениями

if (Values != NULL)

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

Grid->Cells[i + 1][i + 1] = Values[i];

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

Label1->Caption='Выбрана ячейка '+IntToStr(ARow) + ':'+IntToStr(ACol);

выдаст в метку Label1 номер выбранной ячейки. А оператор

Label1->Caption=StringGrid1->Cells[ACol, ARow];

выведет в ту же метку текст выделенной ячейки.

Закрашивание отдельной ячейки
// для закрашивания отдельной ячейки в StringGrid напишите
// следующий обработчик события OnDrawCell StringGrid
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if (ACol == 2 && ARow == 2) // определяем конкретную ячейку
{
StringGrid1->Canvas->Brush->Color = clRed;
StringGrid1->Canvas->FillRect(Rect); } }

Скрыть столбец таблицы:

StringGrid1->ColWidths[Index] = -1; //Index - порядковый номер столбца

Наши рекомендации