Процедуры и функции в 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. |