Delphi-Help

Function

Печать
Рейтинг пользователей: / 0
ХудшийЛучший 

Function

Описание

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

Примечание

Авторизация



Счетчики