Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема_2_6_FoxМодульность.doc
Скачиваний:
4
Добавлен:
05.05.2019
Размер:
92.67 Кб
Скачать

Процедуры-функции

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

Технически ПФ может быть реализована как внешняя, так и внутренняя процедура, но доступ к ней более простой - только по имени, которое может непосредственно включаться в команды, например, в команды: -STORE, REPLACE, IF, WHILE, CASE, DISPLAY, ?, LIST, @...SAY...GET...VALID.

После имени ПФ должны стоять обязательные для всех функций в FoxPro скобки - пустые-или с аргументами.

Внутренняя ПФ должна начинаться с команды

FUNCTION <Имя функции>

Если в ПФ передаются параметры, второй командой обязательно должна быть команда PARAMETERS.

Завершается ПФ командой RETURN вида RETURN <выр>, где <выр> является результатом функции. Если эта команда опущена, подразумевается RETURN .Т. .

FoxPro не делает различий между процедурами и процедурами-функциями. К ПФ можно обращаться и как к процедуре - командой DO. В этом случае при возврате в исходную программу значение <выр> в команде RETURN игнорируется.

Пример. Положим, требуется создать ПФ, выясняющую максимальное значение из двух произвольных величин Х и Y. Назовем ПФ именем MAXIMUM. Очевидно, она должна иметь два аргумента:

MAXIMUM(x,y).

Такая функция может быть реализована в виде внешней (см. ниже слева) или внутренней процедуры с именем MAXIMUM (справа) или входить в некоторый процедурный файл, который до первого к ней обращения должен быть открыт командой SET PROCEDURE.

*-Модуль MAXIMUM. PRG-- *-Процедура-функция MAXIMUM PARAMETERS a,b FUNCTION maximum RETURN IIF(a>b,a,b) PARAMETERS a,b

RETURN IIF(a>b,a,b)

Формальные переменные в обоих случаях - это переменные А,В. Командой RETURN "наружу" сразу передается результат, который замещает имя функции.

ПФ могут замещать практически любые <выражения>, присутствующие в командах/функциях FoxPro. При этом важно, чтобы команда RETURN возвращала из ПФ значение допустимого в данном случае типа (символьного, числового, логического, даты). Если возвращать ничего не нужно, должно быть указано хотя бы пустое (для данного типа) значение. Так, если в команде, ссылающейся на функцию, задано <вырС>, команда RETURN должна вернуть текстовое значение или хотя бы нулевую строку (RETURN ").

Ниже приведен пример программы, в которой используются разные реализации ПФ. Здесь предъявляются на редактирование три поля из базы KADR.DBF. ПФ используются для сопровождения команд @...GET подсказками. Такие подсказки (MESSAGE-сообщения) организуются с помощью опций MESSAGE <вырС>. Для поля FAM сообщение о необходимости ввода фамилии прописными буквами прямо включено в команду @...GET как константа. Для поля POL подсказка реализуется в функции PL(). Для поля PODR (подразделения) подсказка имеет более сложную структуру - это перечень всех подразделений предприятия, выведенный в специальное окно PD с помощью команды LIST. Поскольку функция никаких параметров не возвращает, после слова RETURN стоят только два апострофа. Это обеспечивает передачу назад переменной строкового типа. Если опустить этот аргумент или все слово RETURN, будет возвращено по умолчанию RETURN .t., что вызовет ошибку и прерывание. В целях деактивации окна PD при покидании поля PODR в опции VALID используется ПФ DEAC(). Так как аргументом опции является выражение логического типа (<ВыpL>), то команду RETURN можно опустить, поскольку RETURN .t. нас вполне устраивает.

SET TALK OFF

USE kadr IN a 6& Открытие баз данных

USE podr IN b

SET HEADING OFF && Подавление заголовка в команде LIST

DEFINE WINDOW pd FROM 1,50 TO 23,68 6& Окно для команды LIST

CLEAR

@ 1,2 SAY 'Фамилия' GET fam MESSAGE 'Заглавными буквами'

@ 3,2 SAY 'Пол' GET pol MESSAGE pl()

@ 5,2 SAY 'Подразделение' GET podr MESSAGE pd() VALID deac()

RE'AD CYCLE

FUNCTION pi &6---------------Фуккция подсказки для поля POL

RETURN 'Введите М ипи Ж' 6& Возврат результата

FUNCTION pd 66--------------Фунхция подсказки для поля PODR

ACTIVATE WINDOW pd 66 Активация окна PD CLEAR

SELECT b 66 Переход в область В LIST b.podr OFF 66 Вывод всех подразделений ИЗ базы PODR. DBF SELECT a 66 Возвращение в область А RETURN '' 66 Возврат пустого слова

FUNCTION deac 66---——--——-———---Функция деактивации окна DEACTIVATE WINDOW pd

Параметры, передаваемые в функцию через команду PARAMETERS, хотя и могут изменяться внутри функции, в вызывающей программе останутся неизменными, поскольку они передаются "по значению". Способом передачи параметров управляет команда

SET UDFPARMS TO VALUE/REFRENCE

По умолчанию VALUE. Если мы хотим передать назад не только основной результат через команду RETURN, но и какие-то из измененных параметров, следует воспользоваться установкой REFRENCE ("до ссылке").

В процедуры и программы параметры всегда передаются "по ссылке", если только они не взяты в скобки, тогда - "по значению".