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