Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Interface

Begin

End.

Begin

Var

Implementation

Var

Public

Private

Type

Uses

Interface

Windows, Messages, SysUtils, Variants,

Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

TForm1 = class(TForm);

Label1: TLabel;

StringGridl: TStringGrid;

Button1: TButton;

Label2: TLabel;

 

procedure ButtonlClick(Sender: TObject);

{ Private declarations }

 

{ Public declarations }

end;

 

Form1: TForml;

 

{$R *.dfm}

procedure TForml.ButtonlClick(Sender: TObject);

a: array[1..5] of integer; // массив

summ: integer; // сумма элементов

sr: real; // среднее арифметическое

i: integer; // индекс

 

// ввод массива

// считаем, что если ячейка пустая, то соответствующий

// ей элемент массива равен нулю

 

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;

 

 

После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши <Enter>. Сделать это можно при помощи процедуры обработки события onKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.

Текст процедуры обработки события OnKeyPress приведен в листинге 3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.

 

Листинг 3. Процедура обработки события OnKeyPress

procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);

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.

 

Использование компонента Memo

В некоторых случаях для ввода массива можно использовать компонент Memo. Компонент Memo позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Компонент Memo добавляется в форму обычным образом. Значок компонента находится на вкладке Standard (рис.14.4).

 

Рисунок 14.4 - Компонент Memo

 

В табл. 14.2 перечислены некоторые свойства компонента Memo.

Таблица 14.2 - Свойства компонента Memo

Свойство Определяет
Name Имя компонента. Используется в программе для доступа к свойствам компонента
Text Текст, находящийся в поле Memo. Рассматривается как единое целое
Lines Текст, находящийся в поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру
Lines.Count Количество строк текста в поле Memo
Left Расстояние от левой границы поля до левой границы формы
Top Расстояние от верхней границы поля до верхней границы формы
Height Высоту поля
Width Ширину поля
Font Шрифт, используемый для отображения вводимого текста
ParentFont Признак наследования характеристик шрифта формы

 

При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать клавишу <Enter>.

Получить доступ к находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля).

Следующая программа, текст которой приведен в листинге 5, демонстрирует использование компонента Memo для ввода символьного массива.

Основной цикл процедуры ввода символьного массива из компонента Memo может выглядеть так:

 

for i:=l to SIZE do

a [ i ]:= Memol.Lines[i];

где:

· SIZE — именованная константа, определяющая размер массива;

· а — массив;

· Memol — имя Memo-компонента;

· Lines — свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку находящегося в поле Memo текста.

Форма программы приведена на рис. 14.5. Помимо поля Memo она содержит командную кнопку (Buttonl), при щелчке на которой выполняется ввод значений элементов массива из поля Memo.

Рисунок 14.5 - Диалоговое окно приложения Ввод массива

 

Листинг 5. Ввод массива строк из компонента Memo

unit fr_memo_;

<== предыдущая лекция | следующая лекция ==>
Ввод массива | 
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 313; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.025 сек.