Руководство разработчика

Типы функций

Функция располагается в памяти по определенному адресу, ссылку на этот адрес можно присвоить некоторой переменной в качестве ее значения. Адрес, по которому функция расположена в памяти, используется при вызове функции. Так как некая переменная, которой ранее была присвоена ссылка на функцию, хранит адрес функции , то функция может быть вызвана при помощи этой переменной типа функции. Переменная типа функции позволяет также передавать ее другим функциям в качестве параметров. Чаще всего переменные типа функции используются для написания обработчиков событий.

Переменную типа функции можно задать несколькими способами:

Синтаксис

ТИП <имя типа> = ФУНКЦИЯ [<тип результата>:] @[<список параметров>];

При объявлении поля объектного типа или параметра обязательно использование синонима типа функции.

<имя переменной> = {<имя функции>}

Пример

ФУНКЦИЯ СТРОКА: Датастрока(ДАТА: дд)
  РЕЗУЛЬТАТ = СТР(дд)
  СООБЩЕНИЕ(РЕЗУЛЬТАТ)
КОНЕЦ_ФУНКЦИИ

ТИП А = ФУНКЦИЯ СТРОКА: @(ДАТА: д);

ФУНКЦИЯ Датарожд(А: м; СТРОКА: фамилия)
  СООБЩЕНИЕ(фамилия + "родился" + м(27.12.1994))
КОНЕЦ_ФУНКЦИИ

ВЫЧИСЛИТЬ

  ПЕРЕМ ф={Датастрока}
  ф(27.12.1994)

  ПЕРЕМ А: аа
  аа={Датастрока}
  Датарожд(аа, "Иванов")//как параметр другой функции
  
КОНЕЦ

При вызове метода по ссылке может возникать синтаксическая неоднозначность. Так как вызов метода происходит в контексте некоторого объекта, то при вызове метода объекта по ссылке компилятор понимает это как обращение к полю объекта, а не вызов метода. Пример ниже демонстрирует неоднозначноть вызова метода по ссылке и то, как ее избежать. Для вызова метода по ссылки(обработчика "размер") пришлось бы писать конcтрукцию вида САМ.САМ.размер(параметры), но так как язык И++ не позволяет обрабатывать такие синтаксические конструкции, то вводится дополнительная переменная "обр".

Пример

ТИП Диалог1(ДИАЛОГ)
[
  ПОДМЕНА размер = {изм_размер}
  ПОДМЕНА до_открытия = {до_откр};
  ...
]
ФУНКЦИЯ ЛОГИКА: Диалог1.изм_размер(ПЕРЕМ ДИАЛОГ: форма; 
                                   ЧИСЛО: старая_ширина; ЧИСЛО: старая_высота; 
                                   ЧИСЛО: новая_ширина; ЧИСЛО: новая_высота)
  ...
  РЕЗУЛЬТАТ = ДА
КОНЕЦ_ФУНКЦИИ

ФУНКЦИЯ ЛОГИКА: Диалог1.до_откр
  ...
  ЕСЛИ @размер ТО
    ПЕРЕМ обр = размер // нужно из-за неоднозначности синтаксиса вызова метода по ссылке
    САМ.обр(САМ, ширина, высота, сохр_ширина, сохр_высота)
    ОТЛАДКА(САМ.размер)
    ОТЛАДКА(обр)
  КОНЕЦ_ЕСЛИ
  ...
КОНЕЦ_ФУНКЦИИ

См. также: