Основные свойства компонента 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 - порядковый номер столбца