1 Function Name : Return type; {Directives;}
2 Function Name(Parameters) : Return type; {Directives;}
3 type Name = Function{(Parameters)} : Return type {of object};
Ключевое слово Function определяет подпрограмму, которая возвращает значение.
Версия 1
Определяет функцию, которая просто возвращает определенный тип данных. Из функции может быть возвращено только одно значение.
Версия 2
Определяет функцию, которой передаётся один или более параметров, и возвращает определённный тип данных. Из функции может быть возвращено только одно значение.
Возвращаяемое значение передаётся, псевдо переменной Result. Delphi создает эту переменную для вас когда функция начинается, в соответствии с возвращаемым типом данных.
(В старом коде Паскаля, нужно было присваивать это значение переменной с таким же именем как и функция).
Когда функция определена в классе, её обычно называют Метод.
Когда используется директива Overload, одно и то же название функции может использоваться для более чем одна функция. Другие основные директивы по порядку даются здесь:
Reintroduce : Переопределяет функцию
Overload : Позволяет иметь одинаковые имена 2-м и более функциям
Virtual : Может быть переопределен в дочернем классе
Override : Переопределяет родительский метод класса
Abstract : Вызывает для осуществления дочерний клаcс
Версия 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} // Include form definitions
Function GetSum(a, b : Integer) : Integer;
begin
// Сложение двух чисел, и возврат этого значения
Result := a + b;
end;
// Подпрограмма On Create главной формы - наша основная программа
procedure TForm1.FormCreate(Sender: TObject);
var
total : Integer;
begin
// Показ суммы нескольких пар чисел
total := GetSum(1,2);
ShowMessageFmt('%d + %d = %d',[1,2,total]);
total := GetSum(62,444);
ShowMessageFmt('%d + %d = %d',[62,444,total]);
end;
end.
1 + 2 = 3
62 + 444 = 506
Пример кода : Иллюстрация function и function 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}
// В строке функций
Function MaxValue(a, b : Integer) : Integer;
begin
// Возвращение наибольшего из 2-х чисел
if a > b
then Result := a
else Result := b;
end;
Function MinValue(a, b : Integer) : Integer;
begin
// Возвращение наименьшего из 2-х чисел
if a
then Result := a
else Result := b;
end;
// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
type
TNumberFunc = Function(a, b : Integer) : Integer;
var
numberFunc : TNumberFunc;
a, b, c : Integer;
begin
// Использование функции MaxValue непосредственно
a := 3;
b := 6;
c := MaxValue(a, b);
ShowMessage('Прямой запрос к MaxValue :');
ShowMessageFmt('Max из %d и %d - %d',[a,b,c]);
// Теперь вызываем её косвенно
numberFunc := MaxValue;
c := numberFunc(a, b);
ShowMessage('Косвенный запрос к MaxValue :');
ShowMessageFmt('Max из %d и %d - %d',[a,b,c]);
// И вызываем её снова для функции MinValue
numberFunc := MinValue;
c := numberFunc(a, b);
ShowMessage('Косвенный запрос к MinValue :');
ShowMessageFmt('Min из %d и %d - %d',[a,b,c]);
end;
end.
Прямой запрос к MaxValue : :
Max из 3 и 6 - 6
Косвенный запрос к MaxValue :
Max из 3 и 6 - 6
Косвенный запрос к MinValue :
Min из 3 и 6 – 3
Пример кода : Использование типа функции класса
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем 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;
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
// Сохранение переданной строки
self.name := name;
end;
// Возвращение простого имени
function TSimple.GetName: string;
begin
Result := name;
end;
// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
type
TNameFunc = Function : string of object;
var
simple : TSimple;
nameFunc : TNameFunc;
begin
// Создание простого объекта
simple := TSimple.Create('Brian');
// Показываем имя объекта
ShowMessage('Имя обращённое непосредственно= '+simple.GetName);
// Теперь обращаемся к этому методу косвенно
nameFunc := simple.GetName;
// Показываем имя объекта
ShowMessage('Имя обращённое косвенно= '+nameFunc);
end;
end.
Имя обращённое непосредственно = Brian
Имя обращённое косвенно = Brian
|