Иллюстрированный самоучитель по Delphi 7 для начинающих

Использование компонента 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.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.