Разработав некоторую функцию, программист может использовать ее в другой программе, поместив текст этой функции в раздел implementation. Однако этот способ неудобен, т. к. приходится набирать текст функции зановоили копировать его из текста другой программы.
Создание модуля
Delphi позволяет программисту поместить свои функции и процедуры в отдельный модуль, а затем использовать процедуры и функции модуля в своих программах, указав имя модуля в списке модулей, необходимых программе (инструкция uses).
Чтобы приступить к созданию модуля, нужно сначала закрыть окно формы и окно модуля формы (в ответ на вопрос о необходимости сохранения модуля следует выбрать No, т. е. модуль, соответствующий закрытой форме, сохранять не надо). Затем из меню File нужно выбрать команду New | Unit. В результате открывается окно редактора кода, в котором находится сформированный Delphi шаблон модуля. Его текст приведен в листинге 6.7.
Листинг 6.7. Шаблон модуля
1.
unit
Unitl;
2.
interface
3.
implementation
4.
end
.
Начинается модуль заголовком — инструкцией unit, в которой указано имя модуля. Во время сохранения модуля это имя будет автоматически заменено на имя, указанное программистом.
Слово interface отмечает раздел интерфейса модуля. В этот раздел программист должен поместить объявления находящихся в модуле процедур и функций, которые могут быть вызваны из других модулей, использующих данный.
В раздел implementation (реализация) нужно поместить процедуры и функции, объявленные в разделе interface. В качестве примера в листинге 6.8 приведен модуль программиста, который содержит рассмотренные ранее функции isint и IsFloat.
Листинг 6.8. Модуль программиста
01.
unit
myjunit;
02.
interface
// объявления процедур и функции,
03.
// доступных программам,
04.
// использующим этот модуль
05.
function
Islnt(ch :
char
) : Boolean;
06.
// функция Islnt проверяет, является ли символ
07.
// допустимым во время ввода целого числа
08.
function
IsFloat(ch :
char
; st:
string
) : Boolean;
09.
// Функция IsFloat проверяет, является ли символ допустимым
10.
// во время ввода дробного числа
11.
// ей — очередной символ
12.
// st — уже введенные символы
13.
implementation
// реализация
14.
// проверяет, является ли символ допустимым
15.
16.
// во время ввода целого числа
17.
function
Islnt(ch :
char
] : Boolean;
18.
begin
19.
if
[ch >=
' 0 '
)
and
(ch <=
' 9 '
]
// цифры
20.
or
(ch = #
13
)
// клавиша <enter></enter>
21.
or
(ch = #
8
)
// клавиша
22.
then
Islnt := True
// символ допустим
23.
else
Islnt := False;
// недопустимый символ
24.
end
;
// проверяет, является ли символ допустимым
25.
26.
// во время ввода дробного числа
27.
function
IsFloat (ch :
char
; st -.
string
) : Boolean;
28.
// ch — очередной символ
29.
// at — уже введенные символы
30.
begin
31.
if
(ch >=
'0'
)
and
(ch <=
' 9 '
)
// цифры
32.
or
(ch = #
13
)
// клавиша <enter></enter>
33.
or
(ch = #
8
)
// клавиша <bacspace></bacspace>
34.
then
35.
begin
36.
IsFloat := True;
// символ верный
37.
Exit;
// выход из функции
38.
end
;
39.
case
ch
of
40.
'-'
:
if
Length(st) =
0
then
IsFloat :- True;
41.
','
:
if
(Pos(
','
,st) =
0
)
42.
and
(stfLength(st)] >=
' 0 '
)
43.
and
(st[Length(st)] <=
' 9 '
)
44.
then
// разделитель можно ввести только после цифры
45.
// и если он еще не введен
46.
IsFloat := True;
47.
else
// остальные символы запрещены
48.
IsFloat := False;
49.
end
;
50.
// это раздел инициализации
51.
// он а данном случае не содержит инструкция
52.
end
.
Сохраняется модуль обычным образом, т. е. выбором из меню File команды Save, Вместе с тем, для модулей повторно используемых процедур и функций лучше создать отдельную папку, нажав ее, например, Units.
Использование модуля
Для того чтобы в программе могли применяться функции и процедуры модуля, программист должен добавить этот модуль к проекту и указать имя модуля в списке используемых модулей (обычно имя модуля программиста помещают в конец сформированного Delphi списка используемых модулей).
В листинге 6.9 приведен вариант программы Поездка на дачу. Процедура обработки события onkeypress в полях ввода исходных данных обращается к функции IsFloat, которая находится в модуле my_unit.pas, поэтому в списке используемых модулей указано имя модуля my_unit.
Листинг 6.9. Использование функции из модуля программиста
01.
unit
fazenda_;
02.
interface
03.
uses
04.
Windows, Messages, SysOtils, Variants, Classes, Graphics, Controls,
05.
Forms, Dialogs, StdCtrls,
06.
my_unit;
// модуль программиста
07.
type
08.
TForml =
class
(TForm)
09.
Editl: TEdit;
// расстояние
10.
Edit2: TEdit;
// цена литра бензина
11.
Edit3: TEdit;
// потребление бензина на 100 км
12.
CheckBoxl: TCheckBox;
// True — поездка туда и обратно
13.
Buttonl: TButton;
// кнопка Вычислять
14.
Label4: TLabel;
// поле вывода результата расчета
15.
Labell: TLabel;
16.
Label2: TLabel;
17.
Label3: TLabel;
18.
procedure
EditlKeyPress(Sender: TObject;
var
Key: Char];
19.
procedure
Edit2KeyPress(Sender: TObject;
var
Key: Char);
20.
procedure
Edit3KeyPress(Sender: TObject;
var
Key: Char);
21.
procedure
ButtonlClicklSender: TObject);
22.
private
23.
1
Private declarations )
24.
public
25.
/ Public declarations }
26.
end
;
27.
var
28.
Forml: TForml;
29.
implementation
30.
1
$R
*.dfm}
31.
// нажатие клавиши в поле Расстояние
32.
procedure
TForml
.
EditlKeyPress(Sender: TObject;
var
Key: Char);
33.
begin
34.
if
Key = Char(VK_RETURN)
35.
then
Edit2
.
SetFocus
// переместить курсор в поле Цена
36.
else
If
not
IsFloat(Key,Edit2
.
Text)
then
Key := Chr(O);
37.
end
;
38.
39.
// нажатие клавиши в поле Цена
40.
procedure
TForml
.
Edit2KeyPress(Sender: TObject;
var
Key: Char);
41.
begin
42.
if
Key = Char(VK_RETURN|
43.
then
Edit3
.
SetFocus
// переместить курсор в поле Потребление
44.
else
If
not
IsFloat(Key,Edit2
.
Text)
then
Key := Chr(O);
45.
end
;
46.
// нажатие клавиши в поле Потребление
47.
procedure
TForml
.
Edit3KeyPress(Sender: TObject;
var
Key: Char];
48.
begin
49.
if
Key = Char(VK_RETURN)
50.
then
Buttonl
.
SetFocus
// // сделать активной кнопку Вычислить
51.
else
If
not
IsFloat(Key,Edit2
.
Text)
then
Key := Chr(O);
52.
end
;
53.
// щелчок на кнопке Вычислить
54.
procedure
TForml
.
ButtonlClicklSender: TObject);
55.
var
56.
rast :
real
;
// расстояние
57.
cena :
real
;
// цена
58.
potr :
real
;
// потребление на 100 км
59.
summ :
real
;
// сумма
60.
mes:
string
;
61.
begin
62.
rast := StrToFloat(Editl
.
Text);
63.
eena := StrToFloat(Edit2
.
Text);
64.
potr := StrToFloat(Edit3
.
Text);
65.
summ := rast /
100
* potr * cena;
66.
if
CheckBoxl
.
Checked
then
67.
suiim ; = зшпт *
2
;
68.
mes := 'поездка на дачу
1
;
69.
if
CheckBoxl
.
Checked
then
70.
mes := mes +
' и обратно'
;
71.
mes := mes +
'обойдется в '
+ FloatToStrFfsumm,ffGeneral,
4
,
2
}
72.
+
' руб.'
;
73.
Label4
.
Caption := mes;
74.
end
;
75.
end
.
После добавления имени модуля в список модулей, используемых приложением, сам модуль нужно добавить в проект. Для этого из меню Project надо выбрать команду Add to Project и в открывшемся диалоговом окне — имя файла модуля. В результате добавления модуля к; проекту в окне редактора появится вкладка с текстом добавленного к проекту модуля.
Увидеть структуру проекта можно в окне Project Manager, которое появляется в результате выбора соответствующей команды из меню View. В качестве примера на рис. 6.3 приведена структура проекта Поездка на дачу.
После добавления модуля к проекту и включения его имени в список используемых модулей (инструкция uses) можно выполнить компиляцию программы.