Описание |
Ключевое слово Function определяет подпрограмму, которая возвращает значение.
Версия 1
Определяет функцию, которая просто возвращает определенный тип данных. Из функции может быть возвращено только одно значение.
Версия 2
Определяет функцию, которой передаётся один или более параметров, и возвращает определённный тип данных. Из функции может быть возвращено только одно значение.
Возвращаяемое значение передаётся, псевдо переменной Result. Delphi создает эту переменную для вас когда функция начинается, в соответствии с возвращаемым типом данных.
(В старом коде Паскаля, нужно было присваивать это значение переменной с таким же именем как и функция).
Когда функция определена в классе, её обычно называют Метод.
Когда используется директива Overload, одно и то же название функции может использоваться для более чем одна функция. Другие основные директивы по порядку даются здесь:
Reintroduce : Переопределяет функцию
Overload : Позволяет иметь одинаковые имена 2-м и более функциям
Virtual : Может быть переопределен в дочернем классе
Override : Переопределяет родительский метод класса
Abstract : Вызывает для осуществления дочерний клаcс
Версия 3
Определяет функцию как тип данных. Это позволяет функции быть переданным как параметр, и использоваться как переменная. Определение типов определяет только конфигурацию функции - а не название.
Переменная такого типа может быть назначена названию любой функции с той конфигурацией. Если назначено, то имя переменной может быть обработано, как будто это было имя функции. См. код примера.
Далее, опция Of Object все еще позволяет вам обращаться к объектному методу. Обращение к переменной такого типа ведёт себя, как будто вы вызвали объектный метод непосредственно. См. второй пример.
|
|
Похожие команды |
Abstract Определяет метод класса, осуществляемый только в подклассах
Const Начинает определение данных с установленными значениями
Out Идентифицирует стандартный параметр только для вывода
Override Определяет метод, который заменяет виртуальный родительский метод класса
Procedure Определяет подпрограмму, которая не возвращает значение
Result Переменная, используемая для хранения возвращаемого значения функции
Var Начинает раздела определения переменных
Virtual Позволяет методу класса быть отменённым в производных классах
Dynamic Позволяет методу класса быть заменённым в производных классах
| |
|
Пример кода : Простой пример |
// Полный код Модуля. // ----------------------------------------------------------- //
Вы должны поместить этот код в модуль с именем 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
|
|