Распечатать страницу

Процедуры и функции в Microsoft Visual FoxPro

« Назад

В PRG-файле вслед за основной программой можно поместить иной программный компонент – процедуру или функцию и вызвать ее из основной программы:

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

store 25 to x

y = Sqrt(x)

? "Вывод результата выполняется в процедуре Output( )"

&& Вызов процедуры Output( ); команда = может быть опущена

= Output( )

procedure Output

? "x = ", x picture "99"

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

endProc

Таким образом, на настоящий момент программа, размещенная в файле d:\Prog1.prg, состоит из двух программных компонентов – основной программы и процедуры Output( ).

Круглые скобки при таком вызове процедуры обязательны. И наоборот, круглые скобки должны быть опущены, если процедура вызывается при помощи команды DO:

&& Вызов процедуры Output( )

do Output

Таким образом, процедура может быть вызвана одним из следующих способов

= Output( )

Output( )

do Output

Кроме того, процедуру можно вызвать из выражения. Например команда

? VarType(Output( ))

содержит в качестве выражения вызов процедуры Output( ).

В выражении используется значение, возвращаемое процедурой (функцией). Если последний выполненный оператор программного компонента – это команда RETURN eExpression, то программный компонент вернет значение выражения eExpression, или .T. – в противном случае.

Число процедур и функций в программе произвольно. Выполним для примера вывод x и y соответственно в процедурах OutX( ) и OutY( ):

store 25 to x

y = Sqrt(x)

? "Вывод результата выполняется в процедурах OutX( ) и OutY( )"

&& Вызов процедур OutX( ) и OutY( )

OutX( )

OutY( ) 

procedure OutX

? "x = ", x picture "99"

endProc 

procedure OutY

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

endProc

Если переменная создана в процедуре или функции и не является глобальной (создана без употребления команды PUBLIC), то ее значение может быть возвращено в вызывающий программный компонент в результате употребления команды RETURN, например:

&& Обращаемся к функции ValueForX( ); возвращаемое значение присваиваем

&& частной переменной x

x = ValueForX( )

y = Sqrt(x)

function ValueForX

store 25 to xVal

&& Возвращаем значение переменной xVal в вызывающую программу

return xVal

endFunc

Переменная xVal, созданная в функции ValueForX( ), по умолчанию рассматривается VFP как PRIVATE. После выполнения функции ValueForX( ) все ее частные переменные освобождаются (удаляются из памяти).

В принципе, если в функции ValueForX( ) вместо имени xVal использовать имя x и объявить в функции ValueForX( ) эту переменную как глобальную, то оператор RETURN в функции можно опустить:

&& Обращаемся к функции ValueForX( )

&& В ней переменная x объявлена PUBLIC

ValueForX( )                       && или: do ValueForX

y = Sqrt(x)                          && Переменная x существует и равна 25

 

function ValueForX

                                            public x

                                            store 25 to x

endFunc

Первый вариант организации функции (с оператором RETURN) предпочтительнее.

Из примера видно, что в VFP к функции можно обратиться, не помещая ее в правую часть оператора присваивания. В общем случае к функции можно обращаться, так же как и к процедуре, следующими способами:

x = ValueForX( )

=ValueForX( )

ValueForX( )

do ValueForX

Функция, не имеющая команды RETURN eExpression, возвращает при вызове ее из выражения .T.

Таким образом, в VFP нет принципиальной разницы между процедурами и функциями.

Замечание. После выполнения основной программы ее PUBLIC и PRIVATE-переменные не освобождаются (остаются в памяти). При необходимости память можно от этих переменных очистить, употребив, например, команду CLEAR MEMORY или RELEASE.

Код, расположенный в PRG-файле, не имеющем команды PROCEDURE или FUNCTION, может быть загружен в память для последующего употребления, например в результате употребления команды SET PROCEDURE:

set procedure to d:\Prog1 additive

После этого к программе файла d:\Prog1.prg следует обращаться по имени Prog1, так же как и к процедуре, например:

do Prog1

Детали см. в описании команды SET PROCEDURE.

Таким образом, основная программа PRG-файла интерпретируется VFP как процедура (функция), и отличается от нее лишь отсутствием команды PROCEDURE (FUNCTION). Все остальные атрибуты процедуры (функции), такие, как параметры и возвращаемое значение, могут в основной программе присутствовать, например если имеется файл

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

lparameters lp1, lp2

if Pcount( ) = 2 then

                                            p1And2 = SumP1AndP2(lp1, lp2)

                                            ? p1And2

else

MessageBox("Передано меньше двух параметров!")

endif

function SumP1AndP2(p1, p2)

                                            return p1 + p2

endFunc

То после вызова

do d:\ProgAndFunc with 15, 20

будет напечатано число 35.

Для повторного вызова, поскольку файл загружен, достаточно употребить

ProgAndFunc(15, 20)

Если же основная программа файла содержит команду RETURN:

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

lparameters lp1, lp2

if Pcount( ) = 2 then

                                            return SumP1AndP2(lp1, lp2)

else

MessageBox("Передано меньше двух параметров!")

return .F.

endif

то для получения результата файл нужно предварительно загрузить, а затем вызвать как функцию:

set procedure to d:\ProgAndFunc

? ProgAndFunc(15, 20)      && Напечатает: 35

? ProgAndFunc( )               && Напечатает: .F.