Por ejemplo, cuando pasas parámetros a una función puedes analizar el tipo de variable que se pasa y decidir un curso de acción:
GetInforme(lcPar1,lnPar2,llPar3,loForm)
Function GetInforme(xcpar1,xnPar2,xlPar3,xoForm)
if Vartype(xcPar1)#"C"
xcPar1=""
endif
if Vartype(xnPar2)#"N"
xnpar2=0
endif
if Vartype(xLpar3)#"L"
xLpar3=.F.
ENDIF
if vartype(xoForm)#"O"
xoForm=null
endif
Con esto, puedes llamar a la función con GetInforme(), donde los parámetros se definen por defecto.
La única complicación que tienes en este tema, es saber si se pasa un Array.
También te permite, en algunos casos, utilizar un solo parámetro, donde la respuesta dependerá del tipo de parámetro. Por ejemplo, en un Form secundario del que necesitas algún valor
*INIT del form
LPARAMETERS xntipo_oform
Addproperty(thisform,"frmCall",null)
do case
case vartype(xntipo_oform)="O"
thisform.frmCall=xnTipo_oform
case vartype(xntipo_oform)="N"
if between(xnTipo_oform,0,1)
thisform.WindowType=xnTipo_oform
endif
endcase
En este caso, el valor del parámetro puede ser la referencia del objeto form convocante (o de un objeto del form convocante) o puede ser la indicación que el formulario se vuelva Modal (1) ó Modeless (0).
Como está escrito, si se pasa cualquier otro valor, no hará nada.
Vartype() y en su caso ISNULL(), te permiten determinar si un procedimiento llega a un valor requerido.
Para el ejemplo del form, suponiendo que se pasa como referencia de objeto un TExtbox del formulario convocante que tiene que asumir un valor numérico:
* UNLOAD del form secundario
if !ISNULL(thisform.FrmCall)
thisform.frmCall.Value=nValor && valor determinado por el proceso
&& Si se convoca al como: DO FORM secundario with thisform.Text3
&& Thisform.FrmCall será la referencia al .TExt3 del convocante
endif
if thisform.Windowtype=1
Return nValor && funciona únicamente si se convoca al secundario como
&& do form secundario with 1 to lnValor
endif
Además de los parámetros puede que la necesites emplear si utilizas Arrays. Los Array pueden contener cualquier tipo de valor. A diferencia de un cursor, no tiene una estructura de campo, de modo que los datos pueden ser de diversos tipos.
for i=1 to alen(gaArray,1)
For j=1 to alen(gaArray,2)
do case
case vartype(gaArray[i,j])="C"
Messagebox("Character")
case vartype(gaArray[i,j]=="N"
Messagebox("Numérico")
case vartype(gaArray[i,j])="L"
Messagebox("Lógico")
case vartype(gaARray[i,j]="D"
mESSAGEBOX("Fecha")
case vartype(gaArray[i.j]="T"
Messagebox("Fecha Hora")
case vartype(gaARray[i,j]="O"
Messagebox("Objeto")
&& case ETc
ENDCASE
NEXT
NEXT