
Пример использования компонента StringGrid для ввода массива
В качестве примера использования компонента StringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис.1 . Компонент StringGrid используется для ввода массива, компоненты Label1 и Label2 — для вывода пояснительного текста и результата расчета, Button1 — для запуска процесса расчета.
Рис. 1. Диалоговое окно программы Ввод и обработка массива
Добавляется компонент StringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 1. Значения свойств Height и Width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.
Текст программы приведен в листинге 1.
Таблица 1. Значения свойств компонента StringGrid1
Свойство |
Значение |
ColCount |
5 |
FixedCols |
0 |
RowCount |
1 |
DefaultRowHeight |
24 |
Height |
24 |
DefaultColWidth |
64 |
Width |
328 |
Options . goEditing |
True |
Options . AlwaysShowEditing |
True |
Options .goTabs |
True |
Листинг 1. Ввод и обработка массива целых положительных чисел
unit getar_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
const n=5;
type
TIntArr = array[1..n] of integer;
TForm1 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
A : TIntArr;
implementation
{$R *.dfm}
// Процедура обработки массива
procedure CalcArr(A: array of integer; var s : integer; var sr : real);
var
i : integer;
begin
s:=0;
for i:=0 to high(A) do
s := s + A[i];
sr := s / length(A);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
summ: integer; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
begin
// ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for i:= 1 to StringGrid1.ColCount do
begin
if StringGrid1.Cells[i-1,0] = ''
then
StringGrid1.Cells[i-1,0]:='0';
A[i] := StrToInt(StringGrid1.Cells[i-1,0])
end;
CalcArr(A,summ,sr);
// вывод результата
Label2.Caption :=
'Сумма элементов: ' + IntToStr(summ) + #13+
'Среднее арифметическое: ' + FloatToStr(sr);
end;
end.
После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши <Enter>. Сделать это можно при помощи процедуры обработки события onKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.
Текст процедуры обработки события OnKeyPress приведен в листинге 2. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.