Struttura logica di un programma Tutti i programmi per computer prevedono tre operazioni principali: l input di dati (cioè l inserimento delle informazioni da elaborare) il calcolo dei risultati cercati (cioè l elaborazione dei dati in input) la visualizzazione dei risultati dei calcoli in output In Visual Basic il primo e l ultimo dei tre passi indicati (l input e l output dei dati) sono eseguibili tramite l interfaccia utente. È quindi importante progettare un interfaccia che accetti i dati e restituisca i risultati. Il secondo compito (l elaborazione) viene in genere portato a termine da una serie di istruzioni in Visual Basic; la scelta e l ordine di tali istruzioni sono determinati da un appropriato algoritmo, ossia una strategia logica e d ordine per trasformare i dati in ingresso nei dati in output desiderati. Componenti di un programma Visual Basic In Visual Basic un programma viene indicato con il termine progetto. Ogni progetto consiste in almeno due file separati: un file di progetto(con estensione.vbp), e un file di form (con estensione.frm). Alcuni progetti contengono molti file di form e altri tipi di file, come i moduli di classe (estensione.cls), i moduli di codice standard (estensione.bas) e i controlli ActiveX (estensione.ocx). L ambiente Visual Basic Per entrare nell ambiente Visual Basic si deve fare clic con il mouse sull icona del programma presente sul desktop: verrà aperto il gruppo di finestre mostrato in figura ()
Si può quindi accedere all area di lavoro per iniziare un nuovo progetto confermando l opzione di default Nuovo/EXE standard, oppure selezionando Nuovo progetto dal menu File. In alternativa si può aprire un progetto esistente attivando la scheda Esistente o la scheda Recente, quindi selezionando il progetto desiderato. Un altro modo ancora di aprire un progetto esistente è di scegliere il comando Apri progetto dal menu File, quindi selezionare il file da aprire. Se si sceglie di creare un nuovo progetto, viene visualizzato il seguente gruppo di finestre Finestra del Form Barra dei menu Finestra Gestione progetti Barra del titolo Barra degli strumenti Standard Casella degli strumenti Finestra di progetto Finestra proprietà Finestra Disposizione Form Si focalizzi l attenzione sulla finestra del form. Il form è la vera e propria finestra del programma che si realizzerà; lo si può immaginare come un contenitore dentro cui si inseriscono tutti i controlli di cui il programmatore avrà bisogno, per esempio: Finestre di testo, utili sia per la fase di input sia per la fase di output Pulsanti di comando; facendo clic con il mouse su di essi si avvierà l elaborazione vera e propria dei dati Finestre grafiche (picture box), utili per la restituzione grafica della fase di output
Etichette (label), utili, per esempio, per individuare in quale casella di testo inserire lo specifico dato o per sapere che tipo di output verrà visualizzato in una casella di testo generica. Picture Box Etichetta Casella di testo Pulsante di comando Si può selezionare un controllo dalla Casella degli strumenti e disporlo nella finestra del form con un doppio clic sull icona (così facendo quest ultima viene posta nel centro del form), oppure con un singolo clic sull icona stessa, seguito da un clic sull area in cui la si vuole posizionare: le dimensioni sono attribuite per trascinamento. Esempio di programma in Visual Basic Si supponga di dover realizzare un programma che riceve in fase di input due numeri reali e restituisce in fase di output la loro media aritmetica; alla luce di quanto detto all inizio possiamo fare la seguente distinzione: Fase di input: occorrerà inserire nel form due caselle di testo, una per ogni numero in ingresso, nonché due etichette per distinguere una casella di testo dall altra Fase di elaborazione dati: occorrerà un pulsante di comando che, una volta fatto clic su di esso, calcoli la media dei due numeri Fase di output: occorrerà una casella di testo all interno della quale venga visualizzata la media aritmetica, nonché un etichetta per indicare all utente che in questa casella di testo ci sarà l output. Riepilogando, andranno inseriti nel form tre caselle di testo, tre etichette e un pulsante di comando; terminato l inserimento il form apparirà come in figura.
Si supponga che in text1 e in text2 si inseriscano i due numeri (fase di input): bisognerà per prima cosa eliminare le diciture text1 e text2 e sostituire alle espressioni label1 e label2 le espressioni input1 e input2. Tali operazioni si eseguono nel seguente modo: Selezionare la casella di testo text1 con il mouse Andare nella finestra proprietà, selezionare la proprietà text e cancellarne l espressione text1 Prima Dopo
Risultato Analogo ragionamento si può seguire per le caselle di testo Text2 e Text3. Per quanto riguarda le etichette, una volta selezionate occorre andare nella finestra proprietà, selezionare la proprietà caption (caption è il nome dell oggetto sulla schermata del form, mentre name è il nome dell oggetto all interno del codice di calcolo) e digitare input1 per la prima etichetta e input2 per la seconda. Prima Dopo
Risultato Ripetendo lo stesso procedimento per Label2, Label3 (si scriverà Media), e rinominando il pulsante di comando Calcola Media (sempre facendo clic su di esso, andando in finestra proprietà e scrivendo in corrispondenza di Caption Calcola Media), si otterrà la seguente schermata Naturalmente l interfaccia grafica si può ancora migliorare: per esempio le etichette si possono avvicinare ulteriormente alle caselle di testo corrispondenti (basta selezionarle con il mouse e ridimensionarle manualmente); inoltre la dicitura delle etichette può essere allineata in maniera centrata (basta scegliere per ogni etichetta selezionata dalla finestra proprietà Alignment e
selezionare Center). Inoltre si possono anche diminuire le altezze di ogni casella di testo (sempre manualmente una volta selezionate con il mouse); si possono avvicinare tutti gli oggetti tra di loro con la stessa tecnica di selezione e trascinamento con il mouse. Si può anche aggiungere un pulsante di comando che si chiamerà Esci (quindi la sua Caption sarà Esci, seguendo ovviamente la stessa procedura effettuata per il pulsante di comando Calcola Media). Tale pulsante avrà, ovviamente, la funzione di far uscire l utente dal programma. Infine si può ridimensionare il form stesso (sempre con la stessa tecnica di selezione con il mouse e di trascinamento del lato orizzontale in basso). A questo punto bisogna iniziare la fase di progettazione vera e propria: bisogna far capire al programma che premendo il tasto Calcola Media esso deve effettivamente calcolare la media aritmetica dei due numeri immessi): facendo doppio clic su Calcola Media apparirà il codice relativo a tale pulsante. All interno di questa finestra la prima e l ultima linea di codice sono fornite automaticamente, separate da una linea bianca di spazio: i comandi effettivi vanno inseriti fra queste due linee. Si focalizzi l attenzione sull intestazione Command1_Click: nonostante il pulsante abbia come caption Calcola Media (cioè sul pulsante di comando si legge Calcola Media) all interno del codice conserva ancora Command1 (questa è la proprietà Name, cioè come si chiama il pulsante all interno del codice; per modificare anche la Name basta andare nella finestra proprietà, selezionare Name e scrivere una dicitura nuova). Inoltre dopo Command1 c è _Click: questo significa che l elaborazione comincia quando si fa click con il mouse sul pulsante Calcola Media (o Command1 facendo riferimento alla Name).
A questo punto si può aggiungere il seguente codice: La prima linea di codice inserita è una dichiarazione di variabile, la quale afferma che a e b sono variabili reali a doppia precisione; le rimanenti quattro linee di codice sono istruzioni di assegnazione, con le quali l informazione rappresentata dall elemento a destra dell uguale viene assegnata all elemento a sinistra dell uguale. Nella prima istruzione alla variabile a viene assegnato il Valore numerico (Val) di ciò che viene scritto (.text) nella casella di testo input1 (la cui Name è Text1); poiché ciò che si scrive nella casella di testo è una stringa di caratteri la funzione Val converte tale stringa in un valore numerico. Analogo ragionamento vale per la seconda istruzione di assegnazione; nella terza si scrive la definizione di media aritmetica tra due punti, mentre nella quarta istruzione il valore c (convertito in stringa tramite la funzione Str) verrà visualizzato nella casella di testo Media (la cui Name è Text3). Resta da inserire il codice per il pulsante Esci: seguendo le stesse modalità del pulsante precedente, basta aggiungere la riga di comando End dopo aver fatto doppio clic su di esso. Per l esecuzione del programma basta fare clic sul pulsante Avvia della barra degli strumenti Standard)
Pulsante Avvia Moduli e Routine I grandi programmi sono molto più maneggevoli se suddivisi in moduli, ciascuno dei quali contiene parti del codice che copre l intero progetto. Visual Basic supporta diversi tipi di moduli, per esempio: Moduli di form: contengono dichiarazioni, routine di evento (verranno definite in seguito) e varie informazioni relative ai rispettivi form e controlli. Essi sono memorizzati in file identificati dall estensione.frm. ogni volta che si aggiunge un nuovo form a un progetto e lo si salva, si crea un modulo di form separato (cioè un nuovo file.frm). Un nuovo form può essere creato selezionando Inserisci form dal menu Progetto di Visual Basic Moduli standard: contengono dichiarazioni e routine cui si può accedere da altri moduli, e sono memorizzati in file identificati dall estensione.bas. Possono essere creati selezionando Inserisci modulo dal menu Progetto di Visual Basic. Una routine, o procedura, è un insieme di comandi, di istruzioni che fanno compiere al programma delle azioni specifiche. I moduli molto estesi vengono di solito suddivisi in più routine, per diverse ragioni. Innanzitutto esse eliminano la ridondanza (cioè la ripetizione di un medesimo gruppo di istruzioni in differenti punti del programma), inoltre migliorano la leggibilità del programma componendolo in parti più piccole, più concise dal punto di vista logico. In seguito si analizzeranno: subroutine routine di evento funzioni SubRoutine Nella sua forma più semplice, una subroutine è scritta nel seguente modo: Sub nome_routine (argomenti). istruzioni. End Sub Il nome della routine (nome_routine) non può essere uguale a un nome di una costante o variabile presenti nel medesimo modulo. L elenco degli argomenti è opzionale; essi rappresentano l informazione che è trasferita nella routine dall istruzione chiamante (si veda successivamente l esempio per chiarimenti). Ogni argomento è scritto come una dichiarazione di variabile:
nome_argomento As tipo di dato Il tipo di dato può essere omesso se l argomento è un variant; argomenti multipli devono essere separati da virgole. Se non sono presenti argomenti, nell istruzione Sub deve apparire una coppia di parentesi vuota. Esempio di definizione di una subroutine che determina il più piccolo tra due numeri. Sub smallest (a,b) Dim Min If (a <= b) Then Min = a Else Min = b End if Text3.text=str(Min) End Sub Questa routine possiede due argomenti, a e b, entrambi variant. La routine confronta i valori dei due argomenti,determina quale valore è più piccolo, quindi lo mostra in una casella di testo (Text3 lo si capirà successivamente). Si noti che la variabile Min è una variant definita localmente nella routine. A una subroutine si può accedere da un punto qualsiasi dentro al modulo attraverso l istruzione Call: Call nome_routine (argomenti) La lista degli argomenti Call deve accordarsi con la lista degli argomenti nella definizione di routine per numero, ordine e tipo di dati. Tuttavia i rispettivi nomi possono essere differenti. Quindi se la definizione di routine include tre argomenti i cui dati sono rispettivamente di tipo single e integer, l istruzione Call deve pure contenere tre argomenti i cui dati sono di tipo single e integer. Tuttavia non occorre che i nomi degli argomenti siano uguali ai nomi degli argomenti nell istruzione Call; per esempio gli argomenti nella definizione di routine chiamati a, b potrebbero, dentro l istruzione Call, essere chiamati x e y. Quando si accede alla subroutine, i valori degli argomenti all interno della parte chiamante (i valori a cui fa riferimento l istruzione Call nome_routine (x,y)) diventano disponibili agli argomenti appartenenti alla stessa subroutine; quindi, i valori degli argomenti sono trasferiti dalla parte chiamante del programma alla subroutine. Inoltre se il valore di un argomento della subroutine viene modificato all interno di essa, la variazione sarà riconosciuta nella parte chiamante del programma (si veda l esempio successivo per maggiori chiarimenti). Esempio Si consideri un programma Visual basic che utilizzi la subroutine vista in precedenza; il programma determina il più piccolo tra due numeri e visualizza il risultato
Il codice relativo è il seguente: Quando l utente clicca sul pulsante Calcola minimo, si attiva la routine di evento Command1_click(). Questo comporta che i due valori inseriti nelle caselle di testo siano convertiti in valori numerici e assegnati alle variabili x, y. Questi valori vengono trasferiti alla subroutine Smallest tramite l istruzione Call. Nella subroutine smallest gli argomenti (cioè i valori di x e y nella routine di evento) sono indicati come a e b. La subroutine determina quale argomento rappresenta il minimo e lo mostra nella casella di testo relativa.
Routine di evento Le routine di evento dovrebbero essere a questo punto familiari: una routine di evento è uno speciale tipo di subroutine. Ad essa si accede attraverso alcune specifiche azioni, come cliccare su un oggetto (come un pulsante di comando) Funzioni Una funzione è simile a una subroutine, con un importante differenza: una funzione deve restituire un singolo dato!!! Ogni nome di funzione perciò rappresenta un dato e ad esso è associato un tipo di dato. Nella definizione di una funzione, al nome della funzione deve essere assegnato il valore da restituire, come se il nome della funzione fosse una ordinaria variabile Function nome_funzione(argomenti) As tipo di dato istruzioni nome_funzione = End Function Come per una subroutine, l elenco degli argomenti rappresenta l informazione trasferita nella routine di funzione dall istruzione chiamante: ogni argomento è scritto come una dichiarazione di variabile: nome_argomento As tipo di dato Esempio Definizione della funzione Fattoriale Function Factorial (n As Integer) As Long Dim i As integer Factorial =1 For i =1 to n Factorial=Factorial * i Next i End Function Ad una funzione si accede nel medesimo modo di una funzione di libreria (viste prima), scrivendo cioè il nome della funzione e i suoi argomenti come espressione. Pertanto, il nome della funzione (e i suoi argomenti) possono assegnati a un altra variabile. La lista degli argomenti nell accesso alla funzione deve accordarsi con la lista degli argomenti nella definizione di funzione per numero, ordine e tipo di dato. Come con le subroutine i nomi degli argomenti nell accesso alla funzione possono essere differenti dai nomi degli argomenti usati nella definizione della funzione
Visibilità L ambito di visibilità si riferisce alla parte di programma in cui una routine (o una variabile o una costante) viene riconosciuta (cioè se una routine può essere usata da tutti i form oppure solo da quelli in cui essa è dichiarata a livello di codice, per esempio). La visibilità di una subroutine è determinata dall identificatore Public o Private che precede il nome della routine stessa: Public Sub nome_routine (argomenti) oppure Private Sub nome_routine (argomenti) Analogamente, la visibilità di una funzione è determinata tramite Public Function nome_routine (argomenti) As tipo di dato oppure Private Function nome_routine (argomenti) As tipo di dato A una routine Public si può accedere da qualsiasi modulo o form del programma, mentre una routine Private sarà riconosciuta solo all interno del modulo o del form in cui è definita. L impostazione predefinita è Public, quindi se una routine definita dal programmatore non include una specificazione Public/Private, si assume che sia Public. Occorre precisare che le routine di evento includono automaticamente la designazione Private quando sono create. Quando si accede a una routine Public da un modulo o form diverso da quello contenente la routine stessa, per accedere ad essa basta digitare nel codice: Call nome_form.nome_routine (argomenti) Analogamente si accede alle funzioni, con il nome del form contenente la definizione della funzione a precedere il nome della funzione: Variabile = nome_form.nome_funzione (argomenti) Le variabili e le costanti con nome che sono definite in una routine sono locali a quella routine. Tuttavia, le variabili e le costanti possono essere dichiarate dentro un modulo o form, esternamente a qualsiasi routine definita in quest ultimo (vedere esempio per maggiori chiarimenti). Tali variabili possono essere dichiarate Public o Private: Private nome_variabile As tipo di dato oppure Public nome_variabile As tipo di dato Nel primo esempio (Private), la variabile sarà riconosciuta in qualsiasi punto del modulo di form o standard in cui è dichiarata, ma non in altri moduli. A una variabile Public può essere fatto riferimento in altri moduli o form tramite : nome_form.nome_variabile Esempio Si voglia sempre costruire un programma che calcoli il minimo tra due numeri: questa volta si vogliono utilizzare due form, e si vuole dichiarare le variabili rappresentanti i due numeri in ingresso come Public. Inoltre si vuole utilizzare un modulo standard
Innanzitutto bisogna inserire il secondo form nel progetto: bisogna selezionare dal Menu Progetto Inserisci Form
A questo punto bisogna inserire anche il modulo standard (.bas) nel progetto. Tale modulo permette di riutilizzare il più possibile il codice già scritto, specie se i programmi si fanno più complessi. Per questo motivo spesso si memorizzano nei moduli le procedure e le funzioni, invece di lasciarle collegate a un form. Un modulo standard è il punto in cui si inserisce il codice che deve essere accessibile a tutte le parti di un progetto (come se fosse un form super partes ). Esso non ha componenti visive come i form e, come già detto, può essere sfruttato per riutilizzare il codice. Per l inserimento nel progetto di un modulo basta seguire la seguente procedura Si può notare come nei due menu a tendina ci sia la combinazione (generale)-(dichiarazioni): questa è la parte in cui bisogna dichiarare le variabili public; il codice completo è visualizzato nella pagina successiva.
Quando l utente preme su calcola minimo (una volta inseriti i dati) si avvia la routine di evento Command1_Click() del form1; essa tramite l istruzione Call richiama prima la routine di inserimento dati dal modulo1 e successivamente la routine smallest. Quest ultima, dopo aver calcolato il valore minimo, rende visibile il form2 tramite l istruzione form2.visibile=true e inserisce il valore del minimo nella casella di testo del form2. Se l utente preme nel form2 sul pulsante visualizza numeri si attiva la routine di evento Command2_Click(), la quale memorizza le variabili public sotto diverso nome per poi visualizzarle nelle due caselle di testo del form2. Il significato delle routine Command1_Click() del form2 e Command2_Click() del form1 appare ovvio!!! Lo studente verifichi per esercizio come la sostituzione del codice di Command2_Click() del form2 con: Form2.Text2.text=Str(x) Form2.Text3.text=Str(y) conduca allo stesso risultato!!!