Abbiamo già avuto modo, nelle precedenti lezioni, di conoscere che cosa sono i form.
I form sono moduli perché contengono un insieme relativamente chiuso di informazioni e che possono essere inseriti all’interno di altri progetti.
I moduli form vengono infatti salvati da Visual Basic con estensione .frm: per utilizzare un form sviluppato inizialmente per il progetto “a”, all’interno del progetto “b”, sarà possibile inglobarlo nell’applicazione che stiamo sviluppando, scegliendo dal menù Progetto di Visual Basic la voce Inserisci form… provvedendo a specificare il file frm da aggiungere.
Le applicazioni più semplici, come quelle, per esempio, che abbiamo sviluppato finora, sono costituite da un unico modulo form; va tenuto ben presente, però, che non appena le finalità del programma da creare ed i requisiti per l’interfaccia utente aumentano complicando la situazione, sarà necessario utilizzare ben più di un modulo form. Basti osservare di quante finestre siano costituite le applicazioni software che utilizziamo tutti i giorni per renderci conto di quanto complessa possa essere un’applicazione.
Il programmatore sentirà quindi l’esigenza di attribuire un solido schema organizzativo al proprio progetto e dovrà far sì che il codice che inserisce all’interno dell’applicazione che sta sviluppando, possa essere il più possibile chiaro e soprattutto riutilizzabile.
Se infatti l’applicazione deve eseguire in più punti – o comunque diverse volte – le stesse operazioni è assolutamente sconsigliato riscrivere le stesse istruzioni ogni volta che risulti necessario utilizzarle. Il programmatore dovrà piuttosto organizzare tali istruzioni in subroutines o functions che consentano di richiamarle in modo semplice e rapido.
Supponiamo di avere a disposizione un macinacaffé.
Sappiamo tutti che inserendo dei chicchi di caffé nell’apposita vaschetta del macinacaffé ed avviando l’apposito meccanismo otteniamo caffé in polvere.
Conosciamo quindi ciò che inseriamo in entrata e il risultato, ovvero ciò che otteniamo in uscita (l’input e l’output): non ci interessa minimamente ciò che avviene all’interno del macinacaffé.
Subroutines e Functions si comportano esattamente come il macinacaffé.
Dopo aver scritto le istruzioni necessarie all’interno di una subroutine o di una function, ovvero dopo aver “creato” il meccanismo del macinacaffé, non ci preoccupiamo più di ciò che accade all’interno, ma provvediamo esclusivamente a specificare dei dati di input plausibili e a verificare l’ottenimento di valori di output altrettanto plausibili.
Le Functions, che d’ora in poi chiameremo Funzioni, utilizzando la traduzione italiana, sono porzioni ben definite di codice che ricevono in "input" uno o più elementi da elaborare e restituiscono, dopo l’esecuzione delle istruzioni previste, un certo risultato.
Le Subroutines sono anch’esse porzioni ben definite di codice ed anche ad esse possono essere eventualmente passati degli elementi da "trattare"; differiscono però dalle funzioni circa un aspetto molto importante: le subroutines non restituiscono mai un valore in modo esplicito, non forniscono mai un risultato.
Prima di formulare alcuni esempi di funzioni e subroutines in modo da chiarire meglio le idee, è necessario che il lettore cominci ad intuire che cosa sia un modulo standard.
Abbiamo poco fa parlato dei moduli form: il lettore sappia che in Visual Basic non esistono solo quelli.
Ogni modulo form – salvato con estensione .frm – tende infatti, per così dire, a fare vita a sé stante: le informazioni che ogni form include, le procedure, subroutines, funzioni, etc…, sono in genere atte alla risoluzione di problematiche più ristrette – rispetto all’intera applicazione di cui fanno parte – che solitamente si esauriscono all’interno del form stesso.
Moduli standard
Ci si renderà presto conto che nelle applicazioni di dimensioni più congrue, alcune parti di codice dovranno essere eseguite in vari form differenti. Le istruzioni necessarie per compiere una certa operazione non dovranno assolutamente essere copiate o riscritte in ogni form all’interno del quale debbano essere eseguite: basterà bensì "mettere in comune" il codice richiesto.
I moduli standard che vengono salvati da Visual Basic con estensione .bas servono proprio per tale scopo: all’interno di essi il programmatore potrà implementare tutto il codice che prevede debba essere eseguito in più punti all’interno dell’applicazione. Subroutines e funzioni contenute in moduli standard saranno eseguibili da qualunque form dell’applicazione.
Facciamo un esempio che riassuma quanto imparato finora.
Vogliamo implementare una procedura che consenta di centrare un form sullo schermo, qualunque sia la risoluzione utilizzata dall’utente e qualunque sia il personal computer sul quale verrà installata la nostra applicazione.
Si supponga che la nostra applicazione sia moderatamente complessa, quindi costituita, come il lettore potrà immaginare, da un buon numero di form.
Ogni form, allorquando esso venga mostrato a video, dovrà risultare perfettamente centrato.
E’ necessario perciò implementare la procedura che consenta di centrare il form, all’interno di un modulo standard bas.
Possiamo riutilizzare l’applicazione "Lista della spesa" sviluppata nella scorsa lezione: inseriamo all’interno del progetto listaspesa.vbp un modulo standard scegliendo dal menù Progetto la voce Modulo quindi l’icona Modulo.
Nella finestra Gestione progetti comparirà, sotto il form Principale, il modulo appena inserito.
Nella finestra del codice del modulo standard appena aggiunto, provvediamo ad inserire la procedura che consentirà di centrare un qualunque form.
Dato che si tratta di una procedura che deve ottenere "in entrata" esclusivamente il nome del form da centrare, ma non è necessario che restituisca alcunché "in uscita", l’utilizzo di una subroutine diviene la scelta più appropriata in questo caso.
Inseriamo allora il seguente codice:
Sub CenterForm(frm As Form)
On Error Resume Next
Dim iTop, iLeft As Integer
If frm.WindowState 0 Then Exit Sub
iTop = (Screen.Height - frm.Height) \ 2
iLeft = (Screen.Width - frm.Width) \ 2
If iTop And iLeft Then
frm.Move iLeft, iTop
End If
End Sub
Il modulo si presenterà come in figura:
Da qualunque form è ora possibile richiamare la subroutine CenterForm che consente di centrare il form specificato.
Apriamo la finestra del codice relativa al form Principale e portiamoci in corrispondenza dell’evento Form_Load: troveremo il codice inserito seguendo i suggerimenti della precedente lezione:
Prima di tutte le altre istruzioni inseriamo:
L’istruzione Call consente di trasferire il controllo a una subroutine o ad funzione. Nel nostro caso viene eseguita la subroutine CenterForm.
Me è una parola chiave che passa alla subroutine CenterForm il nome del form corrente (in questo caso Principale).
A Me potrà essere sostituito il nome del form da centrare.