| Тема. Отображение данных в табличной форме
Вы уже ознакомились с приемами ввода и вывода значений элементов одномерного массива с использованием компонентов Memo, ListBox. Но поскольку алгоритмы обработки массивов предназначены для работы с таблицами данных, для большей наглядности работы программы желательно отображать содержимое массива в виде таблицы.
Использование компонента StringGrid
- Компонент StringGrid (Вкладка Additional) предназначен для вывода различных данных в табличной форме.
- Как следует из названия, клетки компонента StringGrid могут содержать данные типа String.
Таблица StringGrid может состоять из фиксированных клеток-заголовков FixedCols и FixedRows, выделенных серым цветом, и обычных клеток белого цвета:

- Обращение к ячейке таблицы, находящейся на пересечении столбца с номером col и строки с номером row, имеет вид StringGrid1.Cells [col, row]

- Нумерация столбцов (col) и строк (row) начинается с нуля.
Рассмотрим основные свойства компонента StringGrid, с помощью которых можно определить структуру и вид таблицы.
Задание 1. Рассмотрим пример настройки вида элемента StringGrid1 для отображения одномерного массива
Вариант 1.
- Выполним загрузку Lazarus
- Установим на форме компоненты StringGrid1 и Button1 , Button2.
-
Для компонента назначим значение свойств согласно таблице:

Вывод фиксированной строки с индексами элементов массива не является обязательным, но бывает очень полезным при анализе работы программы.
- Заполним ячейки нулевой строки значениями индексов (i) элементов массива. Содержание фиксированных клеток меняется только программным способом, обычно в процедуре обработки события OnCreate для формы:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin // нумерация столбцов и строк начинается с нуля
For i := 1 to 6 do StringGrid1.Cells[i - 1, 0] := IntToStr(i);// нумерация столбцов нулевой строки
end;
|
 |
-
Заполним массив случайными числами в диапазоне от 0 до 40

|
procedure TForm1.Button1Click(Sender: TObject);
var a: array[1..6] of Integer; i: Integer;
begin
Randomize;
For i := 1 to 6 do
begin
a[i] := Random(40);
StringGrid1.Cells[i - 1, 1] := IntToStr(a[i]);//заполнение ячеек второй строки данными
end;
end;
|
Очистить содержимое таблицы:
procedure TForm1.Button2Click(Sender: TObject);
begin
StringGrid1.Rows[1].Clear;
end;
|
 |
Вариант 2.
Программный код
procedure TForm1.Button1Click(Sender: TObject);
var a:array[1..6] of integer; i: integer;
begin
randomize;
for i:=1 to 6 do
begin
a[i]:= random(40); // формирование элементов массива от 1 до 6
stringGrid1.cells[i-1, 0] := inttostr(i);{создание заголовка первой строки таблицы, следует помнить что нумерация строк и столбцов начинается с нуля}
stringGrid1.cells[i-1, 1] := inttostr(a[i]); // вывод элементов массива в ячейки второй строки таблицы
end;
end;
|
 |
Вариант 3.
Программный код
var
Form1: TForm1;
a: array[1..6] of integer; i: integer;// объявление глобальных переменных
Процедура для кнопки " нумерация столбцов":
procedure TForm1.Button1Click(Sender: TObject);
Begin
For i:=0 to 5 do stringGrid1.cells[i, 0] := inttostr(i+1); {создание заголовка первой строки таблицы,
следует помнить что нумерация строк и столбцов начинается с нуля}
End;
Процедура для кнопки " заполнение элементами массива второй строки таблицы":
|

procedure TForm1.Button2Click(Sender: TObject);
Begin
For i:=0 to 5 do
Begin
A[i]:= random(20);
Stringgrid1.cells[i,1] := inttostr(a[i]); // вывод элементов массива в ячейки второй строки таблицы
End;
end;
|
Редактирования содержимого ячеек таблицы StringGrid
1. За возможность редактирования обычных клеток соответствуют значения свойства Options.
2. В окне Инспектор объектов список значений свойства Options содержит 32 элемента, которые могут принимать значения True или False.
3. Чтобы в ходе выполнения программы можно было редактировать содержимое ячеек, необходимо предоставить значение True таким элементам списка Options:

Задание 2. Заполнить таблицу с клавиатуры и найти среднее арифметическое элементов массива
В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива.
Интерфейс проекта

Компонент stringGrid используется для ввода массива,
Компоненты Label1 ,Label2 - для вывода пояснительного текста и результата расчета,
Button1 - для запуска процесса расчета.
|
Значение свойств компонента StringGrid1
Свойство |
Значение |
ColCount
|
5 |
FixedCols |
0 |
FixedRows |
0 |
RowCount |
1 |
DefaultRowHeight |
24 |
Height |
24 |
DefaultColWidth |
64 |
Width |
328 |
Options. goEditing |
True |
Options. AlwaysShowEditing |
True |
Options .goTabs |
True |
PS! фиксированная строка с индексами элементов массива отсутствует
|
Программный код
procedure TForm1.Button1Click(Sender: TObject);
var a: array[1..5] of Integer; sum, i: Integer; //массив, сумма элементов, индекс
sr: Real; //среднее арифметическое
begin
For i := 1 to 5 do
If Length(StringGrid1.Cells[i - 1, 1]) <> 0
Then a[i] := StrToInt(StringGrid1.Cells[i- 1, 1]) Else a[i] := 0; // формирование массива
sum := 0;
For i := 1 to 5 do sum := sum + a[i]; // накопление суммы
sr := sum / 5; // вычисление среднего арифметического
Label2.Caption := 'Сумма элементов: ' + IntToStr(sum) + LineEnding +
'Среднее арифметическое: ' + FloatToStrF(sr, ffFixed,10,3); //LineEnding — константа,устанавливающая конец строки
end;
Вариант вывода информации:
Label2.Caption := 'сумма элементов: '+ FloatToStrF(summ,ffFixed,10,3)+ #13 + 'среднее арифметическое:' + FloatToStrF(sr,ffFixed,10,3);
|
 |
Задание 3. Найти наибольшее и наименьшее значение среди элементов линейного массива и поменять их местами.
Алгоритм проекта

|
Интерфейс проекта
Вариант 1

Вариант 2

|
Программный код
var
Form1: TForm1;
var a:array[1..10] of real; nmin, nmax, i: integer; max, min: real; // объявляем переменные - глобальными
Вариант 1.
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
for i:= 1 to 10 do
begin
a[i]:= random(60) + 0.5; // формируем массив
memo1.lines[i] := 'a['+ inttostr(i) + ' ]= '+ floattostr(a[i]); //вывод элементов массива построчно в многострочное поле
end;
max:=a[1]; nmax :=1; //первый элемент массива считаем максимальным
min:=a[1];nmin := 1; //второй элемент массива считаем минимальным
for i:= 2 to 10 do
if a[i]> max //сравниваем очередной элемент массива с наибольшим на данный момент
then begin max:= a[i]; nmax := i; end //меняем значение наибольшего элемента и его номер
else if a[i]< min then //сравниваем очередной элемент массива с наименьшим на данный момент
begin min:= a[i]; nmin := i; end ; //меняем значение наименьшего элемента и его номер
label2.caption:= floattostr(max);
label4.caption:= floattostr(nmax);
label6.caption:= floattostr(min);
label8.caption:= floattostr(nmin);
a[nmax] := min; a[nmin] := max; //обмен значениями наибольшего и наименьшего элементов массива
for i:= 1 to 10 do // вывод преобразованного массива
memo2.lines[i] := 'a['+ inttostr(i) + ' ]= '+ floattostr(a[i]);
end;
Вариант 2.
procedure TForm1.FormCreate(Sender: TObject);
begin // нумерация столбцов и строк начинается с нуля
for i := 1 to 10 do StringGrid1.Cells[i - 1, 0] := IntToStr(i);// нумерация столбцов нулевой строки
for i := 1 to 10 do StringGrid2.Cells[i - 1, 0] := IntToStr(i);// нумерация столбцов нулевой строки
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
for i:= 1 to 10 do
begin
a[i]:= random(60) + 0.5; //создаем массив
StringGrid1.Cells[i - 1, 1] := floattostr(a[i]); //заполнение ячеек второй строки таблицы StringGrid1 соответствующими элементами массива
end;
max:=a[1]; nmax :=1; //первый элемент массива считаем максимальным
min:=a[1]; nmin := 1; //второй элемент массива считаем минимальным
for i:= 2 to 10 do
begin
if a[i]> max //сравниваем очередной элемент массива с наибольшим на данный момент
then
begin max:= a[i]; nmax := i; end //меняем значение наибольшего элемента и его номер
else if a[i]< min //сравниваем очередной элемент массива с наименьшим на данный момент
then
begin min:= a[i]; nmin := i; end ; //меняем значение наименьшего элемента и его номер
end;
label2.caption:= floattostr(max);
label4.caption:= floattostr(nmax);
label6.caption:= floattostr(min);
label8.caption:= floattostr(nmin);
a[nmax] := min; a[nmin] := max; //обмен значениями наибольшего и наименьшего элементов массива
for i:= 1 to 10 do // вывод преобразованного массива
StringGrid2.Cells[i - 1, 1] := floattostr(a[i]); //заполнение ячеек второй строки таблицы StringGrid2 соответствующими элементами массива
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StringGrid1.Rows[1].Clear;
StringGrid2.Rows[1].Clear;
label2.caption:= '';
label4.caption:= '';
label6.caption:= '';
label8.caption:= '';
end;
|
обработка табличных величин
| |