Процедура — это разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух случаях:
- когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
- когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.
Объявление процедуры
В общем виде объявление процедуры выглядит так:
1.procedure Имя{var параметр1: тип1; ... var параметр К :тип К);2.var3.// здесь объявление локальных переменных4.begin5.// здесь инструкции процедуры6.end;
где:
- procedure — зарезервированное слово языка Delphi, обозначающее, что далее следует объявление процедуры;
- Имя — имя процедуры, которое используется для вызова процедуры;
- параметр К:— формальный параметр, переменная, которая используется в инструкциях процедуры. Слово var перед именем параметра не является обязательным. Однако если оно стоит, то это означает, что в инструкции вызова процедуры фактическим параметром обязательно должна быть переменная.
Параметры процедуры используются для передачи данных в процедуру, а также для возврата данных из процедуры в вызвавшую ее программу. В качестве примера в листинге 6.5 приведена процедура решения квадратного уравнения (которое в общем виде записывается так: ах2+ Ьх+ с—О).
У процедуры шесть параметров: первые три предназначены для передачи в процедуру исходных данных — коэффициентов уравнения; параметры x1 и х2 используются для возврата результата — корней уравнения; параметр ok служит для передачи информации о том, что решение существует.
Листинг 6.5. Процедура SqRoot
01.// решает квадратное уравнение02.procedure SqRoot(a,b,c : real; var xl,x2 : real; var ok : boolean);03./ a,ib,c — коэффициенты уравнения04.xl,x2 — корни уравнения05.ok = True — решение есть06.ok = False — решения нет )07.var08.d : real; // дискриминант09.begin10.d:= Sqr(b) - 4*a*c;11.if d < 012.than13.ok := False // уравнение не имеет решения14.else15.begin16.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.interface04.uses05.Windows, Messages, SysUtils, Variants, Classes, Graphics/ Controls,06.Forms, Dialogs, StdCtrls;07.type08.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.private20.{ Private declarations }21.public22.I Public declarations }23.end;24.Var25.Forml: TForml;26. 27.implementation28.(SR *.dfm}29.// решает квадратное30.procedure 3qRoot(a,b,c : real; var xl, x2 : real; vai ok : boolean)31.{ a,b,c — коэффициенты уравнения32.xl,x2 - корни уравнения33.ok=true - решение есть34. 35.ok = False — решения нет /36.var37.d : real; // дискриминант38.begin39.d:= Sqr(b) - 4*a*c;40.if d < 041.then42.ok := False // уравнение не имеет решения43.else44.begin45.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)i52.kl,k2: real; // корни уравнения53.rez: boolean; // True —решение есть, False —решения нет54.rues: string; // сообщение55.begin56.SqRoot(StrToFloat(Editl.Text), StrToFloat(Edit2.Text),57.StrToFloat(Edit3.Text), kl,k2,rez);58.if rez then59.mes ;= 'Корни уравнения1 + #13 +60.'xl='+FloatToStrF(kl,ffGeneral,4,2)-t-#13+61.'x2='+FloatTo3trF(k2,ffGeneral,4,2)-«-tl362.else63.mes:= 'Уравнение не имеет решения';64.labels.Caption := mes;65.end;66.end.