L'utilizzo delle Procedure e delle funzioni utente

 


Le Procedure e le Funzioni hanno il grosso vantaggio di poter accorpare, all'interno di una singola porzione di codice, le funzionalità più comunemente utilizzate nel nostro programma, richiamandole al momento opportuno. Questo dà la possibilità di scrivere programmi più leggibili e più facili da manutenere in quanto la modifica di una routine può essere fatta una volta per tutte all'interno della Procedura e resa automaticamente disponibile a tutte le nostre applicazioni..
In Visual FoxPro, una procedura viene scritta con la seguente sintassi:

PROCEDURE myproc
* questo è un commento, ma potrebbe essere codice
ENDPROC

Normalmente una procedura contiene del codice che viene scritto per eseguire delle operazioni e delle funzioni che restituiscono dei valori. In Visual FoxPro, le Funzioni sono simili alle Procedure:

FUNCTION myfunc
* questo è un commento, ma potrebbe essere codice
ENDFUNC

Si possono includere Procedure e Funzioni in un programma a sé stante oppure, indifferentemente, alla fine di un normale programma che contiene già del codice. Nel secondo caso, però, Procedure e Funzioni devono necessariamente essere poste alla fine del file di programma, ovvero dopo di esse non è consentito scrivere altre istruzioni.

Nel caso in cui si decida di includere Procedure e Funzioni all'interno di un file a sé stante è necessario, per renderle accessibili agli altri programmi, utilizzare il comando SET PROCEDURE TO. Per esempio, nel caso in cui si accorpino le nostre funzioni nel file FUNPROC.PRG, dovremo utilizzare la seguente sintassi:
SET PROCEDURE TO funproc.prg

Richiamare una Procedura od una Funzione

Ci sono due modi per richiamare una procedura od una funzione dal nostro programma:

Ognuno di questi due metodi può essere impostato in maniera tale da inviare o ricevere valori dalla Procedura o dalla Funzione chiamate.

Inviare valori ad una Procedura o ad una Funzione


Per inviare valori alle procedure od alle funzioni, è necessario utilizzare l'istruzione parameters. La procedura mostrata di seguito, per esempio, accetta un singolo parametro:
PROCEDURE myproc( cString )
* La seguente linea mostra un messaggio
MESSAGEBOX ("myproc" + cString)
ENDPROC


Nota Inserendo i parametri tra parentesi nella riga di definizione di una funzione o di una procedura, per esempio PROCEDURE myproc(cString), indica che il parametro è una variabile locale, cioè accessibile solo dall'interno della procedura/funzione stessa.
E' anche possibile fare accettare dalla funzione o dalla procedura parametri locali utilizzando l'istruzione LPARAMETERS.

I Parametri funzionano allo stesso modo in una funzione. Per inviare un valore come parametro alla procedura o alla funzione si può utilizzare una stringa od una variabile che la contiene, come mostrato nell'esempio seguente:

Passare i parametri

Codice Commenti
DO myproc WITH cTestString
DO myproc WITH "test string"
Chiama una procedura e le passa una stringa di caratteri o una variabile.
myfunc("test string")
myfunc( cTestString )
Chiama una funzione e le passa la copia di una variabile contenente caratteri ed una stringa di caratteri.

Nota Richiamando una procedura od una funzione senza utilizzare il comando DO, il settaggio di UDFPARMS determinerà come tali parametri saranno passati. Per default, UDFPARMS è settato a 'VALUE', in questo modo viene trasferita una copia dei parametri. Utilizzando l'istruzione DO, viene utilizzato il parametro attuale (trasferimento per referenza), ed ogni modifica all'interno della procedura o della funzione, viene applicata al valore originale, in base al indipendentemente dall'impostazione di UDFPARMS.
E' possibile trasferire alla funzione o alla procedura più parametri contemporaneamente, separandoli l'uno dall'altro tramite delle virgole. Per esempio, la seguente procedura si aspetta di ricevere tre parametri: una data, una stringa di caratteri, ed un numero.
PROCEDURE myproc( dDate, cString, nTimesToPrint )
     FOR nCnt = 1 to nTimesToPrint
         ? DTOC(dDate) + " " + cString + " " + STR(nCnt)
     ENDFOR
ENDPROC

Questa procedura può essere chiamata utilizzando la seguente linea di codice:

DO myproc WITH DATE(), "Hello World", 10

Ricevere valori da una Funzione


Il valore restituito di default da una funzione è vero (.T.), ma utilizzando l'istruzione RETURN si può restituire valori di qualsiasi genere. Per esempio, la seguente funzione restituirà una data di due settimane successiva a quella passatale come parametro.
FUNCTION plus2weeks
PARAMETERS dDate
        RETURN dDate + 14
ENDFUNC


La seguente riga di codice memorizza il valore restituito dalla funzione, all'interno di una variabile:
dDeadLine = plus2weeks(DATE())

La tabella successiva elenca le varie modalità con cui si possono memorizzare o visualizzare i valori restituiti da una funzione:
Gestire i valori restituiti

Codice Commenti
var = myfunc( ) Memorizza in una variabile il valore restituito dalla funzione
? myfunc( ) Visualizza, nella finestra attiva, il valore restituito dalla funzione.


Verificare i parametri di una Procedura o di una Funzione

E' buona abitudine verificare che i parametri inviati alla nostra procedura o alla nostra funzione siano effettivamente come ce li aspettiamo. A tale scopo si può utilizzare la funzione TYPE( ) e la funzione PARAMETERS( ) per verificare il tipo ed il numero di parametri inviati alla funzione (o procedura).
Nell'esempio appena visto, si richiede di ricevere un parametro di tipo Data. Utilizzando la funzione TYPE( ) è possibile effettivamente verificare se tale parametro sia del tipo specificato.

FUNCTION plus2weeks( dDate )
    IF TYPE("dDate") = "D"
         RETURN dDate + 14
    ELSE
        MESSAGEBOX( "Devi fornire una data!" )
        RETURN { - - }
&& Restituisce una data vuota
    ENDIF
ENDFUNC

Nel caso in cui una procedura si aspetti un numero minore di parametri rispetto a quanti effettivamente ne riceve, Visual FoxPro genererà un messaggio di errore. Per esempio, nel caso si specifichino due parametri, ma si chiami la funzione con tre parametri, si otterrà un messaggio di errore. Nel caso in cui, invece, la procedura riceva meno parametri di quanti ne possa accettare, semplicemente inizializzerà a falso (.F.) quelli non esplicitamente ricevuti. Siccome non c'è sistema per vedere se l'ultimo parametro è stato settato a falso(.F.) od omesso, possiamo utilizzare la seguente procedura per verificare se sono stati inviati tutti i parametri richiesti:

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

Convertire il programma NUMONLY in una Funzione


NUMONLY.PRG, il programma di esempio che abbiamo esaminato precedentemente nella sezione Il processo della programmazione, può essere reso più flessibile creando una funzione contenente la parte di programma che rimuove i caratteri non numerici da una determinata stringa.
Procedura che restituisce un carattere numerico da una stringa






Codice Commenti
FUNCTION NumbersOnly( cMixedVal ) Dichiara la funzione, che accetta la stringa di caratteri.
cNumOnly = " "
     FOR nCnt = 1 TO LEN(cMixedVal)
         cCharacter = ;
         SUBSTR(cMixedVal, nCnt, 1)
         IF ISDIGIT(cCharacter)
             cNumOnly = ;
             cNumOnly + cCharacter
        ENDIF
     ENDFOR
Crea una stringa che contiene solo i caratteri numeri estratti dalla stringa originale.
     RETURN cNumOnly Restituisce la stringa appena calcolata (solo caratteri numerici).
ENDFUNC Fine della funzione.

In aggiunta, per permettere l'utilizzo del codice in svariate situazioni, questa funzione rende il programma più semplice da leggere:
SCAN
REPLACE FieldName WITH NumbersOnly(FieldName)
ENDSCAN

Oppure, ancora più semplicemente:
REPLACE ALL FieldName WITH NumbersOnly(FieldName)

L'utilizzo della programmazione di tipo procedurale (procedural programming), insieme a quella orientata agli oggetti (object-oriented programming) ed agli strumenti di sviluppo di Visual FoxPro può permettere la realizzazione di applicazioni Visual FoxPro assai versatili.

Traduzione Alessandro Bindi



© FoxPro e Visual FoxPro sono un marchi registrati da Microsoft Corporation

 

 
Febbraio 2002
 

FoxPro e Visual FoxPro® sono un marchi registrati da Microsoft Corporation

Fonte: "Programmers Guide Visual FoxPro®" di Microsoft© in lingua inglese.
Questa guida ha il solo scopo di fornire le indicazioni
per muovere i primi passi con questo bellissimo strumento.

 


dal 22 Giugno 1999
webmaster@foxitaly.com