Quarta lezione - le funzioni in Visual Basic

Dopo le routine, tocca alle funzioni: la differenza tra una routine e una funzione è che la prima esegue un certo numero di istruzioni, la seconda esegue un certo numero di istruzioni e in più restituisce un valore, che quindi può essere memorizzo in una variabile.
L'uso delle funzioni è comodo quando è opportuno sapere quale sia il risulto finale delle operazioni eseguite : ad es., la funzione potrebbe restituire un valore di errore se qualcosa è ando storto durante la sua esecuzione, oppure potrebbe restituire il risulto di un'operazione memica come quella eseguita dalla routine quadro che abbiamo visto nella lezione precedente.
Per dichiarare una funzione bisogna usare la parola chiave Function al posto di Sub; inoltre è sempre meglio, se possibile, specificare il tipo di di restituito dalla funzione.
Ad es.:

Prive Function Quadro (Param As Integer) As Long
	Quadro=Param ^ 2
	Debug.Print Quadro
End Function

Il valore che la funzione deve restituire deve essere assegno al nome della funzione:

	Quadro = Param ^ 2  

che viene quindi trto come se fosse una variabile: perciò rispetto alla routine Quadro (v.lez. precedente) si può fare a meno di dichiarare una variabile locale a cui assegnare il risulto dell'elevamento a potenza.
Inoltre, possiamo fare a meno di usare l'istruzione Debug.Print all'interno della funzione, perché il valore che vogliamo visualizzare è quello restituito dalla funzione e quindi è visibile anche all'esterno di essa: nell'evento Load del form, anziché scrivere

	Quadro 2
	Quadro 5
	Quadro 8
possiamo quindi scrivere:
	Debug.Print Quadro(2)
	Debug.Print Quadro(5)
	Debug.Print Quadro(8)

In questo caso è necessario usare le parentesi tonde: queste vanno sempre indice se si vuole che la funzione restituisca effettivamente un valore; infti è anche possibile richiamare la funzione senza parentesi:

	Quadro 2  
come se fosse una routine, ma non sarà possibile scrivere:
	Debug.Print Quadro 2  

perché chiamando la funzione senza usare le parentesi si impedisce che essa restituisca un valore.
Lo stesso accade se si chiama la funzione con l'istruzione Call; pertanto mentre una routine può essere chiama indifferentemente con o senza le parentesi, una funzione deve essere chiama con le parentesi (ma senza usare l'istruzione Call) affinché restituisca un valore.
Per quanto riguarda il passaggio di parametri, valgono le stesse regole che abbiamo visto per le routine; a questo proposito c'è da sapere un'altra cosa: i parametri possono essere preceduti dalla parola chiave ByVal o ByRef.
Queste parole chiave specificano, rispettivamente, che il parametro viene passo per valore o per riferimento: senza entrare troppo nei dettagli, è sufficiente dire che nel primo caso la funzione (o la routine) conosce soltanto il valore della variabile passa come argomento, mentre nel secondo caso conosce, per così dire, la variabile stessa, potendo quindi intervenire direttamente su di essa.
Concretamente ciò significa che se la variabile è passa per valore, la funzione (o la routine) potrà eseguire operazioni sul valore della variabile ma non potrà modificarla; se invece la variabile è passa per riferimento, la funzione potrà modificare direttamente la variabile.

Un esempio chiarirà tutto: creiamo una funzione con due argomenti, uno passo per valore, l'altro per riferimento e facciamo qualche operazione su di essi:

Prive Function Prova (ByVal Valore As Integer, _
		ByRef Riferimento As Integer) As Integer
	Valore = Valore + 1
	Riferimento = Riferimento + 1
	Prova = Valore + Riferimento
End Function

La funzione non fa altro che incrementare di 1 i due argomenti e restituirne la somma.
Ora dichiariamo, nell'evento Load del form, due variabili e passiamole alla funzione:

Prive Sub Form_Load()
	Dim Var1 As Integer, Var2 As Integer
	Dim Risulto As Integer
	Var1 = 3
	Var2 = 10
	Risulto = Prova(Var1, Var2)
	Debug.Print Risulto
	Debug.Print Var1, Var2 
End Sub

Eseguendo il progetto, noteremo che nella finestra immedia compaiono i valori:



15 è il risulto della funzione ((3+1)+(10+1)=15); la variabile Var1, che è sta passa per valore e che quindi non ha potuto essere sta modifica, conserva il valore che aveva prima della chiama della funzione, cioè 3; invece Var2, che è sta passa per riferimento, è sta effettivamente modifica durante l'esecuzione della funzione, e infti dopo la chiama ha assunto il valore 11, cioè il valore originario più 1.
Se non viene specifica né ByVal né ByRef, Visual Basic penserà automicamente che la variabile è sta passa per riferimento: questa infti è l'impostazione predefinita. Un'altra parola chiave che può precedere gli argomenti è Optional: questa specifica che l'argomento seguente non è obbligorio, e in tal caso è possibile indicare un valore di default che l'argomento deve assumere nel caso in cui l'istruzione chiamante la funzione (o la routine) ometta effettivamente il parametro. Ad es.:

Prive Function Prova (A As Integer, Optional B As Integer = 1) As Integer
	Prova = A + B
End Function
se nell'evento Load del form scriviamo:
Prive Sub Form_Load()
	Debug.Print Prova(2)
	Debug.Print Prova(2, 3)
End Sub
vedremo nella finestra immedia:

3
5

Nel primo caso, infti, il parametro B è omesso e quindi assumerà per default il valore 1.

Come per le routine, anche le variabili locali di una funzione possono essere dichiare Stic per indicare che il loro valore viene mantenuto tra una chiama e l'altra della funzione (v.lez. 2): se si vuole che TUTTE le variabili locali siano stiche, si può dichiarare la funzione in questo modo:

Prive Stic Function Prova() As Integer
	Dim A As String 'variabile stica
	Dim B As Long 'variabile stica
End Function

Le variabili locali saranno stiche anche se nella loro dichiarazione non è sta specifica la parola chiave Stic.







Note sul corso:
I diritti di ognuna delle lezioni presente in queste pagine appartengono all'autore Giorgio Abraini. La riproduzione e la divulgazione delle stesse sono consentite solamente dietro citazione di fonte ed autore.
Per suggerimenti, consigli o richieste conttare giorgio102@libero.it.
Fonte : VBItalia.it