Листинг 5.2. Ввод
и обработка массива целых чисел
unit
getar_;
interface
uses
Windows,
Messages, SysUtils, Variants,
Classes,
Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1
= class(TForm)
Label1:
TLabel;
StringGridl:
TStringGrid;
Button1:
TButton;
Label2:
TLabel;
procedure
ButtonlClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForml ;
implementation
{$R
*.dfm}
procedure
TForml.ButtonlClick(Sender: TObject); var
a
: array[1..5] of integer; // массив
summ:
integer; // сумма элементов
sr:
real; // среднее арифметическое
i:
integer; // индекс
begin
//
ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for
i:= 1 to 5 do
if
Length(StringGridl.Cells[i-1, 0]) <>0
then
a[i] := StrToInt(StringGridl.Cells[i-1,0])
else
a[i] := 0;
//
обработка массива
summ
:= 0;
for
i :=1 to 5 do
summ
:= summ + a[i]; sr := summ / 5;
У
вывод результата Label2.Caption :=
'Сумма
элементов: ' + IntToStr(summ)
+
#13+ 'Среднее арифметическое: ' + FloatToStr(sr);
end;
end.
После
пробных запусков
программы возникает желание внести изменения в процесс ввода массива.
Так, было
бы неплохо, чтобы курсор автоматически переходил в следующую ячейку
таблицы,
например, в результате нажатия клавиши <Enter>. Сделать это
можно при
помощи процедуры обработки события onKeyPress. На эту же процедуру
можно возложить
задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае
надо разрешить
ввод в ячейку только цифр.
Текст
процедуры обработки
события OnKeyPress приведен в листинге 5.3. Следует обратить внимание
на свойство
Col, которое во время работы программы содержит номер колонки таблицы,
в которой
находится курсор. Это свойство можно также использовать для
перемещения курсора
в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы,
впрочем,
как и строки, нумеруются с нуля.
Листинг 5.3.
Процедура обработки события OnKeyPress
procedure
TForm1.StringGridlKeyPress(Sender: TObject;
var Key:
Char);
begin
case
Key of
#8,'0'..'9'
: ; // цифры и клавиша <Backspace>
#13:
// клавиша <Enter>
if
StringGridl.Col < StringGridl.ColCount — 1
then
StringGridl.Col := StringGridl.Col + 1;
else
key := Chr(0); // остальные символы запрещены
end;
end;
Если
нужно ввести массив
дробных чисел (a: array [1. .5] of real), то процедура обработки
события OnKeyPress
несколько усложнится, т. к. помимо цифр допустимыми символами являются
символ-разделитель
(запятая или точка — зависит от настройки Windows) и минус. С целью
обеспечения
некоторой дружественности программы по отношению к пользователю можно
применить
трюк: подменить вводимый пользователем неверный разделитель верным.
Определить,
какой символ-разделитель допустим в текущей настройке Windows, можно,
обратившись
к глобальной переменной Decimaiseparator.
В
листинге 5.4 приведен
текст модуля приложения ввода и обработки массива дробных чисел.
Процедура обработки
события OnKeyPress обеспечивает ввод в ячейку таблицы только
допустимых при
записи дробного числа символов.
Листинг 5.4.
Ввод и обработка массива дробных чисел
unit.
getar_1; interface
uses
Windows,
Messages, SysUtils, Variants, Classes,
Graphics,
Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1=
class(TForm)
Label1:
TLabel;
StringGrid1:
TStringGrid;
Button1:
TButton;
Label2:
TLabel;
procedure
Button1ClicktSender: TObject);
procedure
StringGridlKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R
*.dfm}
procedure
TForm1.ButtonlClick(Sender: TObject);
var
a
: array[1..5] of real; // массив
suram:
real; // сумма элементов
sr: real; // среднее арифметическое
i:
integer; // индекс
begin
//
ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for
i:= 1 to 5 do
if
Length(StringGridl.Cells[i-l,0])<>0
then
a[i] := StrToFloat(StringGridl.Cells[i-1, 0]) else a[i] := 0;
//
обработка массива
summ
:= 0;
for
i :=1 to 5 do
summ
:= summ + a[i]; sr := summ / 5;
//
вывод результата
Label2.Caption
:=
'Сумма
элементов: ' + FloatToStr(summ)
+
#13+ 'Среднее арифметическое: ' + FloatToStr(sr); end;
'/
Функция обеспечивает ввод в ячейку только допустимых символов
procedure
TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
begin
case
Key of
#8,'0'..'9'
: ; // цифры и <Backspace>
#13:
// клавиша <Enter>
if
StringGridl.Col < StringGridl.ColCount - 1
then
StringGridl.Col := StringGridl.Col + 1; '.',',':
//
разделитель целой и дробной частей числа
begin
if
Key <> DecimalSeparator then
Key
:= DecimalSeparator; // заменим разделитель
// на допустимый
if
Pos(StringGridl.Cells[StringGridl.Col,0],
DecimalSeparator)
<> 0
then
Key := Chr(O); // запрет ввода второго
// разделителя end;
'
-' : // минус можно ввести только первым символом,
//
т. е. когда ячейка пустая
if
Length(StringGrid1.Cells[StringGrid1.Col, 0]) <>0 then
Key := Chr(0) ;
else
// остальные символы запрещены
key
:= Chr(0);
end;
end;
end.