Типы функций
Функция располагается в памяти по определенному адресу, ссылку на этот адрес можно присвоить некоторой переменной в качестве ее значения. Адрес, по которому функция расположена в памяти, используется при вызове функции. Так как некая переменная, которой ранее была присвоена ссылка на функцию, хранит адрес функции , то функция может быть вызвана при помощи этой переменной типа функции. Переменная типа функции позволяет также передавать ее другим функциям в качестве параметров. Чаще всего переменные типа функции используются для написания обработчиков событий.
Переменную типа функции можно задать несколькими способами:
- при помощи объявления синонима типа функция;
- при помощи присваивания ссылки на функцию.
Синтаксис
ТИП <имя типа> = ФУНКЦИЯ [<тип результата>:] @[<список параметров>];
При объявлении поля объектного типа или параметра обязательно использование синонима типа функции.
<имя переменной> = {<имя функции>}
Пример
ФУНКЦИЯ СТРОКА: Датастрока(ДАТА: дд)
РЕЗУЛЬТАТ = СТР(дд)
СООБЩЕНИЕ(РЕЗУЛЬТАТ)
КОНЕЦ_ФУНКЦИИ
ТИП А = ФУНКЦИЯ СТРОКА: @(ДАТА: д);
ФУНКЦИЯ Датарожд(А: м; СТРОКА: фамилия)
СООБЩЕНИЕ(фамилия + "родился" + м(27.12.1994))
КОНЕЦ_ФУНКЦИИ
ВЫЧИСЛИТЬ
ПЕРЕМ ф={Датастрока}
ф(27.12.1994)
ПЕРЕМ А: аа
аа={Датастрока}
Датарожд(аа, "Иванов")//как параметр другой функции
КОНЕЦ
При вызове метода по ссылке может возникать синтаксическая неоднозначность. Так как вызов метода происходит в контексте некоторого объекта, то при вызове метода объекта по ссылке компилятор понимает это как обращение к полю объекта, а не вызов метода. Пример ниже демонстрирует неоднозначноть вызова метода по ссылке и то, как ее избежать. Для вызова метода по ссылки(обработчика "размер") пришлось бы писать конcтрукцию вида САМ.САМ.размер(параметры), но так как язык И++ не позволяет обрабатывать такие синтаксические конструкции, то вводится дополнительная переменная "обр".
Пример
ТИП Диалог1(ДИАЛОГ)
[
ПОДМЕНА размер = {изм_размер}
ПОДМЕНА до_открытия = {до_откр};
...
]
ФУНКЦИЯ ЛОГИКА: Диалог1.изм_размер(ПЕРЕМ ДИАЛОГ: форма;
ЧИСЛО: старая_ширина; ЧИСЛО: старая_высота;
ЧИСЛО: новая_ширина; ЧИСЛО: новая_высота)
...
РЕЗУЛЬТАТ = ДА
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ ЛОГИКА: Диалог1.до_откр
...
ЕСЛИ @размер ТО
ПЕРЕМ обр = размер // нужно из-за неоднозначности синтаксиса вызова метода по ссылке
САМ.обр(САМ, ширина, высота, сохр_ширина, сохр_высота)
ОТЛАДКА(САМ.размер)
ОТЛАДКА(обр)
КОНЕЦ_ЕСЛИ
...
КОНЕЦ_ФУНКЦИИ