Методические указания к работе 5
3.18. Компонент StringGrid (класс TStringGrid, палитра Additional) представляет собой таблицу, ячейки которой содержат строки символов. Свойства компонента приведены в табл. 12. Таблица 12
Таблица делится на две части – фиксированную и рабочую (рис. 3). Фиксированная часть служит для показа заголовок колонок и строк, а также для ручного управления их размерами. Обычно фиксированная часть занимает левую колонку и верхнюю строку таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных колонок и строк (если эти свойства имеют значение 0, таблица не содержит фиксированной зоны). Рабочая часть – это остальная часть таблицы. Она может содержать произвольное количество колонок и строк, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое – заголовки колонок и строк.
Рис.4. Важным свойством компонента является свойство Cells – двумерный массив ячеек, каждая из которых может содержать произвольный текст. Конкретная ячейка определяется парой чисел – номером колонки и номером строки, на пересечении которых она находится (нумерация начинается с нуля). Для доступа к ячейкам программно используется StringGrid1.Cells[i, j], где i — номер столбца, а j — номер строки. Свойство Cells имеет тип String, поэтому программа может легко прочитать или записать содержимое нужной ячейки. Например, StringGrid1.Cells[1,0]:= 'Фамилия'; For i:=1 to m do For j:=1 to n do Begin A[i,j]:=random(100); StringGrid1.Cells[j,i]):= IntToStr(A[i,j]); End; Следует учитывать, что при доступе к элементу матрицы первый индекс – номер строки, а второй индекс – номер столбца, а при доступе к ячейкам таблице StringGrid – наоборот: первый индекс – номер столбца, а второй индекс – номер строки. Выделенная ячейка таблицы имеет номер столбцаStringGrid1.Col и номер строки StringGrid1.Row, поэтому содержимое выделенной ячейки будет адресоваться так: S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; или with StringGrid1 do S:=Cells[Col, Row]; Количество ячеек по каждому измерению хранят свойства ColCount (количество колонок) и RowCount (количество строк). Значения этих свойств и, следовательно, размеры таблицы могут меняться как на этапе разработки программы, так и в ходе ее работы, и их значения должны быть как минимум на единицу больше соответственно значений в свойствах FixedCols и FixedRows, определяющих размер фиксированной зоны.
По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, поэтому, если необходимо редактировать содержимое ячеек, то свойство Options.goEditing нужно установить в положение True. После ввода значения в ячейку таблицы и нажатия клавиши Enter, курсор остается в текущей ячейке. Перейти в соседнюю ячейку можно с помощью мыши или с помощью клавиши Tab, если свойство Option.goTab имеет значение True. С помощью приведенного ниже алгоритма можно организовать автоматический переход курсора в следующую ячейку после нажатия клавиши Enter. Если нажата клавиша Enter (Key = #13), то необходимо проверить не находится ли текущая ячейка в последнем столбце таблицы (StringGrid1.Col < StringGrid1.ColCount-1). Если не находится, то надо перейти к следующему столбцу таблицы (StringGrid1.Col:= StringGrid1.Col+1), если находится в последнем столбце, то надо проверить не находится ли текущая ячейка в последней строке (StringGrid1.Row < StringGrid1.RowCount-1). Если не находится, то надо перейти в начало строки (StringGrid1.Col:=1) и затем перейти к следующей строке (StringGrid1. Row:= StringGrid1. Row +1), если курсор находится в последней строке, то передать фокус командной кнопке Button1.SetFocus. Реализовать данный алгоритм целесообразно в процедуре обработки события OnKeyPress компонента StringGrid1. Значения, введенные с клавиатуры, можно присвоить соответствующим элементам матрицы: For i:=1 to m do For j:=1 to n do A[i,j]:=StrToInt(StringGrid1.Cells[j,i]); // или StrToFloat(StringGrid1.Cells[j,i]); Содержимое ячеек фиксированной области недоступно редактированию с клавиатуры, и меняется только программно. Таблица StringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, поэтому для удаления внесенных в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами For: With StringGRid1 do For i:=1 to RowCount-1 do //Заголовки строк в этом случае не очищаются For j:=1 to ColCount-1 do //Заголовки столбцов в этом случае не очищаются Cells[j, i]:=''; end; Пример 3.2. Разработать программу, показывающую таблицу умножения.
На форму поместим компонент StringGrid. Обработчик onCreate формы (возникает двойным щелчком мыши по форме) будет таким: Procedure TForm1.FormCreate(Sender: TObject); Var x, y: integer; Begin // Задаем число столбцов и строк таблицы StringGrid1.ColCount:= 10; StringGrid1.RowCount:= 10; // Задаем ширину и высоту ячеек StringGrid1.DefaultColWidth:= 30; StringGrid1.DefaultRowHeight:= 30; // расставляем цифры от 1 до 9 в горизонтальной области заголовка For x:= 1 to StringGrid1.ColCount - 1 do StringGrid1.Cells[x, 0]:= IntToStr(x); // расставляем цифры от 1 до 9 в вертикальной области заголовка For y:= 1 to StringGrid1.ColCount - 1 do StringGrid1.Cells[0, y]:= IntToStr(y); // выводим результаты умножения в ячейки таблицы For x:= 1 to StringGrid1.ColCount - 1 do For y:= 1 to StringGrid1.RowCount - 1 do StringGrid1.Cells[x, y]:= IntToStr(x*y); End; Число строк и столбцов, а также ширину и высоту ячеек можно было задать на этапе проектирования формы с помощью соответствующих свойств. Результат работы программы представлен на рис. 4 Рис. 5
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|