Guida a Visual Basic 6 1. Introduzione a Visual Basic 6 2. Interfaccia e ambiente di sviluppo 3. Le Form e gli oggetti di un modulo VB 4. Variabili, costanti, tipi di dato e operatori 5. Istruzioni condizionali 6. Istruzioni di iterazione 7. Gli Array 8. Funzioni e Sub 9. Gestione delle stringhe 10. Gestione delle date 11. Funzioni di conversione e Funzioni predefinite 12. Interazione con i database 1. Introduzione a Visual Basic 6 Visual Basic è un linguaggio di programmazione WUI (Windows User Interface) di casa Microsoft, abbastanza potente e molto semplice nella sintassi e nelle funzionalità, adatto quindi sia al neofita che allo sviluppatore professionista. Visual Basic, da ora in po semplicemente VB, nasce dal vecchio Basic, sempre di casa Microsoft, come versione avanzata con interfaccia visuale (da qui il suo nome attuale); il vecchio Basic, infatti, nasce e muore in ambiente DOS. VB è attualmente e definitivamente arrivato alla versione 6.0: la versione successiva, in uso da già qualche anno, fa parte della piattaforma .NET e pur conservando la maggior parte delle caratteristiche, può definirsi un linguaggio a se stante: VB è quindi differente da VB.NET. VB è un tipo di programmazione detta event driven, ovvero basata sugli eventi. Vedremo in seguito cosa vuol dire questa affermazione. VB è acquistabile col pacchetto Microsoft Visual Studio 6.0 oppure separatamente. Il prezzo varia spesso e con l'avvento di .NET è decisamente calato, ma non è certo accessibile a chi è solo un curioso, bensì a coloro che intendono fare della programmazione la propria professione. L'installazione del pacchetto completo o del singolo software è davvero semplice, è sufficiente seguire le istruzioni del Wizard di installazione, inserire i dati richiesti, il numero di serie del prodotto (in genere si trova all'interno della copertina del CD acquistato oppure su di un documento interno alla custodia) e lasciare che il Wizard faccia il resto. Al termine riavviare il sistema anche se non richiesto. Nel corso della guida impareremo come si compone l'ambiente di sviluppo, tratteremo le componenti principali del prodotto e della sintassi, impareremo a programmare ad eventi con l'utilizzo degli oggetti (Rif. capitoli successivi), impareremo a manipolare file di testo, XML e database Microsoft Access (preferibilmente versione 2000). Buona lettura! 2. Interfaccia e ambiente di sviluppo Una volta eseguita ed andata a buon fine l'installazione, per accedere all'ambiente di sviluppo di VB partire dal menu Start / Programmi / Microsoft Visual Studio 6.0 / Microsoft Visual Basic 6.0 la prima richiesta fatta da VB è di scegliere il tipo di progetto tramite la finestra documentata nell'immagine seguente: La voce selezionata per default è EXE standard ovvero un classico progetto VB. Non preoccupatevi delle altre voci, si tratta in un modo o nell'altro di componenti avanzati che tratteremo in una versione avanzata della guida. Confermate quindi, cliccando il tasto Apri la scelta di un nuovo EXE standard. L'interfaccia completa del programma, documentata con una serie di commenti aggiunti in rosso, è visualizzabile cliccando questo link. Probabilmente non tutte le definizione degli elementi dell'interfaccia saranno chiare a tutti immediatamente, ma prego i lettori di non preoccuparsi perchè ogni nozione sarà esaurita prima nel corso della guida. 3. Le Form e gli oggetti di un modulo VB Le Form sono gli elementi madre di un programma VB, o in generale di qualsiasi software di sviluppo e linguaggio di programmazione WUI. Si tratta di finestre molto comuni, classiche di Windows: un esempio è la finestra delle proprietà di Internet Explorer, oppure delle proprietà del Desktop, ecc... Su di una Form vengono posizionati i vari elementi per la manipolazione dei dati o per la realizzazione di applicazioni non basate su di un database. In questo paragrafo vedremo i principali oggetti (che chiameremo prevalentemente controlli) per la realizzazione di un modulo VB. Torniamo un attimo all'interfaccia di VB e guardiamo sulla sinistra dell'immagine la barra Generale in cui sono contenuti una serie di icone; da qui possiamo, con un doppio click o facendo il drag' n' drop (trascinamento) dell'icona sulla Form stessa, inserire controlli da manipolare via codice. Facciamo un semplice esempio che vede coinvolti i tre controlli più utilizzati in VB, ovvero la TextBox (casella di testo per l'inserimento di dati), la Label (semplice area in cui inserire descrizioni) ed il CommandButton (bottone di comando per l'esecuzione di una routine o di uno script VB). Si crei quindi un nuovo progetto EXE standard; dalla Finestra delle Proprietà sulla destra dell'IDE di sviluppo si vada a modificare la proprietà Name della Form e la si chiami frmPrimoProg. Prima di proseguire tengo a sottolineare la modalità di assegnazione dei nomi ai controlli delle Form ed alle Form stesse: si utilizza un suffisso in minuscolo e poi il nome da assegnare con la maiuscola iniziale; prego inoltre di assegnare alle Form ed ai progetti nomi significativi, per due buoni motivi: 1. in fase di progettazione è difficile cambiare un nome ad un controllo per via dei riferimenti che VB crea automaticamente in una serie di file di configurazione 2. per non trovarvi in difficoltà quando non sapere un controllo a che scopo lo avete creato se non riuscite ad identificarlo facilmente e subito da un nome che abia un senso logico Si modifichi inoltre la proprietà Caption (la scritta che compare sul titolo della Form) in "La mia prima Form!". Quelli che vedete cerchiati in rosso nell'immagine seguente sono rispettivamente i controlli per l'inserimento di una Label, di una TextBox e di un CommandButton. Inserite sulla Form uno per ognuno dei controlli descritti fino ad ottenere il seguente effetto in fase di sviluppo: Bisogna ammettere che cosi è piuttosto bruttina... va modificata un pochino! Cliccando una singola volta su un controllo sulla Form compaiono attorno al controllo i puntini blu di selezione ed è possibile modificarne le dimensioni. Inoltre si assegnino, dalla Finestra delle Proprietà, i seguenti nomi e le seguenti diciture testuali ai tre controlli: • • • TextBox o Name: txtTesto o Text: nessun testo Label o Name: lblRisultato o Caption: nessun testo CommandButton o Name: cmdEsegui o Caption: Esegui fino ad ottenere il seguente risultato: Direi che va già meglio :-) Passiamo ad un primo esempio di codice ed anche se farò riferimento ad elementi del linguaggio non ancora spiegati, ho la presunzione che anche il lettore meno avvezzo non avrà difficoltà a capire. Eccoci finalmente di fronte alla spiegazione di programmazione event driven, ovvero basata (letteralmente guidata) sugli eventi. Al click sul CommandButton verrà eseguito uno script VB: il click è l'evento! Si faccia doppio click sul CommandButton e si accederà al codice del bottone di comando, già composto dal seguente codice: Private Sub cmdEsegui_Click() End Sub In VB questa è una Sub che tratteremo più avanti. All'interno di questa Sub, che comunque è l'elemento madre di un programma o di una singola fase di un programma VB, andremo ad inserire il codice che verrà eseguito al click sul CommadButton: ' ' ' ' Questo è un commento! VB non esegue tutto ciò che è preceduto dal singolo apice ma lo tratta come un promemoria per lo sviluppatore Private Sub cmdEsegui_Click() If txtTesto.Text = "" Then lblRisultato.Caption = "Inserisci un testo" Else lblRisultato.Caption = txtTesto.Text End If End Sub Anche se non abbiamo ancora affrontato le istruzioni condizionali credo sia intuibile il fatto che il programma ragionerà cosi: se la casella di testo contiene un valore vuoto allora scrivi nella Label un messaggio che indichi all'utente di inserire un testo, oppure scrivi il contenuto della casella di teso. Per avviare il programma si faccia click sul pulsante Play cerchiato in rosso nell'interfaccia di VB, oppure si prema il tasto F5 sulla tastiera. Nei prossimi capitoli abbandoniamo un attimo le componenti visuali di VB per dedicarci al codice, alla sintassi ed agli elementi del linguaggio. 4. Variabili, costanti, tipi di dato e operatori Prima di passare alle fasi più divertenti del linguaggio è necessario dedicare un capitolo all'apprendimento delle componenti base del linguaggio. Le variabili sono delle aree di memoria virtuali che il programma va a occupare nel sistema operativo che lo esegue; la peculiarità delle variabili è che sono valori suscettibili a cambiamenti a seconda di condizioni, eventi, azioni degli utenti, ecc... Per dichiarare una variabile si usa la parola chiave Dim. Le costanti sono simili alle variabili, con la differenza che, come il termine lascia intuire, non sono aree di memorie suscettibili dinamicamente a cambiamenti e si utilizza, per la dichiarazione, la parola chiave Const. Se le variabili e le costanti sono praticamente la stessa cosa, con la differenza che le variabili sono suscettibili a cambiamenti e le costanti no, perchè si utilizza una sintassi differente per la dichiarazione? La risposta è semplice: Const occupa un'area di memoria inferiore rispetto a Dim, quindi si evita di sovraccaricare inutilmente il sistema. I tipi di dato sono elementi di VB che consentono di definire a priori se una variabile è di tipo numerico, stringa, ecc... Non è obbligatorio tipizzare una variabile, ma è consigliabile per il motivo che il programma non deve andare a sovraccaricare il buffer dell'interprete per stabilire come trattare un valore, sapendolo a priori grazie alla tipizzazione. Gli operatori sono simboli che vengono utilizzati per effettuare uguaglianze, operazioni matematiche, implementare condizioni avanzate, ecc... Facciamo un esempio di dichiarazione e tipizzazione di una variabile. Si crei un nuovo progetto EXE standard e si acceda al codice senza passare per il doppio click su un elemento della Form o sulla Form stessa, ma semplicemente dal menu Visualizza / Codice e si inserisca il seguente codice: Option Explicit Dim testo As String Dim numero As Integer in questo modo abbiamo le variabili testo di tipo stringa e numero di tipo numerico intero. La clausola Option Explicit serve a VB a sovraccaricare meno il buffer dell'interprete del programma in fase di localizzazione delle variabili. Si inserisca un CommandButton sulla Form e gli si assegni la proprietà Name cmdVariabili (a voi la scelta di modificarne la Caption, non importa, è solo un esempio) ed al doppio click si inserisca il seguente codice: Private Sub cmdVariabili_Click() testo = "Hello, World!" numero = 5 MsgBox testo, vbOKOnly, "Messaggio da VB" MsgBox numero, vbOKOnly, "Altro messaggio da VB" End Sub Si avvii il programma premendo F5 ed al click sul CommandButton verranno lanciate due finestre di messaggio consecutive: la prima stampa a video la variabile testo e la seconda stampa a video la variabile numero. Questo semplice esempio per sottolineare un aspetto molto importante: una variabile di tipo String va valorizzata tra doppi apici mentre una variabile di tipo Integer va valorizzata, solo con numeri, senza apici. Si cancellino le variabili testo e numero dalla parte generale del codice e si inseriscano le seguenti: Option Explicit Dim a As String Dim b As String Dim c As String Si cancelli il codice appena proposto dalla Sub cmdVariabili_Click() e si inserisca il seguente: Private Sub cmdVariabili_Click() a = "10" b = "5" c = a + b Debug.Print c End Sub Debug.Print lancia il risultato dell'operazione nella Finestra Immediata dell'ambiente di sviluppo che compare al volo all'esecuzione dello script. Abbiamo messo in pratica un esempio errato di calcolatrice, dato la somma delle variabili sarà 105 e non 15... come fare? Usiamo il tipo Integer! Si modifichi la parte generale del codice come segue: Option Explicit Dim a As Integer Dim b As Integer Dim c As Integer e la parte relativa alla Sub come segue: Private Sub cmdVariabili_Click() a = 10 b = 5 c = a + b Debug.Print c End Sub Ora è tutto ok! Concludiamo questo capitolo con una panoramica sugli operatori. • • • • Operatori di assegnazione = (uguale a...) < (minore di...) > (maggiore di...) <= (minore o uguale a...) >= (maggiore o uguale a...) <> (diverso da...) Operatori matematici + (effettua una somma) - (effettua una sottrazione) * (effettua una moltiplicazione) / (effettua una divisione) Operatori di stringa & (concatena due stringhe) + (concatena due stringhe ma si usa la &) Operatori logici AND (indica che due condizioni devono essere entrambe vere) OR (indica che solo una delle due condizioni dev'essere vera) 5. Istruzioni condizionali In un linguaggio di programmazione esistono strutture di controllo come le istruzioni condizionali che servono, come visto nei capitoli precedenti, a stabilire per l'appunto condizioni per scatenare una routine o un'altra a seconda del risultato della condizione. VB utilizza il costrutto If - Then - Else per effettuare controlli. La sintassi base è la seguente: If condizione Then espressione Else espressione alternativa End If Vediamo un esempio. Si crei un nuovo EXE standard e si assegni alla Form il Name frmIstrCond; si inserisca un CommandButton e lo si chiami cmdIstrCond. Nella parte generale si inserisca il seguente codice: Option Explicit Dim a As Integer Dim b As Integer e nella Sub il seguente codice: Private Sub cmdIstrCond_Click() a = 10 b = 10 If a = b Then Debug.Print "A è uguale a B" Else Debug.Print "A è diverso da B" End If End Sub Essendo A e B impostate entrambe a 10, il risultato sarà A è uguale a B. VB, come tutti i linguaggi di programmazione possiede una clausola per ampliare il raggio condizionale, ovvero ElseIf. Facciamo un esempio chiarificatore. Si inserisca nella Sub il seguente codce: Private Sub cmdIstrCond_Click() a = 10 If a = 10 Then Debug.Print "A è uguale a 10" ElseIf a < 10 Then Debug.Print "A è minore di" Else Debug.Print "A è diverso da 10" End If End Sub Il risultato sarà A è uguale a 10. Esiste un altro costrutto per la generazione di condizioni, il Select Case. La sintassi base è la seguente: Select Case condizione Case 0: espressione Case 1: espressione Case 2: espressione Case Else tutti gli altri End Select 0 1 2 casi Vedremo dei casi di studio col Select Case nei capitoli successivi. 6. Istruzioni di iterazione Le istruzioni di iterazione fanno parte delle istruzioni di controllo dei linguaggi di programmazione e servono, come il nome lascia ad intendere, a ripetere una fase del programma N volte finchè non si raggiunge la condizione stabilita dallo sviluppatore in modo statico o dinamico. Fanno parte delle istruzioni di iterazione, detti anche cicli, i costrutti • • • • For - Next For Each - Next While Do While - Loop Esaminiamoli singolarmente. Il ciclo For - Next ripete un'istruzione sulla base di una variabile di tipo Integer che parte da un valore predefinito, in genere zero (0) e si perpetua fino ad un valore maggiore, ad esempio nove (9) ripetendo quindi il ciclo da 0 a 9 per un totale di 10 ripetizioni. La sintassi base è la seguente: For inizio To fine espressione da ripetere N volte Next Vediamo un esempio concreto. Si crei un nuovo EXE standard e si inserisca sulla form un bottone di comando a cui assegnare il nome cmdFor ed una Label di nome lblFor. Consiglio di ingrandire un po la Label in altezza rispetto alle sue dimensioni di default, in modo da visualizzare correttamente il risultato. Nella parte generale del codice inserire il seguente codice: Option Explicit Dim i As Integer Nella Sub, invece, inserire il seguente codice: Private Sub cmdFor_Click() i = 0 For i = 0 To 9 lblFor.Caption = lblFor.Caption & i & vbCrLf Next End Sub Facciamo la conoscenza con l'elemento vbCrLf che rappresenta il ritorno a capo in VB. Se avessimo ciclato solo lblFor.Caption = lblFor.Caption & i avremmo avuto come risultato 0123456789 con l'utilizzo di vbCrLf avremo invece 0 1 2 3 4 5 6 7 8 9 Il ciclo For Each - Next si differenzia da For - Next per il motivo che il primo ricerca ogni occorrenza di un elemento in un elemento madre. La sintassi base è la seguente: For Each elemento In elementi espressione da ripetere N volte Next elemento Tratteremo questo ciclo più avanti nel corso della guida appena spiegati altri elementi, senza dei quali un esempio non avrebbe senso e rischierebbe, addirittura, di confondere le idee al lettore. Il ciclo While esegue un'istruzione (o un'espressione) fin quando una condizione è vera. La sintassi base è la seguente: While condizione espressione da ripetere N volte Wend Tratteremo approfonditamente While nel capitolo dedicato ai database. Il ciclo Do While - Loop si differenzia ben poco da While, quindi ci limiteremo a vedere un esempio sintattico e poi lo abbandoneremo: Do While condizione espressione da ripetere N volte Loop 7. Gli Array Si definisce Array un agglomerato di dati, statici o dinamici, archiviati in una variabile speciale in forma tabellare. Un classico esempio di Array è rappresentato dai giorni della settimana, ma vediamo prima un esempio sintattico teorico: Dim nome_array(numero_elementi) nome_array(0) = "valore" nome_array(1) = "valore" nome_array(2) = "valore" Si crei un nuovo EXE standard e si inserisca una Label di nome lblArr da ingrandire come nell'esempio del capitolo precedente, ed un bottone di comando da chiamare cmdArr. Si inserisca nella porzione generale il seguente codice Option Explicit Dim settimana(7) As String e nella Sub il seguente codice: Private Sub cmdArr_Click() settimana(0) = "Lunedi" settimana(1) = "Martedi" settimana(2) = "Mercoledi" settimana(3) = "Giovedi" settimana(4) = "Venerdi" settimana(5) = "Sabato" settimana(6) = "Domenica" ' Qui sotto richiameremo l'Array End Sub Ampliamo il codice con questa riga, da inserire sotto al commento: Debug.Print settimana(5) Il risultato sarà Sabato perchè si è puntato all'indice equivalente. Si inserisca poi, al posto della precedente riga, il seguente codice: Dim i As Integer i = 0 For i = 0 To UBound(settimana) lblArr.Caption = lblArr.Caption & settimana(i) & vbCrLf Next Dichiaro al volo una variabile che imposto come contatore ed effettuo un ciclo sulla lunghezza dell'Array UBound(settimana) restituisce la lunghezza di un Array. Stampo poi a video il risultato passando all'Array la variabile che fa da contatore che, come abbiamo visto nel capitolo precedente, assume un valore differente ad ogni iterazione del ciclo settimana(i) equivale a scrivere lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption = = = = = = = = "" lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption lblArr.Caption & & & & & & & settimana(0) settimana(1) settimana(2) settimana(3) settimana(4) settimana(5) settimana(6) 8. Funzioni e Sub Gli elementi madre di un programma, quelli a cui è delegato il compito di contenere e gestire le routine e gli script VB che vengono lanciati allo scatenarsi di un evento, sono le Funzioni e le Sub. Spesso non si fa molta distinzione tra questi elementi, dato che svolgono un ruolo abbastanza simile. La differenza tra loro è che una Funzione raccoglie una serie di operazioni, o script, che insieme formano una routine e restituisce un valore; una Sub è un programma all'interno di un programma e cosi via fino al software finale. Altra differenza è che solo una Sub viene chiamata allo scatenarsi di un evento, mentre una Funzione viene chiamata all'interno di una Sub al verificarsi di una data condizione o a prescindere. Sia le Funzioni che le Sub possono essere pubbliche o private: pubbliche quando sono visibili a tutto il programma ed a tutte le Form e generalmente vengono inserite in un modulo di classe esterno; private quando fanno parte della Form in cui nascono, vivono e muoiono. Si utilizzano le parole chiave Public e Private e se omesse VB da per scontato che si tratta di una Funzione o di una Sub privata. La sintassi di una Funzione pubblica è la seguente: Public Function NomeFunzione (argomento As tipo) istruzioni End Function La sintassi di una Funzione privata è la seguente: Private Function NomeFunzione (argomento As tipo) istruzioni End Function ed è possibile omettere la parola chiave Private. Sintatticamente parlando per eseguire una Sub non bisogna far altro che sostituire la parola chiave Function con Sub e chiudere il blocco con End Sub al posto di End Function. Per chiamare una Funzione o una Sub dall'esterno o all'interno di un'altra Funzione o Sub, basta far riferimento al nome e passare tra parentesi gli eventuali valori da assegnare agli argomenti (o parametri, o ancora variabili, che dir si voglia); è possibile utilizzare la parola chiave opzionale Call prima del nome della Funzione o Sub che sia. Facciamo un esempio tanto chiarificatore quanto inutile ai fini pratici della realizzazione di un programma. Si crei un nuovo EXE standard e si acceda al codice della Form dal menu Visualizza / Codice e si inserisca il codice per la seguente Funzione: Private Function Messaggio(testo As String) MsgBox testo End Function Alla Funzione Messaggio() passo la variabile testo di tipo String che rappresenta il testo del messaggio che lanceremo. Si acceda poi alla Funzione / evento Form_Load() semplicemente facendo doppio click in un punto qualsiasi della Form dalla visualizzazione struttura e si richiami la Funzione Messaggio() come segue: Private Sub Form_Load() Call Messaggio("Benvenuto!") End Sub In questa fase valorizzo la variabile testo inserendo materialmente il messaggio di benvenuto: il risultato sarà infatti una MsgBox con la scritta Benvenuto! 9. Gestione delle stringhe Sia questo che il prossimo capitolo entrano nel dettaglio del codice VB per imparare a gestire due elementi fondamentali per qualsiasi linguaggio di programmazione: la manipolazione delle stringhe e la gestione delle date. Iniziamo con le stringhe. VB dispone di una nutrita schiera di interessanti Funzioni per la manipolazione delle stringhe: capita in moltissimi programmi di dover sostituire determinati caratteri in una stringa, di dividere una stringa in più stringhe in base ad un determinato criterio, di controllare la lunghezza di una stringa, di farci restituire solo parte di una stringa, e tante altre esigenze che devono essere soddisfatte. Iniziamo con la Funzione Replace() che serve a sostituire caratteri all'interno di una stringa. Come vedremo più avanti parlando dei database, è importante, sia in fase di inserimento dei dati che in lettura, controllare che non ci siano all'interno di una stringa dei singoli apici... capita però che quegli apici siano lì nella stringa ad uno scopo: se ho un utente che si chiama D'Alessio non posso cambiargli il nome in DAlessio... insomma, non sono mica il responsabile dell'anagrafe! Posso però sostituire il singolo apice con due singoli apici in modo da non dar fastidio al database e far comparire comunque l'apice lì dove serve. La sintassi per una simile operazione è la seguente: Replace("D'Alessio", "'", "''") In pratica Replace() accetta i seguenti parametri: Replace(stringa, carattere da sostituire, carattere sostitutivo) Se ad esempio in una frase voglio sostituire un nome userò la Funzione Replace() come segue: Replace("Pippo è un personaggio Disney", "Pippo", "Pluto") ed eseguendolo con un Debug.Print Debug.Print Replace("Pippo ... riceverò la frase Pluto è un personaggio Disney. Passiamo alla Funzione Split(). Split() divide una stringa in un Array (Rif. capitolo 7) di stringa; prendiamo la seguente stringa: Luca#Ruggiero#Napoli ho una serie di dati quali nome, cognome e città di appartenenza, ma in una forma irregolare e teoricamente illeggibile e scorretta grammaticalmente. Il carattere cancelletto (#) presente nella stringa mi consente di avere un utile riferimento per dividere la stringa come meglio conviene. Si crei un nuovo EXE standard, si inserisca sulla Form una Label di nome lblSplit e si acceda alla Sub Form_Load(); nella parte generale si inserisca il seguente codice: Option Explicit Dim stringa As String Dim s() As String Dim i As Integer dove s() è una stringa di tipo Array che utilizzerò per lo Split(). Nella Sub, invece, si inserisca il seguente codice: Private Sub Form_Load() i = 0 stringa = "Luca#Ruggiero#Napoli" s = Split(stringa, "#") For i = 0 To UBound(s) lblSplit.Caption = lblSplit.Caption & s(i) & vbCrLf Next End Sub Utilizzando la sintassi Split(stringa, carattere di riferimento) otterrò in output sulla Label Luca Ruggiero Napoli Ricordo che, come un Array, il conteggio degli item parte da zero (0) fino ad N. Per controllare la lunghezza di una stringa esiste la Funzione Len() che accetta come parametro la stringa di cui, appunto, si vuole controllare la lunghezza. La sintassi è la seguente: Len(stringa) quindi Debug.Print Len("Luca") restituisce 4. VB possiede tre Funzioni l'una figlia dell'altra che serve ad eliminare gli spazi superflui sulla sinistra, sulla destra o sia sulla sinistra che sulla destra di una stringa. Le Funzioni sono rispettivamente LTrim() (Left Trim), RTrim() (Right Trim) e Trim(). La sintassi è analoga per tutte e tre le Funzioni ed il funzionamento è quello appena descritto; facciamo un esempio con Trim(); la sua sintassi è: Trim(stringa) quindi Debug.Print Trim(" Luca ") restituisce Luca senza gli spazi superflui. Le Funzioni Left(), Right() e Mid() servono rispettivamente ad isolare da una stringa un certo numero di caratteri specificati. Andiamo per ordine e vediamo come usufruire delle funzionalità di tutte e tre. Si crei un nuovo EXE standard e si inserisca nella parte generale il seguente codice: Option Explicit Dim stringa As String che useremo per gli esempi di tutte e tre le funzioni appena accennate. La sintassi di Left è la seguente: Left(stringa, numero di caratteri) Nel codice Form_Load() inseguire il seguente codice: Private Sub Form_Load() stringa = "lukeonweb.net" Debug.Print Left(stringa, 4) End Sub La stringa lukeonweb.net viene parserizzata da Left() e restituisce solo i primi 4 caratteri, ovvero luke. Il seguente codice illustra l'utilizzo della Funzione Right() Private Sub Form_Load() stringa = "lukeonweb.net" Debug.Print Right(stringa, 4) End Sub Il risultato è .net. In pratica Left() prende N caratteri specificati come secondo parametro tra parentesi a partire dalla sinistra della stringa, mentre Right() parte dalla destra. Mid() invece non considera N caratteri a partire da sinistra ed N caratteri a partire da destra; un esempio: Private Sub Form_Load() stringa = "lukeonweb.net" Debug.Print Mid(stringa, 5, 5) End Sub Il risultato è onweb. Le stringhe possiedono ancora moltissime Funzioni, ma quelle spiegate in questo capitolo sono essenziali per affrontare la programmazione VB; rimando la spiegazione di altre Funzioni ad un corso più avanzato o ad un corso professionale. 10. Gestione delle date La gestione delle date riveste un ruolo molto importante nell'ambito di un qualsiasi programma. VB mette a disposizione dello sviluppatore una serie di semplici e potenti Funzioni; elenchiamole: • • • • • • • • • • Date - restituisce la data in formato gg/mm/aaaa Time - restituisce l'orario in formato oo.mm.ss Now - restituisce la data e l'orario in formato gg/mm/aaaa oo.mm.ss FormatDateTime - restituisce vari formati della data anche in formato alfanumerico Day - restituisce il giorno della settimana accettando un oggetto Date Month - restituisce il mese dell'anno accettando un oggetto Date Year - restituisce l'anno accettando un oggetto Date Hour - restituisce l'ora accettando un oggetto Time Minute - restituisce i minuti accettando un oggetto Time Second - restituisce i secondi accettando un oggetto Time Facciamo qualche esempio: Debug.Print Date ' restituisce 31/10/2004 Debug.Print Time ' restituisce 15.00.00 Debug.Print Now ' restituisce 31/10/2004 15.00.00 Debug.Print FormatDateTime(Date, vbLongDate) ' restituisce domenica 31 ottobre 2004 Debug.Print Day(Date) ' restituisce 31 Debug.Print Month(Date) ' restituisce 10 Debug.Print Year(Date) ' restituisce 2004 Debug.Print Hour(Time) ' restituisce 15 Debug.Print Minute(Time) ' restituisce 00 Debug.Print Second(Time) ' restituisce 00 11. Funzioni di conversione e Funzioni predefinite VB mette a disposizione dello sviluppatore una serie di Funzioni predefinite, alcune definite di conversione, che servono a convertire un tipo di dato in un'altro tipo, ed altre per la risoluzione di alcune problematiche in maniera semplice, veloce e potente. In questo capitolo affronteremo le principali. Le Funzioni di conversione più famose sono CInt() e CStr() che convertono un dato rispettivamente in formato Integer ed in formato String. La sintassi è la seguente Dim numero As String numero = "5" ' è un numero ma in formato stringa CInt(numero) ' restituisce numero = 5 Esistono altre Funzioni di conversione come CBool() che converte un dato in valore booleano, ovvero che restituisce True o False; CDate() che converte una stringa in una data; CCur() che converte un numero in formato valuta, ed altre. Alcune Funzioni predefinite di VB molto comode sono FormatNumber() che separa con un punto le migliaia Debug.Print FormatNumber(1000, 0) ' restituisce 1.000 FormatCurrency() che restituisce un numero con il simbolo dell'euro Debug.Print FormatCurrency(1000, 1) ' restituisce 12. Interazione con i database VB è nato principalmente per la creazione di potenti interfacce che permettono la gestione locale o via rete (NON Internet) di dati residenti su una fonte di dati quale un database. Essendo un prodotto di casa Microsoft, VB preferisce lavorare con prodotti (DBMS, ovvero gestori di database) Microsoft come Access e SQL Server, ma lavora correttamente anche con DBMS di case differenti come Oracle. In questo capitolo ci baseremo sull'interazione con Access, preferibilmente versione 2000 e do per scontato che il lettore abbia almeno un'infarinatura di base di SQL. Per la connessione con una fonte di dati e la gestione dei dati ivi residenti, VB utilizza l'oggetto ADO (ActiveX Data Object) per l'interfacciamento tra il programma e la fonte di dati stessa. ADO mette a disposizione, tra l'altro, due oggetti fantastici, ovvero Connection per la gestione della connessione ed altre utility, e Recordset per la gestione fisica dei dati. Si crei un nuovo EXE standard e si acceda al menu Progetto / Riferimenti... per l'importazione dei riferimenti ad ADO, selezionando le voci come nell'immagine seguente: Si nomini la Form frmDatabase, si inseriscano due Label con Caption Nome e Cognome (non preoccupatevi di cambiare la proprietà Name) e due TextBox in cui svuotare la proprietà Text e modificare i nome come txtNome e txtCognome. Si aggiunga poi un CommandButton da nominare cmdInserisci e modificare la Caption in Inserisci. Questa Form ci consentirà di effettuare inserimenti nel database Access ce creeremo tra poco; l'immagine seguente mostra il risultato finela della Form: Si salvi il progetto dal menu File / Salva progetto con nome... nella cartella test da creare sotto il drive C: C:\test All'interno di questa cartella troverete fei file di progetto creati automaticamente da VB; aggiungete in questa cartella il file Access database.mdb al cui interno creare la tabella utenti in cui inserire i campi id (Contatore), nome (Testo) e cognome (Testo); appena espletata questa operazione tornare sulla Form in visualizzazione struttura, accedere al codice della Form ed inserire queste righe nella parte generale: Option Explicit Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim stringa As String I tipi di dato ADODB.Connection ed ADODB.Recordset sono stati aggiunti a VB per mezzo dell'importazione dei riferimenti come accennato in precedenza. Doppio click sul CommandButto per accedere alla Sub in cui inserire il seguente codice: Private Sub cmdInserisci_Click() If Len(Trim(txtNome.Text)) = 0 Then MsgBox "Inserire il nome", vbCritical, "ERRORE" txtNome.SetFocus Exit Sub End If If Len(Trim(txtCognome.Text)) = 0 Then MsgBox "Inserire il cognome", vbCritical, "ERRORE" txtCognome.SetFocus Exit Sub End If stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" stringa = stringa & "C:\test\database.mdb" Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open stringa rs.Open "utenti", cn, 3, 3 rs.AddNew rs("nome") = txtNome.Text rs("cognome") = txtCognome.Text rs.Update Set cn = Nothing Set rs = Nothing MsgBox "Inserimento effettuato", vbOKOnly, "CONFERMA" End Sub A prima vista questo codice potrebbe destare qualche perplessità al lettore più inesperto, quindi affrontiamo le singole fasi della Sub. Controllo che i campi nome e cognome siano stati compilati correttamente, utilizzando l'espressione Exit Sub per uscire dalla Sub qualora le condizioni non siano state soddisfatte e non si vuol permettere la continuazione della routine: If Len(Trim(txtNome.Text)) = 0 Then MsgBox "Inserire il nome", vbCritical, "ERRORE" txtNome.SetFocus Exit Sub End If If Len(Trim(txtCognome.Text)) = 0 Then MsgBox "Inserire il cognome", vbCritical, "ERRORE" txtCognome.SetFocus Exit Sub End If A condizioni soddisfatte creo la stringa di connessione al database e la memorizzo nella variabile stringa: stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" stringa = stringa & "C:\test\database.mdb" Con la clausola Set imposto le variabili cn ed rs come nuove istanze degli oggetti Connection e Recordset: Set cn = New ADODB.Connection Set rs = New ADODB.Recordset Apro la connessione al database ed il Recordset in modalità scrittura, passando al metodo Open il nome della tabella su cui voglio lavorare, il nome della connessione che sto utilizzando ed i cursori appropriati: cn.Open stringa rs.Open "utenti", cn, 3, 3 Utilizzo i metodi AddNew ed Update per aggiungere un nuovo record alla tabella e per aggiornarlo; passo poi al Recordset i campi della tabella e li valorizzo con le variabili contenenti i dati corrispondenti: rs.AddNew rs("nome") = txtNome.Text rs("cognome") = txtCognome.Text rs.Update Pulisco la memoria del buffer dalle variabili contenenti la connessione ed il recordset, settandole sul valore speciale di VB Nothing: Set cn = Nothing Set rs = Nothing In fine, ad operazioni espletate, lancio un messaggio di conferma: MsgBox "Inserimento effettuato", vbOKOnly, "CONFERMA" Vediamo adesso come leggere i dati dal database. Si aggiunga una nuova Form dal menu Progetto / Inserisci form si scelga Form e si confermi. Si assegni alla Form il nome frmLettura e si aggiunga una Label di nome lblDati grande quanto tutta la Form. Si acceda all'evento Form_Load() della Form con un doppio click in un punto qualsiasi della Form stessa e si inserisca nella parte generale il seguente codice: Option Explicit Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim stringa As String In Form_Load(), invece, inserire il seguente codice: Private Sub Form_Load() stringa = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" stringa = stringa & "C:\test\database.mdb" Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open stringa rs.Open "SELECT * FROM utenti", cn, 1 If rs.EOF Then lblDati.Caption = "Nessun dato" Else While rs.EOF = False lblDati.Caption = lblDati.Caption _ & rs("nome") & " " _ & rs("cognome") & vbCrLf rs.MoveNext Wend End If Set cn = Nothing Set rs = Nothing End Sub Gran parte del codice appena presentato non è molto differente da quello di esempio per l'inserimento: la stringa di connessione al database è la stessa, è necessario settare ed aprire, ed in fine svuotare, gli oggetti Connection e Recordset. Concentriamoci sulla lettura dei dati: If rs.EOF Then lblDati.Caption = "Nessun dato" Else While rs.EOF = False lblDati.Caption = lblDati.Caption _ & rs("nome") & " " _ & rs("cognome") & vbCrLf rs.MoveNext Wend End If La logica seguita è la seguente: se non ci sono dati nella tabella, ovvero se la lettura del Recordset arriva alla fine della tabella (EOF - End Of File) lancio un messaggio che avvisa che non sono stati trovati dati; altrimenti effettuo un ciclo e stampo a video nella Label tutti i record tirati fuori dalla stringa SQL SELECT * FROM utenti passata al Recordset impostato in lettura.