Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

5.4. Вложенные вызовы программ

Из любой программы можно вызвать программу, расположенную в другом файле.

Пусть в файле d:\Output.prg имеется следующий код:

&& Файл d:\Output.prg

? "x = ", x picture "99"

? "Квадратный корень из x равен ", y picture "9.9"

Вызовем, употребив команду DO, программу этого файла из программы файла d:\Prog1.prg, в котором записаны следующие строки:

&& Файл d:\Prog1.prg

store 25 to x

y = Sqrt(x)

? "Вывод результата выполняется программой файла d:\Output.prg"

&& Вывод данных

do d:\Output

Приведенный пример показывает, что определенные в программе Prog1 переменные видны и в программе Output другого файла, вызванной из Prog1.

Такие же свойства переменные программы Prog1 сохранят, если их объявить PRIVATE:

private x, y

store 25 to x

…

В то же время переменные основной программы (процедуры, функции), если они созданы как LOCAL, будут недоступны в других файлах или программных компонентах текущего файла.

Замечание. Создание переменных командами LOCAL и PUBLIC и объявление переменных PRIVATE может быть выполнено в любой строке программы. Нельзя, однако, менять статус переменной, например, с PUBLIC на LOCAL. В то же время переменные созданные как LOCAL или PUBLIC могут быть затем объявлены PRIVATE (но не наоборот).

Программа (процедура, функция) не должна вызывать без ограничений сама себя (явно или косвенно, то есть посредством другой программы). Если это правило нарушено, то VFP после некоторых вычислений обнаружит ошибку Allowed Do nesting level exceeded.

Замечание. Максимальное число DO-вложений равно 128.

В то же время рекурсии в VFP разрешены. Так, следующая программа печатает факториал заданного числа, вычисляемый рекурсивной функцией FACT( ):

&& Вызов рекурсивной функции FACT( )

store 5 to n

nFactorial = Fact(n)

? nFactorial && Напечатает: 120

function Fact(n)

if n = 0 then

return 1

else

&& Рекурсия: функция FACT( ) вызывает сама себя

return n * Fact(n – 1)

endif

endFunc

5.5. Создание констант и переменных

5.5.1. Константы

Константы разделяются на буквальные и именованные.

Буквальная константа – это одно из возможных значений данных. Например: 1.2, .T., "Дата и время" – буквальные константы числового, логического и символьного типов.

Именованная константа – это элемент языка, значение которого не может быть изменено на этапе выполнения программы.

Директива

#DEFINE CONSTNAME eExpression

определяет именованную константу CONSTNAME.

Константа создается и получает значение на этапе компиляции. Использование констант приводит к экономии памяти, снижению временных затрат и в ряде случаев к упрощению программы.

Параметр:

eExpression – выражение типа Character, Numeric, Currency, Date, DateTime или Logical. Всякий раз, когда константа CONSTNAME обнаруживается в выражении, вычисляется eExpression и полученный результат используется в качестве значения константы.

Замечания:

  1. Нельзя использовать в eExpression системные переменные, поскольку они не оцениваются на этапе компиляции.

  2. Имя константы должно отвечать тем же требованиям, что и имя переменной (см. разд. 5.5.2.2).

  3. Имя константы не должно совпадать с зарезервированным именем VFP (см. раздел Reserved words справки). Нарушение этого условия сделает невозможным употребление соответствующего средства VFP, например:

#define SQRT 4

&& Теперь функция SQRT( ) недоступна

? SQRT && Напечатает: 4

? Sqrt(4) && Вызовет ошибку

#undef SQRT

? Sqrt(4) && Напечатает: 2.00

Пример. Значение константы SOMECONST переопределяется.

#define SOMECONST x * Sqrt(y)

x = 2

y = 4

? SOMECONST && Напечатает: 4.00

x = 1

y = 9

? SOMECONST && Напечатает: 3.00

Созданная define-константа доступна только в породившей ее программе. Так, если константа определена в методе или обработчике события формы, то она доступна только в внутри этих процедур.

Однако если define-константа определена в Include-файле, и этот файл выбран для формы (Form – Include File…), то константа доступна во всех методах и обработчиках событий формы.

Значение define-константы нельзя изменить, например располагая ее имя в левой части оператора присваивания. Попытка изменения define-константы в результате присваивания ей значения приведет к генерации ошибки.

Директива

#UNDEF CONSTNAME

освобождает define-константу CONSTNAME.

После ее исполнение имя CONSTNAME воспринимается как имя несуществующей переменной.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]