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;
else key:= Chr(0); // остальные символы запрещены
end;
end;
Листинг 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 Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private { Private declarations }
public { Public declarations }
end;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.Button1Click(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-1,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.
Использование компонента Memo
Рис. 5.4. Компонент Memo
Таблица 5.3. Свойства компонента Memo
Свойство | Определяет | ||
Name | Имя компонента. Используется в программе для доступа к свойствам компонента | ||
Text | Текст, находящийся в поле Memo. Рассматривается как единое целое | ||
Lines | Текст, находящийся в поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру | ||
Lines.Count | Количество строк текста в поле Memo | ||
Left | Расстояние от левой границы поля до левой границы формы | ||
Top | Расстояние от верхней границы поля до верхней границы формы | ||
Height | Высоту поля | ||
Width | Ширину поля | ||
Font | Шрифт, используемый для отображения вводимого текста | ||
ParentFont | Признак наследования свойств шрифта родительской формы | ||
for i:=l to SIZE do
a [ i ]:= Memo1.Lines[i];
где:
- SIZE — именованная константа, определяющая размер массива;
- а — массив;
- Memo1 — имя Memo-компонента;
- Lines — свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку находящегося в поле Memo текста.
Рис. 5.5. Диалоговое окно приложения Ввод массива
Листинг 5.5. Ввод массива строк из компонента Memo
unit fr_memo_;
Interface
Uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;
Type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
Var
Form1: TForm1;
Implementation
($R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
Const
SIZE=5; // размер массива
Var
a:array[l..SIZE]of string[30]; //массив
n: integer; // количество строк, введенных в поле Memo
i:integer; // индекс элемента массива
st :string;
Begin
n:=Memo1.Lines.Count;{кол-во строк текста в поле Memo}
if n = 0 then begin
ShowMessage ('Исходные данные не введены!');
Exit; // выход из процедуры обработки события
end;
// в поле Memo есть текст
if n > SIZE then begin
ShowMessage ('Количество строк превышает размер массива.');
n:=SIZE; // будем вводить только первые SIZE строк
end;
for i:=1 to n do
a[i]:=Form1.Memo1.Lines[i-1]; // строки Memo пронумерованы с нуля
// вывод массива в окно сообщения
if n > 0 then begin
st:='Введенный массив:'+#13;
for i: =1 to n do
st:=st+IntToStr(i)+' '+ a[i]+#13;
ShowMessage(st);
end;
end;
End.
Рис. 5.6. Окно приложения Ввод массива
Рис. 5.7. Массив, введенный из Memo-поля