Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
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 приведен в листинге 3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.
Листинг 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. В листинге 4 приведен текст модуля приложения ввода и обработки массива дробных чисел. Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов. Листинг 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.
|