Процедуры в Delphi

Процедура — это разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух случаях:

  • когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
  • когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.

Объявление процедуры

В общем виде объявление процедуры выглядит так:

 

1.procedure Имя{var параметр1: тип1; ... var параметр К :тип К);
2.var
3.// здесь объявление локальных переменных
4.begin
5.// здесь инструкции процедуры
6.end;

 

где:

  • procedure — зарезервированное слово языка Delphi, обозначающее, что далее следует объявление процедуры;
  • Имя — имя процедуры, которое используется для вызова процедуры;
  • параметр К:— формальный параметр, переменная, которая используется в инструкциях процедуры. Слово var перед именем параметра не является обязательным. Однако если оно стоит, то это означает, что в инструкции вызова процедуры фактическим параметром обязательно должна быть переменная.

Параметры процедуры используются для передачи данных в процедуру, а также для возврата данных из процедуры в вызвавшую ее программу. В качестве примера в листинге 6.5 приведена процедура решения квадратного уравнения (которое в общем виде записывается так: ах2+ Ьх+ с—О).

У процедуры шесть параметров: первые три предназначены для передачи в процедуру исходных данных — коэффициентов уравнения; параметры x1 и х2 используются для возврата результата — корней уравнения; параметр ok служит для передачи информации о том, что решение существует.

Листинг 6.5. Процедура SqRoot

01.// решает квадратное уравнение
02.procedure SqRoot(a,b,c : realvar xl,x2 : realvar ok : boolean);
03./ a,ib,c — коэффициенты уравнения
04.xl,x2 — корни уравнения
05.ok = True — решение есть
06.ok = False — решения нет )
07.var
08.d : real// дискриминант
09.begin
10.d:= Sqr(b) - 4*a*c;
11.if d < 0
12.than
13.ok := False // уравнение не имеет решения
14.else
15.begin
16.ok := True;
17.xl := (-b + Sqrt(d)) / ;
18.x2 := (b + Sqrt(d)! / (2*a>;
19.end;
20.end;

 

Использование процедуры

Разработанную процедуру нужно поместить в раздел implementation, перед подпрограммой, которая использует эту процедуру.

Инструкция вызова процедуры в общем виде выглядит так:

 

Имя(СписокПараметров);

 

где:

  • имя — имя вызываемой процедуры;
  • Список параметров — разделенные запятыми фактические параметры.

Фактическим параметром, в зависимости от описания формального параметра в объявлении процедуры, может быть переменная, выражение или константа соответствующего типа.

Например, инструкция вызова приведенной выше процедуры решения квадратного уравнения может выглядеть следующим образом:

 

SqRoot(StrToFloat[Editl.Text), StrToFloat(Edit2.Text),
StrToFloat(Edit3.Text), kl,k2,rez);

 

Если в описании процедуры перед именем параметра стоит слово var, то при вызове процедуры на месте соответствующего параметра должна стоять переменная основной программы. Использование константы или выражения считается ошибкой, и компилятор в этом случае выведет сообщение: Types of actual and formal var parameters must be identical (ТИП фактического параметра должен соответствовать типу формального параметра).

В листинге 6.6 приведена программа решения квадратного уравнения, в которой используется процедура SqRoot. Окно программы представлено на рис. 6.2.

Листинг 6.6. Решение квадратного уравнения (использование процедуры)

 

02.unit SqRoot_;
03.interface
04.uses
05.Windows, Messages, SysUtils, Variants, Classes, Graphics/ Controls,
06.Forms, Dialogs, StdCtrls;
07.type
08.TForml = class (TForm)
09.Editl; TEdit;
10.Edit2: TEdit;
11.Edit3: TEdit;
12.Labell: TLabel;
13.Label2: TLabel;
14.Label3 : TLabel;
15.Label4r TLabel;
16.Buttonl ; TButton;
17.Label5 : TLabel;
18.procedure ButtonlClicklSender: TObject);
19.private
20.{ Private declarations }
21.public
22.I Public declarations }
23.end;
24.Var
25.Forml: TForml;
26. 
27.implementation
28.(SR *.dfm}
29.// решает квадратное
30.procedure 3qRoot(a,b,c : realvar xl, x2 : real; vai ok : boolean)
31.{ a,b,c — коэффициенты уравнения
32.xl,x2 - корни уравнения
33.ok=true - решение есть
34. 
35.ok = False — решения нет /
36.var
37.d : real// дискриминант
38.begin
39.d:= Sqr(b) - 4*a*c;
40.if d < 0
41.then
42.ok := False // уравнение не имеет решения
43.else
44.begin
45.ok ;= True;
46.xl := (-b + Sqrt(d)) / <2*a) ;
47.x2 := (h + Sqrt(d)] / (2*a);
48.end;
49.end;
50. 
51.procedure TForml.ButtonlClick(Sender: TObject)i
52.kl,k2: real// корни уравнения
53.rez: boolean// True —решение есть, False —решения нет
54.rues: string// сообщение
55.begin
56.SqRoot(StrToFloat(Editl.Text), StrToFloat(Edit2.Text),
57.StrToFloat(Edit3.Text), kl,k2,rez);
58.if rez then
59.mes ;= 'Корни уравнения1 + #13 +
60.'xl='+FloatToStrF(kl,ffGeneral,4,2)-t-#13+
61.'x2='+FloatTo3trF(k2,ffGeneral,4,2)-«-tl3
62.else
63.mes:= 'Уравнение не имеет решения';
64.labels.Caption := mes;
65.end;
66.end.
dle

Помоги проекту! Расскажи друзьям об этом сайте: