Delphi справочник - Форум программистов - Навигация  
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z      По первой букве  
System     SysUtils     StrUtils     DateUtils     FileCtrl     ConvUtils     StdConvs     Math     Classes     Dialogs     Types     Variants    ПО Unit   Compiler directives     Directives     Keywords     Types     Variables     Constants     Functions     Procedures    По категории  

форум программистов

Основы Delphi
Function
Ключевое слово
Определяет подпрограмму, которая возвращает значение System unit
  
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 все еще позволяет вам обращаться к объектному методу. Обращение к переменной такого типа ведёт себя, как будто вы вызвали объектный метод непосредственно. См. второй пример.
Похожие команды
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
 


Оплата за обучение в Kata Academy только после твоего трудоустройства в IT, начни карьеру Middle Java-разработчика



Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки? Slurm подготовили для вас особенный продукт!





форум программистов


© Форум Delphi  |  Форум Pascal   |  Блог программистов   |  Исходники Delphi   |  Автор сайта  |  Ссылки   |  Английская версия