Procedimientos y funciones definidas por el usuario
Los procedimientos y funciones permiten mantener en un único lugar el código que utiliza con frecuencia y llamarlo a través de su aplicación siempre que lo necesite. Esto hace que su código sea más fácil de leer y mantener, ya que en un procedimiento el cambio se realiza una sola vez, no varias veces como ocurre en un programa.
En Visual FoxPro, los procedimientos son similares a éste:
PROCEDURE myproc
* This is a comment, but it could be executable code
ENDPROC
Tradicionalmente, los procedimientos contienen código que usted escribe para realizar una operación y funciones que calculan y devuelven un valor. En Visual FoxPro, las funciones son similares a los procedimientos:
FUNCTION myfunc
* This is a comment, but it could be executable code
ENDFUNC
Puede incluir procedimientos y funciones en un archivo de programa distinto o al final de un archivo de programa que contenga código normal de programa. En un archivo de programa no puede tener código ejecutable de programa a continuación de los procedimientos y las funciones.
Si incluye sus procedimientos y funciones en un archivo de programa distinto, podrá hacer accesibles estos procedimientos y funciones desde su programa si utiliza el comando SET PROCEDURE TO. Por ejemplo, para un archivo llamado FUNPROC.PRG, utilice el siguiente comando en la ventana Comandos:
SET PROCEDURE TO funproc.prg
Llamar a un procedimiento o a una función
Hay dos formas de llamar a un procedimiento o a una función en sus programas:
Utilizar el comando DO. Por ejemplo:
DO myproc
–O bien–
Incluir detrás del nombre de la función un par de paréntesis. Por ejemplo:
myfunc( )
Cada uno de estos métodos puede ampliarse enviando o recibiendo valores desde el procedimiento o la función.
Enviar valores a un procedimiento o a una función
Para enviar valores a procedimientos o funciones se incluyen parámetros. Por ejemplo, el procedimiento siguiente acepta un solo parámetro:
PROCEDURE myproc( cString )
* The following line displays a message
MESSAGEBOX ("myproc" + cString)
ENDPROC
Nota Incluir los parámetros entre paréntesis en la línea de definición de un procedimiento o una función, por ejemplo
PROCEDURE myproc(cString)
, indica que el parámetro tiene alcance local al procedimiento o la función. También puede permitir que una función o un procedimiento acepte parámetros de alcance local mediante LPARAMETERS.
Los parámetros funcionan de manera idéntica en una función. Para enviar un valor como un parámetro a este procedimiento o a una función, podría utilizar una cadena o una variable que contuviera una cadena, como se muestra en la tabla siguiente.
Transferencia de parámetros
Código | Comentarios |
---|---|
|
Llama a un procedimiento y transfiere una variable de caracteres o una cadena literal. |
|
Llama a una función y transfiere una copia de una cadena literal o una variable de caracteres. |
Nota Si llama a un procedimiento o función sin usar el comando DO, la configuración de UDFPARMS controla cómo se transfieren los parámetros. De forma predeterminada, UDFPARMS se establece como VALUE, por lo que se transferirán copias de los parámetros. Cuando utilice DO, se empleará el parámetro real (el parámetro se transfiere por referencia) y cualquier cambio realizado en el procedimiento o en la función se reflejará en los datos originales, cualquiera que sea la configuración de UDFPARMS.
Puede enviar múltiples valores a un procedimiento o función si los separa mediante comas. Por ejemplo, el siguiente procedimiento espera tres parámetros: una fecha, una cadena de caracteres y un número.
PROCEDURE myproc( dDate, cString, nTimesToPrint )
FOR nCnt = 1 to nTimesToPrint
? DTOC(dDate) + " " + cString + " " + STR(nCnt)
ENDFOR
ENDPROC
Podría llamar a este procedimiento mediante la siguiente línea de código:
DO myproc WITH DATE(), "Hello World", 10
Recibir valores desde una función
El valor devuelto de forma predeterminada es verdadero (.T.), pero puede utilizar el comando RETURN para devolver cualquier valor. Por ejemplo, la siguiente función devuelve una fecha correspondiente a dos semanas después de la fecha que se ha pasado como parámetro.
FUNCTION plus2weeks
PARAMETERS dDate
RETURN dDate + 14
ENDFUNC
La siguiente línea de código almacena el valor devuelto desde esta función en una variable:
dDeadLine = plus2weeks(DATE())
En la tabla siguiente se muestran las formas en que puede almacenar o mostrar valores devueltos por una función.
Manipular valores devueltos
Código | Comentarios |
---|---|
|
Almacena en una variable el valor devuelto por la función. |
|
Imprime en la ventana de resultado activa el valor devuelto por la función. |
Comprobar parámetros en un procedimiento o en una función
Es conveniente comprobar que los parámetros enviados a su procedimiento o a su función son los que espera recibir. Puede utilizar las funciones TYPE( ) y PARAMETERS( ) para comprobar el tipo y el número de parámetros enviados a su procedimiento o a su función.
El ejemplo de la sección anterior necesita recibir un parámetro de tipo Date. Puede utilizar la función TYPE( ) para asegurarse de que el valor que su función recibe es del tipo adecuado.
FUNCTION plus2weeks( dDate )
IF TYPE("dDate") = "D"
RETURN dDate + 14
ELSE
MESSAGEBOX( "You must pass a date!" )
RETURN { - - } && Return an empty date
ENDIF
ENDFUNC
Si un procedimiento espera menos parámetros de los que recibe, Visual FoxPro generará un mensaje de error. Por ejemplo, si especificó dos parámetros pero llamó al procedimiento con tres parámetros, obtendrá un mensaje de error. Pero si un procedimiento espera más parámetros de los que recibe, los parámetros adicionales simplemente se inicializarán como falso (.F.). Puesto que no hay ninguna forma de decir si el último parámetro se estableció como falso (.F.) o se omitió, el siguiente procedimiento comprueba que se ha enviado el número correcto de parámetros:
PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable )
IF PARAMETERS( ) < 3
MESSAGEBOX( "Too few parameters passed." )
RETURN .F.
ENDIF
IF lIsInTable
REPLACE (cStoreTo) WITH (cNewVal)
ELSE
&cStoreTo = cNewVal
ENDIF
RETURN .T.
ENDPROC
Convertir el programa NUMONLY en una función
NUMONLY.PRG, el programa de ejemplo descrito en Construir un programa pequeño, puede hacerse más robusto y útil si crea una función para la parte del programa que elimina los caracteres no numéricos de una cadena.
Procedimiento de ejemplo para devolver caracteres numéricos de una cadena
Código | Comentarios |
---|---|
|
Principio de la función, que acepta una cadena de caracteres. |
|
Crea una cadena que sólo tiene los caracteres numéricos de la cadena original. |
|
Devuelve la cadena que sólo tiene caracteres numéricos. |
|
Fin de la función. |
Además de permitirle utilizar este código en múltiples situaciones, esta función mejora la legibilidad del programa:
SCAN
REPLACE FieldName WITH NumbersOnly(FieldName)
ENDSCAN
O, más sencillo aún:
REPLACE ALL FieldName WITH NumbersOnly(FieldName)
Vea también
Construir un programa pequeño | Funciones de tipo Character | Conceptos básicos de programación | Crear programas frente a entrar manualmente | Crear programas | TYPE( ) | PARAMETERS( ) | RETURN