Ключевое слово Procedure определяет подпрограмму, которая не возвращает значение.
Версия 1: Определяет процедуру, которая работает без параметров.
Версия 2: Определяет процедуру, которой передаётся один или более параметров.
Когда
процедура определена в классе, ее обычно называют Методом. Пока
используется директива Overload, одно и то же имя может использоваться
больше чем в одной процедуре.
Reintroduce : Переопределяет подавленную функцию
Overload : Позволяет иметь одинаковые названия для 2 или более функций
Virtual : Может быть переопределен в дочернем классе
Override : Переопределяет родительский метод класса
Abstract : Вызывает дочерний класс для выполнения
Версия
3: Определяет процедуру как тип данных. Это позволяет процедуре быть
переданным как параметр, и использоваться как переменная. Определение
типов определяет только конфигурацию процедуры - а не название.
Переменной
данного типа можно присвоить имя любой процедуры с её конфигурацией.
Когда присвоено, имя переменной может быть обработано, как будто это
название процедуры. См. код примера.
Опция Of Object позволяет
Вам обращаться к объектному методу. Обращайтесь к переменной такого
типа, как будто Вы вызываете объектный метод непосредственно. См. второй
пример.
Пример кода : Простой пример
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;
interface
uses
// Модуль System не нуждается в определении
Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm} // Вложение определений формы
Procedure ShowSum(a, b : Integer);
var
total : Integer;
begin
// Сложение двух чисел
total := a + b;
// Показ суммы
ShowMessageFmt('%d + %d = %d',[a,b,total]);
end;
// Подпрограмма On Create основной формы - наша основная программа
procedure TForm1.FormCreate(Sender: TObject);
begin
// Показ суммы нескольких пар чисел
ShowSum(1,2);
ShowSum(245,62);
end;
end.
1 + 2 = 3
245 + 62 = 307
Пример кода : Иллюстрирование Procedure и Procedure type
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
// Сам класс формы
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// В строку функций
Procedure ShowMsg(msg : string);
begin
ShowMessage(msg);
end;
Procedure ShowLongMsg(msg : string);
begin
ShowMessage('Текст сообщения = '+msg);
end;
// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
type
TShowProc = Procedure(msg : string);
var
showProc : TShowProc;
begin
// Использование ShowMsg косвенно
ShowMessage('Используя ShowMsg косвенно :');
ShowMsg('Привет Мир');
// Использование процедуры ShowMsg непосредственно
ShowMessage('Используя ShowMsg непосредственно :');
showProc := ShowMsg;
showProc('Снова привет');
// Использоване ShowLongMsg косвенно
ShowMessage('Используя ShowLongMsg косвенно :');
showProc := ShowLongMsg;
showProc('Снова привет');
end;
end.
Используя ShowMsg косвенно :
Привет Мир
Используя ShowMsg непосредственно :
Снова привет
Используя ShowLongMsg косвенно :
Текст сообщения = Снова привет
Пример кода : Использование типа процедуры класса
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
// Определение простого класса
TSimple = class
private
name : string;
public
function GetName : string;
Procedure SetName(name : string);
constructor Create(name : string);
end;
// Сам класс формы
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Создание простого объекта
constructor TSimple.Create(name: string);
begin
// Save the passed string
self.name := name;
end;
// Возвращение простого имени
function TSimple.GetName: string;
begin
Result := name;
end;
// Назначение переданного имени
Procedure TSimple.SetName(name : string);
begin
self.name := name;
end;
// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
type
TNameProc = Procedure(name : string) of object;
var
simple : TSimple;
nameProc : TNameProc;
begin
// Создание простого объекта
simple := TSimple.Create('Brian');
// И установка имени
simple.SetName('New name');
// Показ имени объекта
ShowMessage('Имя сейчас = '+simple.GetName);
// Обращение к методу SetName
nameProc := simple.SetName;
// И установка имени
nameProc('Even newer name');
// Показ имени объекта
ShowMessage('Имя сейчас = '+simple.GetName);
end;
end.
Имя сейчас = New name
Имя сейчас = Even newer name