Использование компонента StringGrid
Если нужно ввести массив дробных чисел (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 StringGrid1KeyPress(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(StringGrid1.Cells[i-l,0])<>0 then a[i]: = StrToFloat(StringGrid1.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.StringGrid1KeyPress(Sender: TObject; var Key: Char); begin case Key of #8,'0'..'9':; // цифры и <Backspace> #13: // клавиша Enter if StringGrid1.Col < StringGrid1.ColCount – 1 then StringGrid1.Col: = StringGrid1.Col + 1; '.',',': // разделитель целой и дробной частей числа begin if Key <> DecimalSeparator then Key: = DecimalSeparator; // заменим разделитель // на допустимый if Pos(StringGrid1.Cells[StringGrid1.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.