Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
COM®
Copyright © Giuseppe Scozzari
Tutti i diritti riservati. Nessuna parte di questo libro può essere riprodotta o inserita in un
sistema di riproduzione o trasmessa in qualsiasi forma e con qualsiasi mezzo in formato
elettronico, meccanico, su fotocopia, come registrazione o altro per qualsiasi scopo senza
il permesso scritto dell’autore e dell’editore.
Per motivi didattici in questo libro e nelle sue versioni successive vengono utilizzati i pro-
grammi più aggiornati disponibili al momento della stampa.
Marchi Registrati.
Tutti i marchi registrati appartengono ai legittimi proprietari.
Altri nomi di prodotti e società citati nel presente libro possono essere marchi dei rispettivi
proprietari. Le informazioni contenute nel presente documento, inclusi gli URL e i riferimenti
a siti Web su Internet possono essere soggetti a modifiche senza preavviso. Se non speci-
ficato espressamente ogni riferimento a società, nomi, dati, indirizzi utilizzati nelle riprodu-
zioni è puramente casuale ed ha il solo scopo di illustrare con esempi pratici il funziona-
mento e le procedure da seguire per acquisire un certo grado di conoscenza del computer.
Né l’Autore né l’Editore possono assumersi alcuna responsabilità derivante dall’implemen-
tazione dei programmi contenuti in questo libro, ne possono fornire alcuna garanzia sulle
prestazioni e sui risultati derivanti dall’utilizzo di detti programmi. Lo stesso vale per ogni
persona o società coinvolta nella produzione o nella distribuzione di questo libro.
EDIZIONIFUTURA.COM®
Via Castelfidardo, 62 – 50137 FIRENZE - ITALY
tel. (+39)055.52.75.869 – fax. (+39)055.52.75.869
cell. 388.89.20.665
Sito web: www.edizionifutura.com
e-mail: edizionifutura@gmail.com
Terza Edizione
Aggiornamento edizione digitale: Maggio 2020
Sommario
Introduzione .................................................................................................................................... 9
Installare Visual Studio .................................................................................................................. 10
Personalizziamo l’ambiente di lavoro. ............................................................................................ 18
Creare un Progetto ......................................................................................................................... 20
Salviamo il Progetto ................................................................................................................................ 29
MaximizeBox e MinimizeBox .................................................................................................................. 30
ControlBox .............................................................................................................................................. 32
FormBorderStyle ..................................................................................................................................... 32
Creiamo l’eseguibile di un progetto ............................................................................................... 33
Aggiungere altre finestre (form) al progetto. ......................................................................................... 38
Primi passi nel mondo della programmazione ............................................................................... 45
Errori nella selezione dell’evento ........................................................................................................... 47
Ritornare alla progettazione ................................................................................................................... 48
Gli elementi del Linguaggio di Programmazione ............................................................................ 52
Introduzione ................................................................................................................................... 52
Psicologia del programmatore ................................................................................................................ 52
Come si scrive il codice ........................................................................................................................... 52
Le istruzioni ............................................................................................................................................. 56
Gli eventi ................................................................................................................................................. 56
Righe Vuote ............................................................................................................................................ 57
Note alla programmazione o commenti ................................................................................................. 57
Le variabili ............................................................................................................................................... 57
Le costanti............................................................................................................................................... 59
Assegnazione di valori ............................................................................................................................ 59
Dichiarazioni Esplicite ............................................................................................................................. 60
Tipi di dati ............................................................................................................................................... 61
Operazioni matematiche ........................................................................................................................ 61
Altre funzioni matematiche .................................................................................................................... 66
Funzioni trigonometriche ....................................................................................................................... 68
Operazioni sulle stringhe ................................................................................................................ 69
Format .................................................................................................................................................... 70
InStr ........................................................................................................................................................ 72
LCase ....................................................................................................................................................... 72
Len .......................................................................................................................................................... 73
Mid.......................................................................................................................................................... 73
Space....................................................................................................................................................... 73
StrConv ................................................................................................................................................... 73
StrComp .................................................................................................................................................. 74
StrReverse ............................................................................................................................................... 75
Trim, LTrim, RTrim. ................................................................................................................................. 75
UCase ...................................................................................................................................................... 75
Data e Ora ............................................................................................................................................... 75
Date ........................................................................................................................................................ 75
DateAdd .................................................................................................................................................. 76
DateDiff................................................................................................................................................... 77
DatePart .................................................................................................................................................. 78
DateSerial ............................................................................................................................................... 79
DateValue ............................................................................................................................................... 80
Hour ........................................................................................................................................................ 80
Minute .................................................................................................................................................... 81
Month ..................................................................................................................................................... 81
MonthName ............................................................................................................................................ 81
Now ......................................................................................................................................................... 82
Second..................................................................................................................................................... 82
TimeSerial ............................................................................................................................................... 82
Weekday ................................................................................................................................................. 83
WeekdayName ........................................................................................................................................ 83
Year ......................................................................................................................................................... 84
Altre funzioni ................................................................................................................................... 84
IsDate ...................................................................................................................................................... 85
IsEmpty ................................................................................................................................................... 85
IsNumeric ................................................................................................................................................ 86
IsNull ....................................................................................................................................................... 87
Funzioni di conversione di tipo. ...................................................................................................... 87
Asc ........................................................................................................................................................... 87
CBool ....................................................................................................................................................... 87
CByte ....................................................................................................................................................... 87
CDate ...................................................................................................................................................... 88
CDbl ......................................................................................................................................................... 88
CDec ........................................................................................................................................................ 88
Chr ........................................................................................................................................................... 88
CInt .......................................................................................................................................................... 89
CLng......................................................................................................................................................... 89
CSng ........................................................................................................................................................ 89
CStr.......................................................................................................................................................... 90
FormatCurrency ...................................................................................................................................... 90
FormatDateTime ..................................................................................................................................... 91
FormatNumber ....................................................................................................................................... 91
FormatPercent ........................................................................................................................................ 92
Hex .......................................................................................................................................................... 93
Val ........................................................................................................................................................... 94
Riepilogo operazioni su data e ora. ......................................................................................................... 94
Riepilogo operazioni sulle stringhe ......................................................................................................... 95
Concatenazione di stringhe ..................................................................................................................... 95
Routine .................................................................................................................................................... 96
Etichette e GoTo. .................................................................................................................................... 97
Le funzioni ............................................................................................................................................... 98
L’ Istruzione If ........................................................................................................................................ 100
If, Then ed Else annidati. ....................................................................................................................... 101
AND e OR .............................................................................................................................................. 102
Ciclo FOR … NEXT .................................................................................................................................. 104
DO … Loop ............................................................................................................................................. 106
DO While …loop .................................................................................................................................... 107
DO Until…. Loop .................................................................................................................................... 107
Uscita anticipata da un ciclo Loop ......................................................................................................... 107
Select Case ............................................................................................................................................ 108
Numeri casuali ...................................................................................................................................... 109
ARRAY ................................................................................................................................................... 109
Gli Strumenti a disposizione del programmatore ......................................................................... 115
I controlli .......................................................................................................................................115
Il pulsante di comando o Button ........................................................................................................... 117
Il TextBox............................................................................................................................................... 126
Impostazioni iniziali ............................................................................................................................... 132
Campo password................................................................................................................................... 134
La Label o etichetta ............................................................................................................................... 135
Il CheckBox o casella di controllo .......................................................................................................... 136
Il RadioButton o Pulsante di Opzione ................................................................................................... 139
GroupBox .............................................................................................................................................. 140
DateTimePicker ..................................................................................................................................... 142
NumericUpDown .................................................................................................................................. 147
ComboBox o Casella Combinata ........................................................................................................... 148
ListBox................................................................................................................................................... 150
Le finestre di dialogo .................................................................................................................... 153
Message Box, Le finestre di Messaggio ................................................................................................ 153
InputBox ............................................................................................................................................... 156
OpenFileDialog...................................................................................................................................... 158
OpenFileDialog & PictureBox ................................................................................................................ 158
SaveFileDialog e File di Testo ................................................................................................................ 162
FontDialog............................................................................................................................................. 167
ColorDialog ........................................................................................................................................... 168
PrintDialog ............................................................................................................................................ 169
Operazioni sui Form e sui Menu ................................................................................................... 175
Form MDI ...................................................................................................................................... 175
Il Menu Principale ......................................................................................................................... 181
Separatore ............................................................................................................................................ 184
Personalizzare un menu ........................................................................................................................ 185
Combinazioni di tasti da tastiera. ......................................................................................................... 187
Scorciatoie da tastiera .......................................................................................................................... 189
ToolTip .................................................................................................................................................. 190
Attiva e disattiva un menu .................................................................................................................... 191
Assegnare un’icona ad un menu ........................................................................................................... 192
Richiamare un Form da un Form MDI. .................................................................................................. 194
ToolStrip o Barra degli Strumenti ......................................................................................................... 197
StatusStrip o Barra di stato (StatusBar) ................................................................................................ 202
Timer..................................................................................................................................................... 205
Trascina e Rilascia ......................................................................................................................... 208
Eventi comuni. .............................................................................................................................. 211
I Database .................................................................................................................................... 213
Le tabelle. ............................................................................................................................................. 213
Query .................................................................................................................................................... 213
Maschera. ............................................................................................................................................. 213
Report. .................................................................................................................................................. 213
Microsoft ACCESS......................................................................................................................... 214
Le tabelle .............................................................................................................................................. 214
Passiamo all’azione ............................................................................................................................... 216
Tipi di campo......................................................................................................................................... 227
Le relazioni ............................................................................................................................................ 228
Inserire i dati nelle tabelle. ................................................................................................................... 234
Modificare se necessario la struttura di una tabella. ............................................................................ 236
Mettiamo un po’ d’ordine al layout delle relazioni............................................................................... 242
Le Query o Viste. ........................................................................................................................... 244
Query di raggruppamento. ................................................................................................................... 250
Altri esempi ........................................................................................................................................... 255
Access e il linguaggio SQL ..................................................................................................................... 255
Perfezioniamo il database..................................................................................................................... 256
Importare dati dall’esterno .......................................................................................................... 260
Importare dati da altri database di Access............................................................................................ 266
Collegare le tabelle ............................................................................................................................... 269
Importare dati da un file di testo. ......................................................................................................... 270
Esportare i dati ..............................................................................................................................273
Esportare dati in un file di Excel ............................................................................................................ 273
Esportare dati in un file di Access ......................................................................................................... 275
ACCESS & Visual Basic .................................................................................................................. 278
Accedere al database Access ................................................................................................................ 278
database mdb ....................................................................................................................................... 279
Database accdb ..................................................................................................................................... 284
Accesso ai dati da Visual Basic. ............................................................................................................. 287
Adattatore dei dati (OleDbDataAdapter) .............................................................................................. 288
DataSet.................................................................................................................................................. 288
OleDbCommand .................................................................................................................................... 288
DataGridView ........................................................................................................................................ 289
Eliminare un record ............................................................................................................................... 291
ComboBox ............................................................................................................................................. 292
Aggiungere un record............................................................................................................................ 293
Modificare un Record............................................................................................................................ 296
Stampare con Visual Basic..................................................................................................................... 299
MySQL .......................................................................................................................................... 304
Installare MySQL ................................................................................................................................... 304
Configurare MySQL ............................................................................................................................... 310
Connetti al database ............................................................................................................................. 314
Il database. ............................................................................................................................................ 316
Tabelle................................................................................................................................................... 316
Query o View......................................................................................................................................... 316
Utenti .................................................................................................................................................... 317
Progettare un database .................................................................................................................317
Utilizziamo uno strumento grafico per MySQL ..................................................................................... 317
Utilizzare Workbench ....................................................................................................................317
Creare e rimuovere database. ............................................................................................................... 319
Eliminare un database........................................................................................................................... 321
Creare le tabelle .................................................................................................................................... 321
Modificare le tabelle ............................................................................................................................. 326
Gli indici ................................................................................................................................................ 327
Relazioni fra tabelle .............................................................................................................................. 329
Inserire i dati in una tabella. ................................................................................................................. 331
Le Views ................................................................................................................................................ 335
Collegare due tabelle ............................................................................................................................ 337
Altre utilità ............................................................................................................................................ 338
Linguaggio SQL ............................................................................................................................. 339
SELECT ................................................................................................................................................... 343
WHERE .................................................................................................................................................. 345
AND ....................................................................................................................................................... 345
OR ......................................................................................................................................................... 345
LIKE e NOT LIKE ..................................................................................................................................... 345
Operatori di Confronto ..................................................................................................................345
IS NULL .................................................................................................................................................. 346
IN e NOT IN ........................................................................................................................................... 346
Colonne Calcolate ................................................................................................................................. 347
Operazioni matematiche....................................................................................................................... 347
GROUP BY ............................................................................................................................................. 348
Combinazione di dati su più tabelle. ..................................................................................................... 348
Creare un Database .............................................................................................................................. 349
Creare una Tabella ................................................................................................................................ 349
Modificare una tabella. ......................................................................................................................... 349
Eliminare una tabella ............................................................................................................................ 349
Inserire i dati in una tabella .................................................................................................................. 350
Elencare i record ................................................................................................................................... 350
Modificare un record ............................................................................................................................ 350
Eliminare un record .............................................................................................................................. 350
Utilizzare Visual Basic con MySQL ................................................................................................ 351
Accedere ai dati con Visual Basic. ................................................................................................. 354
Accedere ai dati. ................................................................................................................................... 355
Connessione a un Database MySQL ...................................................................................................... 355
Inserire nuovi record............................................................................................................................. 359
Modificare un record ............................................................................................................................ 362
Eliminare un record .............................................................................................................................. 366
Ricercare un dato .................................................................................................................................. 367
Controllare l’immissione dei dati da parte dell’utente ................................................................. 371
IsNumeric .............................................................................................................................................. 373
Convalidare un indirizzo di posta elettronica ....................................................................................... 373
DBNULL ................................................................................................................................................. 376
Moduli di codice ........................................................................................................................... 377
ComboBox & DataGridView.......................................................................................................... 381
Creazione di un database MySQL con Visual Basic. ...................................................................... 390
Visualizzare gli oggetti di un database MySQL con Visual Basic. .................................................. 397
Il Backup dei dati con MySQL. ...................................................................................................... 403
Restore.................................................................................................................................................. 404
Migrazione dei dati. .............................................................................................................................. 405
Gli errori in Visual Basic ............................................................................................................... 412
Trappole per errori ............................................................................................................................... 416
Informazioni sul sistema ....................................................................................................................... 417
Disegnare con Visual Basic. .......................................................................................................... 419
Disegnare una Linea...................................................................................................................... 419
Disegnare un Rettangolo .............................................................................................................. 421
Disegnare un Poligono. ................................................................................................................. 422
Ellisse ............................................................................................................................................ 423
Stringa ........................................................................................................................................... 424
Icona ............................................................................................................................................. 426
Immagine ...................................................................................................................................... 427
Altri Controlli utili. ....................................................................................................................... 429
MaskedTextBox ............................................................................................................................ 429
RichTextBox .................................................................................................................................. 433
FolderBrowserDialog .................................................................................................................... 437
PageSetupDialog ........................................................................................................................... 438
ImageList ....................................................................................................................................... 439
TreeView ....................................................................................................................................... 444
Creare controlli personalizzati ..................................................................................................... 453
Aggiungere Proprietà al controllo utente. .................................................................................... 458
Informazioni e operazioni su File e Cartelle .................................................................................. 468
Copiare una Directory ........................................................................................................................... 469
Verifica dell’esistenza di una cartella .................................................................................................... 470
Cambiare nome a una cartella. ............................................................................................................. 470
Operazioni sui File .........................................................................................................................471
Copia di File ........................................................................................................................................... 471
Spostare un file ..................................................................................................................................... 471
Rinominare un file ................................................................................................................................. 472
Informazioni sui File .............................................................................................................................. 472
Progetto FileInfo. ...........................................................................................................................473
Visual Basic & Word ..................................................................................................................... 482
Visual Basic & Excel ...................................................................................................................... 492
La Stampa con Visual Basic ........................................................................................................... 500
Stampa di un documento in PDF ...................................................................................................508
Stampa documento XPS ................................................................................................................510
XML .............................................................................................................................................. 511
Distribuire un’applicazione ........................................................................................................... 523
Appendici ..................................................................................................................................... 526
Le parole chiave in Visual Basic. ....................................................................................................526
Parole chiave non riservate ................................................................................................................... 527
Risorse ......................................................................................................................................... 528
Indice ........................................................................................................................................... 529
Introduzione
9
Introduzione
Finalmente un libro che tratta come diventare programmatori partendo “quasi” da zero o
qualcosa di simile. Lo scopo di questo testo è mettere in grado, chi si avvicina per la prima
volta alla programmazione, di entrare in un mondo tutt’altro che semplice e prendere con-
fidenza con i nuovi strumenti che il mercato mette a disposizione, acquisire tutta una serie
di conoscenze soprattutto pratiche e non solo teoriche, permettergli di creare interessanti
programmi e di fornirgli gli strumenti necessari per poter andare avanti da solo documen-
tandosi un domani su testi più impegnativi o linguaggi di programmazione diversi.
Gli argomenti presenti abbracciano i tempi più “caldi” che un programmatore di solito si
trova ad affrontare, cercando di mettere in evidenza tutto quello che può essere necessario
scartando volutamente argomenti inutili, troppo specifici o di nicchia.
Per iniziare l’avventura è necessario essere in possesso di requisiti minimi, ovvero avere
almeno la conoscenza degli argomenti che sono stati presentati sui volumi 1 e 2 de “Il
Computer Partendo da Zero”, che è possibile reperire in commercio nelle librerie o attra-
verso il sito www.edizionifutura.com, giusto per capirsi durante l’esposizione dei vari argo-
menti, anche se vengono utilizzati termini intenzionalmente semplificati per evitare di sca-
dere in quelle perifrasi incomprensibili nelle quali spesso ci si imbatte quando consultiamo
“certi” testi di programmazione. Meglio ancora se avete dimestichezza con il “pacchetto”
Office, ovvero con programmi come Word, Excel ecc.
Innanzitutto, mettetevi comodi perché la strada è molto lunga e soprattutto questo è un
mestiere che non si improvvisa. Diffidate da situazioni come: “diventa programmatore in
cinque comode lezioni” oppure “Programmare subito” perché se così fosse il mondo sarebbe
pieno di “Programmatori”.
La quantità tale di argomenti e di conoscenze necessarie per utilizzare gli strumenti che
vedremo in questo libro e a dir poco sbalorditiva, quindi il percorso va affrontato un poco
alla volta con calma e tranquillità, spesso trascorrendo intere giornate a documentarsi per
risolvere un problema che all’apparenza sembrava semplice.
Ho volutamente utilizzato un linguaggio semplice evitando spiegazioni scientifiche incom-
prensibili come quelle che spesso appaiono in altri testi e anche astrusi voli pindarici per
permettere all’aspirante programmatore di essere produttivo da subito, senza impazzire
scontrandosi con un codice che non funzionerà mai solo perché copiato così com’è da altre
parti e completamente decontestualizzato.
Ho cercato di riportare esempi realistici che provengono dalla mia esperienza lavorativa
quindi ho evitato quegli argomenti che sono a dir poco inutili e non applicabili alle necessità
e ai bisogni delle aziende che richiedono che un programma sia soprattutto funzionale. Per
fare ciò è bene tenere a mente che il programmatore per sviluppare un programma “vin-
cente” deve mettersi nei panni dell’utente meno abile e ragionare come ragionerebbe lui
durante l’utilizzo.
Il codice che appare in questo libro può essere utilizzato anche nelle versioni di Visual Basic,
2017 e 2019 per permettere anche a chi è un felice possessore di una versione precedente
di utilizzarlo per le proprie necessità salvo qualche caso dove è stato inserito del codice che
funziona nella versione 2019 che comunque è scaricabile gratuitamente dal sito della Mi-
crosoft.
Inoltre, questo libro non vuole essere una guida completa, come invece si fregia qualcuno,
al linguaggio Visual Basic in quanto sarebbe impossibile in un solo libro anche se partico-
larmente voluminoso mettere in evidenza solo una minima parte di quello che questo lin-
guaggio di programmazione può fare, e sono sicuro che ve ne renderete conto anche da
soli. Quindi gli argomenti utilizzati in questo libro sono stati scelti per fare in modo che
anche il principiante sia produttivo da subito affrontando argomenti di sicuro interesse.
Non mi resta che augurarvi buon lavoro.
Al momento della pubblicazione di questo libro la versione più “moderna” è la 2019. Tenete
presente che nell’ambito programmazione gli ambienti di sviluppo sono soggetti a continui
aggiornamenti ma, una volta che avrete sviluppato “l’occhio del programmatore”, riuscirete
facilmente a muovervi in qualunque situazione.
Nella parte bassa dello schermo compare una finestra che mostra tre opzioni. Per avviare
l’installazione del prodotto fate click sul pulsante Esegui come mostra la figura successiva.
Installare Visual Studio
11
Per far partire l’installazione del prodotto fate click sul pulsante Continua.
La figura successiva vi prega di avere un po’ di pazienza mentre viene scaricato l’ambiente
di sviluppo. Attendete fiduciosi…
VisualBasic.NET 2019 – Partendo da Zero
12
Durante questa fase compare una finestra che vi permette di scegliere i componenti neces-
sari per iniziare la nostra avventura nel mondo della programmazione. Dato che l’ambiente
di sviluppo è particolarmente complesso, e presenta molti linguaggi di programmazione,
dato che siamo alle prime armi è meglio iniziare da dove viene indicato nella figura succes-
siva. È possibile aggiungere in un secondo tempo altre opzioni o altri linguaggi di program-
mazione. Questo per evitare di installare programmi che potrebbero non servirvi mai. Fate
click sul pulsante Installa in basso a destra nella finestra.
Installare Visual Studio
13
A questo punto vengono installati i componenti scelti. Questa fase può durare diversi minuti
quindi non vi resta che attendere.
Quando compare la finestra che vedete nella figura sottostante, fate click sul pulsante Riav-
via per completare l’installazione e riavviare il vostro computer.
Una volta eseguita l’operazione di riavvio, come si vede nella figura successiva, fate click
con il tasto SX del mouse sul Pulsante del menu di Avvio (Start) in basso a sinistra nello
schermo. L’icona di Visual Studio 2019 dovrebbe essere presente nella lista dei pro-
grammi. Nella prima parte di questo libro utilizzerò un linguaggio non troppo tecnico in
quanto il testo è appunto dedicato a chi parte da zero.
VisualBasic.NET 2019 – Partendo da Zero
14
Fate click con il tasto DX del mouse in corrispondenza dell’icona del programma, e dal menu
scegliete Aggiungi a Start per posizionarlo sul Menu di avvio, in modo da averlo sempre
a portata di mano invece di stare a scorrere, tutte le volte che lo vogliamo avviare, la lista
dei programmi.
Quando un programma viene aggiunto al menu Start, è probabile che non venga collocato
nella posizione desiderata. Dovete quindi provvedere a spostarlo dove desiderate con il
metodo trascina e rilascia, (drag & drop nel linguaggio dei programmatori) fino a trovargli
la posizione più consona alle vostre necessità.
Installare Visual Studio
15
Quindi avviate con in click del tasto SX del mouse. Vi consiglio di iscrivervi sul sito della
Microsoft per sbloccare il programma e per renderlo di durata illimitata, altrimenti qualche
caratteristica potrebbe risultare bloccata e, sicuramente dopo 30 giorni di prova, il pro-
gramma stesso verrà disattivato. Se non l’avete già fatto, creando un Account Microsoft,
prima di proseguire fate click sul collegamento fare click qui per crearne uno che vedete
nella figura sottostante.
VisualBasic.NET 2019 – Partendo da Zero
16
Per portare correttamente a termine questa procedura è necessario disporre di un indirizzo
di posta elettronica personale che utilizzerete per creare un Account, come si dice in gergo,
ovvero creare qualcosa dove potrete accedere con le vostre credenziali, che di solito sono
il vostro indirizzo di posta elettronica e una password. La creazione di un account è una
semplice registrazione delle vostre credenziali, in modo che la Microsoft possa identificarvi
come utilizzatore regolarmente registrato. Questa operazione di registrazione è analoga alla
creazione di una casella di posta elettronica.
Una volta che vi siete registrati il programma vi chiede con quale ambiente desiderate
sviluppare le vostre applicazioni. Per semplificarvi la vita partite con le impostazioni di svi-
luppo a Visual Basic.
La scelta di questo linguaggio non è casuale. Per chi parte da zero è impensabile addentrarsi
in linguaggi come C# (detto anche C Sharp), C++ o cose di questo genere, perché si tratta
di ambienti di sviluppo ben più complicati del nostro glorioso Visual Basic, che è stato ap-
positamente creato e modificato negli anni per risolvere cose complicate in modo relativa-
mente semplice.
Scegliete il tema dei colori per l’ambiente di sviluppo. Quindi dopo aver scelto dalla lista il
nostro linguaggio di programmazione fate click sul pulsante Avvia Visual Studio in basso
nella finestra.
Le immagini che vedete in questo libro sono state concepite per migliorarne la vi-
sibilità, per intenderci sul vostro computer le icone compariranno sicuramente più
piccole e le Barre degli strumenti o le Barre multifunzione sicuramente mostreranno
più comandi di quanto non ne siano visibili nel libro. Questo dipende anche da tipo
di schermo che avete a disposizione, ma se riportavamo le immagini che compaiono
sugli schermi attuali sarebbe stato impossibile apprezzarne i dettagli perché troppo
piccoli.
A questo punto iniziamo a prendere confidenza con l’ambiente di sviluppo per vedere cosa
ci offre, e di personalizzarlo in modo di avere sottomano quello di cui abbiamo bisogno.
Installare Visual Studio
17
Contrariamente ad altri testi che si trovano in commercio questo libro si propone innanzi-
tutto di mettere a proprio agio il principiante iniziando da subito a fare conoscenza con
l’ambiente di lavoro, presentandogli gli strumenti e, poi in un secondo tempo, presentargli
il codice che permetterà al programma di funzionare.
La situazione iniziale potrebbe essere quella che vedete nella figura sottostante.
Tenete presente che lo scopo di questo libro non è illustrare le ultime ed avanzatissime
funzioni di VisualStudio2019, ma semplicemente di avviarvi alla programmazione illustran-
dovi quelle componenti del linguaggio, la filosofia della programmazione e quant’altro non
sia soggetto a continui aggiornamenti, che spesso e volentieri non servono a nulla se non
a movimentare il mercato.
Chi si dedica alla programmazione non può cambiare ogni settimana o ogni mese l’ambiente
di sviluppo, altrimenti non sarà mai in grado di essere produttivo. Ad esempio, in giro esi-
stono ottimi programmi che originariamente sono stati sviluppati con Visual Basic 6 (anno
1998 circa). Fate click sul collegamento Continua senza codice.
La finestra iniziale mostra tutta una serie di altre finestre che non tutte sono di solito uti-
lizzate durante la fase di progettazione. Le finestre più importanti sono:
• La finestra Esplora Soluzioni, dove vengono visualizzate tutti le parti che com-
pongono il progetto e che vedremo descritte nel dettaglio in seguito,
• La Casella degli strumenti che mostra i controlli e quei componenti che realizzano
la parte grafica del nostro progetto.
La pagina iniziale presenta, a volte anche in lingua inglese, le novità riguardanti l’ambiente
di sviluppo, la guida introduttiva e altre notizie oltre ai comandi per aprire un progetto
salvato. Può essere utile una volta che avrete preso confidenza con l’ambiente di sviluppo
per vedere se sono disponibili delle novità o degli aggiornamenti.
VisualBasic.NET 2019 – Partendo da Zero
18
Personalizziamo l’ambiente di lavoro.
Non è che dovete prendere quello che dico io come oro colato, in quanto ognuno di voi
potrebbe avere preferenze diametralmente opposte alle mie nella complicata arte della per-
sonalizzazione del proprio ambiente di lavoro, però vi garantisco che le finestre costante-
mente presenti sullo schermo durante lo sviluppo sono veramente poche (per fortuna).
Fate click con il tasto SX del mouse (tenete presente che da qui in poi quando si dirà di fare
click senza specificare con quale tasto del mouse si intenderà quello SX) sul riquadro che
rappresenta la Casella degli strumenti, nella parte sinistra dello schermo.
Fate click sulla piccola icona che somiglia ad una puntina da disegno per ancorare la finestra.
Come mostra la figura seguente la Casella degli strumenti può, come una qualsiasi finestra,
essere trascinata in una posizione a piacere se portate il puntatore nell’area del titolo della
finestra (i nomi delle parti che compongono le parti di una finestra vanno conosciuti bene).
Per ancorarla in una determinata posizione dello schermo è sufficiente fare coincidere il
Installare Visual Studio
19
trascinamento con l’icona del lato dello schermo che desiderate, in questo caso a sinistra,
quindi rilasciate.
Una volta posizionata la Casella degli strumenti dal lato desiderato è possibile ridimensio-
narla come una normale finestra, come si vede nella figura sottostante.
Se per errore avete chiuso qualche finestra oppure desiderate far comparire sullo schermo
altre finestre potete tranquillamente operare dal menu Visualizza in alto a sinistra nello
schermo.
VisualBasic.NET 2019 – Partendo da Zero
20
A questo punto è tutto pronto per iniziare l’avventura nel mondo della programmazione.
Creare un Progetto
Iniziamo a muovere i primi passi nell’ambiente di lavoro creando un nuovo progetto. Fate
click sul menu File in alto a sinistra nella finestra e scegliete la voce Nuovo progetto,
come mostra la figura sottostante, oppure eseguite da tastiera la combinazione CRTL+N.
La posizione di questo menu è in continua evoluzione perciò qualora non corrispondesse
esattamente alla figura qui sotto non meravigliatevene.
Selezionate dalla prima lista la voce Visual Basic, dalla seconda la voce Windows e dalla
terza Desktop, come mostra la figura successiva. Quindi se necessario scorrete la lista fino
a trovare la voce App Windows Forms.
Installare Visual Studio
21
Fate click sul pulsante Avanti che si trova nella finestra in basso a destra.
Dato che con Visual Studio è possibile creare praticamente di tutto, partiamo dunque dalla
madre di tutti i progetti: l’applicazione Windows Form ovverosia un progetto basato
sulle finestre di Windows, o meglio ancora un programma che sullo schermo comparirà
sotto forma di finestra. Quindi come potete immaginare praticamente tutto dato che oggi
qualsiasi programma di Windows ha l’aspetto di una finestra.
Date un nome accattivante al vostro primo progetto in modo da poterlo riconoscere da tutti
gli altri, digitandolo nell’apposito spazio in basso a sinistra nella finestra, e fate click sul
pulsante Crea in basso a destra.
A questo punto verrà presentato l’ambiente di progettazione Visual Basic che attenzione,
potrebbe non essere identico a quello che vediamo nella figura successiva. Ma niente paura,
vi spiegherò nel dettaglio come fare apparire o scomparire quelle parti dello schermo che
possono essere utili oppure no, in uno specifico momento della programmazione.
Nella parte destra in alto dello schermo, ma non è una regola, di solito si trova la finestra
Esplora soluzioni che mostra tutti i file che fanno parte del nostro progetto.
Qualora la finestra non dovesse comparire per un motivo qualunque fate click sulla scheda
Visualizza in alto e selezionate la voce Esplora Soluzioni, oppure effettuate dalla tastiera
la combinazione CRTL+ALT+L.
VisualBasic.NET 2019 – Partendo da Zero
22
Nella parte centrale della finestra di solito compare come prima cosa quando si crea un
nuovo progetto quello che è la rappresentazione di una finestra di Windows etichettata
come Form1.
Quando si crea un programma o applicazione l’oggetto principale è una finestra dove an-
dremo in seguito a posizionare Controlli come Pulsanti, Griglie, spazi dove è possibile scri-
vere e tante altre cose che concorreranno a creare il programma finito. Tutte queste cose
per funzionare hanno bisogno di sapere come si devono comportare in determinate occa-
sioni, e questo dovrete dirglielo voi, attraverso quello che si chiama Codice, che poi sarebbe
il programma vero e proprio.
La figura successiva mostra la finestra delle Proprietà, che nient’altro sono che le carat-
teristiche del controllo selezionato in quel momento. Ad esempio, se fate click all’interno
della finestra Form1, nella finestra delle proprietà appariranno le proprietà del controllo
elencate a gruppi, anche se è conveniente almeno a mio modo di vedere che l’elenco delle
proprietà venga presentato in ordine alfabetico. (anche questo dipenderà in futuro dal vo-
stro modo di lavorare)
Qualora la finestra delle proprietà non dovesse comparire sullo schermo, fate click con il
tasto SX del mouse all’interno dell’area del Form1 (figura successiva) e dalla tastiera pre-
mete il tasto F4.
Sul vostro schermo sicuramente c’è molto più spazio di quanto non ce ne sia in
queste immagini. Per questo tipo di lavoro è consigliato uno schermo da almeno 19
pollici utilizzato alla risoluzione 1280x1024. Ottimo anche se disponete di uno
schermo Wide da 20 o più pollici.
Installare Visual Studio
23
La risoluzione dello schermo è semplicemente un parametro che indica da quanti
puntini chiamati pixel (picture elements) è composta l’immagine che può visualiz-
zare il vostro schermo. Questo è anche in rapporto a quanto è grande lo schermo
stesso. Maggiore sono le sue dimensioni e maggiore sarà la risoluzione che potrà
sopportare.
Ad esempio, la proprietà Size serve per impostare la dimensione che il form dovrà assu-
mere al momento che il programma verrà eseguito.
Vi consiglio di ordinare in ordine alfabetico la lista delle proprietà in modo da riconoscerle
più velocemente, cosa molto importante per risparmiare tempo durante il lavoro. Fate click
sul pulsante che vedete nella figura sottostante.
VisualBasic.NET 2019 – Partendo da Zero
24
All’interno di un progetto ogni componente deve avere un nome per poter essere ricono-
sciuto in maniera univoca, senza dubbi. Tenete presente che il nome dell’oggetto compare
comunque per primo nonostante la lista sia alfabetica per agevolare il riconoscimento del
controllo.
Innanzitutto, è buona norma dare un nome personalizzato all’oggetto o al controllo che
popola il nostro progetto in modo che venga da noi riconosciuto velocemente, specie quando
un progetto è costituito da decine o centinaia di oggetti e form. Selezionate con un click del
mouse l’oggetto Form1 e dalla lista identificate la proprietà Name.
La lista delle proprietà in alcuni casi è molto lunga, per questo ho messo in evidenza la
barra di scorrimento per accedere ad altre voci della lista. Inoltre, dato che lo spazio sullo
schermo è poco, ho chiuso temporaneamente la finestra Esplora Risorse.
Normalmente accanto alla proprietà nel caso di una finestra troverete la dicitura Form1.
Fate click nello spazio e digitate un nuovo nome ad esempio FormPrincipale.
Installare Visual Studio
25
La proprietà “Name” di qualsiasi controllo deve essere digitata senza spazi, ad
esempio FormPrincipale e non Form Principale.
Attraverso la proprietà Size (dovete scorrere la lista per trovarla) è possibile impostare la
dimensione iniziale della nostra finestra, cioè la dimensione che assume quando il pro-
gramma verrà avviato. Al momento della creazione di un Form il computer propone una
dimensione di 300x300 Pixel. Con l’esperienza vi farete un’idea dell’area occupata sullo
schermo. Fate click sul segno (+) che compare alla sinistra del nome della proprietà per
accedere alle singole componenti, in quanto potrebbe essere composta da più parametri.
Ad esempio, impostiamo una nuova dimensione facendo click nello spazio accanto alla pro-
prietà Width (larghezza) e Height (Altezza) digitando dalla tastiera un altro valore. Vedrete
la finestra assumere queste nuove dimensioni.
VisualBasic.NET 2019 – Partendo da Zero
26
È possibile modificare la dimensione di una finestra anche manualmente portando il punta-
tore del mouse a sovrapporsi ad uno dei quadratini che si trovano agli angoli e al centro dei
lati di una finestra, e trascinando come chissà quante volte avete già fatto in altri casi.
Al momento del rilascio del tasto del mouse vedrete comparire in corrispondenza delle pro-
prietà i nuovi valori assunti da Width e Height.
Il risultato finale ad esempio può essere come quello che mostra la figura sottostante.
Installare Visual Studio
27
Per adattare la finestra delle proprietà in modo da ottimizzare la lettura dei valori di pro-
prietà di un controllo ridimensionate con la tecnica del trascina e rilascia (drag & drop), in
modo che i valori siano chiaramente leggibili. In alcuni casi i valori sono particolarmente
lunghi e quindi la dimensione della finestra delle proprietà necessita di un ritocchino da
parte nostra.
Ad esempio, come mostra la figura sottostante, digitate un testo nel valore della proprietà
al posto di Form1.
Procedete con tranquillità senza cambiare all’impazzata tutti i valori delle Proprietà
che vi capitano a tiro…
Installare Visual Studio
29
Salviamo il Progetto
Prima di andare avanti con le operazioni salviamo il nostro primo progetto. Fate click sulla
scheda File in alto a sinistra nella finestra e dal menu scegliete la voce Salva Tutto, oppure
dalla tastiera eseguite la combinazione CTRL+MAIUSC+S, come suggerito anche dalla
voce del menu.
Continuiamo quindi a prendere confidenza con nostro nuovo ambiente di lavoro dando uno
sguardo alle altre caratteristiche che può avere un’oggetto Form, e quale utilità possono
avere ai fini del nostro lavoro. Altra proprietà di un certo interesse è WindowState.
A questo punto, dopo qualche secondo, sullo schermo comparirà solo una grande finestra
vuota. Per interrompere l’esecuzione del programma fate click sulla (X) in alto a destra, che
si utilizza di solito per chiudere una qualsiasi finestra.
Così facendo si torna all’ambiente di sviluppo pronti per proseguire con la nostra prima
avventura di programmatori.
MaximizeBox e MinimizeBox
Queste due proprietà servono ad abilitare, quando sono impostate su True, o disabilitare
quando sono impostate su False, rispettivamente il comando di ingrandimento della fine-
stra (quello alla sinistra del comando di chiusura) e quello di riduzione a Icona (-) che
appaino in quasi tutte le finestre di Windows. Sarà quindi disponibile in alto soltanto il
comando per chiudere la finestra e nient’altro.
Installare Visual Studio
31
FormBorderStyle
Determina lo stile di una finestra. Normalmente è impostato su Sizable (ovvero che è
possibile modificarle le dimensioni) ma sono disponibili altri stili che per maggior chiarezza
vi prego di provare, in modo da rendervi conto voi stessi che tipo di modifiche applicano
alla finestra. Il valore None ad esempio crea una finestra senza bordi né comandi di chiu-
sura.
Installare Visual Studio
33
Creiamo l’eseguibile di un progetto
A questo punto, prima di passare a cose più impegnative, trattiamo un argomento molto
importante. Le operazioni che vedremo in questo capitolo servono esclusivamente a pren-
dere confidenza con l’ambiente di lavoro, in modo da acquisire quella manualità che vi
permetta di trovare al volo tutti i comandi che solitamente vengono utilizzati centinaia di
volte durante lo sviluppo di un progetto. Approfondimenti su questi ed altri temi verranno
esposti più avanti. Quando un programma viene completato e abbiamo appurato che fun-
ziona correttamente dobbiamo distribuirlo, o meglio installarlo su altri computer per te-
starne il funzionamento, per passarlo ad un amico o per distribuirlo al cliente che ce l’ha
commissionato per proprio lavoro. In gergo si chiama “creare l’eseguibile di un programma”
perché il codice sorgente (come vedremo nei prossimi capitoli) non è di nessuna utilità per
chi deve utilizzare il programma nel suo lavoro quotidiano.
Fate click sula scheda Compilazione in alto e dal menu selezionate la voce Compila Primo
Progetto.
Sullo schermo non accade niente di trascendentale, e viene generato il file eseguibile del
nostro programma, ovvero quel file formato EXE che non ha bisogno dell’ambiente di svi-
luppo (Visual Studio) per funzionare in maniera autonoma.
Uscite per il momento dall’ambiente di sviluppo chiudendo con l’apposito comando in alto a
destra nella finestra, e vediamo dove è possibile trovarlo nei meandri del vostro computer.
Se vi trovate sul Desktop fate doppio click sulla cartella che contiene i File dell’utente,
quella simpatica icona con la testina di un omino, che molto probabilmente ha il vostro
nome e si trova in alto a sinistra sul Desktop.
Una volta sicuri di essere nella cartella Source fate doppio click sulla cartella Repos dove
troverete le cartelle dei vostri progetti.
All’interno di questa cartella cercate la cartella del progetto che nel nostro caso si chiama
Primo Progetto. Se per ogni progetto avete utilizzato dei nomi descrittivi allora rintracciarli
sarà un gioco da ragazzi.
All’interno della cartella del nostro progetto se ne trova un’altra che ha lo stesso nome.
Installare Visual Studio
35
Dalla Barra multifunzione alla scheda Visualizza scegliete la voce Dettagli per visualizzare
i dettagli connessi ai file nella finestra.
Da quanto visto fin qua è inutile aggiungere che è necessaria una buona manualità
con i file e le cartelle e tutte le operazioni annesse e connesse a tale argomento,
come ad esempio taglia, copia e incolla, la regolazione della grandezza delle icone
all’interno di una finestra come in questo esempio. Facendo parte della manualità
di base in questo libro cercheremo ovviamente di non dare nulla per scontato, ma
può capitare che se siete a conoscenza di alcuni argomenti vi conviene consultare
anche i due volumi “Il Computer Partendo da Zero”.
VisualBasic.NET 2019 – Partendo da Zero
36
In questo modo potrete scoprire la tipologia di un file. In questo caso si tratta di un’appli-
cazione ovvero qualcosa che è in grado di eseguire in maniera indipendente una serie di
istruzioni in essa contenute senza bisogno dell’ambiente di sviluppo (Visual Basic).
Se fate doppio click parte l’esecuzione del programma che ovviamente per il momento si
limita ad una solo finestra tristemente vuota.
Chiudete tutte le finestre e tornate sul Desktop. Riavviate Visual Studio facendo click sul
Pulsante del menu di Avvio in basso a sinistra sul Desktop e dalla lista scegliete Visual
Studio 2019.
Installare Visual Studio
37
Il progetto verrà visualizzato nell’elenco dei progetti recenti, quindi, per poterne tornare in
possesso, è sufficiente fare click sul nome del progetto come mostra la figura sottostante.
VisualBasic.NET 2019 – Partendo da Zero
38
Aggiungere altre finestre (form) al progetto.
Come avete potuto appurare, qualsiasi programma in cui vi siete imbattuti non era compo-
sto da una singola schermata, ma da più finestre ognuna con le sue caratteristiche e fun-
zioni. Vediamo come è possibile aggiungere o eliminare Form, che poi saranno le nostre
finestre, in un progetto. Come già detto in precedenza questa prima parte è strutturata in
modo da permettervi di acquisire pratica durante lo sviluppo dei vostri programmi, e da
non perdere due ore di tempo quando non trovate un comando, magari anche di utilizzo
ricorrente.
L’elenco di questi oggetti form (finestre) che compongono il nostro progetto è visibile come
mostrato nella figura successiva nella finestra Esplora Soluzioni. Nel nostro caso il pro-
getto è costituito da un unico oggetto form che riporta la dicitura Form1.VB
Quando il progetto diventa più impegnativo, come nel caso di un programma che ha una
decina di finestre, questi nomi Form1, Form2 ecc. non sono affatto descrittivi e rendono
difficile il riconoscimento di uno di questi oggetti all’interno del progetto. Per questo, ad
esempio, è meglio assegnare nomi descrittivi anche alle finestre in modo da poterle facil-
mente identificare.
Fate click con il tasto DX del mouse su Form1.vb come mostrato nella figura successiva e
dal menu che appare scegliete la voce Rinomina
Installare Visual Studio
39
Dalla tastiera digitate il nome identificativo per l’oggetto nel nostro caso ad esempio For-
mPrincipale.
Per aggiungere un nuovo oggetto Form al progetto fate click con il tasto DX del mouse nella
finestra Esplora soluzioni sul nome che abbiamo assegnato al nostro Progetto, in questo
caso Primo Progetto, che di solito si trova come primo elemento della lista come mostra
la figura successiva. Dal menu scegliete la voce Aggiungi e dal sottomenu selezionate la
voce Form (Windows Form).
VisualBasic.NET 2019 – Partendo da Zero
40
Come mostra la figura successiva, compare una finestra che desidera sapere che tipologia
di oggetto inserire. Selezionate Windows Form, qualora non lo fosse già, e quindi asse-
gnate un nome al form come nel nostro esempio FormSecondario.vb Ricordate di non
omettere o cancellare il .vb finale per evitare errate interpretazioni da parte del computer.
Concludete l’operazione facendo click sul pulsante Aggiungi in basso a destra nella fine-
stra.
Installare Visual Studio
41
Il nostro nuovo form comparirà nella lista della finestra Esplora Soluzioni.
Per eliminare un form fate click son il tasto DX del mouse sul form da rimuovere dal progetto
e dalla lista scegliete la voce Elimina (non eliminate per il momento il file, ma fate click
all’esterno del menu per chiuderlo senza effettuare nessuna operazione in lista).
Fate click con il tasto DX del mouse sull’oggetto da includere nel progetto, come nel nostro
esempio il FormSecondario.vb, e dal menu scegliete la voce Includi nel Progetto (que-
sta volta eseguite pure l’operazione). Come noterete le icone dei file non inclusi sono eva-
nescenti per ribadire che non fanno parte del progetto.
Installare Visual Studio
43
Quindi agite nuovamente sul pulsante Mostra tutti i file, come in precedenza, in modo da
nascondere i file del progetto che non devono essere modificati dal programmatore. I file
che sono nascosti infatti non devono essere modificati per nessun motivo.
Non includete nel progetto cose strane che vedete nella lista. Limitatevi ad esclu-
dere o includere solo quegli oggetti da voi creati e non eseguite per nessun motivo
operazioni su eventuali altri file presenti nella lista.
VisualBasic.NET 2019 – Partendo da Zero
44
Per passare da un form ad un altro basta fare doppio click sull’icona del form.
Nella finestra di progettazione appariranno tante schede quanti sono gli oggetti che avete
aperto. In fase di programmazione spesso si tiene aperto solo la finestra dell’oggetto sul
quale stiamo lavorando, quindi se siamo concentrati sul FormPrincipale, e per il momento
non dobbiamo eseguire nessuna operazione sul FormSecondario, potete tranquillamente
chiuderlo con gli appositi comandi anche per evitare di riempire la testata con tante schede
che non servono a nulla creandovi solo confusione.
Primi passi nel mondo della programmazione
45
Primi passi nel mondo della programmazione
Per il momento abbiamo preso confidenza con l’ambiente di lavoro giusto per capire come
muoverci, ma adesso passeremo alla programmazione vera e propria. Dalla finestra
Esplora Soluzioni fate doppio click con il tasto SX del mouse su quello che è il FormPrin-
cipale per selezionarlo.
Fate doppio click con il tasto SX all’interno del form. Comparirà quella che in gergo viene
chiamata Finestra del codice.
Per il momento non modificate quelle cose strane che vedete scritte dentro la finestra del
codice. In caso di modifiche arbitrarie il programma potrebbe non funzionare generando
una serie di errori che creerebbero non pochi problemi al programmatore principiante.
Concentriamoci invece su quelle liste che vedete in alto indicate nella figura sottostante.
VisualBasic.NET 2019 – Partendo da Zero
46
La lista di sinistra ci permette di selezionare gli oggetti che fanno parte di quel form (nel
nostro caso ancora non ce ne sono perché non abbiamo inserito nulla nella finestra Form-
Principale, a parte il FormPrincipale stesso perché anch’esso è un oggetto). La lista di destra
invece mostra gli Eventi associati a quello specifico oggetto che è stato selezionato nella
lista di sinistra.
Gli eventi nient’altro sono che azioni che il computer deve intraprendere quando si verifica
appunto un certo evento, come ad esempio un click del mouse, due click del mouse oppure
anche il semplice passaggio del mouse sopra un determinato controllo che poi piano piano
andremo a conoscere andando avanti nel corso della programmazione.
Ad esempio, se voglio che accada qualcosa di specifico quando faccio doppio click all’interno
del form (finestra) devo scrivere nel linguaggio di programmazione quello che voglio che
accada nell’evento DoubleClick dell’oggetto FormPrincipale.
In questo modo quando si verifica quel tipo di evento, ad esempio un doppio click all’interno
del FormPrincipale, il computer eseguirà tutte le istruzioni che troverà scritte all’interno
delle parole Private Sub e End Sub.
Quando il cursore si trova nella posizione indicata nella figura successiva (di solito è la
posizione che assume quando viene fatto doppio click in un punto vuoto del form) la lista
di destra mostra tutti gli eventi disponibili per quell’oggetto (nel nostro caso il FormPrinci-
pale.)
Comparirà, quindi non spaventatevi, il codice iniziale quando si genera quell’evento. Il cur-
sore si posiziona automaticamente quindi a noi non resta che scrivere il codice, ovverosia
le istruzioni che deve eseguire il computer per fare una determinata cosa al verificarsi di
quell’evento, nel nostro caso quando viene fatto doppio click sul form.
Non chiedetemi per favore come si fa a selezionare un brano perché vi rimando al libro: “Il
Computer partendo da Zero”.
Qualora abbiate chiuso la scheda [Progettazione] di un form per aprirla nuovamente basta
fare doppio click con il tasto SX del mouse sul form in questione nella finestra Esplora
Soluzioni.
Primi passi nel mondo della programmazione
49
Tenete sempre sott’occhio quali schede si trovano aperte in alto nella finestra.
Quando il progetto si farà più complesso è probabile che ve ne siano aperte
molte, creando spesso confusione nel rintracciare quella giusta. Per chiudere
una specifica scheda basta fare click sulla piccola (x) che si trova nella parte
destra di ogni scheda, proprio come il comando di chiusura di una normale fi-
nestra di Windows.
Torniamo adesso alla parte codice facendo click sulla scheda FormPrincipale.vb
Le schede il cui nome finisce con .vb sono schede di codice cioè che contengono le istruzioni
nel linguaggio di programmazione.
Se la scheda [.VB] non fosse aperta fate doppio click nell’area del Form.
Adesso portiamo a termine il primo esempio di programma per poi proseguire con una
panoramica del linguaggio di programmazione Visual Basic.
Come mostra la figura successiva all’interno dell’evento DoubleClick scrivete:
Per migliorare la leggibilità del codice potete inserire tutte le righe vuote che
desiderate.
Dopo qualche istante comparirà sullo schermo la finestra del programma. Fate doppio click
con il tasto SX del mouse nell’area della finestra.
Primi passi nel mondo della programmazione
51
Fate click sul pulsante OK del messaggio e quindi sul comando di chiusura della finestra
per interrompere l’esecuzione del programma. Passiamo adesso ad illustrare il linguaggio
di programmazione che vi permetterà di dare libero sfogo alla vostra creatività.
VisualBasic.NET 2019 – Partendo da Zero
52
Gli elementi del Linguaggio di Programmazione
Introduzione
Il linguaggio di programmazione è quella cosa che permette al programmatore di dare
istruzioni al computer su quello che deve fare o come comportarsi quando avviene qualcosa
di specifico, come ad esempio un click da parte dell’utente e un’infinità di altre cose che
analizzeremo un poco alla volta. Le istruzioni che il computer deve trasformare in azioni a
dire la verità sono piuttosto complesse, ma un po’ per volta affronteremo la situazione per
renderla più semplice possibile.
Innanzi tutto, non mi dilungherò su questo perché fa parte di quella teoria che viene inse-
gnata sui banchi di scuola, quando si vuol creare un programma bisogna avere ben chiaro
o quasi quello che deve essere il risultato finale. È vero che le idee vengono sul momento
lì per lì, ma bisogna prima di partire per l’avventura, avere più che una mezza idea di quello
che il programma andrà a fare, altrimenti vi perderete nei meandri del programma stesso.
I vecchi programmatori facevano pagine e pagine di diagrammi di flusso, ovvero uno
schema di massima su come di deve comportare il computer in certe situazioni, in modo da
programmare più agevolmente o affrontare un problema in modo più chiaro. Noi non af-
fronteremo questa cosa se non in modo semplice quando faremo conoscenza delle parole
chiave del linguaggio Visual Basic.
Inoltre, ricordate che il computer fa una cosa sola: calcoli matematici ed è con quelli che in
realtà dovrete fare tutto. Questo non vuol dire che se a scuola avevate cinque in matematica
non diventerete mai programmatori perché il segreto del successo non è solo quello, ma la
capacità di mettere insieme questo e quel suggerimento, trovato su internet o avuto da un
amico, in modo da risolvere agevolmente un problema al momento insuperabile.
Selezionate qualora non lo fosse la voce App Windows Forms all’inizio della lista dei mo-
delli di progetto recenti, e confermate l’operazione con il pulsante Avanti in basso a destra
nella finestra.
Quindi fate click sul pulsante Crea in basso a destra nella finestra.
VisualBasic.NET 2019 – Partendo da Zero
54
Fate doppio click con il tasto SX del mouse nella posizione dove vedete il puntatore nell’im-
magine qui sopra. Sullo schermo si propone una situazione analoga alla figura successiva.
In alto viene aperta una scheda che di solito richiama il nome dell’oggetto a cui stiamo
lavorando, mentre la scheda con il nome dell’oggetto in questo caso Form1, seguito dalla
scritta [Progettazione] si riferisce alla parte che riguarda la parte grafica dell’oggetto ciò
la progettazione di quello che dovrà poi apparire sullo schermo dell’utilizzatore del pro-
gramma. Per passare dalla Progettazione al codice basta fare click con il tasto SX del mouse
sulla scheda dove dovete lavorare.
Quando sarete più esperti nell’ambito della programmazione è probabile che le schede vi-
sibili in alto siano molte di più di quelle di questo esempio, quindi fate attenzione su quale
cliccate per essere sicuri che state lavorando a quella desiderata. Sbagliare è molto facile
anche per un esperto e questo comporta spesso una perdita di tempo.
Gli elementi del Linguaggio di Programmazione
55
Quando passate dal lato codice avrete già notato nell’esempio precedente che la pagina
non è proprio vuota, come se qualcuno avesse già digitato qualcosa come si vede nella
figura successiva. Per quanto riguarda una finestra o form troverete qualcosa di simile a ciò
che vedete qui di sotto:
Queste parti non vanno assolutamente modificate dell’utente perché servono al programma
per funzionare. Il significato di questo codice misterioso nel dettaglio verrà illustrato più
avanti in questo capitolo ci limiteremo a dare una spiegazione di massima per introdurre la
tecnica di scrittura del codice.
Ogni controllo che utilizziamo a livello di codice appartiene ad una classe di oggetti, quindi
il computer genera automaticamente il codice necessario per il funzionamento di massima
dato che senza una dichiarazione esplicita qualsiasi l’oggetto non esisterebbe. Nel caso di
un Form (quello che poi è una finestra di Windows) e appunto il codice che vediamo in
figura.
Quindi come prima cosa troveremo:
End Class
Dove Form1 è il nome della finestra. Ogni dichiarazione inizia con il nome del form e termina
con l’istruzione End Class. Quindi tutto il codice che troveremo fra queste due istruzioni
serve al funzionamento dell’oggetto in questione.
Come nei primi linguaggi di programmazione, il computer esegue le istruzioni in modo li-
neare ovvero una dopo l’altra fino a quando non trova altre istruzioni, allora si ferma l’ese-
cuzione di un programma. Ovviamente esistono delle istruzioni che possono spostare l’ese-
cuzione in un altro punto di un programma o cose di questo genere qui, quindi consultate
il capitolo che tratta delle routine e delle funzioni per capire meglio questo meccanismo.
La dichiarazione Public sta a significare che questo oggetto è pubblico ovvero può essere
richiamato da qualsiasi parte del programma.
La dichiarazione Private significa che quella parte di codice può essere richiamata solo
dall’interno dell’oggetto principale che contiene quel codice, ovvero in questo caso il Form1.
Inoltre, ogni classe ha le sue caratteristiche di base. Le Finestre o Form essendo una classe
di oggetti hanno delle caratteristiche che le diversificano da tutte le altre classi e quindi
dispongono di funzioni proprie diverse da altri oggetti come ad esempio un pulsante di
comando, una lista combinata ecc.
Per il programmatore è praticamente impossibile ricordare a memoria tutte le caratteristi-
che di ogni oggetto, ma con la pratica quelle salienti restano comunque abbastanza semplici
da ricordare.
Per quanto riguarda le nostre finestre o form, quando viene avviato il programma, il com-
puter va a cercare se ci sono istruzioni da eseguire dopo la parte di codice:
VisualBasic.NET 2019 – Partendo da Zero
56
End Sub
Se non avete capito un tubo fregatevene. Tutto sarà più chiaro quando met-
teremo in pratica quando detto.
Le istruzioni
È chiamata generalmente istruzione quello che possiamo definire un “comando” che diamo
al computer sotto forma di codice in modo che esegua un’operazione. Le istruzioni possono
essere formate da parole chiave del linguaggio, nel nostro caso Visual Basic, e da assegna-
zioni che effettua il programmatore.
Il linguaggio con il quale ci si rivolge alla macchina è composto da una serie di parole chiave
e da una sintassi generica che si metabolizza meglio con l’esperienza. Visual Basic è un
ottimo compromesso fra velocità di esecuzione e quantità di codice da scrivere per poter
arrivare allo scopo.
Gli eventi
Il computer per eseguire le istruzioni comincia certamente dal punto dove inizia il pro-
gramma, ma reagisce anche e soprattutto in virtù degli eventi che si verificano durante
l’esecuzione del programma stesso. Per evento si intende ad esempio quando l’operatore
fa click su uno specifico pulsante di comando, oppure fa passare semplicemente il mouse
al di sopra ad un’immagine, o trascina un oggetto ecc. ecc.
Ogni controllo, form, pulsante di comando e via dicendo, dispone tutta una serie di eventi
già programmati che possono verificarsi in seguito ad un’operazione da parte di chi utilizza
il programma come ad esempio un click su un pulsante di comando.
Nel caso di un oggetto form il primo evento che si verifica all’avviamento del programma è
la sua apparizione sullo schermo che in gergo si chiama caricamento in memoria (Load) e
da qui viene, in fase di scrittura del codice dal computer viene generata una zona nella
quale dovranno essere inserite le istruzioni che devono essere eseguite quando si genera
quello specifico evento.
Quindi, se volete che quando compare la finestra form1 sullo schermo al momento dell’avvio
del programma accada qualcosa, dovete scrivere il codice corrispondente per far accadere
questo qualcosa fra queste due istruzioni.
Lo spazio fra le due istruzioni può essere allargato a piacimento anche semplicemente por-
tando il cursore fra le due istruzioni e premendo il tasto Invio dalla tastiera.
Gli elementi del Linguaggio di Programmazione
57
Righe Vuote
Durante l’esecuzione di un programma le righe lasciate vuote dal programmatore vengono
ignorate. È quindi possibile ordinare il codice in modo che sia leggibile con facilità.
Per maggior chiarezza il codice può essere scritto con rientri da sinistra diversificati (inden-
tazione) per rendere al programmatore più chiaro il flusso del programma. Inoltre, lo spazio
fra un’istruzione ed un’altra può essere variabile a piacimento senza regole restrittive.
Le variabili
Una variabile è semplicemente un’area di memoria alla quale assegnate voi un nome di
fantasia come ad esempio “Pippo” dove avete la possibilità di memorizzare tutto quello che
volete, come ad esempio numeri o lettere. Durante un programma per rientrare in possesso
del contenuto della variabile basta semplicemente richiamarla.
Per una migliore gestione esistono diversi tipi di variabile a seconda di quello che avete
intenzione di metterci dentro. In pratica il computer vuole sapere se la variabile che avete
creato deve contenere del testo, dei numeri o chissà quale altra diavoleria proprio perché
durante l’esecuzione del programma è probabile che debba eseguire delle operazioni su
queste variabili.
Una variabile che contiene testo in gergo si chiama stringa. Quindi una qualsiasi frase per
il computer è una stringa di caratteri. Le variabili possono anche essere numeriche, quindi
contenere dei numeri che magari successivamente verranno utilizzati per fare delle opera-
zioni matematiche, e anche di altri tipi che ho riassunto nella tabella successiva.
Una variabile prima di essere utilizzata è meglio che sia dichiarata come nell’esempio qui
sotto con l’istruzione Dim.
Dim a As Integer La variabile “a” potrà contenere nel suo interno numeri interi.
Dim b As Double In questo caso “b” potrà contenere numeri a precisione doppia
Dim Stringa As String Questa invece è una stringa di caratteri, ovvero una parola o una
frase
Dim DataOdierna As Date Questa variabile contiene una data.
VisualBasic.NET 2019 – Partendo da Zero
58
Ignorate per il momento il fatto che il computer sottolinea in verde il nome delle nostre
variabili in quanto le considera inutili perché non utilizzate in operazioni nel programma
(che ancora dovete scrivere!!).
Il nome di una variabile non deve presentare spazi al suo interno quindi, ad esempio, una
variabile che conterrà un totale generale dovrebbe essere chiamata totalegenerale. Nes-
suno vi vieta comunque di dare un altro nome di fantasia solo che durante la fase di crea-
zione di un programma quel nome è più facile da ricordare di altri. Inoltre, in un programma
ci possono essere, a secondo della sua complessità, molte centinaia di variabili che se non
hanno un nome ben chiaro risulta poi difficile avere una panoramica completa dell’insieme.
Un’altra cosa da tenere presente è che le variabili non possono avere come nome una parola
chiave riservata come ad esempio sub.
È possibile anche assegnare un valore al momento della dichiarazione come ad esempio:
Dim A as Integer = 50
Le costanti
La costante, come dice la parola stessa, è un valore che resta identico durante tutta l’ese-
cuzione del programma e quindi non può essere soggetta a variazioni.
La parola chiave per definire una costante è Const, quindi l’istruzione per creare una co-
stante è:
In questo caso “Pippo” è la costante che assumerà lo stesso valore durante tutta l’esecu-
zione del programma e non può essere cambiata. Ovviamente non confondete il nome di
una costante o di una variabile con il suo contenuto.
Assegnazione di valori
Come avete visto nelle figure precedenti per assegnare un valore ad una variabile si utilizza
il segno = (uguale) come ad esempio:
VisualBasic.NET 2019 – Partendo da Zero
60
A = 50
A = “PIPPO”
Dichiarazioni Esplicite
Come standard di programmazione in Visual Basic non esiste l’obbligo di dichiarare una
variabile affinché esista effettivamente, ad esempio è possibile anche ad un certo punto di
un programma scrivere a=10 senza nessuna dichiarazione dim in precedenza.
Quando però operiamo ad un programma complesso dove vi sono molte righe di codice
(praticamente sempre) è facile dimenticarsi di una variabile e quindi e meglio utilizzare
l’istruzione Option Explicit On in modo da evitare errori di digitazione o dimenticanze da
parte nostra.
Anche se questa funzione oggi è automatica in quanto inclusa nei criteri di pro-
tezione, meglio utilizzarla ugualmente. Quanto tratta questo libro vale anche
per le versioni precedenti di Visual Basic.
Option Explicit On
All’inizio di ogni codice come mostra la figura sottostante. In questo modo il computer ac-
cetta un’assegnazione solo se la variabile è stata correttamente dichiarata altrimenti picche.
Altamente consigliata l’attivazione.
Gli elementi del Linguaggio di Programmazione
61
Tipi di dati
Esistono molti tipi di dati che è possibile elaborare con Visual Basic e la tabella che vedete
qui sotto li riassume:
Date Dalle 0.00.00 (mezzanotte) dell'1 gennaio 0001 alle 23.59.59 del 31
dicembre 9999
Operazioni matematiche
Quello che vediamo in questo capitolo serve come guida alle operazioni che Visual Basic è
capace di fare, e soprattutto per mostrare la sintassi delle operazioni. Non è necessario
impararle a memoria né creare un progetto ad arte per il momento. Serve solo come rife-
rimento futuro se non vi ricordate come si fa a fare la radice quadrata di qualcosa o cose di
questo genere qui, e troverà il suo utilizzo durante la progettazione dei vostri programmi.
Come ben sapete il computer è nato per fare solo ed esclusivamente calcoli matematici
benché al semplice utilizzatore non possa sembrare vero. Quindi vediamo come utilizzare
le operazioni di base.
VisualBasic.NET 2019 – Partendo da Zero
62
+ Addizione
- Sottrazione
* Moltiplicazione
/ Divisione (quoziente)
% Divisione (resto)
^ Elevamento a potenza
Prima di andare avanti con la nostra avventura inserite per favore nello spazio dei nomi il
codice che vedete nella figura sottostante.
Option Explicit On
Option Strict Off
Imports System.Math
Altrimenti alcune di queste funzioni potrebbero non comportarsi come si conviene o rifiutarsi
addirittura di collaborare. Nell’esempio seguente vedremo alcune possibilità matematiche
di Visual Basic.
Creo tre variabili di tipo Double (precisione doppia) e assegno dei valori a due di esse.
Utilizzo la variabile “Totale” per memorizzare il risultato delle operazioni fra a e b.
Dim a As Double = 50
Dim b As Double = 35
Dim Totale As Double
Se siete curiosi e vedere dal vivo quello che accade in pratica, create un progetto nuovo
come si vede nella figura successiva. Fate click sul menu File dell’ambiente di sviluppo e
Gli elementi del Linguaggio di Programmazione
63
dalla lista scegliete la voce Nuovo – Progetto oppure eseguendo la combinazione da ta-
stiera CTRL+MAIUSC+N.
Adesso cercate nella lista di sinistra la voce Visual Basic e Desktop Classico di Win-
dows, quindi dalla lista centrale scegliete App Windows Forms.
Assegnategli un nome così sarà più facile rintracciarlo nei meandri dei vostri progetti e
confermate con un click sul pulsante Avanti in basso a destra nella finestra.
Assegnate un nome al progetto e fate click sul pulsante Crea in basso a destra nella fine-
stra.
VisualBasic.NET 2019 – Partendo da Zero
64
Quando il progetto è generato fate doppio click portando il puntatore del mouse all’interno
del Form per accedere al codice come mostrato in figura successiva.
A questo punto inserite il codice di cui parlavamo prima nel posto giusto altrimenti si veri-
ficheranno malfunzionamenti.
Fate click sul pulsante Avvia in alto nella finestra oppure premete F5 dalla tastiera. Atten-
dete che il programma si arresti sullo Stop, poi portate il puntatore del mouse senza fare
nessun click a sovrapporsi con la variabile Totale, e un’etichetta ci mostrerà il risultato della
complessa operazione matematica. Questa tecnica può risultare utile per controllare
nell’arco del programma se le variabili assumono un valore corretto oppure abbiamo sba-
gliato qualcosa.
𝑎+𝑏
+ √𝑎 2 + 𝑏 2
𝑎∗𝑏
…e visualizzarne il totale.
VisualBasic.NET 2019 – Partendo da Zero
66
Va chiarito innanzitutto che non è possibile scrivere un’espressione del genere come appare
qui sopra, ma è necessario effettuare uno sviluppo lineare utilizzando le parentesi ad esem-
pio:
Quindi vanno utilizzate le parentesi per isolare le singole operazioni tenendo presente le
regole di base delle espressioni matematiche, ovvero prima le moltiplicazioni e le divisioni
poi le somme e le sottrazioni. Alcune parentesi possono anche essere soppresse ad esempio
così:
Però state attenti altrimenti può cambiare il risultato dell’espressione anche non di poco.
Questa ad esempio va ancora bene:
Totale = (a + b) / (a * b) + Sqrt(a ^ 2 + b ^ 2)
Totale = a + b / a * b + Sqrt(a ^ 2 + b ^ 2)
E neanche questa:
Totale = (a + b / a * b) + Sqrt(a ^ 2 + b ^ 2)
Totale = (a + b) / (a * b) + Sqrt(a ^ 2 + b ^ 2)
Totale = Totale - Int(Totale)
Da questa finestra è possibile vedere quale valore assumono le variabili in quel momento
semplicemente anteponendo il simbolo ? (punto interrogativo) al nome della variabile ad
esempio ? Totale e quindi premendo Invio dalla tastiera.
VisualBasic.NET 2019 – Partendo da Zero
68
Come mostra la figura successiva il totale non tarda ad apparire sullo schermo.
Funzioni trigonometriche
Anche la trigonometria ha un suo posto al sole con Visual Basic. L’unica cosa che va tenuta
presente è che il computer utilizza per variabili che rappresentano un angolo espresso in
radianti e non in gradi come siamo abituati a fare. Per passare da un angolo in gradi ad un
o in radianti basta applicare la seguente formula.
𝜋 ∗ 𝐴𝑛𝑔𝑜𝑙𝑜 𝑖𝑛 𝐺𝑟𝑎𝑑𝑖
𝐴𝑛𝑔𝑜𝑙𝑜 𝑖𝑛 𝑅𝑎𝑑𝑖𝑎𝑛𝑡𝑖 =
180
Ovvero:
Dim Risultato As Double
Dim AngoloGradi As Double = 75 'Ad esempio utilizzo un angolo di 75°
Dim AngoloRadianti As Double = PI * AngoloGradi / 180
Non è assolutamente necessario imparare a memoria tutti gli argomenti che verranno
esposti nella prossima parte di questo capitolo. Alla termine dello stesso si trova un
riepilogo delle operazioni più importanti. Tenetelo presente però come punto di riferi-
mento per consultazioni future perché quando si sviluppa un programma, è difficile
ricordare la sintassi di quei comandi che non utilizziamo proprio troppo spesso.
Nome = "Pinco"
Cognome = "Pallino"
Indirizzo = "Piazza della Vittoria, 41"
Citta = "Firenze"
Utente = Nome & " " & Cognome & vbLf & Indirizzo & " - " & Citta
Ovviamente non esiste la necessità di mandare accapo quando concateno delle stringhe.
Serve come esempio nel caso abbiate la necessità di visualizzare sullo schermo il contenuto
di una stringa, in una finestra di messaggio, su più righe. Questa riga serve solo per visua-
lizzare sullo schermo il risultato.
Stringaformattata = LCase(Stringa)
MsgBox(Stringaformattata, vbOKOnly + vbExclamation, "Risultato")
Stringaformattata = UCase(Stringa)
La funzione Format oltre che sui numeri può lavorare anche sulle date. Acquisisce la data e
l’ora attuali provenienti dall’orologio del computer e la inserisce nella variabile DataOdierna.
Ad esempio:
DataOdierna = Now
DataFormattata = Format(DataOdierna, "dd/MM/yyyy")
Altri esempi:
O meglio ancora:
InStr
Restituisce un valore numerico Integer che specifica la posizione della prima occorrenza di
una stringa all'interno di un'altra, in pratica ricerca una stringa dentro un’altra.
Argomento Descrizione
Opzionale. Valore numerico che imposta la posizione di partenza per ogni
ricerca. Se omesso, la ricerca inizia dalla prima posizione del carattere. Se
Inizio
Inizio contiene Null, si verifica un errore. L'argomento di avvio è obbliga-
torio se viene specificato il confronto tipo di confronto.
stringa1 Parametro obbligatorio, rappresenta la stringa nella quale ricercare.
stringa2 Parametro obbligatorio, rappresenta la stringa da ricercare.
Specifica il tipo di confronto delle stringhe. Se compare è Null, si verifica
confronto un errore. Se compare omesso, l'opzione Confronta opzione determina il tipo
di confronto.
Costante Descrizione
CompareMethod.Binary Esegue una comparazione tipo binario.
CompareMethod.Text Esegue una comparazione testuale.
Esempio:
LCase
Questa funzione trasforma una stringa in caratteri minuscoli.
Len
Restituisce un valore contenente il numero di caratteri presenti in una stringa.
Caratteri = Len(Stringa)
MsgBox(Caratteri, vbInformation, "Messaggio")
Mid
Prende un certo numero di caratteri contenuti in una stringa partendo da una posizione. Ad
esempio Mid(Stringa,13,5) prende 5 caratteri contenuti nella stringa a partire dal carattere
13. Provate il codice qui di seguito:
MsgBox(Stringa & vbLf & Stringa1 & vbLf & Stringa2 & vbLf & Stringa3,
vbOKOnly, "Messaggio")
Space
Questa funzione restituisce una stringa contenente un numero specificato di spazi vuoti.
Esempio di utilizzo:
StrConv
Restituisce una stringa convertita in un modo specifico. Sintassi:
Argomento Descrizione
stringa Rappresenta la stringa da convertire.
Il valore o la somma di valori che specifica il tipo di conversione da
conversione
eseguire.
VisualBasic.NET 2019 – Partendo da Zero
74
Le impostazioni dell’argomento Conversione sono:
Costante Descrizione
vbUpperCase Converte la stringa in maiuscolo.
vbLowerCase Converte la stringa in minuscolo.
vbProperCase Converte la prima lettera di ogni parola in maiuscolo.
In questo esempio viene utilizzata la funzione StrConv per convertire il testo contenuto in
una stringa in un testo tutto maiuscolo.
StrComp
Questa funzione viene utilizzata per comparare il contenuto di due stringhe di caratteri.
Restituisce un valore (di tipo Variant o Integer) che indica il risultato della comparazione
fra stringhe. Sintassi:
StrComp (stringa1, stringa2, Comparazione)
Argomenti della Funzione:
Argomento Descrizione
stringa1 Prima Stringa di caratteri
stringa2 Stringa da comparare
Opzionale. Specifica la tipologia di comparazione. Se questo argomento
assume il valore NULL, si verifica un errore.
Comparazione
Se è omesso la comparazione è determinata dall’impostazione Option Com-
pare nella sezione dichiarazioni.
Costante Descrizione
vbBinaryCompare Esegue una comparazione binaria.
vbTextCompare Esegue una comparazione di testo.
Esempi: Questo esempio utilizza la funzione StrComp per restituire i risultati di un con-
fronto di stringhe. Se l’argomento comparazione è VbTextCompare, viene eseguito un con-
fronto testuale; se l’argomento comparazione è VbBinaryCompare o omesso, viene eseguito
un confronto binario.
Stringa1 = "ABCDEFGHI"
Stringa2 = "abcdefghi"
Gli elementi del Linguaggio di Programmazione
75
Risultato = StrComp(Stringa1, Stringa2, vbTextCompare)
Risultato = StrComp(Stringa1, Stringa2, vbBinaryCompare)
StrReverse
Inverte la sequenza dei caratteri in una stringa.
UCase
Questa funzione trasforma una stringa in caratteri maiuscoli.
Data e Ora
Visual Basic dispone di tutta un serie di funzioni che eseguono le più disparate operazioni
su date e ore e rivestono una certa importanza nel flusso del programma, ad esempio se
devo calcolare una data futura aggiungendo un certo numero di giorni, oppure calcolare la
differenza in giorni fra due date ecc. ecc.
Iniziamo quindi la nostra rassegna delle funzioni più importanti:
Date
Questa funzione restituisce la Data attuale del sistema. Esempio:
Tenete presente che il codice per il momento non contempla gli eventuali errori che possono
derivare da un’immissione errata da parte dell’utente, oltre ad eventuali errori in fase di
esecuzione (run time) che invece affronteremo nel capitolo che tratta della gestione degli
errori con Visual Basic.
Se il parametro numero non è un valore Long, viene arrotondato al numero intero più vicino
prima di essere valutato. Inoltre, il formato del valore restituito è determinato dalle impo-
stazioni del Pannello di controllo, non dal formato passato nell'argomento della data.
L’esempio che segue utilizza una data inserita dall’operatore e aggiunge un numero di mesi
a piacere e visualizza la data risultante.
Gli elementi del Linguaggio di Programmazione
77
DateDiff
Restituisce un valore Long che specifica il numero di intervalli di tempo tra due date speci-
ficate.
Argomento Descrizione
Argomento obbligatorio. Espressione di stringa che corrisponde
Intervallo all'intervallo di tempo utilizzato per calcolare la differenza
tra date1 e date2.
Argomento obbligatorio; Variant (o Data). Le due date da uti-
data1, data2
lizzare nel calcolo.
Argomento facoltativo. Una costante che specifica il primo
primogiornodellasettimana giorno della settimana. Se non specificato, la domenica è presa
come punto di partenza.
Argomento facoltativo. Una costante che specifica la prima set-
primasettimanadellanno timana dell'anno. Se non specificato, si presume che la prima
settimana sia la settimana in cui si verifica il 1 ° gennaio.
È possibile utilizzare la funzione DateDiff per determinare quanti intervalli di tempo specifici
esistono tra due date. Ad esempio, è possibile utilizzare DateDiff per calcolare il numero di
giorni tra due date o il numero di settimane tra oggi e la fine dell'anno.
Codice di esempio: Questo esempio utilizza la funzione DateDiff per visualizzare il numero
di giorni tra una determinata data e oggi. Versione semplice:
Versione completa. Il codice contiene anche il controllo degli errori in caso di digitazione
errata da parte dell’utente. Per maggiori informazioni consultate il capitolo che tratta delle
trappole per errori.
Try
Dim Data2 As Date = Date.Parse(DataImmessa)
Dim Data1 As Date = Now
' Calcola il numero di giorni fra tue date.
Dim Giorni As Long = DateDiff(DateInterval.Day, Data1, Data2)
' Trappola per errori
MessageBox.Show("Giorni da oggi: " & Giorni.ToString)
Catch ex As Exception
MessageBox.Show("Data Errata: " & ex.Message)
End Try
DatePart
Restituisce un valore Integer contenente la parte specificata di una determinata data.
Argomento Descrizione
Obbligatorio. Espressione stringa che corrisponde all'in-
Intervallo
tervallo di tempo che si desidera restituire.
Data Obbligatorio. Valore che si desidera valutare.
Facoltativo. Una costante che specifica il primo giorno
primogiornodellasettimana della settimana. Se non specificato, la domenica è presa
come riferimento.
Facoltativo. Una costante che specifica la prima settimana
primasettimanadellanno dell'anno. Se non specificato, si presume che la prima set-
timana sia la settimana in cui si verifica il 1 ° gennaio.
Gli elementi del Linguaggio di Programmazione
79
Esempio di codice:
DateSerial
Restituisce una data specificando un anno un mese e un giorno in formato numerico.
VisualBasic.NET 2019 – Partendo da Zero
80
DateSerial(anno, mese, giorno)
Argomento Descrizione
year Obbligatorio: Numero intero che rappresenta l’anno.
month Obbligatorio; Numero intero che rappresenta il mese.
day Obbligatorio; Numero intero che rappresenta il giorno.
Esempio:
DateValue
Trasforma una stringa di caratteri in una data.
DateValue(data)
Nota bene: L'argomento della data richiesto è normalmente una stringa che rappresenta
una data dal 1° gennaio dell’anno 1 fino al 31 dicembre 9999. La data può anche essere
qualsiasi espressione che può rappresentare una data, un'ora o una data e un'ora.
Se data è una stringa che include solo numeri separati da separatori di date validi, DateVa-
lue riconosce l'ordine per mese, giorno e anno in base al formato Data breve specificato
nelle impostazioni del sistema Windows.
Riconosce anche date non ambigue che contengono i nomi dei mesi, sia in forma lunga che
abbreviata. Ad esempio, oltre a riconoscere 30/10/1999 e 10/30/99, DateValue riconosce
anche il 30 ottobre 1999 e il 30 ottobre 1999.
Se viene omessa la parte dell'anno della data, DateValue utilizza l'anno corrente dalla data
di sistema del computer.
Se l'argomento della data include informazioni sull'ora, DateValue non lo restituisce. Se la
data include informazioni sull'ora non valide (come "78:89"), si verifica un errore.
Esempio:
Hour
Restituisce un valore Integer compreso tra 0 e 23, incluso, che rappresenta l'ora del giorno.
Hour(Orario)
L'argomento Orario richiesto è qualsiasi Variant, numero, stringa di caratteri o qualsiasi
combinazione che può rappresentare un orario. Come nella funzione precedente se Orario
contiene Null viene restituito Null.
Orario = "18:43"
Minute
Restituisce un Integer compreso fra 0 and 59 che rappresenta i minuti di un orario.
Minute(Orario)
Per quanto riguarda l’argomento da passare alla funzione vale quanto detto per le funzioni
Day e Hour.
Month
Restituisce un valore Integer compreso tra 1 e 12 che rappresenta il mese dell'anno.
Month(date)
Mese = Month(Data1)
MonthName
Restituisce una stringa di caratteri che rappresenta il nome del mese specificato come ar-
gomento.
MonthName(Mese, [Abbreviazione])
Abbreviazione: Facoltativo. Valore booleano che indica se il nome del mese deve essere
abbreviato. Se omesso, il valore predefinito è False, ovvero il nome del mese non è abbre-
viato.
VisualBasic.NET 2019 – Partendo da Zero
82
Data1 = #4/14/2019#
Data1 = "14 Aprile 2019"
Data1 = "14/04/2019"
Now
Restituisce una oggetto DateTime che specifica la data e l'ora correnti in base alla data e
all'ora del vostro computer. Questo esempio di codice mostra l’ora corrente formattata in
quattro differenti modi.
Second
Restituisce un valore Variant (intero) che specifica un numero intero compreso tra 0 e 59,
che rappresenta i secondi del valore passato come argomento.
Second(tempo)
L'argomento è qualsiasi espressione numerica, espressione di stringa o qualsiasi combina-
zione che può rappresentare un tempo.
TimeSerial
Restituisce un valore tipo Date che contiene un Orario specificando l’ora, i minuti ed i se-
condi.
TimeSerial(Ora, Minuti, Secondi)
Argomento Descrizione
Obbligatorio; Variant (Integer). Un numero compreso fra 0 (12:00 A.M.) and
Ora
23 (11:00 P.M.).
Minuti Obbligatorio; Variant (Integer). Qualsiasi espressione numerica.
Secondi Obbligatorio; Variant (Integer). Qualsiasi espressione numerica.
Per specificare un orario, ad esempio 11:59:59, l'intervallo di numeri per ciascun argomento
TimeSerial deve essere compreso nell'intervallo normale per l'unità; ovvero, 0-23 per ore
Gli elementi del Linguaggio di Programmazione
83
e 0-59 per minuti e secondi. È possibile inoltre specificare i tempi relativi per ciascun argo-
mento utilizzando qualsiasi espressione numerica che rappresenti un numero di ore, minuti
o secondi prima o dopo un determinato intervallo di tempo.
Nell'esempio seguente vengono utilizzate espressioni anziché numeri di tempo assoluti. La
funzione TimeSerial restituisce un orario per 15 minuti prima (-15) sei sette prima di mez-
zogiorno (12 - 7) o 4:45:00 A.M
TimeSerial(12 - 7, -15, 0)
Quando uno degli argomenti supera l'intervallo normale per quell'argomento, viene incre-
mentata l’unità successiva. Ad esempio, 75 minuti, viene valutato come un'ora e 15 minuti.
Se un singolo argomento non rientra nell'intervallo da -32.768 a 32.767, si verifica un
errore. Se il tempo specificato dai tre argomenti fa sì che la data non rientri nell'intervallo
accettabile di date, si verifica un errore.
Weekday
Restituisce un Integer contenente un numero che rappresenta il giorno della settimana.
Weekday(Data, Primogiornodellasettimana)
Argomento Descrizione
Parametro obbligatorio: Variant, espressione numerica, Stringa
Data o qualsiasi combinazione che possa rappresentare una data va-
lida.
Parametro facoltativo: una costante che specifica quale deve
Primogiornodellasettimana essere il primo giorno della settimana. Se non è specificato
per convenzione viene impostata domenica.
WeekdayName
Restituisce una Stringa di caratteri che rappresenta il nome del giorno della settimana del
numero del giorno della settimana passato come argomento.
WeekdayName(GiornodellaSettimana, Abbreviato, Primogiornodellasettimana)
VisualBasic.NET 2019 – Partendo da Zero
84
Argomento Descrizione
Obbligatorio. Un numero che rappresenta il giorno della set-
GiornodellaSettimana timana. Il risultato dipende dalle impostazioni dell’argomento
Primogiornodellasettimana.
Facoltativo. Valore tipo Boolean (True o False) che indica se
il nome del giorno della settimana deve essere restituito ab-
Abbreviato
breviato oppure no. Se viene omesso il giorno della settimana
viene restituito non abbreviato.
Facoltativo. Un valore numerico che rappresenta il primo giorno
primogiornodellasettimana
della settimana. Consultate la tabella successiva.
Year
Restituisce un valore Integer contenente un numero intero che rappresenta l'anno.
Year(data)
Altre funzioni
Può accadere che sia necessario verificare la validità di dati immessi dall’utente attraverso
la tastiera, per impedire che il programma restituisca un errore, oppure sincerarsi che il
risultato di un’operazione matematica rientri in una specifica tipologia di dati. Per questo
Visual Basic mette a disposizione del programmatore tutta una serie di funzione dette di
Ispezione.
Gli elementi del Linguaggio di Programmazione
85
IsDate
Questa funzione restituisce il valore True (Vero) se l'espressione passata come argomento
è una data o è riconoscibile come una data o un'ora valida, altrimenti restituisce False
(Falso).
IsDate(espressione)
L'argomento di espressione obbligatorio è un valore contenente un'espressione stringa ri-
conoscibile come data o ora. L'intervallo di date valide è il 1° gennaio dell’anno 1, fino al
31 dicembre 9999. È possibile passare come argomento una data in uno dei modi mostrati
nel codice sottostante.
Data = "05/30/2018"
Verifica = IsDate(Data) 'Restituisce VERO
Data = "30/05/2018"
Verifica = IsDate(Data) 'Restituisce VERO
Data = "11/36/2018"
Verifica = IsDate(Data) 'Restituisce FALSO
Data = "05.30.18"
Verifica = IsDate(Data) 'Restituisce VERO
Data = "05.30.2018"
Verifica = IsDate(Data) 'Restituisce FALSO
Data = #5/30/2018#
Verifica = IsDate(Data) 'Restituisce Vero
MsgBox Verifica
End If
IsEmpty
Restituisce un valore booleano (Vero o Falso) che indica se una variabile è stata inizializzata
oppure è vuota.
IsEmpty(espressione)
L'argomento di espressione richiesto può essere un'espressione numerica o di stringa. Dato
che IsEmpty viene utilizzato per determinare se le singole variabili sono inizializzate, ovvero
VisualBasic.NET 2019 – Partendo da Zero
86
che gli sia stato già assegnato un valore, l'argomento espressione è solitamente il nome
della variabile.
Variabile = Null
Verifica = IsEmpty(Variabile) ' Falso.
Variabile = Empty
Verifica = IsEmpty(Variabile) ' Vero.
Variabile = 50
Verifica = IsEmpty(Variabile) ' Falso
MsgBox Verifica
IsNumeric
Restituisce un valore booleano (Vero o Falso) che indica se un'espressione può essere con-
siderata come un tipo di dato numerico.
IsNumeric(espressione)
L'argomento di espressione richiesto è qualcosa che contiene un'espressione numerica o
una stringa. La funzione restituisce Vero (True) solo se l’intera espressione viene ricono-
sciuta come un numero, altrimenti restituisce False. Se come argomento viene passata
un’espressione che rappresenta una data, la funzione restituisce Falso (False).
Variabile = "64"
Verifica = IsNumeric(Variabile) 'Vero
Variabile = "384.251"
Verifica = IsNumeric(Variabile) ' Vero
MsgBox Verifica
Esempio di codice:
Else
End If
Gli elementi del Linguaggio di Programmazione
87
IsNull
Restituisce un valore booleano che indica se un'espressione non contiene dati validi (Null).
IsNull(espressione)
L'argomento di espressione richiesto è qualcosa che contiene un'espressione numerica o
un'espressione di stringa. Viene restituito True (Vero) se l’espressione passata come argo-
mento è Null; in caso contrario restituisce False. Se l’espressione è costituita da più di una
variabile, Null in qualsiasi variabile che fa parte dell’espressione fa sì che True vengo resti-
tuito per l'intera espressione.
Il valore Null indica che la variabile non contiene dati validi. Null non è uguale a Empty, che
indica che una variabile non è stata ancora inizializzata.
Non è uguale a una stringa di lunghezza zero ("") che a volte viene definita stringa nulla.
Valore = Asc(Stringa)
CBool
Questo esempio utilizza la funzione CBool per convertire un'espressione in valore tipo boo-
leano. Ad esempio, viene verificato le due variabili A e B sono uguali.
Nell’ultimo esempio se l'espressione restituisce un valore diverso da zero, CBool restituisce
Vero, altrimenti restituisce Falso.
L’argomento può essere qualsiasi stringa o valore numerico.
A = 25 : B = 25
Verifica = CBool(A = B) 'Restituisce True
MsgBox(Verifica, vbOKOnly, "Messaggio")
A = 24 : B = 25
Verifica = CBool(A = B) 'Restituisce False
MsgBox(Verifica, vbOKOnly, "Messaggio")
A = 0 : B = 25
Verifica = CBool(A) 'Restituisce False
MsgBox(Verifica, vbOKOnly, "Messaggio")
CByte
Converte l'espressione passata come argomento in un byte. Restituisce valori compresi fra
0 e 255.
VisualBasic.NET 2019 – Partendo da Zero
88
Dim Numero As Double, Valore As Byte
CDate
Questo esempio utilizza la funzione CDate per convertire una stringa in una data. In gene-
rale, non è consigliato passare le date e le ore come stringhe (come mostrato in questo
esempio).
Meglio utilizzare il formato letterale, ad esempio # 3/15/1982 # e # 7:44:32 PM #
Messaggio = "Data = " & Data1 & " " & "Data Breve = " & DataBreve & vbLf &
"Ora = " & Ora & " OraBreve = " & OraBreve
CDbl
questa funzione converte un'espressione in un numero tipo Double.
NumeroDecimale = "325,2145"
Numero = CDbl(NumeroDecimale * 5.21 * 0.6) 'esempio di calcolo con coversione a Double
MsgBox("Numero decimale = " & NumeroDecimale & " - Numero " & Numero,
vbOKOnly, "risultato")
CDec
Trasforma un numero in formato valuta in un numero in formato decimale. Per maggiori
informazioni consultate il capitolo che tratta dei tipi di dati in Visual Basic.
Valuta = 1254.52478
Decimale = CDec(Valuta)
MsgBox("Valuta = " & Valuta & " Decimale = " & Decimale, vbOKOnly, "Messaggio")
Chr
Restituisce una stringa contenente il carattere associato al codice carattere specificato.
Chr(codicecarattere)
Gli elementi del Linguaggio di Programmazione
89
I numeri da 0 a 31 sono uguali ai codici ASCII standard non stampabili. Ad esempio, Chr
(10) restituisce un carattere di avanzamento riga. L'intervallo normale per codicecarattere
è 0-255. Tuttavia, nei sistemi DBCS, l'intervallo effettivo per codicecarattere è -32768-
65535.
For j = 65 To 92
Carattere = Chr(j)
Messaggio = Messaggio & "Valore = " & j & " " & "Carattere = " & Carattere & vbLf
Next
CInt
Questo esempio utilizza la funzione CInt per convertire un numero a precisone doppia in
un intero. La parte intera viene arrotondata per eccesso.
Numero = 3487.5459
Intero = CInt(Numero)
MsgBox("Numero = " & Numero & " Parte Intera = " & Intero,
vbOKOnly, "Messaggio")
CLng
La funzione CLng trasforma un numero a precisione doppia in un intero lungo.
Messaggio = "Valore1 = " & Valore1 & " " & "Intero 1 = " & InteroLungo1 & vbLf &
"Valore2 = " & Valore2 & " " & "Intero 2 = " & InteroLungo2
CSng
Converte un numero a precisione doppia in uno a precisione singola.
CStr
Converte un valore numerico in una stringa di caratteri.
CStr(Numero)
Dim Numero As Double, Stringa As String
Numero = 1854.3254
Stringa = CStr(Numero) ' la stringa contiene "1854.3254".
FormatCurrency
Restituisce un'espressione formattata come Stringa utilizzando il simbolo di valuta definito
nel pannello di controllo del computer. Sintassi del comando:
Argomento Descrizione
Espressione Obbligatorio. L’espressione da formattare.
Facoltativo. Valore numerico che indica il numero di cifre
NumeroCifreDecimali decimali visualizzate. Il valore predefinito è -1, che in-
dica che vengono utilizzate le impostazioni del computer.
Facoltativo. Costante che indica se uno zero iniziale viene
InclusoLaPrimaCifra visualizzato o meno per i valori frazionari. Vedi la ta-
bella successiva.
Facoltativo. Costante che indica se posizionare o meno va-
UsaParentesiPerNumeriNegativi
lori negativi tra parentesi. Vedi la tabella successiva.
Facoltativo. Costante che indica se i numeri sono raggrup-
pati utilizzando il delimitatore di gruppo specificato
RaggruppaCifre
nelle impostazioni internazionali del computer. Vedi ta-
bella successiva
Argomento Descrizione
Data Obbligatorio. Una data da formattare.
Facoltativo. Valore numerico che indica il formato di data / ora
Formato
utilizzato. Se omesso, viene utilizzato vbGeneralDate.
FormatNumber
Restituisce un’espressione formattata come numero.
Argomento Descrizione
Espressione Obbligatorio. L’espressione da formattare.
Facoltativo. Valore numerico che indica il numero di cifre
NumeroCifreDecimali decimali visualizzate. Il valore predefinito è -1, che in-
dica che vengono utilizzate le impostazioni del computer.
Facoltativo. Costante che indica se uno zero iniziale viene
InclusoLaPrimaCifra visualizzato o meno per i valori frazionari. Vedi la ta-
bella successiva.
Facoltativo. Costante che indica se posizionare o meno va-
UsaParentesiPerNumeriNegativi
lori negativi tra parentesi. Vedi la tabella successiva.
VisualBasic.NET 2019 – Partendo da Zero
92
Facoltativo. Costante che indica se i numeri sono raggrup-
pati utilizzando il delimitatore di gruppo specificato
RaggruppaCifre
nelle impostazioni internazionali del computer. Vedi ta-
bella successiva
Valore = -15241.3256
FormatPercent
Restituisce un'espressione formattata come percentuale (moltiplicata per 100) con un ca-
rattere % finale.
Argomento Descrizione
Espressione Obbligatorio. L’espressione da formattare.
Facoltativo. Valore numerico che indica il numero di
cifre decimali visualizzate. Il valore predefinito è -
NumeroCifreDecimali
1, che indica che vengono utilizzate le impostazioni
del computer.
Facoltativo. Costante che indica se uno zero iniziale
InclusoLaPrimaCifra viene visualizzato o meno per i valori frazionari. Vedi
la tabella successiva.
Facoltativo. Costante che indica se posizionare o meno
UsaParentesiPerNumeriNegativi valori negativi tra parentesi. Vedi la tabella succes-
siva.
Facoltativo. Costante che indica se i numeri sono rag-
gruppati utilizzando il delimitatore di gruppo specifi-
RaggruppaCifre
cato nelle impostazioni internazionali del computer.
Vedi tabella successiva
Valore = -0.41
Hex
Restituisce una stringa che rappresenta il valore esadecimale di un numero.
Hex(numero)
L'argomento richiesto è qualsiasi espressione numerica valida o stringa. Se il numero non
è un numero intero, viene arrotondato al numero intero più vicino.
Argomento Risultato
-2,147,483,648 to 2,147,483,647 Fino a otto caratteri esadecimali
NULL Null
VUOTO Zero (0)
Per l’operazione inversa, fate precedere ad un valore esadecimale &H. Ad esempio, Hex
(255) restituisce la stringa FF e &HFF restituisce il numero 255.
For J = 1 To 10
Messaggio = Messaggio & "Numero = " & Numero & " Valore esadecimale = " &
Esadecimale & vbLf
Next J
MsgBox(Messaggio, vbOKOnly, "Messaggio")
For J = 1 To 10
Next J
Dim Anno As Integer = Year(Now) Inserisce nella variabile Anno l’anno corrente. Ri-
cordate che la funzione Now prende i dati dall’oro-
logio del computer.
Dim Orario As String Formato orario a 12 ore
Orario = Format(Now, "hh:mm")
Orario = Format(Now, "HH:mm") Formato orario a 24 ore
Orario = Format(Now, "HH:mm:ss") Include anche i secondi
Dim Giorno As String = Format(Now, "dd") 'viene recuperato il numero del giorno
Gli elementi del Linguaggio di Programmazione
95
Dim Mese As String = Format(Now, "MMMM") 'viene visualizzato il nome del mese
Dim Mese As String = Format(Now, "MM") 'viene visualizzato il numero del mese
Concatenazione di stringhe
Come se sommassi i testi contenuti nelle stringhe. Ad esempio:
Ad esempio:
Stringa = Mid(Stringa, 5, 8)
Restituisce i caratteri di una stringa a partire dal quinto e prendendone altri
otto.
Val Converte una stringa in un numero ammesso che contenga qualcosa che possa essere
interpretata come numero. Ricordate che il separatore dei decimali è un punto e
non un virgola.
Dim a as Double
Dim Stringa as String
a = Val(Stringa)
Len Indica quanti caratteri è lunga una stringa
a = Len(Stringa)
UCase Trasforma la stringa di caratteri in maiuscolo
Stringa = UCase(Stringa)
LCase Trasforma la stringa di caratteri in minuscolo
Trim Rimuove gli spazi vuoti all’inizio e alla fine di una stringa.
VisualBasic.NET 2019 – Partendo da Zero
96
Routine
È così detto un insieme di istruzioni delimitato da una dichiarazione come nell’esempio sot-
tostante:
End Sub
Una routine deve avere necessariamente un nome così è possibile richiamarla in ogni mo-
mento (nel nostro esempio è stata chiamato “Pippo”. La parola chiave Private intende il
fatto che la routine può essere chiamata solo dall’interno della classe di appartenenza (an-
che la classe ha un nome in questo caso Form1) mentre Public sta ad intendere che possa
essere richiamata da qualsiasi punto dell’intero programma. Quindi quando viene chiamato
Pippo il computer esegue tutte le istruzioni che trova fra Private Sub Pippo e End Sub e poi
torna all’istruzione successiva.
Le frecce indicano il percorso che il programma segue nella sua elaborazione. In questo
modo è possibile eseguire più volte uno stesso gruppo di istruzioni senza ripeterle più volte
nel codice del programma.
Inoltre, è possibile inviare ad una routine un valore che il computer dovrà elaborare.
Le variabili TotaleGenerale e TotaleParziale sono state inserite in quel punto del programma
in modo che siano riconosciute in tutta la Classe, altrimenti sarebbero state valide solo nelle
Routine di appartenenza, ad esempio se le avessi dichiarate nella Routine Form1_Load
avrebbero avuto valore solo in quella Routine, oppure se le avessi dichiarate nella Ruotine
Pippo, non sarebbero state accessibili al di fuori di tale routine.
Quindi è molto importante in quale posizione vengono fatte le dichiarazioni.
Gli elementi del Linguaggio di Programmazione
97
Nella figura sottostante viene passata alla routine Pippo il valore della variabile Aliquota per
eseguire delle operazioni che avverranno all’interno della routine stessa. In questo caso fra
parentesi va inviato un parametro che tale routine utilizzerà per calcoli interni ad essa.
Etichette e GoTo.
Anche se poco utilizzate al giorno d’oggi, queste caratteristiche erano molto importanti nei
programmi di qualche annetto fa, in quanto permettono di passare da un punto ad un altro
di una serie di istruzioni. L’etichetta consiste nell’assegnare un nome al punto dove volete
arrivare seguito da due punti come si vede nella figura sottostante.
VisualBasic.NET 2019 – Partendo da Zero
98
Per questo nome non potete utilizzare dei nomi riservati di Visual Basic come ad esempio
le parole chiave. I personaggi dei cartoni animati vanno benissimo.
Per far “saltare” l’esecuzione di un programma ad una specifica etichetta basta utilizzare le
parole chiave GoTo seguito del nome dell’etichetta stessa.
In questo caso, se si verifica una certa condizione (Volume >=150), allora il programma va
verso l’etichetta saltando le istruzioni che si trovano fra il salto e l’etichetta stessa.
Le funzioni
Le funzioni sono molto simili alle routine con la differenza che una funzione restituisce un
valore da impiegare in eventuali altre operazioni.
Quindi alla funzione viene inviato un valore e questa ve ne restituisce un altro dopo gli
opportuni ragionamenti del caso. Nella figura successiva è visibile un esempio di funzione.
Intanto definisco la funzione come Private se desidero che sia richiamabile solo dall’interno
della classe dove si trova, in questo caso dal Form1, mentre definisco Public se questa
funzione deve essere accessibile da tutto il programma quindi anche da altre classi.
Nel nostro esempio alla funzione vengono passati due parametri, Raggio e altezza. Questi
parametri vanno dichiarati come variabili all’interno della funzione attraverso la parola
chiave ByVal e vanno messi fra parentesi.
Ogni parametro dichiarato va separato dall’eventuale altro da una virgola.
All’esterno della parantesi va dichiarato quale tipo di valore la funzione deve restituire, in
questo caso Double ma poteva essere anche String.
Nella funzione vanno inserite tutte le istruzioni necessarie per il calcolo, e quindi al termine
o dove necessario va posta la parola chiave Return seguita dalla variabile da restituire.
Quindi le parole End Function.
Gli elementi del Linguaggio di Programmazione
99
Private Function CalcolaVolume(ByVal Raggio As Double, ByVal altezza As Double) As
Double
Return Volume
End Function
Per utilizzare la funzione in un punto del programma e sufficiente richiamarla passando fra
parentesi separatati da virgole i parametri da inviare per avere la risposta.
CalcolaVolume(Raggio, Altezza)
In questo modo la variabile Volume può essere utilizzata nelle righe successive in quanto è
stata calcolata dalla funzione
Totale = Volume * PI
Qualora fosse coinvolta in qualche calcolo successivo, utilizzandola come variabile parte di
un’espressione. Nella figura successiva potete vedere un esempio di utilizzo dei una fun-
zione. È chiaro che una simile tecnica è molto efficace per evitare di riscrivere diverse volte
la stessa sequenza di istruzioni quando in un programma viene richiamata da diversi punti
una stessa funzione.
VisualBasic.NET 2019 – Partendo da Zero
100
L’ Istruzione If
In generale questa istruzione esegue determinate operazioni se si verifica una determinata
condizione altrimenti può eseguirne altre. L’esempio più semplice e quello del confronto fra
due variabili che può essere espresso come si vede nel riquadro sottostante. Il risultato in
questo caso è ovvio ma serve solo per comprende il meccanismo.
Si fa seguire alla parola If il confronto fra due variabili a e b. Qualora a risultasse maggiore
di b il computer dovrà eseguire determinate istruzioni mentre se la condizione non si veri-
ficasse, ovvero se a non risultasse maggiore di b, allora dovrà eseguirne altre.
If a > b Then
Totale = sqrt(a / b)
Else
Totale = a * b
End If
Se a è maggiore di b esegui:
Totale = sqrt(a / b)
Quindi continua l’elaborazione del programma da dopo End If. Altrimenti esegui:
Totale = a * b
Totale = Sqrt(a / b)
Else
Totale = a * b
End If
Totale = Sqrt(a / b)
Else
Totale = (a ^ 2) * b
VisualBasic.NET 2019 – Partendo da Zero
102
Else
Totale = (a * b) / (a - b)
End If
End If
Ricordate il testo in verde indica le note inserite dal programmatore. Abituatevi a utilizzarle
perché potrebbero essere di fondamentale importanza, quando ad esempio, dopo del tempo
andate ad analizzare un programma e non vi ricordate che soluzione avevate adottato per
un determinato problema. Se invece dovete eseguire diversi gruppi di istruzioni se ad esem-
pio se la variabile supera i 2000 oppure fra 1500 e 2000 e anche fra 1000 e 1500 e magari
se è minore di 1000 allora gli annidamenti diventano tre.
Totale = Sqrt(a / b)
Else
'istruzioni da eseguire se a <2000
If a >= 1500 Then
Else
'istruzioni da eseguire se a < 1500
If a >= 1000 Then
Else
'Istruzioni da eseguire se a < 1000
Totale = (a * b) / (a - b)
End If
End If
End If
Ovviamente si tratta solo di un esempio per capire come si annidano i blocchi If, Then, Else.
AND e OR
Queste parole chiave del linguaggio Visual Basic servono se inserite in un blocco If se una
o più condizioni sono vere nello stesso momento oppure no.
Se utilizzo la parola AND due o più condizioni devono risultare entrambe vere altrimenti il
computer salta il blocco di istruzioni che si trovano tra If e End If e prosegue oltre oppure
va al blocco Else.
Ad esempio:
Gli elementi del Linguaggio di Programmazione
103
If a > 1000 And b < 700 Then
'inserisco qui il codice che devo eseguire se si verificano entrambe le condizioni
Totale = Sqrt(a / b)
Else
'inserisco qui il codice che devo eseguire se non si verifica una o nessuna
delle condizioni
Totale = (a * b) / (a - b)
End If
In questo caso devono verificarsi entrambe le condizioni, ovvero a deve risultare maggiore
di 1000 e b deve risultare minore di 700. Allora il computer eseguirà le istruzioni che si
trovano subito sotto e poi al termine proseguirà dopo le parole End If.
Se una delle due condizioni o entrambe non si verificano allora il computer eseguirà il codice
che troverà sotto il blocco Else e alla fine andrà dopo le parole End If.
Nel caso della parola chiave OR invece basta che si verifica una delle condizioni o entrambe
per eseguire il codice che si trova sotto l’istruzione If.
Totale = Sqrt(a / b)
Else
'inserisco il codice che devo eseguire se non si verifica nessuna delle due
condizioni
Totale = (a * b) / (a - b)
End If
Totale = Sqrt(a / b)
Else
'inserisco qui il codice che devo eseguire se non si verifica nessuna condizione
Totale = (a * b) / (a - b)
End If
Un altro esempio può essere l’utilizzo contemporaneo di AND e OR purché sia abbia bene
in mente quello che si vuole realizzare, utilizzando all’occorrenza le parentesi per separare
le istruzioni, onde evitare di avere dei risultati che non coincidono con ciò che vi eravate
proposto.
Nell’esempio successivo le parentesi sono state utilizzate in modo che, per passare l’espres-
sione come vera (come in gergo dicono i programmatori) è necessario innanzitutto che si
verifichi che a sia > di 1000 e che si verifichi anche una sola delle altre due.
VisualBasic.NET 2019 – Partendo da Zero
104
Totale = Sqrt(a / b)
Else
'inserisco il codice che devo eseguire se non si verifica nessuna condizione
Totale = (a * b) / (a - b)
End If
Quindi attenzione a come utilizzate le parentesi perché il risultato può cambiare anche
molto.
Consultate il capitolo che tratta degli errori in Visual Basic in modo da stop-
pare il programma in fase di esecuzione dove volete per poi verificare in
tempo reale il valore assunto dalle variabili e che “strada” prende il pro-
gramma in modo che non ci siano dubbi sul suo funzionamento.
Else
End If
In questo caso valuta se il contenuto di una stringa di testo può essere considerato un
numero oppure no. Se la risposta è affermativa inserisce il contenuto della stringa in una
variabile numerica. Ricordate solo che nei linguaggi di programmazione il punto (.) è in
realtà il separatore dei decimali e non la virgola come siamo abituati di solito a fare.
Dim j As Integer
For j = 1 To 50
'esegue tutte le istruzioni che trova fra For e Next fino a quando il valore
di j partendo da 1 e incrementandosi di 1 arriva a 50.
Totale = Totale + a
a = a + 5
Next
Un altro esempio è quello che vedete nel riquadro successivo. In questo caso avanza a passi
di 5 invece che di uno.
Dim j As Integer
For j = 1 To 50 Step 5
'esegue tutte le istruzioni che trova fra For e Next fino a quando il
valore di j partendo da 1 e incrementandosi di 1 arriva a 50.
Totale = Totale + a
a = a + 5
Next
Anche i cicli For …Next possono essere nidificati, ma si tratta solo di un esempio nel riquadro
successivo.
Dim j As Integer
Dim k As Integer
For j = 1 To 50
a = a + 3
For k = 1 To 20
totale = totale + a
VisualBasic.NET 2019 – Partendo da Zero
106
a = a + 5
Next k
Next j
Io sono alla vecchia maniera e accanto a ogni Next metto sempre in nome della variabile
che sto incrementando per evitare di perdermi nei meandri delle nidificazioni.
In parole povere il programma entra nel ciclo (j) e ripete 20 volte il ciclo (k). Quindi ogni
volta che ripete un ciclo (j) ripete 20 volte il ciclo (k) fino a quando non ha ripetuto il ciclo
(j) 50 volte.
DO … Loop
Questo ciclo viene ripetuto fino a che non si verifica una condizione che può essere posta
prima o dopo il ciclo, quindi nel secondo caso il ciclo viene eseguito almeno una volta.
Un esempio è riportato nel riquadro sottostante. Il programma entra nel ciclo Do ed esegue
le istruzioni finché non trova le parole chiave Loop Until seguite da una condizione. Fino a
che questa condizione non di verifica continua imperterrito a eseguire le istruzioni che trova
sotto la parola chiave Do. Quando j > 10 è verificata salta all’istruzione seguente uscendo
dal Loop.
Do
j = j + 1
totale = totale + 5
Un altro esempio è riportato nel riquadro successivo. Il ciclo Do viene ripetuto fin quando
la variabile (j) risulta minore o uguale a 10 altrimenti, quando questo non si verifica più
perché il valore è maggiore di 10 esce dal Loop ed esegue un eventuale istruzione succes-
siva.
Do While j <= 10
j = j + 1
totale = totale + 5
Loop
Consultate il capitolo che tratta degli errori in Visual Basic inserendo quelli
che si chiamano punti d’interruzione nel programma in modo da visualizzare
i valori assunti dalle variabili nelle varie fasi del Loop. Con questo strumento
potete avanzare passo per passo e vedere come si comporta il programma.
Per maggiori informazioni consultate il capitolo che tratta degli errori in Visual
Basic.
Gli elementi del Linguaggio di Programmazione
107
DO While …loop
Questa istruzione ripete un ciclo fino a quando una condizione resta Vera (True). Nel caso
dell’esempio sottostante, fino a quando la variabile totale risulta minore di 1500, il computer
ripeterà il ciclo di istruzioni.
j = j + 1
totale = totale + 5
Loop
DO Until…. Loop
Questa istruzione ripete un ciclo finché la condizione diventa Vera (True) quindi per avere
lo stesso risultato del loop precedente dovremmo scrivere:
j = j + 1
totale = totale + 5
Loop
j = j + 1
totale = totale + 5
VisualBasic.NET 2019 – Partendo da Zero
108
Loop
Select Case
Prende decisioni diverse a seconda del valore assunto dalla variabile. Nel nostro esempio
controlla quale valore assume la variabile NumeroCasuale. Se questa risulterà minore o
uguale a 200 allora eseguirà le istruzioni che trovano sotto l’istruzione Case Is corrispon-
dente e quindi continuerà l’esecuzione del programma da dopo l’istruzione End Select.
Lo stesso si può dire per gli altri valori. Le condizioni Case Is possono essere tutte quelle
di cui abbiamo bisogno.
In questo esempio abbiamo tre possibilità: la prima se il valore della variabile è minore o
uguale a 200, la seconda se risulta fra 201 e 500, in quanto se assumesse un valore minore
di 200 eseguirebbe le istruzioni che trovano sotto Case Is = 200.
Il terzo caso, se la variabile assume un valore fra 750 e 501. Si tratta di un possibile esem-
pio tra le molte applicazioni che questa funzione può avere.
End Select
Risposta = "Numero Casuale= " & NumeroCasuale & vbLf & "Totale = " & Totale
Questa riga fa apparire sullo schermo un messaggio di risposta. Il comando vbLf serve a
mandare a capo il testo dentro un messaggio di risposta.
Risposta = "Numero Casuale= " & NumeroCasuale & vbLf & "Totale = " & Totale
Gli elementi del Linguaggio di Programmazione
109
Genera un numero casuale fra zero e mille.
Numeri casuali
Questa routine serve per generare un numero pseudo-casuale intero fra un valore massimo
e minimo impostabili a piacere.
La funzione Floor restituisce il valore intero del numero decimale più basso, ad esempio, se
il numero è 8,65 Floor restituisce 8, mentre la funzione Ceiling restituirebbe 9. Per i numeri
negativi il concetto si rovescia ovvero -8.65 Floor restituisce -9 mentre Ceiling -8.
Randomize()
La funzione CInt converte i dati nel tipo Integer troncando la parte frazionaria e arroton-
dando al valore più vicino secondo la convenzione degli arrotondamenti (ad esempio 99.5
diventa 100 e 99.4 diventa 99)
Randomize invece avvia il generatore di numeri casuali.
ARRAY
Lo scopo del libro è quello di rendervi produttivi da subito senza complicarvi troppo la vita,
ma in questo caso non se ne può fare a meno… o quasi. Diciamo che un Array, o matrice
per utilizzare un termine magari più familiare, è un insieme di dati, come potrebbe essere
la tabella delle tabelline che studiavamo a scuola quando eravamo alle elementari, ma con
qualche complicazione in più, tipo che gli Array possono essere monodimensionali, bidi-
mensionali, tridimensionali e oltre.
Un Array monodimensionale può essere simile ad una tabella che ha una sola colonna e più
righe, mentre le tabelline possono essere paragonate a un Array bidimensionale come ad
esempio una tabella che ha più di una colonna.
Chiaramente un Array deve avere un nome che lo identifica ad esempio matrice (che fan-
tasia…)
Quindi supponiamo che abbia bisogno di una Array monodimensionale che ha 10 elementi
devo scrivere:
Purtroppo per voi il computer considera lo zero come primo numero e quindi per creare una
matrice a 10 elementi basta scrivere (9). Da 0 a 9 ovvio no!
Quindi portando avanti il paragone con una tabella avremo:
VisualBasic.NET 2019 – Partendo da Zero
110
Matrice(0)
Matrice(1)
Matrice(2)
Matrice(3)
Matrice(4)
Matrice(5)
Matrice(6)
Matrice(7)
Matrice(8)
Matrice(9)
Matrice(3) = 50
For j = 0 To 9
Next j
For j = 0 To 15
Next j
Si genererebbe un errore in quanto la matrice non è così grande, avrei dovuto definirla in
anticipo come si vede nella figura successiva.
Come detto in precedenza questi argomenti possono essere anche evitati per il momento e
proseguire oltre per prendere la mano alla parte pratica della cosa, però dategli ugualmente
un’occhiatina per quando si presenterà la necessità di utilizzare un Array.
D’altra parte spesso c’è una fretta tremenda di arrivare ad un traguardo, magari bruciando
le tappe e saltando gli argomenti meno allettanti, dimenticando il fatto che purtroppo sia la
parte del linguaggio che riguarda la sintassi, sia quella che riguarda gli argomenti che un
programmatore deve necessariamente conoscere, non vanno trascurate perché queste
mancanze si manifesteranno come lacune che vi impediranno di trovare le soluzioni ade-
guate alle vostre necessità di sviluppo.
Gli elementi del Linguaggio di Programmazione
111
Adesso, dato che vedere le cose sullo schermo fa sempre piacere scriviamo un semplice
programmino come quello che vedete qui sotto.
VisualBasic.NET 2019 – Partendo da Zero
112
Che riportiamo nel dettaglio nel riquadro successivo.
Option Explicit On
For j = 0 To 9
Stringa = Stringa & "Matrice(" & j & ") = " & Matrice(j) & vbLf
Next j
End
End Sub
End Class
In questo modo vedremo comparire sullo schermo il contenuto di ogni singolo elemento
dell’Array.
Gli elementi del Linguaggio di Programmazione
113
Un Array bidimensionale invece si presenta così:
Penso che ci siamo capiti vero? In questo caso ci siamo fermati a 4 colonne ma gli elementi
possono essere anche molti di più, come ad esempio nel caso delle tabelline sono 10.
I numeri degli indici possono anche essere invertiti basta che teniate presente quello che
volete realizzare ad esempio:
Oppure:
Se giurate di aver capito il meccanismo possono essere la stessa cosa (come dimensione)
purché rispettate il parametro che occupa la prima e la seconda posizione durante lo svi-
luppo del codice, ovvero non scambiate le cose nello stesso programma altrimenti i dati si
mischiano e non corrispondono a quello che vi immaginate o come alternativa si materia-
lizzerà sullo schermo un messaggio d’errore come quello precedente.
Quindi dovete ricordare esattamente cosa per voi rappresenta il primo, il secondo e il terzo
indice, ad esempio se l’array ne ha tre, e rispettarne la disposizione altrimenti accederete
a dei dati che non sono quelli che vi immaginate.
Il codice nel riquadro successivo contiene un loop per generare la tabella delle tabelline con
i valori calcolati al volo:
Option Explicit On
Imports System.Math
For k = 0 To 9
For j = 0 To 9
Matrice(j, k) = (k + 1) * (j + 1)
Stringa = Stringa & "Matrice(" & j & "," & k & ") = " & Matrice(j, k) & " - "
Next j
Next k
End Sub
End Class
Il risultato sullo schermo è un po’ confuso però la matrice contiene il valore corrispondente
alle tabelline. Ricordate che il computer inizia a contare da zero mentre voi da 1.
Gli Strumenti a disposizione del programmatore
115
Gli Strumenti a disposizione del programmatore
I controlli
In questo capitolo presenteremo una panoramica dei Controlli che il programmatore di-
spone per rendere il suo programma più potente e accattivante che mai. Esistono una va-
langa di Controlli dalle caratteristiche più disparate che fanno cose mirabolanti però ovvia-
mente noi presenteremo solo quelli di utilizzo comune, che sono già tanti a dire la verità, e
che vi permetteranno di cavarvela egregiamente in qualunque situazione.
Create un nuovo progetto come abbiamo già visto nei capitoli precedenti e assegnategli il
nome di ProgettoIniziale ad esempio. La figura sottostante mostra la situazione iniziale.
Dal menu VISUALIZZA scegliete Casella degli strumenti oppure eseguite dalla tastiera
la combinazione CTRL+ALT+X
VisualBasic.NET 2019 – Partendo da Zero
116
Gli strumenti sono raggruppati in categorie. Fate click per iniziare sulla voce Tutti i Win-
dows Form.
La seconda possibilità è quella di fare click con il tasto SX del mouse sul controllo che si
trova nella casella degli strumenti, e portare il puntatore del mouse sopra il form come si
vede nella figura sottostante.
A questo punto, potete disegnare il controllo sul form semplicemente facendo click con il
tasto SX del mouse nel punto dove desiderate posizionare il controllo, e tenendo premuto
generate un’area rettangolare. Quindi rilasciate il tasto SX del mouse. Al momento del rila-
scio comparirà il vostro controllo. La figura successiva mostra la fase di creazione del pul-
sante nel form.
VisualBasic.NET 2019 – Partendo da Zero
118
Con la proprietà TextAlign è possibile impostare l’allineamento che il testo descrittivo sopra
il pulsante dovrà avere, ad esempio in basso, in alto a destra ecc. ecc.
La proprietà Size regola la grandezza del pulsante sullo schermo, ma essendo in ambiente
grafico potete anche impostarla semplicemente attraverso un semplice ridimensionamento
utilizzando il mouse.
La proprietà FlatStyle serve per cambiare l’aspetto che il pulsante avrà quando l’utente
sposta il mouse su di esso e farà click.
La Proprietà Cursor serve invece a modificare l’aspetto del puntatore del mouse quando
questo passerà sul pulsante. Normalmente è impostata su Default.
La proprietà BackColor permette di impostare il colore del pulsante.
La proprietà Enabled serve per abilitare o disabilitare il pulsante.
La Proprietà Visibile invece può renderlo Visibile o invisibile agli occhi dell’utente a seconda
dei casi e delle necessità
Ovviamente in questa panoramica ci limiteremo ad utilizzare quelle proprietà di più comune
utilizzo, tralasciando invece quelle che raramente in un programma hanno qualche forma
di applicazione.
Adesso ci occuperemo della proprietà Image che permette di inserire un’immagine o
un’icona sul pulsante per rendere graficamente accattivante il nostro lavoro, anche perché
nell’ambito della programmazione anche l’occhio vuole la sua parte. Qualcosa di visibil-
mente brutto ricorda all’utente qualcosa di poco pratico, un programma non piacevole da
utilizzare. Ovviamente il primo scopo del programmatore è quello di mettere in grado
l’utente finale di utilizzare il suo programma con estrema facilità, come si dice in gergo il
programma deve essere intuitivo da utilizzare.
Vi garantisco che le immagini in quest’ambito fanno la parte del leone al pari e anche di più
della descrizione che può apparire o meno su un pulsante. Un esempio lampante è una
barra degli strumenti che mostra tutta una serie di icone, che piano piano chiunque ha
imparato ad utilizzare anche senza avvalersi della descrizione. In parole povere se vedo un
VisualBasic.NET 2019 – Partendo da Zero
120
dischetto mi viene l’idea che quel comando effettui un salvataggio del lavoro che sto fa-
cendo. Prima di partire con le operazioni dobbiamo però procurarci i ferri del mestiere,
ovvero le immagini o le icone che ci serviranno per i nostri abbellimenti grafici.
Nel nostro computer ce ne sono migliaia nascoste e per trovarle procedente così:
Riducete ad icona l’ambiente di sviluppo come mostra la figura sottostante
Fate doppio click sull’icona Questo PC o Computer, a seconda del sistema operativo Win-
dows, che dovrebbe trovarsi sul vostro Desktop. È probabile che compaia una finestra simile
a questa.
Fate doppio click sul Disco locale C: e dalla casella di ricerca in alto a destra digitate dalla
tastiera *.ico
Gli Strumenti a disposizione del programmatore
121
Attendete che la ricerca sia finita e vedrete migliaia di icone materializzarsi nella finestra di
ricerca. Le icone servono appunto per abbellire i nostri programmi. A questo punto Copiate
(mi raccomando e non Spostate) le icone in una vostra cartella in modo che siano sempre
disponibili, per non procedere tutte le volte che ne serve una alla ricerca come abbiamo
appena fatto. Questa cartella piena di icone mettetela dove si trova più facilmente ad esem-
pio io l’ho piazzata dentro la cartella Documenti.
Adesso tornate nell’ambiente di sviluppo, e dopo avere per sicurezza fatto click sul vostro
pulsante da abbellire, (ve lo dico perché quando in una finestra ci sono diversi oggetti se
non controllate quale di questi oggetti è quello selezionato, correte il rischio di modificare
le proprietà di un altro oggetto invece che quello desiderato) fate click sulla proprietà
Image.
Dalla finestra che appare fate click sull’opzione Risorsa Locale si vede nella figura succes-
siva e quindi fate click sul pulsante Importa.
VisualBasic.NET 2019 – Partendo da Zero
122
Cercate la cartella che contiene le icone, ma ricordate che in basso nella finestra di dialogo
che vi permette di scegliere i file dovete impostare il filtro su Tutti i File, altrimenti non
sarete in grado di visualizzare le icone. Sceglietene una a caso o quella che piace di più con
un doppio click del mouse, oppure ricercatela con lo strumento di ricerca.
Nessuno vi vieta di lasciare il valore di questa proprietà invariato, ad esempio nel nostro
caso è Button1. Ma quando si programma e dobbiamo richiamare le funzioni di un oggetto
o di un controllo in quanti si ricorderanno come si chiama questo controllo?
Vi dico subito che io sono fra quelli che non si ricorderanno sicuramente il nome, specie se
ci sono 20 pulsanti, 30 caselle di testo 15 caselle di opzione e così via.
Certo, un programma composto da un pulsante e da un textbox non ha bisogno di tanta
memoria da parte vostra, ma quanti programmi esistono in giro con queste caratteristiche?
Quindi per evitare di perdere la strada per tornare a casa, la prima cosa che vi consiglio di
fare è quella di dare un nome descrittivo ad ogni controllo o oggetto che inserite nel vostro
programma, in modo da ricordarsi chiaramente come si chiama.
Per la verità esiste anche una notazione ad esempio alcuni chiamerebbero in nostro pulsante
b_Prova e a dire la verità non fanno male. La prima parte prima del trattino basso (under-
score) serve per ricordare al programmatore che si tratta di un pulsante (button) mente la
seconda è il nome vero e proprio.
Ma nessuno vi vieta di chiamarlo PulsanteProva che di sicuro non lascia adito a dubbi.
Quindi modificate il valore della proprietà in uno di questi modi a piacere.
VisualBasic.NET 2019 – Partendo da Zero
124
Adesso fate doppio click sul pulsante per accedere all’aera del codice…
e facciamo fare qualcosa a questo pulsante. Per una visione migliore (ma è solo una mia
opinione) ho chiuso la casella degli strumenti e spostato le altre finestre. Se il vostro
schermo è sufficientemente ampio, non ci sono questi problemi. Il codice da digitare è
questo:
PulsanteProva.Enabled = False
End
Gli Strumenti a disposizione del programmatore
125
Ricordate che gli apici o la parola REM precedono un commento da parte del programma-
tore e sono completamente ininfluenti ai fini del funzionamento del programma.
Avviate il progetto con il pulsante Avvia sulla barra degli strumenti in alto.
Cliccate sul pulsante OK per terminare il programma. Trovando l’istruzione End il pro-
gramma viene terminato.
VisualBasic.NET 2019 – Partendo da Zero
126
Il TextBox
Un controllo veramente importante che si trova praticamente in tutti i programmi è la ca-
sella di testo o TextBox, attraverso il quale è possibile inserire dalla tastiera dei dati che poi
il programma dovrà elaborare. Identificate il controllo in questione nella casella degli stru-
menti e inseritelo nel form.
Come nel caso precedente è conveniente cambiare il nome del controllo per facilitarne il
l’identificazione nel marasma che potrebbe venirsi a creare quando in un form si trovano
decine di controlli. Abituatevi a dare dei nomi descrittivi ai controlli. Di solito i programma-
tori professionisti chiamano i controlli di testo txt seguiti da un trattino basso (underscore)
e da una descrizione ad esempio txt_cognome. In questo modo sicuramente ricorderemo
che quella casella di testo serve per acquisire un cognome che l’utente inserirà nella casella
stessa.
La casella di testo dispone di una valanga di proprietà che troverete in parte elencate nella
tabella qui sotto con una breve descrizione dei valori che possono assumere. Tenete pre-
sente che attualmente ci troviamo ancora nella fase dove prenderemo confidenza con le
Gli Strumenti a disposizione del programmatore
127
caratteristiche fondamentali dell’ambiente di sviluppo, e quindi non staremo ad elencare
tutte le possibilità di cui un controllo può deliziarci, ma cercheremo di mettere in evidenza
quelle fondamentali per poi approfondire più avanti nei prossimi capitoli.
Proprietà Descrizione
BackColor Imposta il colore dello sfondo della casella
Font Serve per scegliere il tipo di carattere utilizzato per il testo della
casella.
MaxLength Indica il massimo numero di caratteri che è possibile immettere nella
casella.
Multiline Trasforma la casella di testo in modo che l’utente possa inserire del testo
su più righe.
PasswordChar Proprietà che si utilizza per creare un campo dove ad esempio va inserita
una password. Quello che digitiamo viene mascherato in modo che l’utente
non veda quello che viene digitato.
ReadOnly Serve per impedire la modifica testo contenuto nella casella.
Text Rappresenta il contenuto del testo nella casella
TextAlign Serve per allineare il testo all’interno della casella di testo.
Queste proprietà possono essere cambiate indifferentemente dalla finestra delle proprietà
oppure dal codice. Ad esempio, se il colore dello sfondo della cella deve cambiare quando
facciamo click al suo interno, ovvero quando il controllo diviene attivo, e deve tornare come
prima quando invece faccio click su un altro controllo, devo farlo da codice, mentre se il
colore non deve mai cambiare durante l’arco dell’esecuzione del programma allora posso
cambiarlo anche dalla finestra delle proprietà.
Proviamo a creare un piccolo programma con un Textbox per capirne meglio il funziona-
mento.
Quando avvio un programma con un unico form, salvo che il programmatore non
abbia specificato diversamente, vengono eseguite per prime le istruzioni che si tro-
vano nell’evento Load.
È inoltre molto importante per il programmatore scegliere l’evento giusto in base a cosa
vuole realizzare, ad esempio se quando facciamo click in un TextBox questo deve cambiare
il colore del suo sfondo dovete utilizzare l’evento GotFocus.
Dalla scheda di progettazione fate doppio click sul controllo Casella di testo (TextBox) per
entrare nel lato codice.
VisualBasic.NET 2019 – Partendo da Zero
128
Quando entrate nel lato codice per la prima volta attraverso il click su un determinato
Controllo, non so perché ma Visual Basic si sente in obbligo di creare il codice di uno spe-
cifico evento, che vi garantisco non è mai quello giusto o per lo meno quello che vi serve in
un determinato momento.
Se fate click e portate il cursore all’interno del codice dell’evento in alto la lista si posiziona
automaticamente sull’evento in questione. Quindi prestate particolare attenzione a cosa
indica la lista, per evitare di scrivere codice in una posizione sbagliata del programma con
la conseguenza che non funzionerà nulla.
Digitate il codice corrispondente, che riguarda appunto il cambio di colore di sfondo dell’og-
getto quando fate click al suo interno per scrivere qualcosa.
txt_cognome.BackColor = Color.LightYellow
VisualBasic.NET 2019 – Partendo da Zero
130
Adesso per pura curiosità avviate il progetto con il pulsante Avvia in alto sulla barra degli
strumenti.
Non appena farete click all’interno della casella di testo il colore del suo sfondo cambierà
con quello selezionato nel codice.
Viene automaticamente generato come nel caso precedente il codice relativo all’evento.
Digitate il codice corrispondente.
txt_cognome.BackColor = Color.LightYellow
VisualBasic.NET 2019 – Partendo da Zero
132
Impostazioni iniziali
Se avete delle impostazioni dei vari oggetti che il programma deve eseguire all’inizio, ov-
vero se ad esempio l’immissione del testo nella casella deve essere limitata a 50 caratteri,
oppure nella casella non si può scrivere nulla se prima non ho premuto un determinato
pulsante o cose di questo genere qui, dovete scrivere il codice corrispondente nell’evento
Load del Form che viene eseguito per primo quando si avvia il programma (salvo diverse
impostazioni).
Quelle che vediamo in questo esempio sono alcune delle possibili applicazioni pratiche della
casella di testo che potete utilizzare a vostro piacimento a seconda delle situazioni.
Il codice è il seguente. Quelle dopo l’apostrofo come ben sapete ci sono solo note che ho
inserito come breve spiegazione e possono essere omesse.
txt_cognome.Focus()
PulsanteProva.Enabled = False
End
End Sub
End Sub
txt_cognome.Focus()
End Sub
txt_cognome.BackColor = Color.LightYellow
End Sub
txt_cognome.BackColor = Color.White
End Sub
Attenzione: non tutte le proprietà di un controllo presenti nella finestra delle pro-
prietà possono essere cambiate in fase di Run Time (ovvero in fase di esecuzione
del programma). Le proprietà definite come Read Only sono modificabili solo dalla
finestra delle proprietà di un oggetto in fase di progettazione.
Campo password
Per mascherare l’immissione del testo in una casella è sufficiente scrivere questa linea di
programma:
txt_cognome.PasswordChar = "*"
Gli Strumenti a disposizione del programmatore
135
Qualsiasi cosa digitata viene sostituita dal simbolo *. Altri comandi interessanti sono:
Impedisce all’utente di scrivere in quella casella di testo.
txt_cognome.ReadOnly = True
txt_cognome.Enabled = False
La Label o etichetta
L’etichetta è utile per inserire delle descrizioni o dei titoli che l’utente del programma non
può modificare. Dalla scheda di progettazione del Form1 cercate nella casella degli stru-
menti il controllo Label e inseritelo nel Form.
Nella proprietà text è possibile inserire il testo che deve comparire sull’etichetta.
VisualBasic.NET 2019 – Partendo da Zero
136
Se l’etichetta resta immutata durante tutto l’arco di esecuzione del programma vi consiglio
di lasciare il nome che il computer assegna automaticamente ovvero label1. Ma se durante
la fase di Runtime, ad esempio, il testo deve cambiare, allora vi consiglio di dargli un nome
specifico in modo da riconoscerla fra le tante componenti del programma. I programmatori
professionisti hanno il maledetto vizio di dare un nome a tutto…
Proprietà Descrizione
AutoSize Serve per adattare le dimensioni dell’etichetta al suo contenuto.
BackColor Imposta il colore dello sfondo dell’etichetta
Font Serve per scegliere il tipo di carattere utilizzato per il testo.
Text Il testo che comparirà sull’etichetta
TextAlign Allinea il testo all’interno dell’etichetta.
Visible Serve per far scomparire il controllo in fase di Run Time. È possibile far
apparire o scomparire in qualsiasi momento l’etichetta.
Esempio:
Supponiamo che abbia bisogno di un controllo che attivi o disattivi, ad esempio, il pulsante
Prova che ho inserito all’inizio del capitolo. Lo stesso può valere per qualsiasi altro tipo di
controllo. Innanzitutto, cambio il testo con la Proprietà Text.
Nella routine Load del Form aggiungo la seguente istruzione supponendo che inizialmente
il quadratino sia spuntato.
CheckBox1.Checked = True
VisualBasic.NET 2019 – Partendo da Zero
138
Poi come mostra la figura successiva selezionate l’oggetto CheckBox1 dalla lista di sinistra
e l’evento CheckStateChanged dalla lista di destra. Fra le dichiarazioni Private Sub e End
Sub digitate questo codice.
PulsanteProva.Enabled = True
Else
PulsanteProva.Enabled = False
End If
Si lo so, esistono altri cento modi più eleganti di fare la stessa cosa ma lascio a voi
scoprirli quando sarete Programmatori…
PulsanteProva.Visible = False
PulsanteProva.Visible = True
GroupBox
È una simpatica cornice che serve per raggruppare alcuni comandi in un riquadro con tanto
di titolo, ma soprattutto può essere utile quando in un Form si trovano due o più gruppi di
RadioButton che devono essere mantenuti separati.
Come mostra la figura successiva, passando al lato Progettazione dalla casella degli stru-
menti prendete un GroupBox e piazzatelo in un punto del Form. Se reputate vi sia poco
spazio a disposizione potete ridimensionare opportunamente il Form per ingrandirlo.
Per spostarlo portate il puntatore del mouse in alto a sinistra del GroupBox dove si trova
l’icona di una freccia quadrupla e trascinatela in un posto a scelta.
Si tratta di semplici operazioni di uso comune come il Drag & drop (trascina e rilascia)
oppure la classica operazione di ridimensionamento di una finestra.
Se invece desiderate delle misure precise dovete impostarle nella Proprietà Size.
Gli Strumenti a disposizione del programmatore
141
Adesso supponiamo che attraverso la selezione di uno o l’altro RadioButton sia possibile
cambiare il colore del testo del pulsante.
Quindi, ad esempio, selezionate la cornice GroupBox e verificate se sulla testata della fine-
stra delle proprietà compare il suo nome. Poi potete cambiare il valore della proprietà Text
per fare comparire sulla cornice, ad esempio, la dicitura “Colore testo”.
VisualBasic.NET 2019 – Partendo da Zero
142
Adesso fate click sulla scheda del codice del Form e modificate il codice dell’esempio pre-
cedente con questo:
PulsanteProva.ForeColor = Color.Blue
PulsanteProva.ForeColor = Color.Red
Ovviamente ciascuna riga all’interno dell’evento click dei rispettivi RadioButton, come mo-
stra la figura sottostante.
DateTimePicker
Si stratta di un controllo molto interessante perché vi permette di selezionare una data
comodamente da una lista senza necessità di digitarla dalla tastiera, impedendo un errore
Gli Strumenti a disposizione del programmatore
143
di formato da parte dell’operatore. Prima di addentrarci nell’esempio chiudiamo il nostro
progetto e partiamo daccapo con uno nuovo. Dal menu File in alto a sinistra scegliete la
voce Chiudi Soluzione.
Scegliete dalla finestra App Windows Forms e quindi fate click sul pulsante AVANTI in
basso a destra.
VisualBasic.NET 2019 – Partendo da Zero
144
Date un nome al nuovo progetto e fate click sul pulsante Crea in basso a destra nella
finestra.
Cercate sulla casella degli strumenti il controllo DateTimePicker e inseritelo nel Form.
In teoria il controllo funziona già così com’è con pochi ritocchi. Ci limitiamo a dare le infor-
mazioni sulle proprietà fondamentali senza dilungarci su come si cambia il colore di sfondo
del calendario tanto queste impostazioni le trovate anche da soli.
Dalla lista delle proprietà selezionate impostate il valore Format a Short in modo da vi-
sualizzare sulla lista solo la data così come siamo abituati a vederla. Comunque nessuno vi
vieta, se l’indicazione vi interessa, di tenere il valore a long per visualizzare anche il giorno
della settimana.
Gli Strumenti a disposizione del programmatore
145
Adesso inseriamo anche un TextBox che ci servirà come riprova per capire quello che resti-
tuisce il programma quando selezioniamo una data. Dalla proprietà Name affibbiategli il
nome t_DataFattura per riconoscerlo durante la fase di scrittura del codice.
Fate doppio click sul DateTimePicker per generare l’evento ValueChanged e digitiamo il
codice che vedete nella figura successiva.
Ovviamente si tratta di un esempio per vedere come si recupera una data dall’oggetto
DateTimePicker per poi riutilizzarla sotto forma di variabile all’interno del flusso del pro-
gramma.
VisualBasic.NET 2019 – Partendo da Zero
146
Option Explicit On
DateTimePicker1.MaxDate = "31/12/2060"
DateTimePicker1.MinDate = "01/01/2000"
End Sub
DataFattura = DateTimePicker1.Value.Date
t_DataFattura.Text = DataFattura
End Sub
End Class
La variabile DataFattura viene dichiarata in quella posizione in modo che in qualunque punto
del programma (in questo caso il programma è rappresentato da questo unico Form) sia
possibile accedere al suo valore.
Le proprietà MaxDate e MinDate dell’oggetto DateTimePicker servono per limitare il campo
di utilizzo, sempre ammesso che non vogliate creare un programma che si avvale di date
stratosferiche. Ovviamente è possibile anche passare direttamente il valore della data al
TextBox in questo modo:
t_DataFattura.Text = DateTimePicker1.Value.Date
Gli Strumenti a disposizione del programmatore
147
DateTimePicker1.Value.Date Restituisce la data selezionata
DateTimePicker1.Value.Day Restituisce il giorno
DateTimePicker1.Value.DayOfWeek Numero seriale del giorno della settimana ad esempio mer-
coledì=3
DateTimePicker1.Value.DayOfYear Numero dei giorni passati dall’inizio dell’anno della
data selezionata
DateTimePicker1.Value.Month Restituisce il mese selezionato
DateTimePicker1.Value.Year Restituisce l’anno selezionato
NumericUpDown
Anche questo controllo ha un ampio utilizzo e sicuramente vi sarete imbattuti molto spesso
in qualcosa del genere. Vediamone le caratteristiche salienti.
Create un nuovo progetto come per il controllo precedente in modo da non confondervi con
il codice generato per altri controlli. Se non vi ricordate come si fa riguardatevi l’esempio
precedente.
Inserite nel Form una casella di testo e un controllo NumericUpDown.
Quindi per accedere al codice e generare l’evento ValueChanged fate doppio click sul con-
trollo NumericUpDown.
VisualBasic.NET 2019 – Partendo da Zero
148
Option Explicit On
End Sub
TextBox1.Text = NumericUpDown1.Value
Numero = NumericUpDown1.Value
End Sub
Inserite sia un ComboBox che un TextBox per recuperare i valori e sincerarci del corretto
funzionamento. Fate doppio click sul ComboBox per generare l’evento SelectedIndexChan-
ged.
Gli Strumenti a disposizione del programmatore
149
Il codice dell’esercizio è visibile nella figura sottostante. Le note del programmatore sono
in verde.
Option Explicit On
End Sub
TextBox1.Text = ComboBox1.Text
TestoCombo = ComboBox1.Text
End Sub
End Class
ListBox
Si tratta sempre di una lista ma con caratteristiche un po’ diverse da quelle del caso prece-
dente. Identificate il ListBox sulla casella degli strumenti e inseritelo tanto per cambiare
insieme al solito TextBox che ci servirà solo per verificarne il funzionamento.
Fate doppio click sul ListBox per generare l’evento SelectedIndexChanged e quindi inserite
il codice che vedete nella figura successiva.
Gli Strumenti a disposizione del programmatore
151
Per recuperare il testo di uno degli elementi della lista dovete utilizzare la riga di codice che
vedete qui sotto:
Testo = ListBox1.Items(ListBox1.SelectedIndex)
In pratica, il valore dell’indice dell’elemento selezionato nella lista (in realtà si tratta di un
numero che la lista assegna ai suoi elementi)
(ListBox1.SelectedIndex)
ListBox1.Items(ListBox1.SelectedIndex)
Option Explicit On
ListBox1.Items.Add("Milano")
ListBox1.Items.Add("Torino")
ListBox1.Items.Add("Bologna")
ListBox1.Items.Add("Genova")
ListBox1.Items.Add("Venezia")
ListBox1.Items.Add("Firenze")
ListBox1.Items.Add("Roma")
VisualBasic.NET 2019 – Partendo da Zero
152
ListBox1.Items.Add("Napoli")
ListBox1.Items.Add("Palermo")
End Sub
End Sub
End Class
Le finestre di dialogo
153
Le finestre di dialogo
Come dice il nome stesso, sono finestre che “dialogano” con l’operatore ovvero possono
avvisare oppure possono aprire o salvare dei file, scegliere colori e tipi di carattere o cose
di questo genere qui. Alzi la mano chi non ha mai avuto a che fare, durante l’utilizzo di un
computer. con qualcosa del genere. In questo capitolo cercheremo di affrontarle una alla
volta, anche se la trattazione ovviamente si limiterà all’utilizzo più frequente di queste fi-
nestre e non certo all’esposizione di tutte le caratteristiche che vi garantisco non sono po-
che.
Fate doppio click sul pulsante (Button) per generare l’evento Click nel codice.
VisualBasic.NET 2019 – Partendo da Zero
154
La figura precedente mostra la posizione del codice di questo esercizio.
End Sub
If Risposta = 1 Then
End If
End If
End Sub
End Class
L’apertura di una finestra ha una sintassi ben precisa anche se ci sono innumerevoli varianti
che affronteremo nei capitoli successivi. Anche se sembra scritta su due righe in realtà
potete trascriverla anche su una sola.
MessageBox.Show(TitoloMessaggio, TitoloFinestra,
MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)
MessageBox.Show Questa parte di codice comanda l’apertura della finestra, ovviamente da sola
non funziona e aspetta la specifica di altri parametri da parte vostra.
Questa variabile l’ho messa io in realtà è il testo del messaggio della
finestra. Potevate anche scrivere direttamente il testo fra virgolette in-
TitoloMessaggio
vece che utilizzare una variabile ma se il testo della finestra cambia
durante le varie fasi del programma è meglio assegnarlo ad una variabile.
Vale quanto detto per la variabile precedente. Sapete cos’è il titolo della
TitoloFinestra finestra vero? Altrimenti vi rimando al Volume “Il Computer Partendo da Zero
Vol.1”
Vuole sapere quali pulsanti devono apparire sulla finestra di
MessageBoxButtons.OKCancel
messaggio. La lista è più avanti in questo paragrafo
Vuole sapere quale icona deve fare apparire accanto al testo
MessageBoxIcon.Exclamation
del messaggio.
Le finestre di dialogo
155
Alcuni di questi parametri sono facoltativi ad esempio è possibile visualizzare una finestra
di messaggio anche senza l’icona. (Che brutto)
Infine, la riga
Seve per capire quale tasto da parte dell’operatore è stato premuto in modo da elaborare
una risposta degna. La tabella qui sotto mostra la lista dei pulsanti che è possibile fare
apparire nella finestra di messaggio.
Anche se non è importante perché è possibile scoprire quale pulsante è stato premuto in
un altro modo, alla pressione di un tasto la variabile Risposta assume questi valori.
OK 1
Cancel 2
Abort 3
Retry 4
Ignore 5
Yes 6
No 7
Per quanto riguarda il parametro che gestisce l’icona che accompagna il messaggio nella
finestra, quelli principali sono elencati qui sotto. Fate una serie di prove e vedrete che vi
divertirete non poco.
MessageBoxIcon.Error Errore
MessageBoxIcon.Exclamation Esclamativo
MessageBoxIcon.Information Informazione
MessageBoxIcon.Question Domanda
MessageBoxIcon.Stop Stop
MessageBoxIcon.Warning Avviso
VisualBasic.NET 2019 – Partendo da Zero
156
InputBox
Questa finestra visualizza sullo schermo una richiesta di immissione dati, attende che
l’utente inserisca il testo e prema dalla tastiera il tasto invio o faccia click sul pulsante OK
nella parte destra della finestra, quindi restituisce una stringa con il contenuto della casella
di testo. È utilizzata per acquisire dati, anche se poi nella realtà l’immissione dei dati può
avvenire con altri metodi più sofisticati.
Stringa1 Obbligatoria. Questa è la frase che verrà visualizzata sulla finestra di dialogo.
La massima lunghezza di questa frase è circa 1024 caratteri. Se la frase è
lunga è possibile disporla su più righe attraverso il comando VbLf. (vedi
esempio di codice)
Stringa2 Espressione facoltativa. Rappresenta il Titolo della finestra. Se si omette
sulla barra del titolo verrà visualizzata il nome dell’applicazione.
Stringa3 Espressione facoltativa. Rappresenta un valore predefinito che è possibile far
comparire sulla casella di testo. Se l’utente non inserisce nulla viene consi-
derato come valore predefinito.
Int32 Facoltativo. Rappresenta un numero intero a 32 bit che specifica in twip
(qualcosa che somiglia al pixel) la distanza dal bordo sinistro dello schermo.
Se si omette questo argomento la finestra sarà centrata nello schermo
Int32 Facoltativo. Rappresenta un numero intero a 32 bit che specifica in twip la
distanza dal bordo superiore dello schermo. Se si omette questo argomento
la finestra sarà centrata nello schermo.
L’espressione restituisce una stringa di caratteri che rappresenta il testo che è stato im-
messo dall’utente. Esempio di codice:
PosizioneX = 500
PosizioneY = 500
Creo tre variabili tipo String che serviranno per contenere il messaggio che comparirà sulla
finestra, il titolo della finestra e il valore predefinito che, in mancanza di inserimento
dell’utente verrà preso come valore inserito.
Faccio apparire la finestra InputBox sullo schermo ed inserisco nella variabile Risultato
quello che l’utente ha digitato dalla tastiera. Se l’utente non digita nulla e si limita a premere
Invio dalla tastiera o a fare click sul pulsante OK sulla finestra, il valore predefinito che
verrà inserito nella variabile Risultato è quello specificato dalla variabile Predefinito.
Fa comparire una finestra di messaggio, vista nel capitolo precedente, che mostra sullo
schermo il contenuto della variabile Risultato, ovvero quello che l’utente ha digitato dalla
tastiera.
Ricordate che alcuni parametri sono facoltativi, quindi possono essere omessi, come nella
seguente riga di codice dove non sono specificati. In questo caso la finestra verrà centrata
nello schermo e la casella di testo comparirà all’utente senza nessun valore predefinito.
Nel caso di valori omessi, ai quali ne seguono altri non omessi, digitate le virgole che sepa-
rano i parametri come ad esempio nella riga successiva.
Se sostituite l’ultima parte del codice con quello che esegue, finché l’utente non avrà inserito
un nome valido, la finestra di richiesta si ripresenterà imperterrita sullo schermo.
Etichetta:
If Len(Risultato) = 0 Then
MsgBox("Non hai inserito il nome" & Risultato, vbOKOnly + vbExclamation, "Bravo")
GoTo Etichetta
End If
Messaggio = "Ciao ! Come ti chiami?" & vbLf & "Per favore digita il nome nella casella
sottostante"
VisualBasic.NET 2019 – Partendo da Zero
158
OpenFileDialog
Questa finestra corrisponde alla finestra Apri nel menu File di qualsiasi programma di que-
sto mondo, quindi molto popolare rispetto a tante altre finestre che tratteremo in questo
capitolo. Vedremo subito l’applicazione pratica di questo Oggetto senza dilungarci in inutili
questioni teoriche.
Quindi fate doppio click sul pulsante che avete inserito nella finestra per generare l’evento
Click del pulsante stesso, e inserite il codice nelle varie aree del programma come mostra
la figura successiva.
Le finestre di dialogo
159
Per maggiore chiarezza il codice viene riportato anche nella tabella successiva.
Option Explicit On
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
Button1.Text = "Apri"
End Sub
OpenFileDialog1.FilterIndex = 1
percorsoImmagine = OpenFileDialog1.FileName
PictureBox1.Image = Image.FromFile(percorsoImmagine)
End If
End Sub
End Class
VisualBasic.NET 2019 – Partendo da Zero
160
Descriviamo brevemente le operazioni principali per poi andare sul complicato.
Con questa riga viene dichiarata una variabile che conterrà sotto forma di stringa di caratteri
la posizione nel vostro computer dove si trova l’immagine e il nome dell’immagine stessa.
Con questa riga dico che il controllo PictureBox deve adattare alla grandezza del controllo
stesso l’immagine che gli verrà assegnata.
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
Assegno alla finestra di dialogo una cartella iniziale dove dovrà aprirsi, quindi sul vostro
computer dovete sostituire il nome dell’utente
OpenFileDialog1.InitialDirectory = "C:\Users\Giuseppe\Pictures\"
Attivo il filtro per tipologia dei file. Le varie tipologie vanno separate da una barretta verti-
cale che si trova alla sinistra del tasto “1” in alto a sinistra nella tastiera.
Altri esempi:
In questo caso verranno visualizzati a richiesta i file tipo jpg, bmp oppure tutti i file contenuti
nella cartella.
OpenFileDialog1.FilterIndex = 1
Quindi se viene premuto il pulsante Apri o OK in basso nella finestra di dialogo dopo che è
stata selezionata l’immagine
Assegno al controllo PictureBox il percorso del file con tanto di nome proveniente dalla
selezione fatta nella finestra di dialogo.
percorsoImmagine = OpenFileDialog1.FileName
PictureBox1.Image = Image.FromFile(percorsoImmagine)
Poi cambio la riga che assegna la cartella inziale alla finestra di dialogo in questo modo
passo il nome utente.
Adesso faremo altre considerazioni sull’utilizzo del PictureBox. Questa riga di programma
che vedete qui sotto è solo dimostrativa e può essere anche non digitata nel codice, nel
senso che se desiderate assegnare direttamente l’immagine al controllo PictureBox senza
utilizzare la finestra di dialogo OpenFileDialog, potete eseguire l’assegnazione direttamente
così:
Oppure
Fate doppio click sul pulsante Button1 che avete inserito nel Form per generare il codice
corrispondente all’evento Click per poi ripetere l’operazione anche con l’altro pulsante.
Il listato competo del codice è riportato qui di seguito:
Option Explicit On
Imports System.IO
Button1.Text = "Apri"
Button2.Text = "Salva"
Button2.Enabled = False
End Sub
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "Apri File di Testo"
OpenFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
OpenFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
NomeFile = OpenFileDialog1.FileName
End If
End Sub
SaveFileDialog1.FileName = NomeFile
SaveFileDialog1.Title = "Salva file di text"
SaveFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
SaveFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
SaveFileDialog1.FilterIndex = 1
NomeFile = SaveFileDialog1.FileName
Dim OggettoWriter As StreamWriter = New StreamWriter(NomeFile, False)
OggettoWriter.Write(TextBox1.Text)
OggettoWriter.Close()
OggettoWriter = Nothing
Button2.Enabled = False
End If
End Sub
Button2.Enabled = True
If TextBox1.TextLength = 0 Then
VisualBasic.NET 2019 – Partendo da Zero
164
Button2.Enabled = False
End If
End Sub
End Class
Proviamo ad analizzarlo riga per riga (ora le cose si complicano un po’) saltando ovviamente
le righe di codice che aggiunge in automatico Visual Basic per generare le routine e lo Spazio
dei nomi.
Rendo esplicite le dichiarazioni delle variabili per evitare errori.
Option Explicit On
Devo importare una libreria che contiene oggetti utili alla lettura ed alla scrittura di un file
dato che non sono presenti in Visual Basic.
Imports System.IO
Tecnica già vista nell’esempio precedente per recuperare il nome dell’utente del computer
Button1.Text = "Apri"
Button2.Text = "Salva"
Button2.Enabled = False
Faccio in modo che inizialmente nella finestra Apri File non ci sia nessun nome nel riquadro
del nome del file da aprire in basso nella stessa finestra.
OpenFileDialog1.FileName = ""
In questo modo dò un titolo alla finestra per evitare di confonderla con Salva File.
Faccio in modo che sulla lista compariranno solo le cartelle e i file del tipo txt, ovvero dei
comuni File di testo.
Mi posiziono quando si aprirà la lista per la scelta del tipo di file sul primo tipo, ovvero file
di testo.
Le finestre di dialogo
165
OpenFileDialog1.FilterIndex = 1
Faccio comparire sullo schermo la finestra Apri e verifico che la risposta dell’utente sia
positiva.
Inserisco nella variabile nome file recuperato dalla selezione che l’operatore ha fatto nella
lista
NomeFile = OpenFileDialog1.FileName
Definisco un oggetto tipo StreamReader che serve per leggere in un file di testo.
TextBox1.Text = OggettoReader.ReadToEnd
Chiudo l’oggetto
OggettoReader.Close()
OggettoReader = Nothing
SaveFileDialog1.FileName = NomeFile
Assegno il titolo alla finestra per evitare di sbagliare fra Apri e Salva.
NomeFile = SaveFileDialog1.FileName
OggettoWriter.Write(TextBox1.Text)
OggettoWriter.Close()
OggettoWriter = Nothing
Inoltre, inserisco nell’evento Text_Changed della casella di testo questo codice che serve
per abilitare o disabilitare il pulsante Salva nel caso in cui il testo non venga modificato.
Button2.Enabled = True
If TextBox1.TextLength = 0 Then
Button2.Enabled = False
End If
Il codice del progetto è tutto qui, quindi prendiamo la cosa per buona. È possibile aggiun-
gere il codice all’esercizio precedente tenendo presente però che un file di testo non può
contenere la formattazione del testo, e quindi la diversificazione del Font vale solo sul vostro
schermo.
VisualBasic.NET 2019 – Partendo da Zero
168
ColorDialog
Questo controllo vi permette di scegliere un colore per poi farne i più svariati utilizzi, come
ad esempio, cambiare il colore del testo contenuto in una casella di testo, oppure cambiare
il colore di testo di un pulsante.
A volte è necessario permette all’utilizzatore del programma di personalizzare l’ambiente di
lavoro, e questo controllo vi permette appunto di modificare i colori del testo presente su
altri controlli, oppure cambiare i colori di una finestra di Windows. (oggetto Form)
Come nel caso precedente, create un nuovo progetto e inserite una TextBox, un Button e
un ColorDialog in un Form, come si vede nella figura successiva.
aggiungendo anche la finestra di dialogo OpenFileDialog che abbiamo già visto nei capitoli
precedenti per aprire un file di testo.
In pratica vedremo come sia possibile stampare un file di testo (.txt) attraverso Visual
Basic. Altri esempi di stampa sono esposti nei capitoli che trattano dei database.
Una volta che avete aggiunto al form una casella di testo in versione MultiLine e due pul-
santi, possiamo concentrarci sul codice dell’esercizio.
Option Explicit On
Imports System.IO
Imports System.Drawing.Printing
Button1.Text = "Apri"
Button2.Text = "Stampa"
Button2.Enabled = False
PrintDialog1.AllowPrintToFile = True
PrintDialog1.ShowNetwork = False
End Sub
End If
LettoreFile.Close()
LettoreFile = Nothing
End Sub
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "Apri File di Testo"
OpenFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
OpenFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
NomeFile = OpenFileDialog1.FileName
End If
End Sub
Le finestre di dialogo
171
Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles
PrintDocument1.PrintPage
PosizioneVerticale = PosizioneVerticale + 20
For j = 1 To RigheperPagina
StringaRiga = LettoreFile.ReadLine
'Stampa Riga
e.Graphics.DrawString(StringaRiga, Font1, Brushes.Black, MargineSinistro,
PosizioneVerticale)
PosizioneVerticale = PosizioneVerticale + 20
ConteggioRiga = ConteggioRiga + 1
Next j
ConteggioRiga = 0
e.HasMorePages = True
End If
End Sub
End Class
Imports System.IO
Imports System.Drawing.Printing
Recupera il nome dell’utente del computer e lo inserisce nella stringa NomeUtente. Questa
operazione l’abbiamo già vista in diversi altri esercizi.
Nell’evento Form_Load inserisco questo codice che fa comparire sui relativi pulsanti Button
il testo Apri e Stampa.
Button1.Text = "Apri"
Button2.Text = "Stampa"
Button2.Enabled = False
I comandi seguenti servono per permettere o meno la “stampa su File” dalla finestra di
dialogo PrintDialog e per accedere alle stampanti in rete. Sono solo alcune opzioni disponibili
sulla finestra PrintDialog utilizzate come esempio di assegnazione, possono tranquillamente
essere ignorate.
PrintDialog1.AllowPrintToFile = True
PrintDialog1.ShowNetwork = False
Il codice inserito nell’evento Click del pulsante Button1 serve per aprire un file di testo ed
inserire il contenuto nella casella di testo. Abbiamo visto questo tipo di applicazione
nell’esempio della finestra OpenFileDialog.
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "Apri File di Testo"
OpenFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
OpenFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
NomeFile = OpenFileDialog1.FileName
End If
Il codice sotto l’evento Click del Button2 serve invece per aprire la finestra di dialogo
Stampa e in caso di risposta affermativa da parte dell’utente alla stampa del file che com-
parirà sullo schermo, fa comparire l’anteprima di stampa prima di effettuare la stampa vera
e propria.
End If
LettoreFile.Close()
LettoreFile = Nothing
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.Width = Me.Width
PrintPreviewDialog1.Height = Me.Height
PrintPreviewDialog1.ShowDialog()
L’ultima parte del codice serve per gestire la stampa vera e propria. Innanzitutto, decido il
font (tipo di carattere) di stampa.
Creo una variabile che per memorizzare quante righe ci saranno per pagina.
Questa variabile memorizza la posizione verticale nella pagina della riga che andrò a stam-
pare. Capiremo meglio il suo utilizzo più avanti nell’esercizio.
Questi invece sono i margini della pagina, recupero il margine sinistro dalle impostazioni
predefinite.
Quello superiore lo stabilisco io ma potrei anche fare la stessa operazione che ho fatto per
il margine sinistro, ovvero recuperarlo da quello predefinito che a dire la verità è un po’
abbondante.
Definisco la variabile che serve per memorizzare ogni riga del file mentre viene letto.
Calcolo orientativamente quante righe possono stare in una pagina a seconda del font uti-
lizzato.
PosizioneVerticale = PosizioneVerticale + 20
VisualBasic.NET 2019 – Partendo da Zero
174
Ripeto le istruzioni che si trovano fra le parole chiave For e Next finché la variabile j incre-
mentandosi di 1 arriva a uguagliare la variabile RigheperPagina.
For j = 1 To RigheperPagina
Controllo che il lettore di flusso del file non sia arrivato alla fine del file stesso.
StringaRiga = LettoreFile.ReadLine
Calcola la posizione verticale nella pagina dove devo stampare la riga che ho letto.
Stampa la riga letta nel file. L’istruzione è abbastanza chiara su quali parametri vanno
passati alla stampante, ovvero i dati che devo stampare, il font da utilizzare, il colore del
testo, il margine sinistro e la posizione verticale dove il testo si deve trovare nella pagina
che verrà stampata.
PosizioneVerticale = PosizioneVerticale + 20
ConteggioRiga = ConteggioRiga + 1
Incremento il valore della variabile j e ricomincio dalle istruzioni che si trovano sotto l’istru-
zione For fino a quando j non è uguale al Numero di righe per pagina.
Next j
Controllo che il numero delle righe che sto stampando non ecceda quello del numero di
righe che entrano nella pagina.
ConteggioRiga = 0
aggiungo una nuova pagina. Tutte le volte che viene aggiunta una nuova pagina viene
creato un evento PrintPage per l’oggetto PrintDocument quindi tutto il codice quell’evento
viene rieseguito nuovamente fino ad esaurimento righe di stampa.
e.HasMorePages = True
End If
Fino a quando non si esauriscono le righe da stampare. Dato che i vari parametri sono
realmente tanti, e quindi per creare stampe complesse la strada è veramente lunga, se
desiderate visionare altre applicazioni per la stampa consultate anche il capitolo dei data-
base.
Operazioni sui Form e sui Menu
175
Operazioni sui Form e sui Menu
Qualsiasi progetto di questo mondo è costituito sicuramente di diverse finestre che insieme
formano l’applicazione, ad esempio una finestra dove inserisco i nuovi clienti, quella dove
verifico le vendite e così dicendo.
Esistono però diverse tipologie di finestre a seconda delle nostre necessità. Gli esempi con
cui abbiamo avuto a che fare fino ad adesso sono sostanzialmente progetti costituiti da
un’unica finestra, mentre in questo capitolo affronteremo un progetto strutturato.
Form MDI
Create un nuovo progetto facendo Click sul menu File e selezionando la voce Nuovo-Pro-
getto oppure attraverso la combinazione da tastiera CTRL+MAIUSC+N. come mostra la
figura successiva scegliete la voce App Windows Forms e fate click sul pulsante Avanti
in basso a destra nella finestra.
Fate click sulla voce Windows Form, selezionate Form padre MDI e assegnategli un
nome. Di solito lo chiamo Principale ma potete dare sfogo alla vostra fantasia.
Operazioni sui Form e sui Menu
177
Quindi fate click sul pulsante Aggiungi in basso a destra nella finestra e vedrete comparire
sullo schermo qualcosa di molto simile alla figura sottostante.
Nella finestra Esplora soluzioni vediamo elencato in ordine alfabetico i form e altri oggetti
presenti nel progetto.
Il Form padre MDI viene fornito con una serie di elementi già pronti che onestamente,
abituato a fare tutto in modo manuale, non gradisco granché.
Il menu principale presenta le caratteristiche classiche di un programma standard ma vi
garantisco che la maggior parte di quelle voci non serve a nulla, oppure le potete persona-
lizzare in altro modo.
Inoltre, dovete procedere in modo particolarmente accorto perché gli elementi che vengono
inclusi automaticamente nel Form MDI come ad esempio i menu o le barre degli strumenti
generano automaticamente un sacco di codice che potrebbe portarvi fuori dal seminato con
il rischio di perdere la strada per tornare a casa.
Una delle prime cosa da fare una volta presa coscienza che la situazione è particolarmente
ingarbugliata è quella di dire al progetto quale finestra deve apparire per prima quando lo
avvierete. Se non impostate questo parametro, il progetto partirà chissà da dove e nessuno
potrà dire con certezza quello che apparirà sullo schermo.
Fate click sul menu Progetto in alto nella finestra e selezionate la voce Proprietà seguita
di solito dal nome del vostro progetto, che in questo caso abbiamo chiamato FormMDI,
per restare in argomento.
VisualBasic.NET 2019 – Partendo da Zero
178
Selezionate dalla lista Form di Avvio il form Principale come form che comparirà per
primo sullo schermo quando l’applicazione si avvierà.
Fate click sul FormMDI (Principale) per essere sicuri che le proprietà che vedete nella figura
successiva si riferiscano al Form e non a chissà quale altro oggetto presente nella finestra.
A volte basta una semplice distrazione per non trovare nella lista la proprietà che cerchiamo.
Modificate la proprietà WindowsState e impostatela a Maximized in modo che la finestra
Principale al momento dell’avvio dell’applicazione occupi tutto lo schermo a disposizione.
Avviate il progetto per vedere se fino a qui abbiamo eseguito le operazioni in modo corretto.
Una volta verificato che tutto procede secondo i piani, tornate in modalità di progettazione
ed eliminate la Barra degli strumenti, perché nessun programmatore utilizzerà mai la barra
come la vedete adesso. Per eliminarla basta selezionarla con un click del tasto SX del mouse
e premere CANC o DEL dalla tastiera. Il risultato sarà simile alla figura successiva.
VisualBasic.NET 2019 – Partendo da Zero
180
Adesso passate dal lato codice facendo doppio click all’interno del FormMDI ed eliminate
tutto il codice, fino a che non resta solo quello che vedete nella figura successiva. Ponete
particolare attenzione a questa operazione, altrimenti rischiate che il progetto mostri qual-
che malfunzionamento che poi diventa complicato da gestire.
End Sub
End Class
Il Menu Principale
Quando iniziamo un progetto è molto difficile che nelle fasi iniziali il programmatore conosca
con certezza tutte le voci che compariranno sul menu principale, che sicuramente non sa-
ranno comunque quelle proposte dal Visual Studio. Per questo il menu è ampiamente per-
sonalizzabile anche in maniera relativamente veloce attraverso semplici passi.
Anche se può sembrare una cosa ovvia, il menu in fase di progettazione non si comporta
come nella fase di esecuzione del programma, quindi prestate attenzione perché qui un
click o due click del mouse realizzano operazioni diverse.
Fate click sul menu File per aprire la lista.
Come in fase di esecuzione del programma, anche in questo caso viene visualizzato il menu
a tendina classico di Windows, con il quale fin dai primi anni, quindi praticamente al tempo
di Re Pipino, tutti ma proprio tutti abbiamo avuto a che fare durante l’utilizzo di un qualun-
que programma.
Per eliminare una voce non gradita selezionatela con un click del tasto DX del mouse e dalla
lista scegliete la voce Elimina come mostra la figura successiva.
Eliminate per prova qualche voce (non tutte per favore) prima di passare all’esempio suc-
cessivo.
VisualBasic.NET 2019 – Partendo da Zero
182
Per aggiungere un nuovo elemento (non importa la posizione iniziale in quanto le voci sono
facilmente spostabili) fate click in fondo alla lista in corrispondenza del testo [Digitare qui]
e dalla tastiera digitate il testo corrispondente all’azione da eseguire.
Per spostare la voce del menu in un’altra posizione basta trascinarla con il tasto SX del
mouse e rilasciarla (drag & drop) nel posto che reputate più comodo.
Per modificare il testo della voce fate click sulla voce stessa, attendete qualche istante e
ripete il click in modo che il testo venga evidenziato, quindi digitate il nuovo testo e premete
Invio dalla tastiera per confermare la nuova immissione.
VisualBasic.NET 2019 – Partendo da Zero
184
Separatore
Il separatore come dice il nome, è un elemento grafico che appare come una linea che
separa le voci del menu in modo da presentarle per argomenti o utilità. L’immagine suc-
cessiva è un esempio.
Per eliminare un separatore invece basta fare click con il tasto SX del mouse per selezionarlo
e dalla tastiera premete il tasto CANC o DEL.
Operazioni sui Form e sui Menu
185
Personalizzare un menu
Andando avanti nella personalizzazione del nostro menu principale, vediamo adesso altre
operazioni di carattere estetico/funzionale che ci permetteranno di padroneggiare le impor-
tanti funzionalità del menu a tendina (controllo MenuStrip).
Per eliminare un intero blocco di menu, ad esempio come nella figura sottostante, fate click
con il tasto DX del mouse in corrispondenza della voce di menu e dalla lista scegliete la
voce Elimina.
Eliminate altri menu lasciando solo il menu file e il menu (?) come si vede nella figura
sottostante.
Per aggiungere altri menu a tendina nella riga in alto accanto al menu File, ad esempio,
fate click sulla Barra dei menu (MenuStrip) come nella figura successiva e digitate nel ri-
quadro (digitare qui) il testo del menu ad esempio Tabelle. Quando avrete metabolizzato
VisualBasic.NET 2019 – Partendo da Zero
186
tutte queste operazioni potete iniziare a sviluppare la vostra applicazioni Windows utiliz-
zando le voci più consone a descrivere le varie funzioni del programma. L’esempio che
facciamo adesso ricalca quello che è il programma Gestioni da me sviluppato.
Per spostare un menu in orizzontale in un’altra posizione lungo la Barra dei menu basta
trascinarlo come abbiamo già visto per le voci di menu e per i separatori, la tecnica è la
stessa.
Operazioni sui Form e sui Menu
187
Combinazioni di tasti da tastiera.
Ogni voce di menu, per mantenere la compatibilità con tutti quei modi di lavorare che esi-
stono fin dalla notte dei tempi dell’informatica, è attivabile anche attraverso la tastiera,
anziché con il mouse come viene fatto di solito.
Le combinazioni di tasti da tastiera vengono attivate dal tasto ALT che si trova in basso a
sinistra nella tastiera accanto alla barra di spazio. Per fare in modo che un menu venga
attivato con la tastiera basta aggiungere un simbolo & (e commerciale) alla parola che
rappresenta il menu ad esempio &Tabelle.
In questo modo quel menu si attiverà anche dalla tastiera eseguendo la combinazione
ALT+T ovvero la lettera accanto alla quale abbiamo posizionato il simbolo &.
Sul menu la lettera T apparirà sottolineata. (Tabelle)
È possibile anche attivare un menu con una lettera diversa da quella iniziale, ad esempio
nessuno vi vieta di posizionare il simbolo & accanto alla lettera a come a esempio T&abelle.
In questo caso il menu verrà attivato dalla tastiera con la combinazione ALT+A.
Se c’è più di un menu che inizia con la stessa lettera ovviamente siete costretti a
sceglierne un’altra con la tecnica che abbiamo appena visto, ricordando che tutti i
menu allineati in alto devono essere attivati necessariamente con lettere diverse
altrimenti possono verificarsi dei malfunzionamenti.
È possibile inoltre assegnare anche una scorciatoia da tastiera per ogni voce di un menu,
ad esempio come si vede nella figura successiva. Per attivare direttamente una voce per
VisualBasic.NET 2019 – Partendo da Zero
188
l’utente sarà necessario agire in questo modo. Se ad esempio voglio dal menu Tabelle atti-
vare la voce Clienti premete e tenete premuto il tasto ALT dalla tastiera mente con l’altra
mano battete rispettivamente la lettera T rilasciando (ma sempre tenendo premuto il tasto
ALT) battete ancora la lettera C.
Attenzione. In fase di Run Time (esecuzione del programma) se non premo il tasto
ALT dalla tastiera non riesco a vedere le sottolineature delle lettere, contrariamente
ad altre versioni di Visual Basic che rendevano visibili le lettere sottolineate dei
menu sempre.
Inoltre, è possibile modificare il testo delle voci principali o della lista del menu semplice-
mente cliccando sull’elemento, ad esempio la voce Tabelle in alto nella finestra, e dalla
proprietà Text eseguire le varie modifiche del caso.
Operazioni sui Form e sui Menu
189
Scorciatoie da tastiera
Per assegnare una scorciatoia da tastiera, caratteristica presente in qualunque programma
o applicazione professionale che si rispetti, è necessario fare click per selezionare la voce
in questione ad esempio Agenti e dalla finestra delle proprietà scovate la proprietà
ShortCutKeys. Fate click sulla freccia che gestiste la lista.
Sinceratevi di aver selezionato con un click la voce Agenti sul menu Tabelle e andate nella
finestra delle Proprietà alla voce ToolTipText come si vede nella figura successiva.
Operazioni sui Form e sui Menu
191
Nello spazio accanto a quella proprietà è possibile digitare il testo che dovrà comparire
all’utente quando porta il mouse sulla voce senza fare click.
Questa operazione è realizzabile anche da codice inserendo nella routine dell’evento Load
del Form il codice che vedete qui sotto.
È possibile anche cambiare le voci che compaiono sul menu ad esempio la voce “Tabelle”
anche attraverso il codice con l’istruzione:
TabelleToolStripMenuItem.Text = "&Strumenti"
Dato che si tratta di un’operazione abbastanza frequente nei programmi di un certo spes-
sore meglio conoscerla bene.
VisualBasic.NET 2019 – Partendo da Zero
192
Disattiva il menu Agenti
AgentiToolStripMenuItem.Enabled = False
AgentiToolStripMenuItem.Enabled = True
Dalla finestra successiva scegliete, qualora non lo fosse già, la voce Risorsa locale e quindi
fate click sul pulsante Importa.
Operazioni sui Form e sui Menu
193
Cercate la cartella depositaria delle vostre icone e sceglietene una degna di rappresentare
la voce del menu in questione. Selezionatela con un doppio click del mouse.
VisualBasic.NET 2019 – Partendo da Zero
194
A questo punto tornando alla finestra precedente confermate la scelta con il pulsante OK
in basso a destra.
Dalla finestra successiva scegliete un oggetto Windows Form e, come si vede nella figura
successiva nella parte inferiore della finestra, potete assegnargli un nome ad esempio
“Agenti” dato che ci apprestiamo a progettare la finestra dove verranno gestiti gli Agenti di
commercio che lavorano per la ditta del vostro cliente.
Fate click in basso a destra nella finestra per aggiungere questo form al progetto in atto.
Operazioni sui Form e sui Menu
195
Nella finestra Esplora Soluzioni verrà visualizzato l’oggetto aggiunto. Non toccate per il
momento nessun elemento presente nella lista che non sia identificabile come un Windows
Form per evitare di creare problemi all’applicazione.
Tornate attraverso la scheda posta sotto la barra degli strumenti dell’ambiente di sviluppo
alla progettazione del form Principale, e quindi fate doppio click sul menu Agenti come si
vede nella figura successiva.
VisualBasic.NET 2019 – Partendo da Zero
196
In questo modo verrà generato l’evento click del menu, ovvero cosa dovrà fare il computer
quando qualcuno va a cliccare sulla voce Agenti dal menu Tabelle.
Il codice per aprire la finestra è il seguente.
Creo l’oggetto FormAgenti che in realtà sarà la finestra Agenti e creo una nuova istanza
dell’oggetto, quindi dico che questo FormAgenti deve essere figlio di Principale (Me si rife-
risce al form dove sto inserendo il codice in questo caso Principale). La parentesi graffa si
realizza dalla tastiera con la combinazione ALT+123 (aperta) e ALT+125(chiusa)
FormAgenti.Show()
Provate adesso ad eseguire il programma avviandolo dall’apposito comando sulla barra de-
gli strumenti dell’ambiente di sviluppo e verificatene il funzionamento.
Operazioni sui Form e sui Menu
197
Tutti i controlli che vediamo in questo capitolo in realtà hanno centinaia di funzioni e appli-
cazioni varie che per motivi di spazio non possiamo farvi vedere in questo libro. Quando
avrete una certa dimestichezza con le operazioni esposte in questi capitoli, disporrete di
VisualBasic.NET 2019 – Partendo da Zero
198
una buona base per poi avventurarvi da soli alla ricerca di altre funzioni e, soprattutto,
sarete in grado di capire il funzionamento del codice scritto da altri, che magari troverete
in Internet e che utilizzerete per i vostri progetti.
La caratteristica principale della ToolStrip è la proprietà Items, che rappresenta i vari oggetti
che si trovano sulla barra come pulsanti, caselle combinate ed altro.
1) Verificate che sia selezionato l’elemento in questione dalla lista di sinistra altrimenti
nella lista di destra compariranno le proprietà di un alto controllo.
2) Scorrete la lista di destra e identificate la proprietà Name.
3) Cambiatela assegnando un nome descrittivo al controllo.
Adesso con la proprietà TextAlign decidete come deve essere allineato il testo all’interno
del pulsante, diciamo centralmente a destra ad esempio.
Dalla proprietà Image assegnate come abbiamo visto nel capitolo precedente un’icona al
pulsante in modo che sia graficamente rappresentativo del comando che esegue.
Operazioni sui Form e sui Menu
201
Fate click sul pulsante OK in basso a destra nella finestra per confermare le impostazioni.
Adesso dovreste trovarvi sulla scheda Principale in fase di progettazione fate doppio click
sul pulsante Agenti in modo da generare l’evento Click del controllo.
VisualBasic.NET 2019 – Partendo da Zero
202
Inserite il codice che vedete qui sotto all’interno della routine dell’evento click del controllo
PulsanteAgenti.
In teoria dovremmo ripetere tutto il codice che si trova poco sopra ovvero:
Che serviva appunto ad aprire la finestra FormAgenti ma siccome siamo furbi scriviamo:
AgentiToolStripMenuItem.PerformClick()
Ovvero esegui tutto quello che si trova nella routine AgentiToolStripMenuItem_Click come
se avessi fatto click (PerformClick).
Verificate il funzionamento e vedrete che fare click dal menu oppure dal pulsante posto
sulla Barra degli strumenti il risultato sarà lo stesso.
Come nel caso della ToolStrip la caratteristica principale del controllo è la proprietà Items
ovvero la lista dei componenti che appariranno sulla barra di stato. Per accedere alla colle-
zione di elementi fate click dove indicato nella figura sottostante.
Eseguite le stesse operazioni viste nel caso precedente, selezionando stavolta dalla lista
l’oggetto StatusLabel che servirà per fare comparire descrizioni accattivanti in basso sulla
barra.
Operazioni sui Form e sui Menu
205
Timer
Dato che una Barra di progresso viene di norma utilizzata quando un programma esegue
una serie di operazioni che richiedono un certo tempo di elaborazione, risulterebbe quindi
inutile utilizzarla in un progetto come il nostro, (allo stato attuale delle cose) inseriamo un
nuovo controllo per animare la Barra di progresso che in realtà viene utilizzato in altri scopi.
Si tratta del controllo Timer.
Questo controllo se attivato esegue una procedura ad intervalli di tempo costanti fino a che
non viene disattivato dal programmatore.
Inseriremo nel Form principale il controllo Timer dalla Casella degli strumenti che verrà
automaticamente posizionato in basso nella finestra, in quanto controlli che non hanno una
consistenza fisica sul Form.
Imports System.Windows.Forms
Me.WindowState = FormWindowState.Maximized
End Sub
End Sub
AgentiToolStripMenuItem.PerformClick()
End Sub
'termina il programma
End
End Sub
BarradiProgresso.Value = BarradiProgresso.Value + 10
End If
End Sub
End Class
Le parti in verde sono le note del programmatore. Abituatevi a descrivere le operazioni con
impressioni personali particolareggiate in modo che risulti chiaro il funzionamento di qual-
cosa che inventate. Quando riprenderete in mano un progetto, perderete molto meno
tempo a capire cosa diavolo facesse una procedura.
Il codice ovviamente è scaricabile dal sito, vanno però date un minimo di spiegazioni.
L’esempio serve solo per spiegare il funzionamento di certi controlli come ad esempio la
Barra di Progresso che solitamente è utilizzata, come abbiamo già detto, quando si verifica
un’elaborazione particolarmente lunga da parte del computer e l’operatore ha la necessità
di capire se il programma funziona o è bloccato. Quindi non è il nostro caso al momento.
Quando avvio il programma e viene caricato il Form imposto il Timer a un secondo (speci-
ficando i millesimi). Ogni volta che trascorre questo tempo il Timer eseguirà il codice che
trova nell’evento Timer1_Tick.
Me.WindowState = FormWindowState.Maximized
Nell’evento Tick del Timer che è limitato dalle istruzioni che vedete qui sotto e che verranno
eseguite ogni secondo dal computer.
End Sub
va scritto questo codice che serve solo per animare la Barra di progresso.
BarradiProgresso.Value = BarradiProgresso.Value + 10
End If
In pratica si arresta quando la proprietà Value della Barra di progresso arriva al valore 100.
VisualBasic.NET 2019 – Partendo da Zero
208
Trascina e Rilascia
Drag & Drop, come è conosciuto nel mondo della programmazione, rappresenta una delle
operazioni più popolari disponibili fin dagli albori dell’informatica in un qualsiasi sistema a
finestre. Alzi la mano chi non ha mai trascinato un oggetto in un’altra posizione sul desktop,
ad esempio. L’operazione si può estendere anche in altri ambiti oltre a quello più famoso
dello spostamento di file o cartelle. Nell’esempio che trovate nel codice allegato al libro sono
presenti due listbox con una lista di voci, e attraverso l’operazione di trascinamento verrà
mostrato come realizzare il trasferimento di una voce nell’altra listbox e viceversa.
Il codice completo del progetto lo trovate nel box sottostante.
Option Explicit On
ListBox1.Items.Add("PINCO PALLINO")
ListBox1.Items.Add("PAOLINO PAPERINO")
ListBox1.Items.Add("BABBO NATALE")
ListBox1.Items.Add("GASTONE PAPERONE")
ListBox1.Items.Add("MARIO ROSSI")
ListBox1.Items.Add("NONNA PAPERA")
ListBox1.Items.Add("VARIE ED EVENTUALI")
End Sub
ListBox1.AllowDrop = False
ListBox2.AllowDrop = True
'attiva il drag drop utilizzando l'evento MouseDown
'ma è possibile utilizzare anche altri eventi
ListBox1.DoDragDrop(ListBox1.SelectedItem.ToString,
DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
End Sub
If e.Data.GetDataPresent(DataFormats.Text) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
End Sub
Operazioni sui Form e sui Menu
209
End Sub
ListBox1.AllowDrop = True
ListBox2.AllowDrop = False
ListBox2.DoDragDrop(ListBox2.SelectedItem.ToString,
DragDropEffects.Copy Or DragDropEffects.Move)
End Sub
ListBox1.Items.Add(e.Data.GetData(DataFormats.Text).ToString)
ListBox2.Items.Remove(ListBox2.SelectedItem)
End Sub
End Class
Andiamo adesso ad analizzare il codice. Innanzitutto, la prima parte popola il primo listbox
con una serie di voci pseudocasuali, giusto per fare un esempio.
Il primo evento da tenere in considerazione, se vogliamo realizzare il trascinamento di una
voce presente nella lista, è l’evento MouseDown. Questo evento viene attivato quando si
preme il tasto SX del mouse all’interno di un controllo.
End Sub
La prima riga serve per evitare che qualcuno trascini qualcosa anche quando la lista è vuota.
L’operazione genererebbe un’eccezione che blocca il programma.
ListBox1.DoDragDrop(ListBox1.SelectedItem.ToString,
DragDropEffects.Copy Or DragDropEffects.Move)
If e.Data.GetDataPresent(DataFormats.Text) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
End Sub
Verifica che i dati che vengono trascinati sulla lista siano una stringa di caratteri. Se questo
è vero abilità la copia, altrimenti non viene eseguita nessuna azione.
If e.Data.GetDataPresent(DataFormats.Text) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
L’evento DragDrop, della ListBox2, viene attivato quando la selezione fatta nella ListBox1
viene rilasciata nella ListBox2.
Aggiunge il dato che è stato trascinato dalla ListBox1 alla ListBox2.
ListBox2.Items.Add(e.Data.GetData(DataFormats.Text).ToString)
ListBox1.Items.Remove(ListBox1.SelectedItem)
Il resto del codice è speculare, ovvero si applica l’operazione inversa quando si trascina un
dato dalla ListBox2 alla ListBox1.
In sostanza, quando si esegue un Drag & Drop si attivano nell’ordine i seguenti eventi:
MouseDown o un altro evento compatibile con un’operazione di inizio del trascinamento
nella ListBox1, DragEnter nella ListBox2 e DragDrop sempre nella ListBox2. Il progetto si
trova nel codice di esempio allegato al libro.
Operazioni sui Form e sui Menu
211
Eventi comuni.
Un evento è un messaggio inviato da un’oggetto per segnalare che è avvenuta una qualche
azione. L’azione può essere generata dall’interazione dell’utente come ad esempio fare click
un controllo, oppure può essere generata anche da altre logiche di un programma, ad
esempio viene modificato il valore di una proprietà.
La lista che trovate in queste pagine riassume gli eventi principali che può chiamare un
controllo generico. Non tutti i controlli dispongono degli stessi eventi. Questo dipende dalla
natura del controllo, ad esempio un TextBox avere in comune eventi con controlli diversi
da lui, ad esempio un Button, ma dispone anche di eventi completamente diversi, propri di
quel controllo.
Evento Descrizione
Si attiva quando il valore della proprietà BackColor, che gestisce il colore
BackColorChanged
di sfondo del controllo, cambia.
BorderStyleChanged Si verifica quando cambia il valore della proprietà BorderStyle.
Viene attivato quando il valore della proprietà CausesValidation cambia.
CausesValidationChanged Se questa proprietà è impostata su False gli eventi Validating e Validated
non vengono attivati né gestiti.
Si verifica quando lo stato attivo o i tasti di scelta rapida dell'interfaccia
ChangeUICues
utente vengono modificati.
Questo evento si verifica quando l’utente seleziona il controllo con un
Click
click del tasto SX del mouse.
Si verifica in seguito al cambiamento del valore della proprietà Con-
ContextMenuChanged
textMenu.
ContextMenuStripChanged Si attiva quando il valore della proprietà ContextMenuStrip cambia.
CursorChanged Si verifica quando il valore della proprietà Cursor cambia.
Si verifica quando il componente viene eliminato da una chiamata al
Disposed
metodo Dispose().
Si attiva quando il valore della proprietà Dock cambia. La proprietà Dock
DockChanged serve per definire la modalità di ridimensionamento automatico di un
controllo in base al ridimensionamento di un controllo padre.
Viene attivato l’evento in seguito al doppio click del tasto SX del mouse
DoubleClick
sul controllo.
Quando viene completata un'operazione di trascinamento e rilascio si
DragDrop
attiva questo evento.
Se un oggetto viene trascinato nei limiti del controllo viene generato
DragEnter
questo evento.
Si verifica quando un oggetto viene trascinato fuori dai limiti del con-
DragLeave
trollo.
Quando un oggetto viene trascinato sui limiti del controllo viene attivato
DragOver
questo evento.
EnabledChanged Si attiva quando viene modificato il valore della proprietà Enabled.
Enter Si attiva quando si entra nell'area del controllo.
Si verifica quando il valore della proprietà Font cambia. La proprietà font
FontChanged
gestisce il tipo di carattere.
Si verifica quando il valore della proprietà ForeColor cambia. ForeColor
ForeColorChanged
rappresenta il colore del carattere.
GiveFeedback Si verifica durante un'operazione di trascinamento.
GotFocus Si verifica quando il controllo riceve lo stato attivo.
VisualBasic.NET 2019 – Partendo da Zero
212
Evento Descrizione
Si verifica quando si preme un tasto dalla tastiera mentre il controllo ha
KeyDown
lo stato attivo.
Si verifica quando si preme un tasto carattere, la barra spaziatrice o il
KeyPress
tasto backspace mentre il controllo ha lo stato attivo.
Si verifica quando si rilascia un tasto mentre il controllo ha lo stato at-
KeyUp
tivo.
Si verifica quando è necessario riposizionare i controlli figlio di un con-
Layout
trollo.
Leave Si verifica quando lo stato attivo per l'input esce dall'area del controllo.
Si verifica quando viene modificato il valore della proprietà Location.
LocationChanged Questa proprietà ottiene o imposta le coordinate dell’angolo superiore
sinistro del controllo in relazione al suo contenitore.
LostFocus Si verifica quando il controllo perde lo stato attivo.
Si verifica quando cambia il valore della proprietà Modified. Questa pro-
ModifiedChanged prietà ottiene o imposta un valore (true o false) che indica che il conte-
nuto del controllo è stato modificato.
MouseClick Si verifica quando si fa click con il mouse sul controllo.
MouseDoubleClick Si verifica quando si fa doppio click con il mouse sul controllo.
Si attiva quando il puntatore del mouse si trova sul controllo mentre
MouseDown
viene premuto un pulsante del mouse.
MouseEnter Si verifica quando il puntatore del mouse entra nell'area del controllo.
MouseHover Quando il puntatore del mouse si sofferma sul controllo.
MouseLeave Si verifica quando il puntatore del mouse esce dall'area del controllo.
MouseMove Si attiva quando il puntatore del mouse viene spostato sul controllo.
Si verifica quando il puntatore del mouse si trova sul controllo mentre
MouseUp
viene rilasciato un pulsante del mouse.
Si verifica quando si sposta la rotellina del mouse mentre il controllo ha
MouseWheel
lo stato attivo.
Move Si verifica quando il controllo viene spostato.
ParentChanged Si verifica quando il valore della proprietà Parent cambia.
Si verifica prima dell'evento KeyDown quando viene premuto un tasto
PreviewKeyDown
mentre il controllo ha lo stato attivo.
ReadOnlyChanged Si verifica quando cambia il valore della proprietà ReadOnly.
Resize Si verifica quando il controllo viene ridimensionato.
SizeChanged Si verifica quando il valore della proprietà Size cambia.
StyleChanged Si verifica quando lo stile del controllo viene modificato.
SystemColorsChanged Si verifica quando i colori di sistema vengono modificati.
TabIndexChanged Si verifica quando il valore della proprietà TabIndex cambia.
Si verifica quando il valore della proprietà TabStop cambia. Questa pro-
TabStopChanged prietà ottiene o imposta un valore (true o false) che indica se l’utente
può assegnare lo stato attivo al controllo con il tasto TAB,
Validated Si verifica al termine della convalida del controllo.
Validating Si verifica durante la convalida del controllo.
Si verifica quando il valore della proprietà Visible cambia. La proprietà
VisibleChanged
determina se il controllo è visibile all’utente oppure no.
I Database
213
I Database
Un database è una struttura dinamica dove è possibile inserire dei dati, anche senza nessun
ordine prestabilito, per poterli recuperare in successivamente in tutti i modi possibili e im-
maginabili. Questo tipo di struttura, per garantire una simile flessibilità nel recupero dei
dati, in realtà è deve essere rigida, ovvero è necessario definire con precisione ogni ele-
mento che la compone. In pratica bisogna creare una base per i vostri dati. Al giorno d’oggi
questa tipologia di programmi rappresenta il 70% di tutti i programmi in circolazione. Alla
fine della fiera un computer serve proprio per memorizzarci dentro dei dati, altrimenti a che
serve?
All’interno di un database si trovano alcuni oggetti dei quali è necessario comprenderne il
funzionamento per poter sfruttare un database in tutte le sue potenzialità. Se dovete svi-
luppare un programma per un singolo utilizzatore Microsoft Access risulta la scelta migliore,
ma se avete altre necessità come ad esempio un numero maggiore di 3 utilizzatori contem-
poranei, allora la scelta ricade su un database ad alte prestazioni come MySQL. Studiatevi
però questo capitolo perché se siete a “digiuno” di database è da qui che dovete partire.
Le tabelle.
La tabella è l’elemento chiave di qualsiasi database. Senza tabelle il database non esiste
perché non può contenere nulla. Per fare un paragone una tabella può essere paragonata
ad un foglio di calcolo, come ad esempio Microsoft Excel, dove però la struttura del foglio
va inventata di sana pianta, ovvero devo in dettaglio dire al database come si deve chiamare
la tabella per poter essere identificata nel mucchio, come si devono chiamare le colonne di
questa tabella, che in realtà si chiamano campi e non colonne, e quali tipi di dati devono
contenere.
Le righe che in questo caso vengono chiamate record, non hanno bisogno di nessuna defi-
nizione da parte nostra in quanto si tratta di una struttura dinamica che aggiunge la riga
solo se ce n’è realmente bisogno, ad esempio, se in libreria ho mille libri nella tabella ci
saranno sicuramente mille righe o record. Quindi le righe aumenteranno o diminuiranno
all’aumentare o al diminuire dei dati immessi e dunque non si presenta come una struttura
statica come nel caso del foglio di calcolo. Dato che si tratta di argomento alquanto ostico
affronteremo poco per volta la questione. Una lista dei libri o un elenco telefonico ad esem-
pio possono stare all’interno di una tabella del database.
Query
Le query sono uno strumento per il recupero dei dati da un database. In pratica la query è
una domanda che noi facciamo database stesso per avere una risposta. Se ad esempio
abbiamo una lista di libri posso chiedere che questa venga ordinata in ordine alfabetico
piuttosto che per Autore ecc. Il risultato di una query ha l’aspetto di una tabella.
Maschera.
La maschera è uno strumento che rende più gradevole il lavoro di immissione dei dati in un
database. Fondamentali per lavorare con comodità ad esempio all’immissione dei dati. Le
maschere nel nostro caso verranno create con Visual Basic e si chiamano Form.
Report.
Il report ha invece il compito di rendere più gradevole l’aspetto dei dati sulla stampa o sullo
schermo. Anche in questo caso ignoreremo questa caratteristica di Access per utilizzare
invece Visual Basic. Quindi in questo capitolo verranno esposte le funzionalità di Access che
hanno un utilizzo pratico con Visual Basic mentre verranno volutamente ignorate quelle
caratteristiche di Access tipiche del suo ambiente di lavoro che non hanno nessuna affinità
con Visual Basic.
VisualBasic.NET 2019 – Partendo da Zero
214
Microsoft ACCESS
Le tabelle
Vediamo adesso come il database è in grado di memorizzare i nostri dati. La componente
più importante di questa struttura sono le tabelle, che memorizzano i dati immessi permet-
tendoci in un secondo momento di recuperarli a nostra discrezione.
Queste tabelle come struttura somigliano molto a un foglio di calcolo di Excel, soltanto che
le “colonne” si chiamano Campi e le “righe” si chiamano Record.
Si tratta inoltre di una struttura dinamica dove non esiste un numero fisso di righe (record)
ma la tabella si “allunga” in virtù della quantità di dati che vengono inseriti.
Inoltre, le colonne (campi) devono essere preparate in fase di progettazione, quindi il pro-
grammatore deve sapere con certezza quali tipologie di dati le colonne devono contenere.
È anche vero che questa struttura può essere modificata in tempi successivi, e adattata ad
eventuali nuove esigenze con ampie possibilità di modifica da parte del programmatore,
che per buona norma, è bene che abbia le idee chiare fin dalle prime fasi della progetta-
zione. Se volessi realizzare un archivio di clienti o di contatti personali devo innanzi tutto
pensare a quali informazioni devo memorizzare.
Cognome e Nome
Indirizzo
CAP
Città
Email
Con Excel, tanto per fare un esempio che sicuramente vi richiama qualcosa alla memoria,
risolvere questo problema è abbastanza semplice e non penso abbia bisogno di troppi chia-
rimenti. Parlo di Microsoft Excel perché è che programma che si avvicina di più a quello che
dobbiamo realizzare, ovviamente in un modo completamente diverso, e che essendo estre-
mamente diffuso presumo che abbiate avuto prima o poi il piacere di imbattervi in esso.
Quello che vedete nella figura sottostante potrebbe essere un buon punto di partenza.
Gli stessi dati per quanto riguarda un database vanno gestiti in un modo completamente
diverso. Intendiamoci, nessuno vi vieterebbe di realizzare questa cosa attraverso appunto
Excel però con l’andare del tempo vi rendereste conto che esistono alcune limitazioni.
Microsoft ACCESS
215
Ad esempio, la facilità con la quale erroneamente un eventuale utente potrebbe cancellare
o modificare i dati, oppure la difficoltà di gestire molte migliaia di questi personaggi o come
l’impossibilità da parte dell’operatore non eserto di estrapolare dati e statistiche.
Per questo il programmatore deve sapere progettare programmi ad hoc che non necessi-
tano da parte dell’operatore particolari conoscenze o abilità.
Inoltre, esistono altre limitazioni che vedremo in questo capitolo andando avanti con l’espo-
sizione degli argomenti. È per questo che alcuni problemi gestionali non è possibile risolverli
con Excel ma abbiamo necessità di qualcosa di diverso come Microsoft Access ad esempio,
tanto per citare qualcosa che magari avrete avuto sottomano tante volte ma non sapevate
come utilizzare.
Quindi per progettare una tabella si deve innanzitutto sapere quali tipologie di dati deve
accogliere e creare la struttura. Dobbiamo quindi specificare per ogni campo (colonna)
quale tipologia di dati deve ospitare, come ad esempio nella tabella sottostante:
Nel nostro esempio sono tutti campi di testo anche quelli che contengono dei numeri come
ad esempio il CAP o anche eventualmente il numero di telefono. Vengono definiti come
campo di testo perché in quel campo lì, sembra strano, ma non avrete la necessità di ef-
fettuare operazioni matematiche e quindi, anche i numeri saranno definiti come Testo pro-
prio perché il computer non li deve trattare come numeri ma semplicemente come testo.
Dunque, tutti i campi non coinvolti in operazioni matematiche devono essere definiti come
campi di testo.
Dato che in questo capitolo tratteremo i database in generale vediamo alcune convenzioni
che ci permetteranno di utilizzare qualsiasi tipo di database senza legarci a nessun in par-
ticolare anche se per gli esempi viene utilizzato Microsoft Access.
In generale i nomi dei campi vanno digitati in minuscolo (anche se per alcuni database non
è vero abituatevi alle convenzioni per evitare di imbattervi in qualche malfunzionamento
dovuto semplicemente a una regolina non rispettata) non separati da spazi, ma eventual-
mente, per simulare lo spazio e rendere maggiormente leggibile un nome, è possibile uti-
lizzare la linea bassa detta underscore come mostra l’esempio della tabella successiva.
È meglio inoltre non utilizzare lettere accentate anche se Access le tollera.
Adesso veniamo ad un’altra caratteristica di un campo, ovvero la lunghezza dei dati che
deve contenere. Per gestire correttamente una tabella i campi devono avere una lunghezza
specificata ovvero il programmatore deve pensare in anticipo, anche se poi può effettuare
le opportune modifiche in seguito, quale numero massimo di caratteri deve contenere quel
VisualBasic.NET 2019 – Partendo da Zero
216
campo (colonna), in modo da poter risparmiare spazio prezioso quando i record (righe)
saranno molte migliaia. In parole povere mai sprecare lo spazio disponibile proprio perché
non sappiamo quanti un domani saranno i dati contenuti.
Per fare un esempio di lunghezza la nostra struttura potrebbe diventare:
Ad esempio, è inutile assegnare più spazio al campo CAP in quanto in Italia non esistono al
momento CAP che superano le 5 cifre. Se invece devo progettare una tabella che contiene
anche contatti esteri, allora dovrò in questo caso pensare a questa eventualità allungando
il campo se ho necessità di maggiore spazio.
È possibile completare la progettazione della tabella attraverso l’aggiunta di altre informa-
zioni ad esempio il numero di telefono (anche questo sarà un campo di testo in quanto non
andremo mai a fare operazioni matematiche sul numero di telefono di qualcuno) data di
nascita (in questo caso esiste un tipo specifico di campo) e tutto quello che vi può passare
dalla mente. Come già detto è possibile aggiungere campi in un momento successivo a
quello della progettazione di una tabella.
Passiamo all’azione
Quello che vedete nella figura sottostante è la schermata iniziale di Microsoft Access. Per
iniziare creiamo un database vuoto facendo click nel riquadro Database desktop vuoto.
Inserite il nome del database che desiderate realizzare. Questo diverrà un file che è possi-
bile rintracciare nella cartella Documenti. Fate click sul pulsante Crea.
Microsoft ACCESS
217
La situazione inziale è simile a quella della figura sottostante. Essendo vuoto il database vi
chiede di creare almeno una tabella.
Per migliorare la visualizzazione degli oggetti è stata volutamente scelta una risoluzione
grafica dello schermo più bassa del normale, in modo che i vari comandi compaiano ben
visibili. Quindi è probabile che la disposizione e l’aspetto dei comandi sulla barra multifun-
zione non corrisponda esattamente a quella riportata nel libro, restando comunque di facile
individuazione.
Iniziamo dalla realizzazione della prima tabella, tendendo presente che l’esercizio è volto a
realizzare l’esempio di una biblioteca con funzione di prestito di libri che sia da spunto anche
per altri utilizzi. Questa prima tabella conterrà i dati dei libri presenti nella biblioteca.
Fate click con il tasto DX del mouse sulla Tabella1 che si vede nella parte sinistra dello
schermo e scegliete la voce Visualizzazione struttura.
VisualBasic.NET 2019 – Partendo da Zero
218
Date un nome descrittivo alla tabella che vi apprestate a creare e salvate facendo click sul
pulsante OK nella finestra.
Adesso sullo schermo viene proposta la visualizzazione della struttura che ci permetterà di
creare la base per i nostri dati. Come si vede nella figura successiva, iniziamo a creare quelli
che si chiamano Campi, ovvero quegli spazi dove andranno a inserirsi i dati. Come abbiamo
visto nel capitolo precedente ogni campo deve essere progettato correttamente a seconda
dei dati che deve contenere.
Quando viene aperta la schermata Access crea un campo automatico chiamato ID che serve
per identificare in modo univoco ogni libro che inseriremo nel database. Non tutte le tabelle
hanno bisogno di un campo ID ma è sempre meglio crearlo perché se un domani volessimo
utilizzare un ambiente di programmazione come Visual Basic (guarda caso) per interfacciare
il nostro database, risulterà più facile identificare un determinato dato. Questo campo non
ha bisogno di impostazioni da parte vostra.
Microsoft ACCESS
219
Adesso veniamo alla creazione dei campi che ospiteranno i dati iniziano dal campo ISBN. Si
tratta di un codice di 13 cifre che si trova sul retro di un libro e che identifica univocamente
un qualunque libro pubblicato. Qualche anno fa il codice ISBN non esisteva perciò non tutti
i libri, soprattutto quelli molto vecchi, lo riportano. Nella figura sottostante sono riportate
le impostazioni di questo campo.
Dopo aver digitato in nome del campo, nel nostro caso ISBN è necessario specificare dalla
lista che si trova alla sua destra che tipologia di dati deve contenere e, anche se il codice in
realtà è un codice numerico come abbiamo già visto nel capitolo introduttivo dove parla-
vamo delle caratteristiche di un campo, dovete impostare la sua tipologia a Testo breve.
Questo perché nessuno, benché si tratti di numeri, andrà mai a fare calcoli matematici su
un codice ISBN.
VisualBasic.NET 2019 – Partendo da Zero
220
Nella parte bassa della finestra limitiamo la dimensione del campo a 13 caratteri in
quanto una dimensione maggiore sarebbe spazio sprecato.
Specificate il valore Sì accanto a Consenti lunghezza zero, ovvero, dato che non tutti i
libri dispongono di un codice ISBN è anche possibile lasciare questo campo vuoto cioè senza
nessun dato.
La caratteristica Indicizzato invece va posizionata sul valore Sì (duplicati non am-
messi). Questa impostazione impedisce l’inserimento di due libri distinti con lo stesso co-
dice ISBN. Se in fase di immissione dei dati dovesse verificarsi questa eventualità il com-
puter vi segnalerebbe con un messaggio questo tipo di problema.
L’indice è qualcosa che permette ricerche più veloci quando si consultano dei dati. I campi
indicizzati risulteranno più rapidi nel dare le risposte.
Passiamo adesso al titolo del libro.
Come nel caso precedente scegliamo la stessa tipologia di dati (testo breve) e lasciamo la
dimensione del campo a 255 caratteri. Ovviamente se ritenete che la Dimensione del
campo del titolo del libro risulti eccessiva, siete autorizzati a diminuirla a seconda della
vostra sensibilità artistica.
Ponete la caratteristica Consenti lunghezza zero sul valore No in quanto il libro deve
necessariamente avere un titolo, quindi il campo non può essere lasciato vuoto.
Questa volta Indicizzato può essere impostato sul valore Sì (Duplicati ammessi), in quanto
è possibile l’esistenza di due libri che hanno lo stesso titolo.
Quando dovete impostare i valori di alcune proprietà dei campi, ricordate di fare click sulla
piccola freccia che va verso il basso. Molte delle caratteristiche che vedete nella schermata
nascondono una lista predefinita di valori, dove dovete scegliere quello che risulta più adatto
al vostro utilizzo, mentre per altri campi come ad esempio Dimensione campo i valori
vanno digitati dalla tastiera.
Microsoft ACCESS
221
Un libro quasi sicuramente sarà collegato ad un Autore, quindi dobbiamo riportare nella
tabella anche qualcosa che identifichi l’autore. Invece che il nome dell’autore viene riportato
un campo che conterrà un codice che identifica l’autore cosi tutti i libri di quell’autore sa-
ranno marcati con quel codice senza possibilità di errore. Questo ovviamente vale quando
un libro ha un solo autore, ma quando questi sono più di uno è necessario creare una
struttura diversa che vedremo più avanti. Per il momento ci limitiamo alle soluzioni di base
in modo da assimilare le tecniche prima di inoltrarci verso argomenti più complessi.
Impostate il campo IDAUTORE a Numerico e indicizzatelo con duplicati ammessi in quanto
un autore potrebbe aver scritto più di un libro, e quindi il codice dell’autore potrebbe com-
parire più volte nella tabella in record diversi.
Ricordate che l’assegnazione di un indice ad un campo velocizza le ricerche dei dati in quel
campo non di poco. Se determinati valori sono unici allora conviene impostare questa ca-
ratteristica a Duplicati non ammessi, se invece si possono ripetere allora conviene asse-
gnare il valore Duplicati ammessi.
Se viene fatto un tentativo di immissione degli stessi dati in un campo dove i duplicati non
sono ammessi allora il database impedisce l’immissione di tali dati.
Il prossimo campo contiene il numero di pagine del libro. Questo campo viene impostato
come Numerico in quanto il numero delle pagine di un libro è con buona approssimazione
qualcosa che somiglia a un numero. Posizionate il parametro Dimensione campo a Intero,
ovvero potranno essere contenuti solo valori numerici interi che vanno da -32.768 a
+32.767 se vi può bastare…
Quando si progetta un database e quindi una tabella, è buona norma decidere, anche se
poi è tranquillamente possibile cambiare in seguito, quali tipi di dati verranno inseriti in un
campo in modo da creare una struttura che non spreca spazio inutile e che risulterà più
snella e veloce. In parole povere è inutile utilizzare un tipo di campo con precisione doppia
quando non verranno mai inseriti valori interi più grandi di qualche migliaio.
VisualBasic.NET 2019 – Partendo da Zero
222
Salvate la struttura della tabella facendo click sull’apposito comando che si trova in alto a
sinistra sulla Barra di accesso rapido oppure eseguite la combinazione da tastiera
MAIUSC+F12 come suggerito dall’etichetta che appare quando posizionate il mouse sul
comando.
Uscite dalla struttura della tabella facendo click sull’apposito comando a destra nella scheda.
VisualBasic.NET 2019 – Partendo da Zero
224
Adesso fate click sulla scheda Crea in alto nella finestra e selezionate il comando Struttura
tabella come si vede nella figura sottostante.
Ripartiamo con l’avventura stavolta con la creazione della tabella Autori. Assegnate al primo
campo il nome IDAUTORE che sarà quel codice che legherà un autore ai suoi libri, asse-
gnando come tipologia di dati la Numerazione automatica. Questo campo viene gestito
automaticamente dal database quindi non avrà bisogno di nessun intervento futuro da parte
vostra.
Come mostra la figura successiva, fate click con il tasto DX del mouse nello spazio del nome
del campo, oppure all’inizio della riga dove si trova il quadratino grigio, e dalla lista selezio-
nate la voce Chiave Primaria.
La Chiave primaria di una tabella è un campo dove i valori non si ripetono mai ovvero non
esistono due record etichettati con la stessa chiave, in modo che ogni record sia identificato
univocamente senza possibilità di errore. Ogni tabella come abbiamo già detto dovrebbe
avere un campo definito come chiave primaria, questo per non generare eventuali doppioni
in fase di programmazione che potrebbero portare a degli errori di aggiornamento o di
modifica di un record (o riga chiamatelo come volete).
Microsoft ACCESS
225
A questo punto inserite un altro campo etichettato come Nome_Cognome dove, indovina
un po’, verrà inserito dall’operatore il nome ed il cognome dell’autore di uno o più libri.
Presumo che un campo di tipo Testo breve dovrebbe ampiamente coprire le vostre neces-
sità. Limitatene la lunghezza a piacere, ad esempio 100 caratteri potrebbero essere suffi-
cienti (ammesso che non abbia 10 nomi) e indicizzate il campo in modo che possa contenere
omonimi (come se non fosse mai successo…)
Aggiungiamo l’immancabile campo Note per sbizzarrirci con tutte le descrizioni che il nostro
autore merita.
VisualBasic.NET 2019 – Partendo da Zero
226
Tutte queste operazioni ci servono per iniziare ad ambientarci in questo nuovo spazio di
lavoro e per assimilare le operazioni più frequenti che si verificano in fase di progettazione
del database, perciò verranno riproposte più volte per evitare di dare qualcosa per scontato.
Fate click sul pulsante Sì per salvare la struttura della tabella.
Adesso come mostra la figura successiva, date un nome alla tabella che state per salvare
ad esempio Autori, e fate click sul pulsante OK nella finestra di dialogo per confermare
l’operazione.
Microsoft ACCESS
227
Tipi di campo
Vediamo brevemente cosa è possibile memorizzare nel database. La scelta della tipologia
di un campo è molto importante in quanto è necessario specificare con precisione quale tipo
di dati deve contenere altrimenti, sbagliando tipologia, è possibile che tutta la struttura non
funzioni affatto. Inoltre, ogni tipologia dispone di caratteristiche da non trascurare, come
ad esempio la dimensione e altre caratteristiche tipiche di uno specifico campo. Facciamo
un breve riepilogo delle tipologie di campi presenti in Access e del loro utilizzo standard.
Testo breve: il testo breve è un campo che può contenere qualsiasi carattere, numerico o
alfabetico fino ad un massimo di 255 caratteri, quindi come direbbero i programmatori una
stringa di 255 caratteri lunghezza massima, ideale quindi per memorizzare nomi, cognomi
indirizzi ecc. ottimizzatelo per la lunghezza massima che ritenete utile quindi per contenere
un CAP utilizzate solo 5 caratteri non 255.
Testo Lungo: stesse caratteristiche del caso precedente con la sola differenza che la lun-
ghezza è limitata dalla fantasia. Questo tipo di campo sostanzialmente serve quando è
necessario aggiungere delle note o appunti di una certa lunghezza, anche parecchie pagine,
a margine dei dati principali.
Numerico: questo tipo di campo, come dice il nome, può contenere numeri, che è possibile
che vengano coinvolti in operazioni matematiche, quindi non definite come numerico un
VisualBasic.NET 2019 – Partendo da Zero
228
campo dove dentro ci va memorizzato un CAP, ma esclusivamente quei dati che quasi si-
curamente da utilizzare in operazioni matematiche, come prezzo di un articolo, la quantità
o cose di questo genere qua.
Data/ora: in un campo di questo tipo solitamente vengono inserite una data, un’ora o
entrambe le cose, dipende dal formato che vogliamo scegliere.
Numerazione Automatica: serve per creare campi che verranno relazionati con altre ta-
belle in quanto la numerazione automatica viene gestita dal computer. La chiave primaria
di una tabella spesso ha questa caratteristica.
Si/no: campo che può memorizzare solo due stati, Si/no oppure Vero/falso. Ottimo per
l’utilizzo con caselle di controllo o pulsanti di opzione. (date un’occhiata al capitolo dei con-
trolli).
Oggetto OLE: un oggetto OLE è qualcosa che proviene da altri programmi come ad esem-
pio un documento di Word o Excel.
Collegamento Ipertestuale: può contenere indirizzi Internet che avviano una volta che
avete fatto click su di essi il programma per navigare. Utili per memorizzare gli indirizzi
Internet di aziende ecc.
Allegato: un campo speciale che può allegare foto o altri documenti. È possibile memoriz-
zare anche più di un file in un unico record fino ad un massimo di 2 GB di dati, ovvero la
grandezza massima di un file di Access. Le dimensioni di un singolo file non possono essere
maggiori di 256 Megabyte.
Le relazioni
Prima di andare oltre diamo un rapido sguardo a un’altra caratteristica di un database,
ovvero le relazioni fra tabelle. Fate click sulla scheda Strumenti database in alto nella
finestra e scegliete il pulsante Relazioni sulla barra multifunzione.
Microsoft ACCESS
229
Le relazioni sono collegamenti fra tabelle che hanno un utilizzo virtuale, nel senso che se-
condo me non servono quasi a nulla se non che visualizzano gli intrecci fra tabelle, rendendo
meglio l’idea di come è strutturato il database ed aiutando magari a studiare eventuali
miglioramenti.
Dato che le relazioni sono sostanzialmente uno schema fate click su ciascuna delle tabelle
coinvolte e quindi fate click sul pulsante Aggiungi in basso nella finestra. Ogni volta che
aggiungete una tabella questa viene visualizzata nello schema sottostante.
Quando avete aggiunto tutte le tabelle coinvolte nell’operazione fate click sul pulsante
Chiudi in basso nella finestra.
VisualBasic.NET 2019 – Partendo da Zero
230
La finestra si toglierà dalle scatole e avrete davanti a voi le tabelle con i relativi campi ben
in vista.
Adesso vediamo come si crea fisicamente una relazione fra le tabelle. Per fare questo en-
trambe le tabelle devono avere dei campi che possono essere correlati, ovvero uguali, una
Microsoft ACCESS
231
tabella primaria nel nostro caso la tabella Autori e una tabella secondaria, ovvero la tabella
libri.
La tabella “Autori” è definita “Primaria” solo perché ad ogni autore possono corrispondere
un numero qualsiasi di libri nella tabella “Libri”.
Portate come mostra la figura sottostante il puntatore del mouse a sovrapporsi al campo
IDAUTORE nella tabella Autori.
Fate click con il tasto SX del mouse e tenendo premuto effettuare il trascinamento del
campo fino a sovrapporsi con il suo omonimo nella tabella Libri.
Rilasciate il tasto SX del mouse e state certi che sullo schermo si presenterà questa finestra.
Ovviamente il prossimo passaggio ha bisogno di diverse spiegazioni per chiarificare la si-
tuazione.
Personalmente penso che le relazioni non servano a nulla, però non potete negare che il
colpo d’occhio è veramente accattivante. A parte tutto quando il Database, o Db per gli
amici, diventa complesso questa vista un aiutino a non perdersi nelle tabelle, bene o male
che sia, lo dà.
L’indicazione accanto alla relazione mostra che un record nella tabella Autori può corri-
sponde a nessuno, uno o molti record nella tabella Libri. Perciò, cari miei, a inserire i dati
quando il database è vuoto, dobbiamo necessariamente iniziare dalla tabella Autori e non
dalla tabella libri perché un libro non può corrispondere a nessun autore.
Se desiderate modificare una relazione portate il puntatore del mouse a sovrapporsi con
essa e quindi fate click con il tasto DX quindi dal menu scegliete Modifica relazione.
Microsoft ACCESS
233
Quando avete terminato gli aggiustamenti e le modifiche del caso fate click con il tasto SX
del mouse sul pulsante Chiudi in alto sulla barra multifunzione.
Qualora vi chiedesse di salvare il Layout fate click sul pulsante Si nella finestra oppure se
avete deciso che volete ricominciare tutto daccapo fate click sul pulsante No.
Fate click nello spazio sotto il campo Nome_Cognome come si vede nella figura sottostante.
Il computer entrerà in modalità di inserimento dei dati evidenziando con un contorno mar-
cato dove andrà a posizionarsi quello che digitate dalla tastiera.
Inserite il primo dei nostri autori. Come nel caso di un foglio di calcolo allargate pure le
colonne per adattarle alle vostre necessità.
Microsoft ACCESS
235
Inserite i vari personaggi come ad esempio nella figura sottostante. Come avrete notato
tutte le volte che inserite un nuovo autore il campo IDAUTORE viene incrementato di una
unità. Ogni autore perciò corrisponderà ad un codice e sarà quel codice che verrà riportato
nelle tabelle eventualmente collegate, ad esempio la tabella libri, per identificare chi è l’au-
tore del libro e non il suo nome e cognome o altre generalità.
Le operazioni comuni su ogni record, così si chiamano le righe di una tabella, sono accessibili
facendo click con il tasto DX del mouse in corrispondenza dell’autore interessato ad even-
tuali operazioni, quindi non ci dilungheremo nella descrizione dato che si tratta di operazioni
intuitive come ad esempio l’eliminazione di un autore.
Tenete presente che quando eliminate un autore il suo codice associato non verrà mai più
ripetuto in quella tabella.
Nel nostro esempio abbiamo utilizzato una tabella particolarmente scarna che presenta solo
il nome dell’autore ed eventualmente delle note (non obbligatorie) a margine. Di solito le
tabelle sono molto più prodighe di informazioni ma come punto di partenza può andare
bene. Nei prossimi capitoli cercheremo di migliorarne la struttura.
VisualBasic.NET 2019 – Partendo da Zero
236
Adesso chiudete la tabella degli Autori facendo click con il tasto SX del mouse in corrispon-
denza del comando che si vede nella figura successiva.
In questo modo qualsiasi libro di autore anonimo può essere facilmente catalogato sempli-
cemente associandolo alla voce “Anonimo”.
Partiamo adesso alla creazione della nuova tabella facendo click sul pulsante Tabella alla
scheda Crea.
Microsoft ACCESS
237
Prima di iniziare passiamo alla visualizzazione della struttura della tabella facendo click sul
pulsante Visualizza a sinistra nello schermo e quindi dal menu scegliamo la voce Visua-
lizzazione Struttura.
Date un nome descrittivo alla tabella come ad esempio quello della figura sottostante, te-
nendo presente che il nome poteva essere scritto anche tutto attaccato senza spazi, oppure
staccato cosa quest’ultima non consigliata per mantenere la compatibilità con altri database
nel caso, prima o poi, di una migrazione o di uno scambio dati. Quindi come consigliato per
mantenere la leggibilità utilizzate invece dello spazio il trattino basso _ (underscore).
Nella figura successiva si può osservare la situazione finale della nuova tabella Case_Edi-
trici. Ovviamente potete aggiungere qualsiasi campo riteniate di qualche utilità. Ricordate
VisualBasic.NET 2019 – Partendo da Zero
238
che il primo IDCASAEDITRICE deve essere definito Chiave primaria della tabella come ab-
biamo già visto in precedenza per le altre tabelle, se il computer automaticamente non gli
assegnasse questa definizione.
Riepilogo delle caratteristiche dei campi, ricordando che possono avere caratteristiche an-
che diverse a seconda delle necessità contingenti.
Dopo la creazione e la definizione dei campi fate click sul comando per chiudere la tabella.
Dal riquadro di tutti gli oggetti di Access fate click con il tasto DX del mouse sulla tabella
libri in quanto vista l’aggiunta della tabella Case_Editrici necessita di qualche piccola modi-
fica. Dal menu scegliete la voce Visualizzazione Struttura.
Microsoft ACCESS
239
Per collegare la tabella Case_Editrici alla tabella libri, dato che ogni libro appartiene ad una
casa editrice, è necessario aggiungere un campo che ci permetterà di effettuare questa
operazione. Fate click con il tasto destro del mouse ad esempio sul campo ISBN e dal menu
scegliete la voce Inserisci righe.
Verrà creato lo spazio per inserire il nuovo campo IDCASAEDITRICE (i nomi dei campi sono
solo consigliati, avete la facoltà di chiamarli come volete, tenendo presente le regole che i
nomi dei campi devono avere) che sarà di tipo Numerico (intero lungo, tutti i campi che
correlano della tabella di solito sono definiti come tali) e deve essere indicizzato (per velo-
cizzare le ricerche) con possibilità di ammettere duplicati, ogni casa editrice può pubblicare
un numero qualsiasi di libri. Nella figura successiva vedete le varie impostazioni qui de-
scritte.
La posizione nella tabella del campo è indicativa è non è soggetta a regole, quindi era
possibile inserirlo anche in fondo alla lista dei campi.
VisualBasic.NET 2019 – Partendo da Zero
240
Dalla scheda Strumenti database fate click sul pulsante Relazioni per collegare le tabelle
libri e case editrici.
Microsoft ACCESS
241
Dal riquadro degli oggetti di Access fate click con il tasto SX del mouse sulla tabella
Case_Editrici e tenendolo premuto trascinate virtualmente la tabella nell’area delle rela-
zioni, come ad esempio mostra la figura successiva.
Rilasciate il tasto SX del mouse e la tabella comparirà nel layout delle relazioni. A questo
punto ripetete l’operazione di trascinamento con il campo IDCASAEDITRICE dalla tabella
Case_Editrici alla tabella libri.
VisualBasic.NET 2019 – Partendo da Zero
242
Confermate l’applicazione dell’integrità referenziale e confermate la relazione con il tasto
Crea nella parte destra della finestra.
Chiudete il Layout delle relazioni con l’apposito comando e confermate il salvataggio delle
impostazioni.
Adesso inseriamo nella relativa tabella i dati, anche parziali di almeno una casa editrice,
perché visto l’impostazione dell’integrità referenziale ogni libro deve necessariamente ap-
partenere ad un autore (anche anonimo) e fare parte di una casa editrice. Quindi non è
possibile inserire un libro se almeno una casa editrice non è presente nella tabella.
Fate doppio click con il tasto SX del mouse sulla tabella Case_Editrici nel riquadro degli
oggetti di Access e inserite i dati relativi quindi salvate e uscite dalla tabella ritornando alla
schermata iniziale di Access.
VisualBasic.NET 2019 – Partendo da Zero
244
Le Query o Viste.
Una query va interpretata come una domanda, che viene fatta al database, e dalla quale
mi aspetto una risposta (se ovviamente ho impostato correttamente la domanda, altrimenti
picche). La risposta è una tabella, diciamo virtuale, perché non si tratta di una tabella vera
e propria in quanto fisicamente non esiste nel database. È la risposta a quanto avete chiesto
incrociando i dati già esistenti nelle tabelle presenti. La query si può memorizzare per essere
richiamata tutte le volte che desideriamo.
Partiamo con un esempio abbastanza semplice per poi gradualmente andare più sul com-
plesso: supponiamo che voglia sapere quali sono i libri di un determinato autore. Questo è
l’esempio più semplice per un oggetto di questo tipo ma serve per mostrare le potenzialità
di questo strumento.
Dalla scheda Crea fate click sul pulsante Struttura Query.
Aggiungete al layout della query la tabella autori e la tabella libri e poi fate click sul pulsante
Chiudi in basso a destra nella finestra. Per selezionare più una tabella dalla lista tenete
premuto dalla tastiera il tasto CTRL e mantenetelo premuto mentre fate click sulle varie
voci da selezionare.
Sistemate le tabelle dove desiderate con la solita tecnica. Qualora non dovessero mostrare
tutti i campi ridimensionate opportunamente la tabella fino a una situazione come quella
che viene mostrata nella figura successiva.
Microsoft ACCESS
245
La zona inferiore della finestra non aspetta altro che gli diciate quali sono i campi che de-
vono essere visualizzati in quella che deve essere la risposta alla vostra domanda.
Per aggiungere un campo alla zona sottostante è sufficiente fare doppio click con il tasto
SX del mouse in corrispondenza del campo da aggiungere. Come mostra la figura succes-
siva verrà visualizzato nel layout o struttura della query. Quindi se nella prima colonna
vogliamo il nome dell’autore fate doppio click nel campo corrispondente.
Per rimuovere un campo inserito nel layout per errore o non gradito fate click nel punto
indicato nella figura sottostante e quando viene selezionato dalla tastiera premete il tasto
CANC.
VisualBasic.NET 2019 – Partendo da Zero
246
Fate click sul pulsante Esegui alla scheda Progettazione per vedere il risultato.
Direi che non è male come prima query. Come si vede nella figura successiva, il risultato è
perfettamente identico ad una tabella, solo che i dati provengono da due tabelle differenti
Microsoft ACCESS
247
e che non occupano nessuno spazio aggiuntivo in memoria perché si tratta solo di una vista,
come fosse una fotografia istantanea dei dati in quel momento.
Ritorniamo con l’apposito comando alla struttura della query per effettuare eventuali gradite
variazioni.
Come mostra la figura successiva, se desiderate uno specifico ordinamento dei record, ad
esempio vogliamo ordinare per codice ISBN in ordine crescente, è sufficiente in corrispon-
denza del campo interessato dall’ordinamento selezionare dalla lista la voce Crescente.
Come allenamento potete richiedere i dati dell’esercizio di questo libro all’indirizzo di posta
elettronica libri@edizionifutura.com dove troverete il database già pronto in modo da non
essere costretti a inserire tutti i titoli dei libri e gli eventuali dati presenti nelle tabelle.
VisualBasic.NET 2019 – Partendo da Zero
248
Aggiungiamo al layout anche l’anno di edizione del libro, in modo da visualizzare informa-
zioni più complete, facendo doppio click del tasto SX del mouse sul campo corrispondente.
Supponiamo inoltre di desiderare solo i titoli pubblicati dal 2009 in poi. È sufficiente digitare
nello spazio Criteri all’altezza del campo in questione il testo >=2009 e il gioco è fatto.
Eseguite la query con l’apposito comando Esegui alla scheda Progettazione e godetevi il
risultato sullo schermo. Se tutti i campi non sono visibili nella query ottimizzate la larghezza
delle colonne dalle loro testate o ridimensionate il riquadro degli oggetti di Access.
Microsoft ACCESS
249
Ricordate che nel vostro computer sicuramente la visualizzazione sarà più dettagliata in
quanto, per chiarezza, nel libro è stata utilizzata una risoluzione più bassa altrimenti alcuni
dettagli non sarebbero stati visibili nelle figure.
= Uguale a:
> Maggiore di:
>= Maggiore o Uguale a:
< Minore di:
<= Minore o Uguale a:
<> Diverso da:
Adesso salvate la query di modo poterla recuperare in un secondo tempo facendo click sul
pulsante Salva in alto a sinistra sulla Barra di accesso rapido e quando appare la finestra
di dialogo assegnate un nome descrittivo alla query (utilizzate la fantasia) e completate le
operazioni facendo click con il tasto SX del mouse sul pulsante OK nella finestra.
La query appena salvata verrà elencata nel riquadro degli oggetti di Access nella parte
sinistra della finestra. È possibile creare un numero qualsiasi di query a seconda delle vostre
necessità per poi essere richiamate in un secondo tempo.
VisualBasic.NET 2019 – Partendo da Zero
250
Query di raggruppamento.
Non faremo una trattazione completa dell’argomento query perché non basterebbe un libro,
però volevo mostrarvi altri tipi di query. Con queste funzionalità è possibile fare pratica-
mente tutto, da semplici domande come abbiamo visto nel capitolo precedente a modifiche
delle tabelle, a query di eliminazione ecc.
Microsoft ACCESS
251
Questo tipo di query raggruppa i dati fornendo se richiesto dei totali. Supponiamo ad esem-
pio di voler sapere quanti titoli appartengono ad un determinato autore. Dalla scheda Crea
in alto nella finestra fate click sul pulsante Struttura query
Aggiungete al layout le tabelle Autori e Libri, dato che la tabella Case_Editrici non contiene
dati utili per questo tipo di interrogazione, facendo click su ciascuna tabella che viene mo-
strata nella lista e quindi sul pulsante Aggiungi, dopo di che fate click sul pulsante Chiudi
in basso nella finestra.
Date una sistemata al layout in modo che abbia un aspetto estetico gradevole, in quando
difficilmente al momento dell’inserimento di una tabella questa occuperà il posto “giusto”.
La figura sottostante potrebbe essere un esempio. Ridimensionate le tabelle in modo che
tutti i campi siano visibili.
Scegliete il campo Nome_Cognome dalla tabella Autori in modo che sia visibile le generalità
dell’autore del libro, il campo Titolo dalla tabella libri ed il campo pagine che ci servirà solo
VisualBasic.NET 2019 – Partendo da Zero
252
per vezzo in quanto, se la cosa può risultare utile, ci dirà il totale delle pagine scritte dall’au-
tore in tutti i suoi libri. A questo passaggio la situazione sarà quella della figura sottostante.
Se ci fermiamo a questo punto però la query non sarà di nessuna utilità, o per lo meno non
ci darà il risultato che ci aspettiamo. Entrano quindi in gioco le funzioni di raggruppamento
o aggregazione dei record.
Fate click con il tasto DX del mouse sul nome del campo in basso nella finestra (va bene un
campo qualsiasi) e dalla lista scegliete la voce totali, oppure dalla barra multifunzione fate
click son il tasto SX del mouse sul pulsante totali nella parte destra in alto della finestra.
Microsoft ACCESS
253
Il pulsante totali è facilmente riconoscibile dal simbolo Sigma (maiuscolo). In entrambe i
casi verrà aggiunto uno spazio etichettato come Formula in basso ad ogni campo. Inizial-
mente troverete riportato “raggruppamento” nel senso che verranno raggruppati tutti i re-
cord perfettamente uguali fra loro.
Nel nostro caso per quanto riguarda il campo Nome_Cognome della tabella Autori verrà
eseguito un raggruppamento mentre la stessa cosa non va bene per gli altri campi coinvolti
nella query, o per lo meno il risultato non avrebbe nessun tipo di interpretazione utile da
parte dell’utente. Dato che questo è un argomento non semplice vi consiglio di effettuare
sempre una serie di prove e di osservare i vari risultati fino a trovare quello gradito perché
non sempre le query funzionano al primo colpo.
Per quanto riguarda il campo Titolo (del libro) invece di raggruppamento come inizialmente
proposto scegliete dalla lista “Conteggio” vale a dire verranno contati i titoli e raggruppati
per Autore.
Infine per il campo Pagine della tabella libri scegliete la voce Somma, quindi per ogni record
raggruppato per autore verrà calcolata la somma delle pagine, tenendo presente che queste
operazioni possono essere eseguite sono in un campo di tipo numerico.
VisualBasic.NET 2019 – Partendo da Zero
254
A questo punto fate click sul pulsante Visualizza foglio dati in alto a sinistra nella finestra,
oppure sul pulsante Esegui.
Il risultato finale molto probabilmente e simile alla figura sottostante. Per semplicità in
questo caso ogni autore ha pochi titoli ma in un caso reale verrà mostrato il conteggio di
titoli corrispondente all’autore.
Per ritornare alla struttura della query qualora fosse necessaria qualche modifica fate click
sullo stesso pulsante in alto a sinistra.
Salvate la query, se intendete utilizzarla in un secondo momento, facendo click sul comando
di chiusura mostrato nella figura successiva in alto a destra nella finestra e quindi assegnate
un nome descrittivo in modo da poterla identificare facilmente nella lista degli oggetti di
Access che si trova nel lato sinistra della finestra.
Microsoft ACCESS
255
Altri esempi
Supponiamo adesso di voler scoprire quanti titoli per anno vengono pubblicati per autore
(si potrebbe fare anche per casa editrice ma attualmente nel database c’è né una sola) in
questo caso la struttura della query assumerebbe la forma visibile nella figura sottostante.
Maggiore è la quantità di dati presenti nel database e più spazio si apre alla fantasia.
In pratica avrei dovuto scrivere tutto quel codice per giungere al risultato dell’esercizio
precedente. Nell’utilizzo con Visual Basic questo strumento è fondamentale.
Perfezioniamo il database.
Adesso supponiamo di dovere gestire i prestiti dei libri in carico alla biblioteca. Il database
o Db così com’è non sarebbe adatto a questo scopo in quando manca di alcune strutture,
vale a dire un paio di tabelle, una per memorizzare i dati dell’utente che ha chiesto il prestito
e una per memorizzare i prestiti veri e propri. Vediamo insieme come si procede.
Fate click sul pulsante Struttura tabella che si trova alla scheda Crea. Quando devo ini-
ziare con la creazione di una nuova tabella preferisco questo comando.
Create una struttura con le caratteristiche che vedete nella figura successiva. Se non ricor-
date alcuni passaggi a proposito dei campi o delle tabelle consultate la parte di questo
manuale che tratta dell’argomento.
Le lunghezze dei campi, dato che si tratta per la grande maggioranza di campi di testo,
possono essere gestite a piacere ragionando sul loro utilizzo senza troppo spreco di spazio,
ad esempio è inutile utilizzare un campo lungo 255 caratteri per memorizzare la provincia.
Anche i campi si prestano ad ampie interpretazioni ovvero avete la facoltà di aggiungere
eventuali dati che ritenete utili che magari sono assenti nello schema qui proposto.
Microsoft ACCESS
257
Inoltre indicizzate come abbiamo visto nel capitolo della creazione delle tabelle i campi che
ritenete oggetto di future ricerche, tenendo presente che questa operazione è fattibile anche
in un secondo tempo.
In questo caso buona parte dei campi sono ti tipo data/ora in quanto necessita l’inserimento
delle date di inizio, termine e reso del libro chiesto in prestito. La tabella è così strutturata
in quanto un utente può chiedere in prestito più di un libro. Ad ogni record corrisponde un
VisualBasic.NET 2019 – Partendo da Zero
258
prestito. Inoltre è possibile apportare delle modifiche includendo tutte quelle informazioni
che ritenete utili al fine della corretta gestione di un prestito.
Salvate anche questa tabella e assegnategli il nome Prestiti. Se non vi ricordate qualcosa
consultate la parte del libro che parla della creazione delle tabelle.
Passiamo adesso al tocco finale, ovvero alla creazione delle relazioni fra tabelle.
Fate click sul pulsante Relazioni che si trova alla scheda Strumenti database.
Fate click sul pulsante Aggiungi tabella per aggiungere le tabelle coinvolte nelle relazioni
nel nostro caso Utenti e Prestiti, qualora non siano già presenti nel layout.
Selezionate le tabelle una alla volta e fate click sul pulsante Aggiungi in basso nella fine-
stra. Per aggiungere più di una tabella contemporaneamente alla selezione fate click su
ciascuna tabella tenendo premuto dalla tastiera il tasto CTRL.
Microsoft ACCESS
259
Create le relazioni tra tabelle come abbiamo già visto nel capitolo specifico. Il risultato finale
potrebbe essere quello della figura successiva. Ricordate che per motivi funzionali è possi-
bile collegare in relazione solo campi che supportano lo stesso tipo di dati. Se collegati due
campi di tipo diverso molto probabilmente si verificherà un errore che vi impedirà l’inseri-
mento dei dati.
Una disposizione esteticamente curata, dato che siete voi che dovete disporre le tabelle nel
layout delle relazioni, può aiutare molto a trovare errori o a farvi venire qualche idea per
migliorare la struttura…
Al termine fate click sul pulsante Chiudi per terminare le operazioni.
Quello che abbiamo visto fin qua serve come base per comprendere meglio come si ma-
neggia un database anche se molto semplice come Access, prima di avventurarci verso
situazioni più complesse. Quindi considerate quello che avete visto fino a qui un percorso
obbligato per avere le basi per potere proseguire l’avventura con l’utilizzo del database
attraverso Visual Basic. Sono inoltre nel prossimo capitolo esposte operazioni che possono
essere utili per acquisire dati dall’esterno di Access e argomenti non utilizzati di frequente
che il programmatore non può non conoscere…
VisualBasic.NET 2019 – Partendo da Zero
260
Importare dati dall’esterno
Un buon database che si rispetti deve avere la possibilità di accedere a dati che si trovano
in altri file ed eventualmente importarli, ovvero inserirli nella propria struttura. Access di-
spone di un menu Dati esterni particolarmente nutrito di comandi con il quale interagire
con l’esterno e soprattutto con gli altri prodotti della suite Office quali Excel e Word.
Iniziamo ad importare i dati da un file di Excel. Fate click sulla scheda Dati esterni e dalla
lista dei comandi fate click sul pulsante Nuova origine dati. Dato che la Microsoft in questo
ultimo periodo ha preso il vizio di aggiornare continuamente i propri prodotti è probabile le
immagini presenti in questa sezione non siano esattamente rispondenti con quello che com-
pare sul vostro schermo. I concetti restano gli stessi, fortunatamente.
Utilizziamo la prima opzione che ci viene offerta ovvero quella di importare i dati in una
nuova tabella nel nostro Database attuale. Per avviare la procedura fate click sul pulsante
Sfoglia…
Microsoft ACCESS
261
Identificate il file di Excel dal quale volete importare i dati. In quest’esempio lo faremo dal
file Pivot utilizzato come esercizio, che potete richiedere all’indirizzo di posta elettronica
libri@edizionifutura.com Una volta identificato fate doppio click sull’icona del file. La finestra
si chiude e si torna a quella precedente.
Se il nome del file che avete selezionato compare nel riquadro fate click sul pulsante Ok in
basso nella finestra per continuare con la procedura altrimenti selezionate nuovamente il
file con il pulsante Sfoglia.
VisualBasic.NET 2019 – Partendo da Zero
262
Un file di Excel può contenere diversi fogli come in questo caso. Selezionate quale dei fogli
deve essere la sorgente dei dati, nel nostro esempio il foglio1. In ogni caso al momento
della selezione una buona anteprima vi permette di valutare la tipologia dei dati in gioco o
per lo meno di cosa si tratta. Scelta la sorgente fate click sul pulsante Avanti.
La colonna mese invece ha bisogno di una piccola variante. Come si vede nella figura suc-
cessiva la tipologia proposta per il campo è Precisione doppia. Dato che il mese è un numero
intero e non potrà mai assumere valori diversi da un numero intero è meglio dalla lista
scegliere questa tipologia per non sprecare spazio nel database.
Selezionate la lista Tipo dati e al posto di Precisione doppia impostate il campo a Intero.
Lo stesso discorso vale per il campo successivo.
Se invece il contenuto del campo non è utile alle vostre necessità potete anche scegliere
apponendo un segno di spunta nell’apposita casella di non importare il campo selezionato.
Ricordate sempre di selezionate con un click del tasto SX del mouse la colonna della quale
dovete specificare le informazioni altrimenti rischiate di sbagliare a importare i dati.
Fate attenzione ad esempio alla colonna “Giorno della settimana” che il computer imposta
a data/ora e che invece si tratta di un comune campo di testo breve.
Quando avete impostato le informazioni per tutti le colonne del foglio di Excel fate click sul
pulsante Avanti come si vede nella figura successiva.
VisualBasic.NET 2019 – Partendo da Zero
264
Anche se in questo tipo di dati la chiave primaria non è necessaria utilizziamo lo stesso la
prima opzione e fate click sul pulsante Avanti.
Microsoft ACCESS
265
L’ultimo passaggio vi chiede di assegnare un nome alla tabella. Se vi va bene quello propo-
sto fate click sul pulsante Fine altrimenti assegnate un nome prima di completare la pro-
cedura.
Al prossimo passaggio non salvate nulla e fate click sul pulsante Chiudi in basso a destra.
VisualBasic.NET 2019 – Partendo da Zero
266
Importare dati da altri database di Access
Come potevamo facilmente immaginare è possibile trasferire dati da un database di Access
ad un altro in maniera molto semplice in quanto si tratta di un dialogo fra amici, ovvero
due file che hanno la stessa struttura.
L’utilizzo principale di questa funzionalità è soprattutto l’importazione dei dati da un data-
base di Access in versione precedente all’attuale a quella più recente nel nostro caso la
versione 2019. È possibile inoltre importare dati e anche altri oggetti del database quali
query, maschere, report ecc. oppure semplicemente collegare le tabelle, ovvero non im-
portare i dati ma creare semplicemente un collegamento ad un altro database per consul-
tare o aggiornare i dati quando ad esempio si accede agli stessi dati da più postazioni.
(Client-Server). In questo modo tutte le postazioni lavorano sullo stesso file e i dati possono
essere aggiornati e consultati in tempo reale.
Partiamo con il primo esempio ovvero importare i dati da un database di Access. Fate click
sulla scheda Dati esterni e scegliete la pulsante Nuova origine dati nel riquadro Importa
e collega.
Fate click sul pulsante Sfoglia per selezionare il file da dove importare i dati.
Per questo esercizio utilizzeremo il database Northwind che si può trovare come esempio
nella pagina inziale di Access. Quello che vedete nella figura successiva è ingrandito rispetto
alle dimensioni reali del vostro schermo quindi se non trovate il collegamento a Northwind
scorrete la finestra verso il basso con le apposite barre di scorrimento che si trovano nella
parte destra della finestra o fate click sul collegamento Alti Modelli, dipende dalla versione
di Access che avete. Seguite la procedura guidata per generare il database dato che non è
Microsoft ACCESS
267
pronto per l’utilizzo. Questa procedura ovviamente viene eseguita una sola volta per gene-
rare il database di esempio dopo di che dovete accedere direttamente al file senza eseguire
questi passaggi.
Una volta terminata la procedura verrà creato nella cartella Documenti del vostro computer
il file Northwind che contiene tante tabelle e altri oggetti interessanti che possono esservi
utili quando avrete una certa abilità nell’utilizzo di Access per estrapolare idee e soluzioni
da utilizzare per i vostri futuri progetti.
Tornando al nostro esempio dopo la generazione del database Northwind eseguite tutti i
passaggi dall’inizio di questo capitolo e vi troverete nella situazione della figura successiva.
Selezionate con un doppio click del tasto SX del mouse il database di esempio.
VisualBasic.NET 2019 – Partendo da Zero
268
Il nome del database verrà riportato nella finestra del passaggio precedente. Esaminiamo
il primo caso selezionando l’opzione corrispondente, ovvero importa tabelle, query o
quant’altro si trova nel database. Fate click su OK in basso nella finestra per andare al
passaggio successivo.
Selezionate una o più tabelle da importare e fate click sul pulsante OK nella parte destra
della finestra ricordando che per effettuare selezioni multiple è necessario tenere premuto
il tasto CTRL dalla tastiera.
Inoltre, è possibile scegliere attraverso il sistema a schede dalla finestra altri tipi di oggetti
contenuti nel database come Query, Maschere, Report, Macro e Moduli.
Microsoft ACCESS
269
In questo esempio scegliamo la tabella Clienti. Fate doppio click sulla tabella appena inclusa
nel vostro Db per visualizzarne i dati.
Collegare le tabelle
Al passaggio di pagina precedente scegliete l’opzione Collega all’origine dati creando
una tabella collegata, in questo modo in dati non saranno trasportati nel vostro database
ma saranno semplicemente collegati.
Con questa tecnica è possibile creare un file centralizzato su un computer al quale è possi-
bile accedere anche da postazioni remote in modo da aggiornare i dati anche da più posta-
zioni con l’enorme vantaggio che tutti possono disporre immediatamente di dati aggiornati.
Fate click sul pulsante OK per andare al passaggio successivo.
Scegliete una o più tabelle da collegare e quindi fate click sul pulsante OK nella parte destra
della finestra.
VisualBasic.NET 2019 – Partendo da Zero
270
Nella lista delle tabelle troverete stavolta la tabella con una piccola freccia che sta ad indi-
care il fatto che la tabella è collegata quindi esterna al vostro database.
In questo esempio abbiamo prima esportato (consultate il capitolo corrispondente) dal da-
tabase Northwind la tabella Clienti in formato file di testo (per intendersi è un normale tipo
di file che si può facilmente leggere con Word o WordPad) e poi l’abbiamo recuperata nel
nostro database Biblioteca.
Selezionate attraverso il pulsante Sfoglia il file che contiene i dati da importare, selezionate
quindi l’opzione Importa dati di origine in una nuova tabella nel database corrente e quindi
fate click sul pulsante OK in basso per procedere al passaggio successivo.
Al passaggio successivo dovete scegliere se i dati sono separati fra loro da caratteri come
virgole, tabulazioni o cose di questo genere qui oppure sono del tipo a Larghezza fissa
ovvero sono allineati in colonne con spazi come caratteri di riempimento.
Nella parte sottostante della finestra compare un’anteprima che vi può facilitare questa
scelta tenendo presente che è necessario andare al passaggio successivo e controllare nuo-
vamente l’anteprima per poter cantare vittoria, ovvero se i dati si presentano leggibili e ben
separati.
VisualBasic.NET 2019 – Partendo da Zero
272
Ne nostro caso si vede chiaramente che l’opzione da preferire è la prima quindi fate click
sul pulsante Avanti per procedere con l’operazione.
Infatti i campi sono ben separati e i dati si leggono molto bene. Qualora questa fortunata
coincidenza non dovesse verificarsi al primo colpo provate a selezionare altri delimitatori di
campo come ad esempio la tabulazione o altri caratteri e fate click sul pulsante Avanti.
Microsoft ACCESS
273
La situazione della figura successiva è già stata trattata nel capitolo che parla di come
importare i dati dal Excel. In sostanza si tratta di scegliere per ogni campo la giusta tipologia
per migliorare l’interpretazione dei dati. Quindi stabilite per ogni campo la giusta tipologia
(testo, numerico, ecc.) prima di fate click sul pulsante Avanti in basso a destra nella fine-
stra.
Al passaggio successivo fate ancora riferimento al capitolo che tratta l’importazione dei dati
da un foglio di Excel. Al termine fate click sempre sul pulsante Avanti.
Terminate infine la procedura assegnando un nome descrittivo alla tabella dove andranno
a collocarsi i dati così importati.
Esportare i dati
Esportare i dati è un’operazione importante quanto l’importazione che abbiamo analizzato
nel capitolo precedente, in quanto attraverso tale procedura è possibile scambiare i dati con
altri programmi che normalmente non hanno nulla a che fare con Access. I comandi neces-
sari si trovano nel riquadro Esporta alla scheda Dati esterni.
Il computer vi propone un nome per il file che verrà generato alla fine dell’esportazione dei
dati ovviamente nel formato Excel. Qualora il nome non fosse di vostro gradimento (Clienti
nel nostro caso) sostituite solo quello lasciando come si può vedere nella figura successiva
tutto il resto cosi come viene proposto.
In alternativa se desiderate salvare il file in un’altra cartella o in altra posizione del computer
fate click sul pulsante Sfoglia nella parte destra della finestra. Normalmente viene proposta
la cartella documenti per il salvataggio dei vostri documenti da qualsiasi programma di
Office e quindi date sempre un’occhiata al contenuto di tale cartella prima di dichiarare
scomparso un qualsiasi file.
A questo punto non vi resta che fare click sul pulsante OK in basso a destra nella finestra.
Ignorate per il momento l’eventuale passaggio successivo che si dovesse presentare dopo
aver fatto click sul pulsante OK della figura successiva in quanto è utile solo in caso di
esportazioni ripetitive o periodiche dei dati.
Microsoft ACCESS
275
Esportare dati in un file di Access
Per esportare i dati in un altro file di Access, dopo aver selezionato la tabella in questione,
fate click sul pulsante Access nel riquadro Esporta.
Al passaggio successivo fate click sul pulsante Sfoglia nella parte destra della finestra per
specificare in quale database di Access va inviata la tabella selezionata in precedenza.
Selezionate il file nel nostro caso utilizzeremo il database di esempio “Prova” e fate click sul
pulsante Salva in basso a destra nella finestra.
VisualBasic.NET 2019 – Partendo da Zero
276
Ritornando al passaggio precedente che qui omettiamo fate click sul pulsante OK in basso
nella finestra per confermate l’operazione.
Adesso non ci resta che decidere se esportare solo la struttura della tabella oppure anche i
dati. Se questa tabella non esiste nel database di destinazione è necessario selezionare la
prima opzione che corrisponde alla situazione più comune. Inoltre è possibile scegliere un
nome di destinazione diverso rispetto alla tabella di origine semplicemente digitandolo nello
spazio al posto di quello che propone il computer. Fate click sul pulsante OK per portare a
termine l’operazione. Come al solito ignorate il passaggio successivo facendo click sul pul-
sante Chiudi in basso a destra nella finestra che compare sullo schermo.
Microsoft ACCESS
277
Se fate click con il tasto DX del mouse su una tabella e scegliete il menu Esporta potete
accedere a tutte le funzioni che avete visto fino ad adesso ed a tanto altro.
In questi capitoli abbiamo parlato di Microsoft Access in quanto per alcune applicazioni può
risultare un ottimo partner di Visual Studio per le sue caratteristiche molto apprezzate come
database.
Per applicazioni di una certa importanza, o se non disponete di Microsoft Access sul vostro
computer, potete optare per l’utilizzo di MySQL che è un prodotto gratuito nella versione
Community e offre prestazioni molto elevate che possono coprire tutte le esigenze nel
mondo dei database professionali.
VisualBasic.NET 2019 – Partendo da Zero
278
ACCESS & Visual Basic
In questo capitolo affronteremo il problema di interfacciare Access con Visual Basic per
accedere ai dati. Si tratta di un argomento particolarmente vasto ed esistono ed inoltre
diverse tecniche per arrivare allo scopo. Inoltre sarebbe necessario un libro intero per
esporre le tecniche principali e quindi in questo capitolo mostreremo e commenteremo solo
le componenti essenziali delle procedure rimandando il codice completo al materiale extra
incluso nel libro e scaricabile dal sito.
Dovrebbe apparire sullo schermo una finestra simile a quella che vedete nella figura suc-
cessiva. È probabile che a seconda dell’origine dati selezionata la finestra può essere anche
diversa.
Adesso è necessario fare alcune considerazioni prima di addentrarci oltre, nei meandri di
questa utilità.
ACCESS & Visual Basic
279
Per quanto riguarda il database Access nei vari anni sono stati fatti alcuni cambiamenti, ad
esempio esistono due tipologie di database Access, quelli mdb e quelli accdb. Dato che un
database in linea di massima deve sempre essere accessibile anche se è datato, ammesso
che non sia stato volontariamente aggiornato, esistono strumenti diversi per connettersi a
queste diverse tipologie di database.
Se avete fra le mani un database mdb (era in voga prima del 2007) per accedere e ricavare
la stringa di connessione seguite questi semplici passi:
database mdb
fate click sul pulsante Modifica per cambiare l’origine dei dati.
Dalla finestra successiva sulla lista dovrebbe comparire la voce File di database Microsoft
Access e quindi fate click sul pulsante OK in basso nella finestra.
Compare ancora un’altra finestra. Fate click sul pulsante Sfoglia per cercare il vostro da-
tabase in formato mdb nei meandri del vostro computer.
VisualBasic.NET 2019 – Partendo da Zero
280
Il mio si trova nella Cartella Documenti e quindi selezionatelo e fate click sul pulsante Apri
in basso a destra nella finestra.
Come vedete dopo la selezione il nome ed il percorso completo del database compaiano
nella casella di testo del nome del File. Qualora il database fosse protetto da una password
d’accesso dovete inserirla nell’apposito spazio e quindi, prima di procedere oltre, fate click
sul pulsante Test Connessione per verificare che tutto sia configurato nel migliore di modi.
ACCESS & Visual Basic
281
Se il risultato è come quello che vedete nella figura sottostante allora siete sulla buona
strada altrimenti è possibile che il database sia danneggiato o che avete sbagliato qualche
parametro nella connessione come ad esempio la password d’accesso.
Se l’esito è positivo alla finestra successiva fate click sul pulsante OK. La vostra connessione
sarà aggiunta all’elenco delle connessioni disponibili nella finestra Esplora Server.
VisualBasic.NET 2019 – Partendo da Zero
282
Diamo quindi una sbirciatina dentro il database per vedere se i dati sono realmente rag-
giungibili oppure si tratta di un bluff. Fate click accanto al nume della connessione per
visualizzare i dettagli.
I dati si trovano nelle tabelle quindi fate click per visualizzare la lista.
Fate click su una tabella con il tasto DX del mouse e dalla lista scegliete Recupera Dati.
Adesso che vi siete sincerati che il database non è vuoto chiudete la finestra dei dati.
ACCESS & Visual Basic
283
Adesso per ricavare la stringa di connessione fate click con il tasto DX del mouse sulla
nostra connessione e dalla lista scegliete proprietà. La stringa è visibile accanto all’omonima
proprietà.
In caso di utilizzo come vedremo nei prossimi capitoli dovete selezionarla, copiarla e incol-
larla dove serve. Qui sotto vediamo alcuni esempi dato che la stringa di connessione è un
argomento molto “caldo” nell’ambito database.
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Giuseppe\Documents\archivio.MDB
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Giuseppe\Documents\archivio.MDB;
User ID=Admin;Password=PincoPallino;
la stringa è scritta su due righe per motivi di spazio ma in realtà e tutta su una riga.
Se il database è protetto tramite sicurezza a livello utente Access crea per i database tipo
mdb un file con lo stesso nome del database ma con estensione mdw, che contiene le
informazioni sul gruppo di lavoro qualora ci fossero altri utenti oltre all’amministratore. Si
tratta di un argomento particolarmente lungo che non possiamo esporre in questo libro,
che è facilmente verificabile per la presenza dell’omonimo file mdw.
In questo caso la stringa di connessione diventa:
Database accdb
Adesso proveremo la connessione ad un database più moderno di Access quello con formato
accdb. Supponiamo che il database si trovi dentro una determinata Cartella come si vede
nella figura sottostante. (nel nostro caso la cartella documenti.)
Fate click son il tasto DX del mouse sulla barra degli indirizzi e dalla lista scegliete la voce
Copia indirizzo come testo.
Questo vi serve per evitare imbarazzanti situazioni quando vi chiede dove si trova il nome
del file dato che la finestra in questo secondo caso è leggermente finestra.
Dall’ambiente di sviluppo fate click sul menu Strumenti in alto nella finestra e dalla lista
scegliete la voce Connetti a database come avete fatto nel caso precedente.
ACCESS & Visual Basic
285
Scegliete dalla lista sottostante, dopo avere verificato che nella lista Origine dati sia stato
selezionato il Provider di Dati.NET framework per OLE DB, il provider Microsoft Office
12 Access Database Engine OLD DB Provider nel caso che il vostro database sia stato
creato con Access 2007-2013 mentre scegliete la versione 16 se il vostro database è stato
creato con Access 2016.
Attenzione: questi due Provider di dati come altri della lista che vedete nella figura
precedente difficilmente saranno installati sul vostro computer. Per procurarveli do-
vete provvedere a scaricarli da Internet ed installarli sul vostro computer. La pro-
cedura non la riportiamo per motivi di spazio ma comunque equivale all’installa-
zione di qualsiasi programma. Si trovano sul sito della Microsoft ma andate su un
motore di ricerca come ad esempio Google e digitate Microsoft Office 2016 Run-
time Library nel caso di Access 2016 (attualmente anche per la versione 2019 va
bene) oppure Microsoft Office 2013 Runtime Library nel caso di Access 2007-
2013. Se disponibili scaricateli in lingua italiana e soprattutto sinceratevi di scari-
carli dal sito della Microsoft e non da altre parti.
Se tutto fila liscio ed il test sulla connessione è positivo confermate facendo click sul pul-
sante OK in basso nella finestra.
Come nel caso precedente fate click con il tasto DX del mouse nella finestra di sinistra sulla
connessione appena creata e dalla lista scegliete la voce Proprietà.
La stringa è ricavabile dalla proprietà Stringa di Connessione.
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Giuseppe\Documents\biblioteca.accdb
ACCESS & Visual Basic
287
Imports System.Windows.Forms
Imports System.Data
Imports System.Data.OleDb
che contengono tutti gli oggetti dei quali abbiamo bisogno. Va detto che il progetto non è
composto di un solo Form quindi è abbastanza articolato e mostra tutto quello che vi serve
per inserire nuovi dati, modificare i dati ed eliminare dati da un database di Access.
Il Form denominato Principale serve solo per aprire il database e fare da contenitore (MDI-
Form) agli altri Form del progetto.
Connessione.Open()
Connessione.Close()
E fin qui tutto fila liscio. Nel codice completo dell’esercizio ovviamente la questione è molto
più complicata ad esempio vi è un controllo che verifica che la connessione sia Ok resti-
tuendo un messaggio d’errore qualora la connessione non vada a buon fine:
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Try
End Try
Questa trappola per errori, per maggiori informazioni consultate il capitolo della gestione
degli errori in Visual Basic, esegue tutte le istruzioni che si trovano fra Try e Catch e nel
caso di insuccesso esegue le istruzioni che si trovano fra Catch e End Try.
VisualBasic.NET 2019 – Partendo da Zero
288
È importante saper gestire gli errori per evitare che, quando il progetto sarà completo e
funzionerà sul computer di qualche cliente, si interrompa facendo esternare frasi che non
sempre rappresentano un apprezzamento per il vostro lavoro.
DataSet
Questo tipo di oggetto rappresenta un insieme di dati recuperati con l’oggetto OleDbDa-
taAdapter e contiene anche i nomi dei campi e i tipi di dati.
OleDbCommand
Viene invece utilizzato per eseguire istruzioni SQL (vedi il capitolo che tratta gli aspetti del
linguaggio SQL) per eseguire istruzioni sul database e possono comprendere comandi per
inserire, eliminare o aggiornare i dati presenti.
La versione semplificata è:
dichiaro gli oggetti:
apro la connessione
Connessione.Open()
Creo l’adattatore
al posto delle due righe precedenti è possibile utilizzare anche queste per avere lo stesso
risultato.
Adattatore.SelectCommand.ExecuteNonQuery()
Adattatore.Fill(SetDati, "Libri")
DataGridView1.DataSource = SetDati.Tables("Libri")
Chiudo la connessione
ACCESS & Visual Basic
289
Connessione.Close()
Questo a grandi linee è la descrizione del codice presente nel form Libri del progetto.
Ovviamente è necessario introdurre brevemente un controllo molto importante
DataGridView
Si tratta del componente principe per visualizzare sullo schermo quello che è l’equivalente
di una tabella di dati. Presenta tantissime caratteristiche e nel nostro progetto ne sono
messe in evidenza diverse. Dato che si tratta di un controllo completamente personalizza-
bile, e quindi funziona già quando gli viene assegnato un set di dati ma ovviamente li vi-
sualizza come vuole lui, sono necessari dei ritocchi per evitare che ciò che è visualizzato sia
a tutti gli effetti difficilmente leggibile.
La DataGridView si trova sulla Casella degli strumenti sotto la voce Dati. Una volta inserita
in un form ha un aspetto insignificante come si vede nella figura sottostante, ma quando la
vedrete all’opera allora vi ricrederete.
Dico alla griglia che quando seleziono una riga questa va selezionata tutta e non solo un
delle celle.
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
Per evitare di scrivere mille volte DataGridView1 utilizzo la parola chiave With omettendo
il nome dell’oggetto in questione mettendo però un punto prima di richiamare le proprietà
dell’oggetto.
With DataGridView1
Dichiaro che la griglia e di sola lettura quindi l’utente non può modificare i dati che com-
paiono sulla griglia.
.ReadOnly = True
.AllowUserToResizeRows = False
.AllowUserToAddRows = False
.RowTemplate.Height = 18
Imposta la larghezza in pixel della colonna che contiene le intestazioni delle righe.
.RowHeadersWidth = 15
Imposta lo stile predefinito applicato alle celle, in questo caso il colore di sfondo e giallo
chiaro,
.RowsDefaultCellStyle.BackColor = Color.LightYellow
Le righe dispari delle celle invece avranno uno sfondo bianco per migliorare la leggibilità
della griglia.
.AlternatingRowsDefaultCellStyle.BackColor = Color.White
Il codice che segue invece serve a impostare le colonne della griglia per migliorare la leg-
gibilità dei dati. Assegno alla prima colonna della griglia il campo ID della tabella libri ma
non lo rendo visibile nella griglia. Mi serve solo per recuperare l’ID univoco del libro per
poterci apportare modifiche o altre operazioni.
.Columns("ID").Visible = False
Alla colonna successiva assegno il campo ISBN. La testa della colonna deve descrivere
quello che compare in quella colonna in questo caso proprio ISBN
.Columns("ISBN").HeaderText = "ISBN"
I dati nella colonna devono essere allineati a destra in orizzontale e al centro in verticale.
.Columns("ISBN").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns("ISBN").Width = 130
ACCESS & Visual Basic
291
Determina il formato del numero, nel caso di contenuto numerico della cella. In questo caso
il codice corrisponde ad un numero che presenta il separatore delle migliaia e due cifre
decimali.
.Columns("Prezzo_Listino").DefaultCellStyle.Format = "##,##.00"
Quelle che abbiamo appena visto sono le caratteristiche principali di una griglia e alcune
personalizzazioni che è possibile applicarle. In realtà le proprietà sono veramente tante e il
loro utilizzo dipende anche dall’impiego finale che la griglia deve avere.
La personalizzazione della griglia viene eseguita in una routine separata per non fare troppa
confusione con il resto codice che invece manipola i dati.
Eliminare un record
Il codice che vedete nel riquadro seguente serve a eliminare un record in una tabella, nel
nostro caso per eliminare un libro nell’omonima tabella.
Dim ID As Long
Try
ID = DataGridView1.Item(0, DataGridView1.CurrentCell.RowIndex).Value
Catch Eccezione As System.Exception
Exit Sub
End Try
End If
Connessione.Open()
Try
OggettoComando.ExecuteNonQuery()
Catch ex As OleDbException
Connessione.Close()
MsgBox(ex.Message)
Exit Sub
End Try
Connessione.Close()
Leggi_Dati()
Dim ComandoCancellazione As String = "DELETE FROM Libri WHERE ID = " & Str(ID)
Connessione.Open()
OggettoComando.ExecuteNonQuery()
Connessione.Close()
Consultate sempre il codice nel materiale allegato al libro per maggiori informazioni.
ComboBox
Nella parte del libro dedicata ai controlli abbiamo fatto conoscenza con questo utile stru-
mento per elencare in una lista a discesa una serie di valori. Una cosa ben diversa è invece
riempire la lista di valori acquisendoli da una tabella di un database.
Nel nostro caso il combo si chiama C_Autori e viene riempito dai valori presenti nella tabella
Autori del database. Il codice in linea di massima e quello che vi vede nel riquadro.
Attraverso una stringa SQL non prendo tutti i dati nella tabella Autori ma limito la scelta ai
campi IDAUTORE e Nome_Cognome
Dim stringaSQL As String = "SELECT IDAUTORE, Nome_Cognome FROM Autori ORDER BY Nome_Cognome"
Adattatore.Fill(DataSetAutori, "Autori")
C_Autori.DataSource = DataSetAutori.Tables("Autori")
Associo il campo IDAUTORE alla proprietà ValueMember che mi servirà per identificare uni-
vocamente l’autore ma non deve comparire nella lista combinata.
C_Autori.ValueMember = "IDAUTORE"
C_Autori.DisplayMember = "Nome_Cognome"
In pratica degli autori vengono visualizzati solo i nomi ed i cognomi ma in realtà per iden-
tificarli univocamente utilizzo l’IDAUTORE che pur non comparendo nella lista viene tenuto
in considerazione dal ComboBox. (Come se fosse una Griglia di dati con due sole colonne
di cui la prima la nascosta.)
Aggiungere un record.
Per aggiungere dei dati ad una tabella esistono diverse tecniche. In questo esempio viene
utilizzato un OleDbCommandBuilder che provvedere a creare in modo automatico un co-
mando SQL da passare al database per aggiungere nuovi record o eseguire altre operazioni.
Il codice di esempio per questa operazione è visibile nel riquadro successivo.
Connessione.Open()
Connessione.Close()
Righe = Tabella.Rows
NuovaRiga = Tabella.NewRow
NuovaRiga("IDCASAEDITRICE") = CasaEditrice
NuovaRiga("IDAUTORE") = Autore
NuovaRiga("ISBN") = ISBN
NuovaRiga("Titolo") = Titolo
NuovaRiga("Prezzo_Listino") = Prezzolistino
NuovaRiga("Pagine") = Pagine
NuovaRiga("Anno_Edizione") = AnnoEdizione
Righe.Add(NuovaRiga)
Connessione.Open()
Adattatore.Update(DataSet1, "Libri")
DataSet1.AcceptChanges()
Connessione.Open()
Dichiaro una stringa SQL che serve per recuperare i dati nella tabella del database
Adattatore.Fill(DataSet1, "Libri")
Chiudo la connessione
Connessione.Close()
Creo un oggetto tabella. Dato che non sono più collegato al database l’aggiornamento dei
dati avviene prima nella memoria del computer e poi passato al database al termine della
procedura di aggiornamento. In questo modo è possibile accedere in più utenti al database
rendendo la struttura più veloce senza tenere aperte le connessioni per tutta la durata del
funzionamento del programma.
Creo un oggetto Righe per la tabella che corrisponde alla collezione di righe della tabella.
Righe = Tabella.Rows
NuovaRiga = Tabella.NewRow
Assegno delle variabili ai campi che si trovano sul form. Recupero i dati dai TextBox e li
inserisco nelle variabili
Recupero dai ComboBox, come abbiamo visto nell’esempio precedente, il valore dell’iden-
tificato corrispondente e non quello che viene mostrato nella lista.
Aggiungo questi dati alla nuova riga. Lo posso fare in diversi modi come si vede dal codice
nel box leggermente diverso ma la sostanza resta quella.
NuovaRiga("IDCASAEDITRICE") = CasaEditrice
NuovaRiga("IDAUTORE") = Autore
NuovaRiga("ISBN") = ISBN
NuovaRiga("Titolo") = Titolo
NuovaRiga("Prezzo_Listino") = Prezzolistino
NuovaRiga("Pagine") = Pagine
NuovaRiga("Anno_Edizione") = AnnoEdizione
Aggiungo la nuova riga alla collezione delle righe del set di dati.
Righe.Add(NuovaRiga)
Apro la connessione
Connessione.Open()
Adattatore.Update(DataSet1, "Libri")
DataSet1.AcceptChanges()
E chiudo la connessione
Connessione.Close()
VisualBasic.NET 2019 – Partendo da Zero
296
Modificare un Record
In questo specifico caso prima di apportare le eventuali modifiche è necessario leggere i
dati e presentarli a schermo. Il progetto dispone infatti di un form che si chiama LibriModi-
fica che permette di modificare dati relativi a un libro già inserito.
La prima parte quindi permette di recuperare i dati nella tabella libri nel database.
Dim StringaSQL1 As String = "SELECT * FROM Libri where ID = " & Str(MioLibro)
t_ISBN.Text = Tabella.Rows(0).Item("ISBN")
t_Titolo.Text = Tabella.Rows(0).Item("Titolo")
t_Prezzo.Text = Tabella.Rows(0).Item("Prezzo_Listino")
t_Pagine.Text = Tabella.Rows(0).Item("Pagine")
t_AnnoEdizione.Text = Tabella.Rows(0).Item("Anno_Edizione")
C_Autori.SelectedValue = Tabella.Rows(0).Item("IDAUTORE")
C_CaseEditrici.SelectedValue = Tabella.Rows(0).Item("IDCASAEDITRICE")
Connessione.Close()
Intanto devo creare una Stringa SQL che recuperi dal database solo ed esclusivamente il
libro specificato. La variabile MioLibro e stata definita Public, quindi disponibile in tutto il
progetto, e si trova nel modulo di codice denominato Modulo1 nella finestra Esplora Solu-
zioni.
Tenete presente che un valore numerico (del campo ID) in questo caso va passato come
Stringa (Str(MioLibro)) al comando SQL.
Dim StringaSQL1 As String = "SELECT * FROM Libri where ID = " & Str(MioLibro)
Adattatore.Fill(DataSet1, "Libri")
Tabella = DataSet1.Tables("Libri")
Recupero i dati dall’unica riga che compone la tabella, quella di indice 0, e li metto nei vari
campi di testo. (TextBox)
t_ISBN.Text = Tabella.Rows(0).Item("ISBN")
t_Titolo.Text = Tabella.Rows(0).Item("Titolo")
t_Prezzo.Text = Tabella.Rows(0).Item("Prezzo_Listino")
t_Pagine.Text = Tabella.Rows(0).Item("Pagine")
t_AnnoEdizione.Text = Tabella.Rows(0).Item("Anno_Edizione")
dato che in precedenza ho già riempito i due ComboBox (Autori e Case Editrici) con i dati
delle rispettive tabelle con questi due comandi dico ai ComboBox che devono posizionarsi
sull’autore e la casa editrice del libro in questione.
C_Autori.SelectedValue = Tabella.Rows(0).Item("IDAUTORE")
C_CaseEditrici.SelectedValue = Tabella.Rows(0).Item("IDCASAEDITRICE")
Chiudo la connessione.
Connessione.Close()
Questo è quello che riguarda la lettura dei dati. Ovviamente vi invito a dare un’occhiata al
codice completo contenuto nell’esercizio visto che nel libro mettiamo in risalto le parti più
importanti.
Dim Adattatore1 As New OleDbDataAdapter("SELECT * FROM Libri WHERE ID = " & Str(MioLibro) &
" ", Connessione)
Riga.BeginEdit()
VisualBasic.NET 2019 – Partendo da Zero
298
Riga("IDCASAEDITRICE") = C_CaseEditrici.SelectedValue
Riga("IDAUTORE") = C_Autori.SelectedValue
Riga("ISBN") = ISBN
Riga("Titolo") = Titolo
Riga("Prezzo_Listino") = Prezzolistino
Riga("Pagine") = Pagine
Riga("Anno_Edizione") = AnnoEdizione
Riga.EndEdit()
Adattatore1.Update(Dataset1, "Libri")
CommBuild.GetUpdateCommand()
Connessione.Close()
Adesso per modificare il record creo un adattatore utilizzando come prima una stringa che
seleziona esclusivamente il record in questione che devo modificare.
Dim Adattatore1 As New OleDbDataAdapter("SELECT * FROM Libri WHERE ID = " & Str(MioLibro) & "
", Connessione)
Creo l’oggetto Riga assegnandogli i dati che si trovano nella riga 0 della tabella.
Prendo i dati che l’utente ha modificato, prima li metto in alcune stringhe ma posso asse-
gnarli anche direttamente
Riga.BeginEdit()
Riga("IDCASAEDITRICE") = C_CaseEditrici.SelectedValue
Riga("IDAUTORE") = C_Autori.SelectedValue
Riga("ISBN") = ISBN
Riga("Titolo") = Titolo
ACCESS & Visual Basic
299
Riga("Prezzo_Listino") = Prezzolistino
Riga("Pagine") = Pagine
Riga("Anno_Edizione") = AnnoEdizione
Termino le modifiche
Riga.EndEdit()
Adattatore1.Update(Dataset1, "Libri")
CommBuild.GetUpdateCommand()
Connessione.Close()
Imports System.Windows.Forms
Imports System.Data
Imports System.Drawing
Nella routine Click del pulsante che servirà a fare partire la stampa va inserito questo codice.
Nel capitolo PrintDialog abbiamo già visto a cosa serve.
End If
End Sub
Mentre nella routine che serve per formare la pagina che andrà in stampa il codice è il
seguente. Alcune righe di codice sono particolarmente lunghe quindi vanno accapo.
PosizioneVerticale = PosizioneVerticale + 15
TotaleRighe = DataGridView1.RowCount
PosizioneVerticale = Marginesuperiore + 25
For j = 1 To RigheperPagina
Next j
ConteggioRiga = 0
e.HasMorePages = True
End If
End Sub
Per le variabili utilizzate nomi che poi vi ricorderanno vagamente quello che rappresentano
altrimenti poi sarà difficile capire quello che fanno durante le varie fasi del programma.
Questa parte di codice stampa la testata di quello che sarà la pagina di stampa e sarà
ripetuta in ogni pagina successiva.
ogni riga che verrà stampata va dichiarata con precisione attraverso il metodo
Graphics.DrawString che ha il seguente formato:
Quindi si tratta di una riga piuttosto lunga che sicuramente si presenterà su più righe.
Il font di stampa va passato nel formato che abbiamo visto in precedenza, il margine sinistro
e la posizione verticale sono variabili tipo Single.
Mette un po’ di spazio verticale.
PosizioneVerticale = PosizioneVerticale + 15
VisualBasic.NET 2019 – Partendo da Zero
302
Disegna una riga per separare la testata della pagina dalla lista dei libri
Calcola orientativamente quante righe entrano in una pagina basandosi sul margine supe-
riore della pagina e sulla grandezza del font utilizzato per stampare i dati, nel nostro caso
Font3 che abbiamo definito all’inizio.
TotaleRighe = DataGridView1.RowCount
PosizioneVerticale = Marginesuperiore + 25
Crea un formato per quei dati che devono essere stampati, come ad esempio un importo,
partendo con l’allineamento da destra verso sinistra e non viceversa con il testo. Questo
parametro verrà specificato al momento di stampare quel dato specifico.
Inizia un ciclo For...Next per stampare ogni riga presente nella DataGridView tenendo pre-
sente però che c’è un limite per ogni pagina altrimenti….
For j = 1 To RigheperPagina
Controlla se la variabile che dice a quale riga di stampa siamo arrivati non eccede il valore
del totale delle righe altrimenti ci sarà un errore di overflow, ovvero un valore va oltre il
limite ammissibile.
Questo dato va stampato allineato a destra e non a sinistra come di solito perciò va for-
mattato in maniera diversa che i dati contenuti nelle altre colonne.
Avrete notato che ogni dato viene stampato incrementando il margine sinistro di un valore.
Questo valore va sperimentato in fase di anteprima di stampa per vedere se si adatta alle
vostre necessità.
Incremento la posizione verticale per la stampa della riga successiva. Questa operazione
può essere fatta anche in altri modi.
PosizioneVerticale = PosizioneVerticale + 20
ConteggioRiga = ConteggioRiga + 1
Incremento il conteggio delle righe totali. Questa variabile è stata definita nello spazio della
classe per evitare che ad ogni pagina successiva venga azzerata perdendo quindi il riferi-
mento. Ricordate che tutte le volte che viene generata una nuova pagina il computer esegue
di nuovo l’evento PrintDocument1_PrintPage, ricominciando la routine daccapo.
Riga = Riga + 1
Next j
Se il conteggio delle righe stampate per quella pagina è uguale o maggiore delle Righe per
pagina allora il codice deve generare una nuova pagina.
ConteggioRiga = 0
e.HasMorePages = True
End If
e.HasMorePages = True
Installare MySQL
Per usufruire dei servigi di questo prodotto è necessario installarne una copia su vostro
computer dopo averlo scaricato da Internet all’indirizzo www.mysql.com
Prestate attenzione al fatto che gli indirizzi Internet, le grafiche e i collegamenti nelle pagine
che vediamo qui di seguito sono soggetti a continui aggiornamenti e quindi è improbabile
che fra cinque anni queste immagini rispecchino fedelmente le modifiche fatte nel frat-
tempo.
Se non riuscite a trovare MySQL cercatelo con un motore di ricerca. (Google ecc.)
Quando siete giunti all’indirizzo in questione fate click sul collegamento Prodotti e cercate
da qualche parte MySQL Community Edition dato che si tratta della versione gratuita.
Dalla figura successiva fate click sul collegamento che vi permette di scaricare il prodotto
sempre tenendo presente che queste pagine sono soggette a continui aggiornamenti quindi
non sono statiche e immutabili (d’altra parte Internet è fatto così).
Ovviamente alcune pagine sono in italiano ma è altamente probabile che molte altre siano
in inglese quindi non vi meravigliate se vi trovate davanti ad una pagina piena di testo
incomprensibile…ammesso che non conosciate la lingua.
MySQL
305
Dato che il prodotto supporta diversi sistemi operativi dovete cercare quello che opera in
ambito Windows. Individuate MySQL installer for Windows che contiene tutte le carat-
teristiche del prodotto per l’installazione in ambiente Windows.
VisualBasic.NET 2019 – Partendo da Zero
306
Le versioni del motore del database variano continuamente ma non vi è nessuna necessità
di fare degli aggiornamenti continui. Personalmente utilizzo su un Server MySQL che ho
scaricato nel lontano 2006 e funziona perfettamente ancora oggi.
La versione attuale del prodotto è la 8.0.19 quindi aspettatevi in futuro altre versioni…. Fate
click dove indicato in figura
Scorrete la pagina successiva fino in fondo e fate click sul collegamento che vedete nella
figura successiva. Qualora non fosse possibile fare altrimenti perché nel frattempo hanno
cambiato politica, registratevi e create un account, è gratis.
MySQL
307
Mettetevi comodi perché ci sono diversi passaggi da eseguire prima dell’installazione del
prodotto.
Al temine del download fate click su Apri cartella per aprire la cartella dove si trova il file
di installazione.
Il file di installazione ha un aspetto simile a quello della figura sottostante. Fate doppio click
per avviare l’installazione del prodotto.
Appena viene avviato il programma di installazione compare sullo schermo una finestra che
vi chiede se desiderate effettuare un aggiornamento del prodotto (upgrade). Confermate
pure la scelta.
VisualBasic.NET 2019 – Partendo da Zero
308
Scegliete l’installazione tipica per
lo sviluppatore che contiene
tutte le funzionalità necessarie
per il vostro utilizzo. Fate click
sul pulsante Next in basso a de-
stra nella finestra.
Se le impostazioni corrispondo a
quello che vedete nella figura ac-
canto fate click sul pulsante Next.
Nell’epoca dei Tools grafici è perfettamente inutile utilizzare la riga di comando, come con
il DOS dell’epoca di Re Pipino, solo perché fa figo. Inutile perdere mesi per memorizzare
comandi che neanche il più abile dei programmatori è in grado di ricordare (ammesso che
non sia iscritto al club dei Nerd) quando tutto può essere semplice e produttivo in pochi
passi. Riavviate quindi il vostro computer e quindi avviate Visual Studio.
VisualBasic.NET 2019 – Partendo da Zero
314
Connetti al database
Adesso vediamo se tutto funziona (o almeno la connessione) al Server MySQL. Si parla di
Server in quanto è possibile creare un numero qualunque di database (catalogs) ed è inoltre
accessibile anche da altri computer della vostra rete (ad esempio un ufficio). Per motivi di
spazio, non possiamo esporre nel dettaglio il funzionamento di una rete di computer ma
cercheremo di dare alcuni rudimenti che possono essere utili al programmatore, nel caso
dovesse creare applicazioni che agiscono su un database che si trova su un altro computer,
ovvero in rete ad esempio in un’azienda. (Rete che non ha nulla a che vedere con Internet)
Dalla finestra principale di Visual Studio senza creare nessun nuovo progetto fate click sul
menu Strumenti e selezionate la voce Connetti a database.
Ogni tipologia di database, Microsoft Access, MySQL, Oracle, SQL Server ecc. ha
bisogno del proprio provider di dati per poter funzionare altrimenti sarà impossibile
collegarsi al Server o al database. Se dovesse comparire una finestra che vi chiede
un qualche aggiornamento eseguitelo pure.
Dalla finestra visibile nella figura successiva verificate l’esistenza nella lista di MySQL Da-
tabase e selezionatelo con un click. Se questa voce non dovesse comparire nella lista allora
annullate questa procedura e procuratevi dal sito MySQL il pacchetto MySQL Connector e
installatelo sul vostro computer. Ricordate di riavviare il computer al termine di qualsiasi
procedura di installazione. Fate click sul pulsante Continua.
MySQL
315
Compliate i parametri presenti nella finestra come mostra la figura sottostante. Il nome del
Server (127.0.0.1) significa che il database si trova sullo stesso computer che state utiliz-
zando al momento, root è l’utente amministratore del Server MySQL e la password è quella
che avete assegnato in fase di installazione qualche decina di passaggi fa. (Ve l’avevo detto
di non dimenticarla che poi sarebbe risultata utile.)
Fate click sulla casella di controllo Save my password in modo da non doverla digitare
agli accessi successivi e infine scegliete il database world, o altri presenti nella lista, che
verranno utilizzati per prova.
Quindi fate click sul pulsante Test connessione per verificare che la connessione sia cor-
retta. Se compare una finestra simile a quella della figura successiva, allora non avete nulla
da temere. Tutto è andato (per ora) nel migliore dei modi.
Fate click sul pulsante Ok in basso nella finestra, per salvare il collegamento nella lista
Esplora Server, che è molto utile per verificare che una qualsiasi connessione ad un qua-
lunque database funzioni correttamente. In questo modo, in teoria, riduciamo al minimo i
problemi di connessione quando andremo a sviluppare le nostre applicazioni che si connet-
teranno al database.
VisualBasic.NET 2019 – Partendo da Zero
316
Quello che abbiamo selezionato è un database di esempio che si trova sul Server MySQL,
infatti, in fase di installazione, abbiamo confermato l’installazione di questi accessori. Nel
prossimo capitolo vediamo invece come si fa a sviluppare un database con MySQL partendo
da zero attraverso dei strumenti grafici sviluppati appositamente per questo tipo di impiego.
Il database.
Dopo aver installato MySQL, prima di proseguire, sono necessarie alcune considerazioni
teoriche. In questo capitolo affronteremo uno degli argomenti più importanti, se non il più
importante, del mondo dell’informatica. Il programmatore, qualunque linguaggio adotti, che
sia Visual Basic, C# o Java, solo per citare i più diffusi, non può assolutamente ignorare
quest’argomento. Il 70% dei programmi in circolazione si appoggia ad un database per
memorizzare i dati e da questo si può capire l’importanza di questo argomento.
Questa struttura chiamata appunto database è particolarmente complessa per la quantità
di argomenti, quindi cercheremo di rendere comprensibili le sue caratteristiche nel modo
più semplice possibile.
Se avete già una certa esperienza per quanto riguarda la teoria e la progettazione dei da-
tabase potete passare ai capitoli successivi, per andare oltre con la programmazione e af-
frontare il linguaggio SQL o altre caratteristiche, in quanto questa sezione del libro è espres-
samente dedicata a chi parte da zero o quasi.
Se siete quasi o completamente a digiuno, vi suggerisco di seguire questo capitolo in ma-
niera di assimilare quelle nozioni teoriche e pratiche che vi permetteranno di entrare in
questo mondo dalla porta principale.
Questo “articolo”, il database appunto, altro non è che una struttura che immagazzina i dati
che vengono inseriti, li memorizza ed eventualmente, a vostra richiesta, li elabora e li vi-
sualizza sullo schermo, e tutto questo indipendentemente dall’ordine in cui questi dati sono
stati immagazzinati nella struttura.
Per ottenere questo tipo di risultato, un database deve essere fortemente strutturato e
quindi necessita di una meticolosa progettazione come abbiamo già visto nel capitolo che
tratta di Microsoft Access.
Tabelle
Sono le sorgenti dei dati senza le quali un database non ha senso.
Query o View
Chiamatele come volete ma questa è una componente molto importante di un database.
Una Query è una domanda che l’operatore formula per avere delle risposte ed il risultato di
questa domanda è una tabella che riassume, o incrocia, i dati provenienti da una o più
tabelle in modo da dare una vista sui dati diversa da quella che normalmente una tabella
offre.
MySQL
317
Posso ad esempio riepilogare gli incassi di un singolo negozio appartenente ad una catena
in modo veloce proprio attraverso le Query. La singola tabella dove sono inseriti i dati
avrebbe difficoltà a fornirveli riepilogati in quel modo.
La query può essere memorizzata e richiamata facilmente dai meandri del database.
Utenti
Un database non è una porta aperta a tutti, per il semplice motivo che può contenere dati
sensibili di una certa importanza e quindi, come capite, esiste tutta una serie di strumenti
che limita o esclude l’accesso agli oggetti del database, come tabelle, query ecc. a deter-
minati personaggi chiamati utenti. L’utente che normalmente ha l’accesso a tutti i dati e
dispone di tutti i poteri si chiama amministratore, o admin, oppure root, a seconda del
database che stiamo utilizzando.
Questo signore può gestire anche quelli che vengono chiamati utenti ovvero chiunque altro
che possa collegarsi a un database che non sia l’amministratore.
L’amministratore decide i nomi degli utenti e quello che possono fare o vedere nel Db.
Progettare un database
Capite che per progettare una struttura come quella che vedremo è necessaria un po’ di
pratica per evitare che i dati vengano distribuiti in modo errato nelle varie tabelle, e soprat-
tutto che le tabelle abbiamo la giusta correlazione fra di loro altrimenti diverrebbe impossi-
bile recuperare i dati.
I passaggi della progettazione sono esposti nei capitoli successivi dove passo per passo
verranno mostrate le caratteristiche di un database e verrà spiegato come padroneggiare
quelle tecniche che vi permetteranno di realizzare un database in modo efficace.
Successivamente affronteremo attraverso il linguaggio SQL l’estrazione dei dati dal data-
base, la creazione di tabelle e tutti quei comandi che vi permetteranno di accoppiare il
vostro database con il linguaggio di programmazione Visual Basic. Quindi andiamo avanti
con la nostra avventura.
Va ricordato, che per motivi di didattica in questo libro vengono utilizzati i pro-
grammi più recenti al momento della pubblicazione, ma tutte le procedure che ve-
diamo sono valide anche per le versioni precedenti di MySQL ed anche precedenti
versioni di Visual Studio (2013, 2015, 2017). Magari cambia un po’ la grafica e
qualche menu ma i concetti basilari sono quelli.
Utilizzare Workbench
Se non fosse già stato installato con la procedura che abbiamo visto nel capitolo precedente,
installatelo sul vostro computer attraverso la procedura d’installazione, che permette una
volta avviata qualora il prodotto fosse già installato, l’aggiornamento dei vari programmi
VisualBasic.NET 2019 – Partendo da Zero
318
che compongono il pacchetto. Avviatelo cercandolo nel menu di avvio e se tutto va bene la
prima schermata sarà come quella che vedete nella figura sottostante.
Innanzitutto, viene identificato il Server che si trova sul vostro computer.
Adesso è necessario creare una connessione al Server per creare le basi di dati vere e
proprie e tutti quegli oggetti, come le tabelle, che abbiamo visto nel capitolo introduttivo e
dove è stato spiegato a grandi linee il funzionamento di un database.
Inserite la password che avete utilizzato durante l’installazione del prodotto per accedere
al server come utente root ovvero come utente amministratore. Salvate la password con il
segno di spunta nella casella di controllo che vedete subito sotto il campo password in modo
che non ve la chieda ad ogni successivo accesso.
MySQL
319
A questo punto comparirà l’ambiente di lavoro in tutta la sua complessità.
Si apre una finestra piuttosto minacciosa, ma fate finta di nulla e fate click sul pulsante
Apply in basso nella finestra.
Ed ecco che il vostro nuovo database è pronto per l’utilizzo (vi piacerebbe eh!!)
Nossignori, ancora il percorso è molto lungo ma comunque siete sulla buona strada.
Eliminare un database.
Fate click con il tasto destro del mouse puntando il nome del database in questione e dalla
lista scegliete la voce Drop Schema.
Puntate con una precisione maniacale perché distruggere il lavoro di anni è più
facile di quanto crediate, con questi maledetti strumenti grafici, e soprattutto non
eliminate per il momento altri database (Schemas) presenti nella lista.
Creare le tabelle
L’oggetto principe di un database sono appunto le tabelle che contengono i dati veri e propri.
Qui armatevi di pazienza perché la lezione è particolarmente lunga.
Sicuramente esistono altri database più “maneggevoli” ad esempio Microsoft Access ma
una volta che avete acquistato una certa confidenza vi garantisco che troverete solo pregi.
VisualBasic.NET 2019 – Partendo da Zero
322
Come abbiamo già visto nel capitolo introduttivo ai database la tabella è il fulcro del sistema
proprio perché contiene i dati e quindi è importante saperla gestire nel migliore dei modi.
Anche se vi dovessero capitare fra le mani prodotti diversi da questo alla fine vedrete che
sono tutti molto simili con qualche piccola differenza.
Come prima tabella ci apprestiamo ad analizzare la tabella Agenti che può servire come
esempio di massima per le altre soprattutto per prendere la mano con lo strumento in
questione. Non mostreremo tutto il database completo per ovvi motivi di spazio.
Il database già pronto lo potete richiedere all’indirizzo di posta elettronica:
libri@edizionifutura.com
Fate doppio click in corrispondenza del database in questione come mostra la figura suc-
cessiva per accedere agli oggetti contenti nel database.
Fate click on il tasto destro del mouse in corrispondenza delle Tabelle (Tables) e dal menu
scegliete la voce Create Table.
MySQL
323
Come mostrato nella figura successiva per prima cosa digitate nell’apposito spazio il nome
della tabella in questione. È inutile che aggiunga che in un database non possono esserci
due oggetti tabella che si chiamano con lo stesso nome. (logico no!?).
Adesso concentriamoci sui campi e sulle loro caratteristiche. Per aggiungere un campo fate
doppio click in corrispondenza della prima riga vuota come mostra la figura sottostante e
digitate il nome del campo, nel nostro caso IDAGENTI, che può essere digitato indifferen-
temente maiuscolo o minuscolo.
Non utilizzare lettere accentate per i nomi dei campi ad esempio “città”
Non inserire spazi nei nomi dei campi, ad esempio UnitaMisura è possibile anche scriverlo
Unita_Misura ma non Unita Misura perché il computer genererebbe un errore.
Applicate le proprietà del campo :
PK = PRIMARY KEY o chiave primaria.
NN = NOT NULL ovvero non può essere lascito vuoto
AI = AUTO INCREMENT cioè che si incrementa da solo (come il campo ID di un database
Access.)
Altre caratteristiche per i campi che è possibile applicare in altri casi sono:
UNIQUE = il valore di quel campo non può ripetersi in altri record presenti nella tabella.
ZERO FILL = Viene riempito dal database automaticamente con degli zeri se nessuno ci
inserisce altri valori dentro.
BINARY = Campo che contiene valori Binari.
VisualBasic.NET 2019 – Partendo da Zero
324
La figura sottostante mostra la situazione finale. Di fondamentale importanza utilizzare per
i campi le lunghezze che meglio si adattano alla situazione, ad esempio, per la provincia è
inutile utilizzare un campo VARCHAR lungo 30 se al massimo il campo sarà impegnato con
2 caratteri.
Un campo tipo Double può contenere qualsiasi tipo di numero mentre ad esempio un
campo tipo INT può contenere solo numeri interi. Un campo tipo DATE può contenere una
data. Altre caratteristiche verranno presentate un po’ per volta quando ci troveremo ad
affrontare l’argomento specifico. Nel Campo LONGTEXT è possibile scrivere un sacco di
cose. Portate a termine l’operazione facendo click sul pulsante Apply in basso a destra nella
finestra.
Come mostra la figura successiva, tutto il vostro lavoro per la creazione della tabella viene
convertito in linguaggio SQL, l’unico che il database è in grado di capire.
Quando sarete campioni di linguaggio SQL potete scrivere o modificare voi stessi le righe
presenti nella finestra.
Fate click sul pulsante Apply in basso a destra nella finestra SQL.
MySQL
325
Modificare le tabelle
Per modificare una tabella selezionate con un click del tasto DX del mouse la tabella stessa,
come si vede nella figura sottostante (ricordando di essere maniacali nella precisione del
click onde evitare la selezione di altri oggetti che non c’entrano nulla) e dal menu scegliete
la voce Alter Table.
Adesso è possibile modificare la struttura della tabella aggiungendo ad esempio altri campi,
oppure modificare le caratteristiche degli stessi come ad esempio la lunghezza o tutte quelle
variazioni che è possibile fare anche in fase di creazione.
MySQL
327
Gli indici
Gli indici sono un’altra componente importante di una tabella. Di solito sono associati ai
campi e permettono di velocizzare una ricerca. Ad esempio, se sospettate che l’utente che
utilizzerà il programma farà delle ricerche sul campo della descrizione di un prodotto, per
velocizzare queste ricerche non c’è nulla di meglio che creare un indice ed associarlo a quel
campo. L’indice è fondamentale per velocizzare le ricerche specialmente se una tabella ha
molte migliaia di record (righe).
Ma passiamo alla pratica: fate click sulla voce Indexes nella parte bassa dello schermo.
A questo punto comparirà una situazione simile a quella della figura successiva.
Intanto la tabella possiede già un indice etichettato con PRIMARY che si trova nella prima
riga della lista di sinistra. Questo perché la PRIMARY KEY, ovvero la chiave primaria, è
già di per sé stessa un indice.
Quindi, come mostra la figura successiva, basta fate click nella riga sottostante PRIMARY e
digitare il nome che l’indice deve avere. Il nome può essere anche di fantasia ma per evitare
che poi la fantasia ci faccia perdere la strada per tornare a casa, è meglio seguire questa
notazione: IX_RAGIONESOCIALE se ad esempio voglio creare un indice associato al
campo RagioneSociale.
Nel nostro caso impostate la tipologia dell’indice a INDEX, come si vede nella colonna
accanto a quella del nome.
Per terza cosa mettete un segno di spunta accanto al nome del campo che vogliamo indi-
cizzare nel nostro caso il campo Descrizione.
Terminate le operazioni con il pulsante Apply in basso a destra nella finestra.
Nel riquadro Index Comment è possibile digitare anche una descrizione che può esservi
utile per ricordare in un secondo tempo cosa fa quell’indice.
VisualBasic.NET 2019 – Partendo da Zero
328
Adesso compare la solita finestra che trasforma in linguaggio SQL le nostre modifiche e le
passa al database. Fate click sul pulsante Apply in basso a destra.
MySQL
329
Nella finestra successiva che qui non riportiamo fate click sul pulsante Finish. Quindi tor-
niamo alla situazione iniziale chiedendo la scheda della tabella Agenti.
In questo database si trovano due tabelle: Clienti e Fatture. Visto che è impossibile inserire
questi dati in una singola tabella sono stati inseriti in due tabelle separate.
Per fare in modo che il database non possa avere dubbi su quale cliente sia collegato alle
rispettive fatture viene creato un campo IDCLIENTE nella tabella clienti e un campo analogo
nella tabella Fatture. Il campo viene chiamato così per una convenzione che vedremo fra
poco ma nessuno vi vietava di utilizzare un altro nome di fantasia.
Nella tabella fatture viene creato lo stesso campo. In realtà questi campi non contengono i
dati del cliente ma un codice numerico univoco assegnato ad ogni cliente che viene ripetuto
nella tabella fatture in corrispondenza della fattura di quello specifico cliente.
VisualBasic.NET 2019 – Partendo da Zero
330
Ogni cliente ha un codice che lo identifica univocamente, senza possibilità di errore, che
viene riportato nella tabella Fatture tutte le volte che viene inserita una fattura relativa a
quel cliente.
Il codice viene automaticamente assegnato dal database al momento dell’inserimento di un
cliente mentre nella tabella fatture ce lo deve inserire il programmatore in un modo che
vedremo successivamente.
In questo capitolo viene esposta solamente la parte teorica in modo che quando affronte-
remo la parte pratica sappiamo almeno di cosa stiamo parlando. Anche il modo di dichiarare
il campo IDCLIENTE e tutto il resto lo vedremo in fase di creazione della tabella nella parte
pratica del libro. Il passo successivo dello sviluppo del database in questione lo vediamo
nella figura qui sotto.
INSERT INTO Clienti (RagioneSociale, Indirizzo, Citta) Values ('Paolino Paperino', 'Via Roma
35','Firenze')
E quindi avviate il comando attraverso il pulsante con l’icona del fulmine come mostra la
figura sottostante.
Se in basso nell’area di Output non viene segnalato nessun errore il database ha inglobato
i vostri dati. La spiegazione dettagliata del comando verrà illustrata nel capitolo teorico del
linguaggio SQL.
Come mostra la figura successiva sono anche possibili immissioni multiple basta ricordare
che al termine di ogni riga si deve trovate il punto e virgola, come separatore di istruzioni.
Eseguite la Query o comando, come dir si voglia, con il solito pulsante con il fulmine sulla
barra degli strumenti.
Nell’area di Output al momento non viene visualizzato nessun errore come si può vedere
qui di seguito, quindi i vostri dati sono finiti nei meandri del database. Ricordate il punto e
virgola alla fine di ogni istruzione!!
VisualBasic.NET 2019 – Partendo da Zero
332
Per ripulire lo schermo dalle istruzioni SQL che sono andate a buon fine basta chiudere la
scheda in alto, dove trovate scritto Query1 o qualcosa di simile, con l’apposito comando
Chiudi (la piccola X presente in qualsiasi scheda) come mostra la figura qui sotto.
Adesso vediamo se è vero che tutti quei nomi sono finiti dentro la tabella Clienti. Verifi-
chiamo con il comando SQL che vedete qui sotto:
Quindi premete il solito pulsante col fulmine per eseguire il comando. Il risultato dell’ope-
razione sarà elencato subito sotto.
MySQL
333
Come vedete la colonna (campo) IDCLIENTE si incrementa da solo senza nessun aiuto da
parte dell’utente.
Adesso inseriamo qualche fattura nella tabella Fatture tanto per vedere come ci si deve
comportare se desiderate inserire i dati in questa tabella.
Se non vi ricordate e vi garantisco che accade spesso, i nomi dei campi della tabella Fatture
basta eseguire il comando:
describe fatture;
INSERT INTO Fatture (IDCLIENTE, Numero, Tipo, Data) VALUES (1, 1, 'F', '2020-09-27');
• Come nel caso precedente prima devo invocare i nomi dei campi dove devo inserire
i dati e quindi dopo la parola chiave values devo digitare i valori da inserire nello
stesso preciso ordine in cui ho elencato i campi corrispondenti.
• Posso omettere il nome di un campo omettendo il valore da inserire in quel campo.
• Le date vanno inserire al contrario, ovvero prima l’anno, poi il mese e quindi il
giorno separati da un segno (-)
• I valori di testo vanno inseriti fra apici.
• I valori numerici vanno inseriti senza apici.
Se un comando è particolarmente lungo potete attivare il “testo a capo” con il pulsante che
vedete nella figura sottostante, in modo da vedete tutto il comando senza scorrere orizzon-
talmente la finestra.
Come potete vedere ho assegnato la fattura al cliente che corrisponde al numero 1 nella
tabella Clienti.
La domanda sorge spontanea: sono costretto a ricordare tutti i numeri corrispondenti ad
un certo Cliente a memoria per memorizzare una fattura in quella tabella?? Pura follia.
Ed in effetti è vero. Non è possibile ricordare a quale codice corrisponde un certo Cliente
sempre ammesso che non apra la tabella Clienti e guardi tutte le volte a quale codice cor-
risponde a quel Cliente. Non vi preoccupate perché il programma Visual Basic che andremo
a sviluppare serve proprio a questo, per assegnare in modo automatico il codice del Cliente,
visualizzando sullo schermo il nome del cliente e non il codice identificativo a lui assegnato.
Con il codice IDCLIENTE ci lavorerà il computer e non noi.
Come mostra la figura successiva sono possibili anche comandi multipli. Ricordate per non
sbagliare la sintassi del comando il Copia e Incolla potrebbe essere una buona idea. A quel
punto basta cambiare i valori e sfruttare il fatto che il comando è già scritto.
MySQL
335
Ricordate sempre il punto e virgola alla fine di ogni singola istruzione. Eseguite il comando
con il solito pulsante con l’icona del fulmine e guardate se la finestra di Output vi restituisce
qualche errore. Nella figura successiva sembra tutto ok.
Ricapitolando quanto visto in questo capitolo l’immissione dei dati in una tabella non è per
niente facile direttamente da Workbench ma è necessaria ai fini di acquisire con l’ambiente
database quella confidenza per programmare in modo efficace.
Ad esempio, Microsoft Access facilita non poco l’immissione dei dati nelle tabelle rispetto a
quanto abbiamo visto fino ad adesso, e rende l’ambiente di lavoro più simile a Microsoft
Excel. Ma attraverso la programmazione Visual Basic si può fare di più e meglio.
Ricordate però che se ignorate queste tecniche che abbiamo appena visto non sarete in
grado di programmare in Visual Basic.
Le Views
Questo oggetto serve creare una vista sui dati. Il risultato di una view è una tabella che
riepiloga i dati come noi desideriamo. È necessario però un po’ di pratica e la giusta sintassi
di comando altrimenti dal database non esce proprio nulla di buono, o peggio ancora qual-
cosa senza senso. Per creare una View fate click sull’apposito pulsante presente sulla barra
degli strumenti.
Compare sullo schermo la finestra principale per la costruzione di una View. Si tratta sempre
di questo benedetto linguaggio SQL.
Innanzitutto, una View deve avere un nome identificativo perché al pari una tabella verrà
memorizzata come oggetto all’interno del database pronta per essere richiamata in qual-
siasi momento. La tecnica delle View o Query è molto utilizzata in ambito Visual Basic quindi
tenetele presente perché sono particolarmente importanti.
VisualBasic.NET 2019 – Partendo da Zero
336
Assegnate un nome alla View sostituendo quel ‘new_view’ con qualcosa di più specifico
come ad esempio query_Fatture. Il trattino basso migliora la leggibilità del nome perché è
altamente sconsigliato creare oggetti che hanno un nome che contiene spazi.
Quello che vedete qui sotto è un esempio di sintassi che nel nostro caso visualizza l’intero
contenuto della tabella libri.
Dovete modificare il nome della query dalla riga di comando come vediamo nella figura
successiva
Ovvero:
Fate click sul pulsante Apply in basso a destra. Al passaggio successivo ancora click sul
pulsante Apply e poi ancora sul pulsante Finish. Non vi resta che fare click sul pulsante
Apply in basso a destra e chiudere la Query come mostra la figura successiva e se non
sono stati rivelati errori la prima parte termina qui.
MySQL
337
Adesso vediamo cosa accade quando andiamo ad eseguire una Query o View. Fate click
sulla piccola freccia che si trova alla sinistra degli oggetti Views nella finestra Schemas in
basso a sinistra nello schermo e fate click sulla query_Fatture con il tasto DX del mouse.
Dal menu contestuale scegliete la voce Select Rows come in figura sottostante. Il risultato
verrà visualizzato nella parte centrale dello schermo.
Adesso viene il bello. Se invece che il campo IDCLIENTE volessi vedere il nome del Cliente
vero è proprio come è possibile realizzare questa cosa?
Bisogna creare una query che mette in gioco non una ma due tabelle.
Adesso passiamo dalla pratica alla teoria in quanto maggiori informazioni riguardo il lin-
guaggio SQL verranno date nel prossimo capitolo. Non trascuratele perché attraverso la
loro conoscenza, e la conoscenza di come si strutturano i database, è possibile affrontare
qualsiasi tipo di problema sorga durante la programmazione.
Se il numero di tabelle aumenta il comando SQL si complica non poco. Per districarsi in
questo marasma è possibile utilizzare anche Microsoft Access che ha uno strumento di crea-
zione Query molto potente, anche se il linguaggio va un po’ adattato perché presenta delle
differenze.
Altre utilità
Per pulire la lista delle risposte ai comandi Action Output fate click all’interno della lista
stessa con il tasto DX del mouse e scegliete la voce Clear.
Linguaggio SQL
339
Linguaggio SQL
Si tratta di un linguaggio strutturato che serve per estrapolare i dati da un database, ovve-
rosia interrogare ed avere delle risposte. SQL è l’acronimo di Structured Query Language
ed è nato appositamente per formulare delle domande dette Query. In sostanza l’operatore,
attraverso un preciso standard, può fare al database tutte le domande che vuole e ricevere
delle risposte, oppure eseguire delle operazioni come ad esempio creare una tabella o can-
cellare un gruppo di Record.
Anche se non si tratta di un vero linguaggio di programmazione è necessario conoscerne la
filosofia per due precise motivazioni:
Ci sono tuttavia alcune differenze fra un tipo di database ed un altro a livello di istruzioni
SQL, ad esempio Microsoft Access ha un linguaggio leggermente diverso, ma con qualche
accorgimento dovremmo riuscire a superare con relativa facilità l’ostacolo.
In questo capitolo per motivi di spazio non tratterò approfonditamente tutti gli aspetti del
linguaggio SQL, che sono veramente tanti ed alcuni sono tipici di uno specifico database,
ma mi limiterò a mettere in evidenza e descrivere quei comandi che nella quasi totalità dei
casi sono quelli più utilizzati dai programmatori.
Nella prima parte di questo capitolo vedremo come si fa ad estrarre informazioni da un
database, quindi passeremo in rassegna quei comandi che servono a modificarne la strut-
tura attraverso le istruzioni SQL.
Utilizzeremo il database di esempio “World” che si trova in MySQL al momento dell’instal-
lazione se ovviamente non l’avete eliminato. Fate doppio click sul database per selezionarlo.
Fate click sull’icona della casetta per tornare alla schermata iniziale di MySQL Workbench.
VisualBasic.NET 2019 – Partendo da Zero
340
Fate click sull’icona della piccola freccia che va verso destra e dal menu che compare sele-
zionate la voce Create ERR Model from Database.
Controllate di essere collegati all’istanza locale del Server (quello che funziona sul vostro
computer) e fate click sul pulsante Next in basso a destra.
Nel passaggio successivo, che non riportiamo, fate ancora click sul pulsante Next. Serve
solo per controllare che il collegamento sia andato a buon fine.
Adesso dovete selezionare, come mostra la figura successiva, il database da utilizzare per
visualizzarne il modello e quindi fare ancora click sul pulsante Next.
Linguaggio SQL
341
Spostatele trascinandole per la testata della tabella per posizionale come credete.
Il diagramma mostra inoltre le relazioni fra tabelle, che servono solo per vedere quali campi
delle varie tabelle sono collegati fra loro, aiutandoci a trovare eventuale errori di progetta-
zione del database o altre soluzioni per il miglioramento dello stesso.
Queste tabelle contengono i dati su tutti gli stati del mondo, le città ad essi collegati e le
relative lingue. Le caratteristiche delle tabelle e dei campi sono state esposte nel capitolo
che spiega la progettazione di un database e quindi adesso ci limitiamo a vedere come è
possibile estrarre i dati da queste tabelle.
Per eseguire un comando SQL in diretta sfruttate la riga di comando SQL che trovate in
MySQL Workbench.
Il comando in alto a destra nella finestra fa comparire o scomparire la finestra di Output,
che serve per capire che effetto ha un comando sul database stesso e soprattutto se ci sono
errori nella digitazione di un comando.
È importante anche saper riconoscere gli errori perché quando utilizzeremo Visual Basic per
accedere ai dati basta un piccolo dettaglio per compromettere il funzionamento di un pro-
gramma.
Linguaggio SQL
343
Negli esempi illustrati in questo libro viene utilizzato il database World che trovate dentro
il server MySQL al momento dell’installazione come mostra la figura qui sopra.
Per accedere a questo database fate doppio click del tasto SX del mouse sul database stesso
nella lista di sinistra.
Allenatevi all’apprendimento del linguaggio SQL attraverso i comandi che vedrete nel capi-
tolo successivo, in modo da comprenderne la filosofia. Inoltre, potete utilizzare il capitolo
come riferimento rapido per i comandi principali del linguaggio, che poi troveremo in am-
biente di programmazione Visual Basic, quando dovremo realizzare il programma del caso
di studio.
SELECT
La prima istruzione del linguaggio SQL è la parola SELECT che serve per selezionare “qual-
cosa” che può essere specificato subito dopo. Questa parola è sempre utilizzata in coppia
con l’istruzione FROM che invece serve per specificare da quale tabella deve prendere que-
sto “qualcosa”. In pratica serve per indicare da quali campi devo estrapolare i dati.
Ad esempio, per visualizzare sullo schermo l’intero contenuto della tabella Country si deve
digitare il comando:
Le parole chiave del linguaggio SQL sono state volontariamente scritte in maiuscolo
per mettere in evidenza la struttura del linguaggio e per rendere più chiaro il co-
mando. È ovvio che potete scriverle indifferentemente in maiuscolo o in minuscolo.
Se invece sullo schermo vogliamo visualizzare solo il contenuto di alcuni campi dobbiamo
scrivere:
Oppure:
In alternativa se desiderate un ordine alfabetico contrario, quindi dalla Z alle A basta digi-
tare.
Ovviamente ordinate per nome. Come potete notare se state effettuando il filtraggio in base
al contenuto di un campo che contiene testo devo mettere fra apici il testo di ricerca
AND
Questa parola chiave del linguaggio verifica che siano soddisfatte più condizioni contempo-
raneamente, ovvero ad esempio, che i record che verranno visualizzati come risultato de-
vono necessariamente rispettare la condizione di appartenenza sia al Nord America che alla
regione dei Caraibi. Tutti gli altri record saranno esclusi.
SELECT * FROM country WHERE Continent = 'North America' AND Region ='Caribbean' ORDER BY
Name;
OR
La clausola OR invece permette che una sola delle condizioni è sufficiente per selezionare i
record, in parole povere significa “Oppure”, “Anche” ad esempio, Nord America e anche
Europa, ed in questo caso verranno visualizzati sullo schermo tutti i record che rispettano
anche una sola di queste due condizioni.
SELECT * FROM country WHERE Continent = 'North America' OR Continent = 'Europe' ORDER BY
Name;
SELECT * FROM Country WHERE Name NOT LIKE 'A%' ORDER BY Name;
Operatori di Confronto
Maggiore
Se invece desidero una lista dove vengono elencati solo gli stati che hanno una popolazione
maggiore di quindici milioni di anime allora dovrò digitare dalla riga di comando:
Come vedete dalla query quando si interpella un campo numerico non c’è bisogno degli
apici come nel caso di un campo di testo.
VisualBasic.NET 2019 – Partendo da Zero
346
Minore
In questo caso la Query diventa:
Minore o uguale:
Maggiore o uguale:
Diverso da:
Se la ricerca deve limitarsi a una gamma di valori è possibile scrivere quello che vedete qui
sotto:
SELECT * FROM country WHERE Population BETWEEN 15000000 AND 30000000 ORDER BY Name;
Ovvero fra 15 e 30 milioni di persone. E come dire: fammi la lista degli stati che hanno fra
i 20 e i 30 milioni di persone ordinati per nome dello stato.
È anche possibile stratificare le clausole ad esempio tutti gli stati che si trovano in Europa
e che hanno fra 15 e 50 milioni di abitanti.
SELECT * FROM country WHERE Continent = 'Europe' AND Population BETWEEN 15000000 AND 50000000
ORDER BY Name;
SELECT * FROM Country WHERE Continent = 'Europe' AND Population NOT BETWEEN 15000000 AND
50000000 ORDER BY Name;
IS NULL
Un campo di un record dove al momento della creazione non sia stato inserito alcun dato è
per definizione dichiarato NULL ovvero non contiene un valore definito e non è un semplice
spazio vuoto.
Ad esempio, se volete come risultato solo gli stati che non hanno una data d’indipendenza
ben definita dovete digitare:
IN e NOT IN
Questo commando serve per selezionare soltanto una serie di valori che si trovano fra par-
tentesi, fra apici e separati da virgola. Ad esempio, il campo code della tabella Country
Linguaggio SQL
347
contiene il codice del paese. Se io voglio solamente i dati di alcuni paesi escludendone altri
dovete digitare il comando che vedete qui sotto:
Se invece voglio escludere solo qui paesi e prendere tutti gli altri:
Colonne Calcolate
È possibile creare al “volo” risultati di operazioni matematiche che coinvolgono uno o più
campi del database.
Supponiamo che abbiate interesse solo per i campi selezionati nella Query qui sotto:
SELECT Code, Name, Continent, Population, SurfaceArea FROM Country ORDER BY Name;
e supponiamo che abbiate necessità di calcolare la densità della popolazione del paese,
possiamo scrivere:
Tenete presente che ho diviso la query su più righe per migliorarne la leggibilità, quindi
dovete considerarla come se fosse scritta in modo lineare senza rimandi a capo.
Create come risultato un campo che ha il nome Density. Questo campo non esiste nel da-
tabase ma si genera al volo quando lo interrogate attraverso la query.
La tecnica di creare campi ‘temporanei’ è fondamentale quando più in là affronteremo la
parte dedicata alla programmazione in Visual Basic e soprattutto quando affronteremo l’ar-
gomento SubQuery.
Ovviamente questi sono esempi che abbiamo ricavato sfruttando il database integrato di
esempio che si trova su MySQL, quindi tenete presente che i nomi dei campi sono a vostra
discrezione quando create la struttura del database.
Operazioni matematiche
Se volessi a questo punto conoscere in quale stato la vita media è più elevata dovrei scri-
vere:
GROUP BY
Se desidero conoscere la somma popolazione e della superfice per continente ho bisogno
di raggruppare e sommare i dati per questo entra in gioco la parola chiave GROUP BY.
Le due tabelle vengono collegate nella clausola WHERE attraverso i campi Capital della
tabella Country e ID della tabella City.
Quando i dati provengono da più tabelle è buona norma specificare da quale tabella pro-
vengono i campi corrispondenti specificando prima il nome della tabella e poi separando
con un punto il nome del campo.
Nella clausola FROM si trovano entrambe i nomi delle tabelle coinvolte nell’operazione sem-
pre separati da una virgola.
La stessa query è possibile scriverla anche così, anzi è probabile che la troviate scritta in
questa forma quando ad esempio utilizzate uno strumento visuale per creare automatica-
mente le query come ad esempio con Microsoft Access.
In questo caso la relazione fra le tabelle viene creata nella clausola FROM invece che in
nella clausola WHERE.
Anche se affrontiamo l’argomento nel modo più ampio possibile è molto probabile che vi
farete aiutare da uno strumento visuale per creare Query di una certa complessità, per
risparmiare tempo e fatica. Questo ovviamente non vuol dire che dovete trascurare la parte
teorica di questo argomento che vi permette poi di rintracciare eventuale errori con mag-
giore facilità, però è comprensibile avvalersi di certi strumenti perché, ad esempio, una
query che estrae i dati da tre o quattro tabelle non è proprio la cosa più semplice del mondo
da scrivere. Per maggiori dettagli consultate il capitolo che parla degli strumenti visuali per
creare le Query come ad esempio Microsoft Access.
Linguaggio SQL
349
Creare un Database
Dopo aver visto come è possibile recuperare i dati da un database attraverso il linguaggio
SQL vediamo come è possibile effettuare modifiche al database stesso o alla sua struttura
sempre attraverso questo linguaggio.
Quando si utilizza Visual Basic per operare su un database, in realtà come già detto, si
utilizza il linguaggio SQL e quindi non dovete trascurare le basi teoriche di questo linguag-
gio.
Il comando per la creazione di un database è:
Per quanto riguarda le caratteristiche dei singoli campi fate riferimento al capitolo che tratta
della strutturazione di un database, dove vengono spiegate nel dettaglio le caratteristiche
salienti di un campo e di una tabella.
Attenzione al fatto che i comandi SQL non chiedono mai conferma per quanto viene
ordinato e quindi prestate particolare attenzione ai dettagli…
Inoltre, questi sono dei semplici esempi che non possono coprire tutte le situazioni
possibili e immaginabili che si possono verificare durante il vostro lavoro.
VisualBasic.NET 2019 – Partendo da Zero
350
Inserire i dati in una tabella
Utilizzate le parole chiave INSERT INTO per dichiarare in quali campi dovete inserire i dati,
e VALUES per i dati che desiderate memorizzare nei vari campi.
Attenzione al fatto che le stringhe vanno inserite fra apici mentre i numeri senza, le date
vanno inserite con il formato che vedete qui sotto. (col formato aaaa-mm-gg o come è più
probabile che vi capiterà yyyy-mm-dd)
Elencare i record
Nel caso desiderate visualizzare il contento di una tabella:
Modificare un record
Modificare i valori all’interno di un campo capita molto spesso in questo ambito.
Questo è un semplice esempio che mostra come sostituire il valore nel campo citta. Per
identificare univocamente un record lo si fa attraverso il campo IDAUTORE.
Eliminare un record
Come nel caso precedente è necessario identificare univocamente il record da eliminare
attraverso il campo IDAUTORE.
Scegliete la voce Riferimenti dal menu di sinistra e quindi fate click sul pulsante Aggiungi.
Per aggiungere un riferimento che vi consentirà di accedere alla libreria di oggetti necessari
per connettersi e gestire i dati in un Server MySQL, fate click sul menu Assembly in alto a
sinistra e quindi selezionate la voce Estensioni.
Scorrete la lista e cercate l’estensione MySql.Data, come si vede nella figura successiva.
Selezionatela e quindi fate click sul pulsante OK per includere nel vostro progetto questa
estensione. Non aggiungete altre librerie se non vi è la necessità di includerle nel progetto.
VisualBasic.NET 2019 – Partendo da Zero
352
Qualora, non si sa per quale losco motivo, l’estensione non comparisse nella lista allora fate
click sul pulsante Sfoglia e cercatelo nella cartella:
Una volta aggiunto il riferimento chiudete la scheda delle Proprietà del progetto con l’appo-
sito comando come mostra la figura sottostante.
Ed a questo punto possiamo cominciare con la nostra avventura. Tenete presente che la
versione di Connector.NET può variare a seconda della versione di Visual Studio che state
utilizzando. Per maggiori informazioni consultate il sito internet di MySQL.
VisualBasic.NET 2019 – Partendo da Zero
354
Accedere ai dati con Visual Basic.
Prima di effettuare il collegamento ad un Server di MySQL è necessario conoscere su quale
computer (in realtà si dice: su quale macchina) si trova il nostro Server. Dato che siamo
programmatori in linea di massima il server è localizzato sullo stesso computer dove state
sviluppando. Se così non fosse, ed il Server di MySQL si trovasse da qualche parte sulla
vostra rete locale, è sufficiente conoscere l’indirizzo IP della macchina che lo ospita.
L’indirizzo IP della vostra macchina è genericamente identificato con 127.0.0.1 (solitamente
è quello che viene utilizzato nel nostro caso) oppure può essere scoperto digitando il co-
mando ipconfig sul prompt dei comandi di Windows che si trova sul Menu di Avvio alla voce
Sistema Windows, o in alternativa facendo click con il tasto DX del mouse sul Menu di Avvio
e scegliendo la voce Windows PowerShell.
Questo numero poi sarà utile per effettuare il collegamento al Server.
Quando il Server si trova nella stessa macchina di sviluppo di solito si utilizza come indirizzo
IP 127.0.0.1
Come seconda operazione è necessario permettere all’utente amministratore di accedere al
Server MySQL non solo dall’utilità WorkBench ma anche da altre posizioni, come ad esempio
una altra macchina in rete o un altro programma. Come mostra la figura sottostante dalla
schermata principale fate click sulla scheda Administration, e quindi selezionate Users and
Privileges. Dalla lista degli utenti scegliete la voce root, che equivale all’amministratore,
quindi inserite il simbolo di percentuale (%) nel campo che limita l’accesso da altre posi-
zioni. Quindi fate click sul pulsante Apply in basso a destra nella finestra.
Se non viene fatta questa impostazione è probabile che il Server, tutte le volte che provate
ad accedere ai dati attraverso Visual Basic, generi un errore.
Non cambiate arbitrariamente altre impostazioni che vedete nella figura, ammesso che non
siate degli esperti, altrimenti è possibile che si verifichino comportamenti non graditi da
parte del Server.
Utilizzare Visual Basic con MySQL
355
Accedere ai dati.
Collegarsi ai dati di un database con Visual Basic è un argomento piuttosto vasto perché
ogni tipo di database ha un modo tutto suo di operare e quindi, le istruzioni possono variare
caso per caso. Esistono però degli elementi comuni che andremo ad analizzare.
Intanto nello spazio dei nomi dovete richiamare la libreria necessaria ad operare:
Imports MySql.Data.MySqlClient
Data source indica il computer dove si trova il Server (nel nostro caso è locale), altrimenti
va specificato l’indirizzo IP della macchina sulla quale è installato, ad esempio 192.168.1.8.
Se il server di MySQL è installato sulla stessa macchina che utilizzate per programmare con
Visual Basic il parametro è 127.0.0.1
Database indica a quale database volete accedere.
User ID è il nome dell’utente nel nostro caso l’amministratore (root).
Password quella che avete utilizzato per l’utente in questione.
Passando subito alla pratica ed evitare sterili considerazioni squisitamente tecniche per col-
legarmi dichiaro cinque stringhe dove dentro ci inserisco i singoli parametri che utilizzerò
nella stringa di connessione
Assegno i valori alla stringa di connessione. Per migliorarne la leggibilità preferisco disporre
i vari parametri su righe diverse invece di scrivere tutto su una riga.
Oppure:
Queste due dichiarazioni si equivalgono. Utilizzatene solo una delle due altrimenti Visual
Basic restituirà un errore.
VisualBasic.NET 2019 – Partendo da Zero
356
Apro la connessione attraverso l’oggetto connessione.
OggettoConnessione.Open()
Try
OggettoConnessione.Open()
Catch Eccezione As System.Exception
MsgBox(Eccezione.Message)
Exit Sub
End Try
Adesso inserite nel form un controllo tipo DataGridView per visualizzare sullo schermo il
contenuto, ad esempio, della tabella City del database World.
Questo database è inserito come esempio nel pacchetto di installazione di MySQL. Se avete
dei dubbi consultate il capitolo di installazione del database MySQL sul vostro computer.
Dalla Casella degli strumenti individuate e posizionate sul vostro Form un controllo tipo
DataGridView come mostra la figura successiva.
Utilizzare Visual Basic con MySQL
357
Per visualizzare i dati nella DataGridView utilizzate il codice qui di seguito al posto di quello
precedente.
Option Explicit On
Imports MySql.Data.MySqlClient
Me.Show()
Try
OggettoConnessione.Open()
Catch Eccezione As System.Exception
MsgBox(Eccezione.Message)
Exit Sub
End Try
'Creo la Stringa
Dim stringaSQL As String = "SELECT * FROM City ORDER BY Name "
Try
Adattatore.SelectCommand = New MySqlCommand(stringaSQL, OggettoConnessione)
Adattatore.Fill(SetDati, "City")
DataGridView1.DataSource = SetDati.Tables("City")
OggettoConnessione.Close()
End Sub
End Class
Dopo che abbiamo descritto l’oggetto connessione è necessario introdurre altri due oggetti
che permettono l’accesso ai dati, il DataAdapter e il DataSet.
Il primo serve per adattare i dati mentre il secondo serve per creare dei set di dati vero e
proprio attraverso un’istruzione SQL.
Creo adattatore dei dati.
Adattatore.Fill(SetDati, "City")
DataGridView1.DataSource = SetDati.Tables("City")
Chiudo la connessione.
OggettoConnessione.Close()
Try
End Sub
Creo una stringa SQL per che crea la lista dei paesi ordinati per nome.
VisualBasic.NET 2019 – Partendo da Zero
360
Dim stringaSQL As String = "SELECT Code, Name FROM Country ORDER BY Name"
OggettoAdattatore.Fill(OggettoDataset, "Country")
Associo la sorgente dei dati del ComboBox con il DataSet creato in precedenza.
ComboBox1.DataSource = OggettoDataset.Tables("Country")
Associo il campo Codice alla proprietà ValueMembrer che verrà utilizzata per associare il
codice al nome del paese.
ComboBox1.ValueMember = "Code"
La proprietà DisplayMember, ovvero ciò che deve essere visualizzato sulla lista viene asso-
ciato al campo Name. In pratica quando l’utente effettua una scelta seleziona il nome di un
paese ma in realtà e come se avesse scelto il suo codice.
ComboBox1.DisplayMember = "Name"
Il codice che segue invece serve per inserire una nuova città nella tabella City del database
e si trova nel Form CittaNuova.vb che serve per salvare una nuova città dentro al database.
OggettoConnessione.Close()
'Recupera il valore della Nazione nel combo box e inseriscilo nella variabile Country1
Dim Country1 As String = ComboBox1.SelectedValue
Utilizzare Visual Basic con MySQL
361
Righe = Tabella.Rows
NuovaRiga = Tabella.NewRow
NuovaRiga("Name") = t_Citta.Text
NuovaRiga("CountryCode") = Country1
NuovaRiga("District") = t_Distretto.Text
NuovaRiga("Population") = t_Popolazione.Text
Righe.Add(NuovaRiga)
Try
OggettoConnessione.Open()
Catch Eccezione As System.Exception
MsgBox(Eccezione.Message)
End Try
Try
Adattatore1.Update(DataSet1, "City")
DataSet1.AcceptChanges()
End Sub
OggettoConnessione.Open()
Associo L’adattatore dei dati alla Stringa SQL e alla connessione al database.
OggettoConnessione.Close()
Creo un oggetto che rappresenta la collezione delle righe (record) di una tabella.
Recupera il valore della Nazione nel ComboBox e inseriscilo nella variabile Country1.
Righe = Tabella.Rows
NuovaRiga = Tabella.NewRow
Inserisco i valori presenti nelle caselle di testo del Form ai campi del nuovo record.
NuovaRiga("Name") = t_Citta.Text
NuovaRiga("CountryCode") = Country1
NuovaRiga("District") = t_Distretto.Text
NuovaRiga("Population") = t_Popolazione.Text
Aggiungo il nuovo record all’oggetto che rappresenta la collezione dei record di una tabella.
Righe.Add(NuovaRiga)
Riapro la connessione:
OggettoConnessione.Open()
Aggiorno il dataset:
Adattatore1.Update(DataSet1, "City")
DataSet1.AcceptChanges()
OggettoConnessione.Close()
Modificare un record
La modifica di un record prevede che siano visibili sullo schermo i dati che andranno modi-
ficati, quindi è necessario prima recuperarli dal database e sottoporli all’attenzione dell’ope-
ratore che provvederà eventualmente ad effettuare delle modifiche. Questo codice si trova
nel Form CittaModifica.Vb
Dim StringaSQL1 As String = "SELECT * FROM City where ID = " & Str(MiaCitta) & " "
t_Citta.Text = OggettoTabella.Rows(0).Item("Name")
t_Distretto.Text = OggettoTabella.Rows(0).Item("District")
t_Popolazione.Text = OggettoTabella.Rows(0).Item("Population")
ComboBox1.SelectedValue = OggettoTabella.Rows(0).Item("CountryCode")
OggettoConnessione.Close()
End Sub
Try
End Sub
Analizzeremo solo la prima parte in quanto la seconda l’abbiamo già incontrata nel caso
precedente dell’aggiunta di un nuovo record.
Crea una stringa SQL che seleziona esclusivamente il solo record da modificare:
Dim StringaSQL1 As String = "SELECT * FROM City where ID = " & Str(MiaCitta) & " "
Dim StringaSQL1 As String = "SELECT * FROM City where ID = " & Str(MiaCitta)
Creo un nuovo oggetto MySqlDataAdapter e lo associo alla stringa SQL e all’oggetto con-
nessione.
OggettoAdattatore.Fill(OggettoDataset, "City")
Leggo i campi dell’oggetto tabella e li inserisco nei ComboBox che si trovano nel Form.
t_Citta.Text = OggettoTabella.Rows(0).Item("Name")
t_Distretto.Text = OggettoTabella.Rows(0).Item("District")
t_Popolazione.Text = OggettoTabella.Rows(0).Item("Population")
ComboBox1.SelectedValue = OggettoTabella.Rows(0).Item("CountryCode")
OggettoConnessione.Close()
Adesso i dati sono visibili sullo schermo. Il codice che segue serve per modificarli.
'*************************
' Salva Città Modificata
'*************************
Cursor = Cursors.WaitCursor
'*********************
'Salvataggio Modifiche
'*********************
OggettoConnessione.Open()
Riga.BeginEdit()
Riga("Name") = t_Citta.Text
Riga("CountryCode") = ComboBox1.SelectedValue
Riga("District") = t_Distretto.Text
Riga("Population") = t_Popolazione.Text
Utilizzare Visual Basic con MySQL
365
Riga.EndEdit()
OggettoAdattatore.Update(OggettoDataset, "City")
CommBuild.GetUpdateCommand()
OggettoConnessione.Close()
StatoConnessione.Close()
Cursor = Cursors.Default
Me.Close()
End Sub
Definisco un nuovo oggetto “tabella” e anche l’oggetto che rappresenta l’unica riga di quella
tabella.
Riga.BeginEdit()
Riga("Name") = t_Citta.Text
Riga("CountryCode") = ComboBox1.SelectedValue
Riga("District") = t_Distretto.Text
Riga("Population") = t_Popolazione.Text
Chiudo le modifiche.
Riga.EndEdit()
OggettoAdattatore.Update(OggettoDataset, "City")
CommBuild.GetUpdateCommand()
Chiudo la connessione.
OggettoConnessione.Close()
VisualBasic.NET 2019 – Partendo da Zero
366
Eliminare un record
Tenete presente che il codice completo dell’esercizio è scaricabile dal sito della casa editrice
e qui ne riportiamo solo le parti salienti. Questa parte di codice si trova nel Form chiamato
Citta.
Try
IDCittà = DataGridView1.Item(0, DataGridView1.CurrentCell.RowIndex).Value
Catch Eccezione As System.Exception
Exit Sub
End Try
End If
OggettoConnessione.Open()
Try
Comando.ExecuteNonQuery()
Catch ex As MySqlException
OggettoConnessione.Close()
MsgBox(ex.Message)
Exit Sub
End Try
OggettoConnessione.Close()
End Sub
Per eliminare un record intanto recupero dall’elemento selezionato nella griglia l’identifica-
tivo univoco.
Poi chiedo, non si sa mai, all’utente se è proprio sicuro di eliminare la città selezionata nella
griglia.
Creo un comando SQL, qui si ritorna all’importanza di conoscere almeno in linea di massima
le istruzioni del linguaggio SQL.
Dim ComandoCancellazione As String = "DELETE FROM City WHERE ID = " & Str(IDCittà)
Apro la connessione:
OggettoConnessione.Open()
Eseguo il comando:
Comando.ExecuteNonQuery()
Chiudo la connessione:
OggettoConnessione.Close()
Ricercare un dato
La DataGridView in genere visualizza sullo schermo dell’operatore una lista di dati. Quando
questi dati diventano troppi, non sono pratici da consultare perciò è necessario in alcuni
casi limitare il numero dei records presenti nella DataGridView.
Ad esempio se l’utente volesse visualizzare solo le città che iniziano con la lettera A, e non
tutte le altre, è necessario creare una Query che contempli questa possibilità. Questo tipo
di ricerca può estendersi a qualunque campo del database a seconda delle necessità
dell’utente attraverso apposite Query di selezione.
Nell’evento click del pulsante “Cerca” è stato inserito del codice che permette di fare un’in-
terrogazione come quella proposta prima ovvero ricercare le città in base al nome. Questa
parte di codice si trova nel Form Citta.vb.
StringaSQL = "SELECT * FROM City WHERE Name LIKE '" & Sigla & "' ORDER BY Name "
Cerca_Citta(StringaSQL)
End Sub
Creo una stringa dove inserirò il contenuto del TextBox “Citta” seguito dal simbolo di per-
centuale:
VisualBasic.NET 2019 – Partendo da Zero
368
Nel linguaggio SQL questo permette di fare ricerche sulla parte iniziale di un nome ad esem-
pio se cerco tutte le città che iniziano con la lettera A devo scrivere A%.
Questo carattere Jolly mi permette di non specificare altro oltre a quanto fatto, ovvero basta
la lettera A.
Posso anche cercare le città che iniziano per AL e in questo caso scriverei AL% o anche
quelle che iniziano con ALE che diverrà ALE% e così via. E’ quindi possibile scrivere non
solo la prima lettera, ma anche parte della stringa di ricerca, ed in questo modo posso
restringere il campo delle ricerche.
Quindi memorizzo il comando nella stringa che utilizzerò per fare l’interrogazione.
StringaSQL = "SELECT * FROM City WHERE Name LIKE '" & Sigla & "' ORDER BY Name "
Attenzione perché a seconda della tipologia di dati che ricercate il comando può cambiare
non poco, ad esempio una stringa in un campo di testo del database oppure un campo
numerico o addirittura un campo che contiene una data.
Nel caso di una ricerca in un campo numerico il comando diventa:
La differenza sta nel fatto che un valore numerico lo devo passare come una stringa utiliz-
zando gli apici in maniera diversa altrimenti il comando non funzionerà mai.
Per quanto riguarda le date il formato è come nell’esempio qui sotto.
Per semplicità e per evitare di sbagliare prendo i valori delle date da due controlli DateTi-
mePicker e le inserisco in queste due stringhe. Per maggiori informazioni consultate il ca-
pitolo che tratta del controllo DateTimePicker.
Da notare che la data va passata nel formato contrario a quella che siamo abituati solita-
mente. Quindi tenete presenti queste informazioni dato che sicuramente vi imbatterete in
un problema del genere.
Il codice sottostante serve per visualizzare sullo schermo il risultato di una ricerca da parte
dell’utente. Il codice completo si trova nel materiale allegato al libro.
Cursor = Cursors.WaitCursor
Try
OggettoConnessione.Open()
Catch Eccezione As System.Exception
MsgBox(Eccezione.Message)
Utilizzare Visual Basic con MySQL
369
Exit Sub
End Try
Try
OggettoConnessione.Close()
StatoConnessione.Close()
Griglia1()
Cursor = Cursors.Default
End Sub
Cursor = Cursors.WaitCursor
Creo e faccio comparire sullo schermo la finestra che riguarda lo stato della connessione al
database:
Apro la connessione e metto una trappola per errori casomai si verificasse qualche pro-
blema. Consultate anche l’omonimo capitolo per maggiori informazioni:
Try
OggettoConnessione.Open()
Catch Eccezione As System.Exception
MsgBox(Eccezione.Message)
Exit Sub
End Try
Try
VisualBasic.NET 2019 – Partendo da Zero
370
Creo un nuovo set di dati.
Associo la stringa SQL e la connessione all’adattatore dei dati che provvederà a passarla al
database.
Adattatore.Fill(SetDati, "Citta")
OggettoConnessione.Close()
DataGridView1.DataSource = SetDati
DataGridView1.DataMember = "Citta"
Chiudo la connessione:
OggettoConnessione.Close()
StatoConnessione.Close()
Vado alla routine che si chiama Griglia1() che serve a sistemare quello che verrà visualiz-
zato sul DataGridView
Griglia1()
Modifico il puntatore sullo schermo e lo rimetto come è di solito ovvero una freccetta.
Cursor = Cursors.Default
Utilizzare Visual Basic con MySQL
371
Controllare l’immissione dei dati da parte dell’utente
Si tratta di un argomento particolarmente importante, in quanto molti dei problemi e degli
errori di Runtime dipendono in larga parte dal fatto che l’utente inserisce nei campi a sua
disposizione valori non ammessi attraverso la tastiera.
Ad esempio se da un TextBox inserisco dei caratteri invece che valori numerici come richie-
sto, è altamente probabile che si generi un errore, dovuto al fatto che quei caratteri non
sono riconosciuti come valori numerici dal programma in fase di elaborazione o di memo-
rizzazione nel database.
La prima cosa da fare è attraverso la proprietà MaxLength di un TextBox è limitare il numero
di caratteri che il campo può accettare in modo, specialmente nei campi di testo, da evitare
che il numero di caratteri superi la lunghezza del campo nel database, ad esempio:
t_Titolo.MaxLength = 255
il titolo del libro non può superare i 255 caratteri anche perché il TextBox ne impedirebbe
l’immissione. Un'altra limitazione può essere quella di permettere all’utente di digitare solo
in maiuscolo:
t_Titolo.CharacterCasing = CharacterCasing.Upper
o in minuscolo:
t_Titolo.CharacterCasing = CharacterCasing.Lower
queste istruzioni possono essere inserite ad esempio nell’evento Load del Form in modo da
applicare le limitazioni subito all’inizio come mostra la figura sottostante.
Inoltre supponiamo che sia necessario impedire a un utente di inserire in un campo valori
non numerici, ad esempio devo digitare il prezzo di un libro o cose di questo genere qui. In
questo caso è necessario avvalersi dell’evento KeyPress di un TextBox ed inserire il se-
guente codice.
If Keyascii <> 13 And Keyascii <> 8 And (Keyascii < Asc("0") Or Keyascii > Asc("9"))
And Keyascii <> Asc(".") Then
e.Handled = True
Exit Sub
End If
Crea una variabile di tipo Integer che contiene il valore Ascii del tasto premuto.
ASCII è l’acronimo di American Standard Code for Information Interchange, ovvero un co-
dice standard adottato nel 1968, che assegna un valore numerico ad ogni simbolo che
compare sulla tastiera (anche quelli che non compaiono). Non ho riportato la tabella nel
libro anche perché è facilmente rintracciabile su Internet.
In pratica quando premo un tasto viene convertito in un valore numerico.
La variabile (e) rappresenta, come si vede nella dichiarazione dell’evento, l’argomento della
pressione del tasto dal quale si può ricavare di quale tasto si tratta e convertirlo in valore
Ascii con la funzione Asc.
Il valore 8 del codice Ascii rappresenta il tasto Backspace sulla tastiera, quello sopra il tasto
Invio che serve per cancellare un carattere verso sinistra.
If Keyascii <> 13 And Keyascii <> 8 And (Keyascii < Asc("0") Or Keyascii > Asc("9")) And
Keyascii <> Asc(".") Then
Mentre il valore 13 rappresenta il tasto Invio qualora dovesse iniziare qualche ricerca in
quel campo attraverso tale tasto. Se non avete necessita di utilizzare il tasto Invio per
qualcosa di particolare il codice diventa:
If Keyascii <> 8 And (Keyascii < Asc("0") Or Keyascii > Asc("9")) And Keyascii <> Asc(".")
Then
Utilizzare Visual Basic con MySQL
373
Questa parte dell’istruzione esclude qualsiasi tasto diverso da uno numerico infatti consi-
dera solamente i tasti da 0 a 9.
ed infine:
e.Handled = True
annulla la pressione del tasto come se non fosse mai stato premuto se non ricade nelle
condizioni che abbiamo visto prima. Per ulteriori approfondimenti consultate il capito che
tratta del controllo MaskedTextBox.
IsNumeric
Questa funzione serve per controllare se un valore può essere valutato come un valore
numerico oppure no. Ad esempio una variabile tipo Stringa contiene qualcosa che può sem-
brare un numero. Per associarla ad una variabile di tipologia più appropriata, prima di ese-
guire l’assegnazione, è meglio verificare che effettivamente il computer la possa interpre-
tare come numero onde evitare un errore che blocchi l’esecuzione del programma.
Il codice sottostante è un esempio.
Option Explicit On
End Sub
End If
' verifica che sia presente "@" e un punto "." in un indirizzo email, nell'ordine
corretto.
If IndirizzoEmail.IndexOf("@") > -1 Then
If (IndirizzoEmail.IndexOf(".",IndirizzoEmail.IndexOf("@")) >
IndirizzoEmail.IndexOf("@")) Then
MessaggioErrore = ""
Return True
End If
End If
End Function
End Sub
End Class
Quando si modifica lo stato attivo di un controllo TextBox usando la tastiera, gli eventi di
attivazione si verificano nell'ordine seguente: Enter, GotFocus, Leave, Validating, Validated,
LostFocus mentre quando lo si modifica attraverso il mouse o chiamando il metodo Focus
dal codice, gli eventi si verificano nell'ordine seguente: Enter, GotFocus, LostFocus, Leave,
Validating, Validated
Utilizzare Visual Basic con MySQL
375
Se la proprietà CausesValidation è impostata su False, gli eventi Validating e Validated
vengono eliminati dalla lista e non vengono eseguiti. Nell’evento Validating, che si verifica
durante la convalida del controllo, troviamo il codice del box sottostante.
End If
' verifica che sia presente "@" e un punto "." in un indirizzo email, nell'ordine
corretto.
If IndirizzoEmail.IndexOf("@") > -1 Then
If (IndirizzoEmail.IndexOf(".",IndirizzoEmail.IndexOf("@")) >
IndirizzoEmail.IndexOf("@")) Then
MessaggioErrore = ""
Return True
End If
End If
End Function
Al termine della convalida viene eseguita il codice che si trova nell’evento Validated del
TextBox.
VisualBasic.NET 2019 – Partendo da Zero
376
Private Sub textBox1_Validated(ByVal sender As Object, ByVal e As System.EventArgs)
Handles TextBox1.Validated
' Se va tutto ok cancella il testo del ErrorProvider.
ErrorProvider1.SetError(TextBox1, "")
End Sub
DBNULL
Quando leggete dei dati da una tabella di un database può accadere una cosa piuttosto
strana, ovvero che venga generato un errore mentre cercate di inserire il valore di un
campo, ad esempio in un TextBox, per visualizzarlo successivamente sullo schermo.
Per fare un esempio calzante prendiamo la routine che legge i dati dei libri nel progetto
Access1 che trovate nel codice d’esempio allegato al libro scaricabile dal sito della casa
editrice. Per la cronaca la routine è la seguente:
Dim StringaSQL1 As String = "SELECT * FROM Libri where ID = " & Str(MioLibro)
t_ISBN.Text = Tabella.Rows(0).Item("ISBN")
t_Titolo.Text = Tabella.Rows(0).Item("Titolo")
t_Prezzo.Text = Tabella.Rows(0).Item("Prezzo_Listino")
t_Pagine.Text = Tabella.Rows(0).Item("Pagine")
t_AnnoEdizione.Text = Tabella.Rows(0).Item("Anno_Edizione")
C_Autori.SelectedValue = Tabella.Rows(0).Item("IDAUTORE")
C_CaseEditrici.SelectedValue = Tabella.Rows(0).Item("IDCASAEDITRICE")
Connessione.Close()
End Sub
Questa singola istruzione ad esempio legge il codice ISBN dalla tabella del database e lo
inserisce nel TextBox corrispondente.
T_ISBN.Text = Tabella.Rows(0).Item("ISBN")
Può accadere però che si verifichi un errore abbastanza inspiegabile dovuto all’esistenza di
una condizione chiamata NULL.
Quando si crea un nuovo record in un database, e non tutti i campi vengono riempiti con
dei valori, può accadere che qualcuno di essi resti nella condizione NULL che non corri-
sponde ad un campo vuoto, ma a un campo dove non c’è mai stato nulla dentro. Per esem-
pio se in un campo viene cancellato il contenuto questo non corrisponde a NULL ma sem-
plicemente non contiene informazioni.
Questa condizione può generare degli errori non gestiti. Per questo è necessario sostituire
la singola riga di istruzione vista prima con il codice seguente.
If IsDBNull(Tabella.Rows(0).Item("ISBN")) Then
t_ISBN.Text = ""
Else
Utilizzare Visual Basic con MySQL
377
t_ISBN.Text = Tabella.Rows(0).Item("ISBN")
End If
Moduli di codice
Questo componente non presenta nessun controllo, né Form o pulsanti dove fare click ma
semplicemente solo codice. Viene utilizzato soprattutto per inizializzare un programma o
applicazione, chiamatela come volete, definendo alcune procedure che sarebbe inutile in-
serire in un form perché non richiamano nessun controllo come TextBox o cose di questo
genere. Ad esempio posso dichiarare alcune variabili o costanti che poi saranno disponibili
in tutto il progetto oppure posso creare delle routine accessibili da qualunque punto del
codice nei Form, oppure creare del codice per scrivere un file di accessi al programma da
parte degli utenti.
Dichiarando le variabili Public queste restano disponibili in tutto il progetto quindi state
attenti a non utilizzare localmente nomi che contrastano con quelli utilizzati nel modulo.
Nello stesso modo se dichiaro la Routine Sub Main() pubblica questa sarà accessibile da
qualsiasi punto del progetto. Di solito si fa iniziare l’esecuzione di un programma da questa
routine, anche se le nuove versioni di Visual Basic, se non esplicitamente dichiarato, fanno
iniziare l’elaborazione da uno del Form inclusi nel progetto.
Si tratta di una procedura assolutamente opzionale alla quale siamo abituati noi “vecchi”
programmatori in quanto i progetti di anni e anni or sono, avevano questa caratteristica,
ovvero l’avvio dalla routine Sub Main(). Dico opzionale perché non c’è nulla di quello che
vedremo in questo capitolo che non si possa fare in altro modo con strumenti attuali.
Se fate doppio click sulla finestra Esplora Soluzioni in corrispondenza del Modulo1 potete
visionare il codice che contiene.
Per aggiungere un modulo di codice ai vostri progetti, vi ricordo che è possibile aggiungerne
un numero qualsiasi, fate click con il tasto destro del mouse sul nome del progetto nella
finestra Esplora Soluzioni e dalla lista scegliete la voce Aggiungi – Modulo come mostra
VisualBasic.NET 2019 – Partendo da Zero
378
la figura successiva. Io di solito non cambio nome al modulo anche se è possibile farlo in
tutta tranquillità come per i Form.
Option Explicit On
Imports System.IO
Module Modulo1
'**********************************
' definisce le variabili Pubbliche
'**********************************
Public StringaConnessione As String
Public PercorsoProgramma As String
Public Const FORMATO As String = "##,##"
Public MiaCitta As Long
Public MioPaese As String
'*****************************************************
'**** Inserite qui il codice di inizializzazione ****
'*****************************************************
Cursor.Current = Cursors.WaitCursor
PercorsoProgramma =
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location)
Cursor.Current = Cursors.Default
End Sub
End Module
Restituisce il percorso completo della posizione del programma, ovvero in quale cartella si
trova l’eseguibile del programma che state sviluppando. È utile conoscere questa variabile
se durante il corso dello sviluppo, in un’altra parte nel codice, è necessario sapere in quale
cartella del computer si trova il programma che state sviluppando o che avete reso esegui-
bile.
PercorsoProgramma =
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location)
Questo codice serve per creare la stringa di connessione a un Server MySQL. Ho spezzato
le varie componenti per renderle più leggibili.
Per avviare un progetto dalla Sub Main() è necessario fare click sul menu Progetto e quindi
accedere alle proprietà del progetto.
VisualBasic.NET 2019 – Partendo da Zero
380
Togliete il segno di spunta o verificate che non ci sia alla voce Abilita Framework Appli-
cazione, dalla scheda Applicazione in alto a sinistra, e dalla lista Oggetto di Avvio sce-
gliete Sub Main() che non sarebbe visibile con la casella spuntata.
Se infatti l’opzione fosse spuntata sarebbero disponibili come oggetti d’avvio solo i form.
Ricordate al termine della Sub Main() ci vuole il codice che fa avviare il Form principale
altrimenti il programma si concluderà con l’esecuzione del solo codice e sullo schermo non
accadrà nulla.
All’interno del progetto troviamo diversi Form che sono utilizzati per visualizzare i dati in
svariati modi. Nel Form1 troviamo due ComboBox e una DataGridView. Dal primo Com-
boBox si può selezionare la regione, nel secondo verranno visualizzate le province di quella
specifica regione, mentre nella DataGridView verranno visualizzati i vari comuni apparte-
nenti a quella provincia con i relativi dati informativi. Questo tipo di utilizzo è molto ricor-
rente quando si tratta di visualizzare dati provenienti da più tabelle, che appartengono solo
ad una determinata categoria, escludendo gli altri. Inoltre viene calcolato il totale degli
abitanti per la provincia selezionata.
Il codice completo del Form1 si trova nel box successivo.
Option Explicit On
Imports MySql.Data.MySqlClient
Public Class Form1
Cursor = Cursors.WaitCursor
Me.MaximizeBox = False
Me.MinimizeBox = False
DataGridView1.Top = 60
DataGridView1.Left = 5
t_Totale.Enabled = False
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
Connessione.Open()
ComboBox1.DataSource = SetDati.Tables("Regioni")
ComboBox1.ValueMember = "IDREGIONE"
ComboBox1.DisplayMember = "Regione"
End Using
ComboBox1.SelectedIndex = -1
Cursor = Cursors.Default
End Sub
Me.StartPosition = StartPosition.CenterScreen
Me.Width = 560
DataGridView1.Width = Me.Width - 30
DataGridView1.Height = Me.Height - 100
End Sub
Connessione.Open()
ComboBox2.DataSource = SetDati.Tables("Province")
ComboBox2.ValueMember = "IDPROVINCIA"
ComboBox2.DisplayMember = "Provincia"
End Using
ComboBox2.SelectedIndex = -1
End Sub
Cursor = Cursors.WaitCursor
Connessione.Open()
DataGridView1.DataSource = SetDati.Tables("Comuni")
With DataGridView1
.Columns("Istat").Width = 60
.Columns("Comune").Width = 200
VisualBasic.NET 2019 – Partendo da Zero
384
.Columns("Prefisso").Width = 50
.Columns("CAP").Width = 50
.Columns("CAP").DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter
.Columns("CodiceFiscale").Width = 50
.Columns("CodiceFiscale").DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter
End With
With DataGridView1.Columns("Abitanti")
.Width = 80
.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.DefaultCellStyle.Format = "##,##"
End With
End Using
Calcola_Totali()
Cursor = Cursors.Default
End Sub
Connessione.Open()
t_Totale.TextAlign = HorizontalAlignment.Right
t_Totale.Text = Format(SetDati.Tables("Totale").Rows(0).Item(0), "##,##")
End Using
Cursor = Cursors.Default
End Sub
End Class
Ovviamente ometterò la spiegazione del codice già visto in altri progetti. Il codice che ve-
diamo nel box successivo serve per scegliere in che modo il ComboBox deve visualizzare i
dati presenti nella lista. DropDown specifica che l'elenco viene visualizzato facendo click
sulla freccia in giù e che la parte di testo è modificabile. L'utente può pertanto immettere
Utilizzare Visual Basic con MySQL
385
un nuovo valore e non è limitato alla selezione di un valore esistente nell'elenco. Il para-
metro DropDownList invece specifica che l'elenco viene visualizzato facendo click sulla frec-
cia in giù e che la parte di testo non è modificabile. L''utente non può immettere nessun
nuovo valore. Possono essere selezionati solo i valori già presenti nell'elenco. Infine Simple
significa che l'elenco è sempre visibile e che il testo è modificabile. L'utente può pertanto
immettere un nuovo valore e non è limitato alla selezione di un valore esistente nell'elenco.
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
Il codice che vediamo nel box successivo invece serve a popolare il ComboBox con i nomi
delle regioni. Viene effettuata una connessione al database e quindi viene creata una query
che ordina in ordine alfabetico i nomi delle regioni. La parola chiave Using serve per dichia-
rare delle risorse che verranno eliminate liberando la memoria quando il programma incon-
tra l’istruzione End Using.
Connessione.Open()
ComboBox1.DataSource = SetDati.Tables("Regioni")
ComboBox1.ValueMember = "IDREGIONE"
ComboBox1.DisplayMember = "Regione"
End Using
Viene assegnato il set di dati risultanti della query alla proprietà DataSource del ComboBox1
per collegare i dati.
ComboBox1.DataSource = SetDati.Tables("Regioni")
ComboBox1.ValueMember = "IDREGIONE"
ComboBox1.DisplayMember = "Regione"
In questo modo l’utente seleziona il nome della regione dalla lista, ma in realtà il computer
utilizzerà il contenuto del ValueMembrer per fare i suoi conti.
L’ istruzione che vedete nel box successivo fa in modo che inizialmente nel ComboBox non
sia selezionata nessuna voce, quindi non apparirà nulla nella lista fino a quando l’utente
non farà click sulla freccia alla destra del ComboBox.
VisualBasic.NET 2019 – Partendo da Zero
386
ComboBox1.SelectedIndex = -1
Quando viene selezionato dall’utente un elemento della lista, e quindi la lista viene chiusa,
viene generato l’evento DropDownClosed del ComboBox1. In questo momento vengono
prima verificate le seguenti condizioni:
Che sia selezionato un elemento della lista. Il valore -1 di SelectedIndex significa che nes-
suna voce della lista è selezionata.
Che nel ComboBox ci sia effettivamente una lista di valori. Questa istruzione significa di
interrompere l’elaborazione se nella lista non è presente nessun elemento.
Questi controlli servono per impedire che venga generata un’eccezione che interrompa l’ela-
borazione del programma.
Quindi viene creata una variabile che immagazzina il valore della scelta del ComboBox.
Tenete presente che SelectedValue si riferisce alla colonna del ComboBox che memorizza il
campo IDREGIONE
Il nome vero e proprio della regione sarebbe disponibile con la seguente riga di comando.
Che nel nostro caso non serve, ma non si sa mai. A questo punto viene ricreata la connes-
sione e vengono selezionate tramite un comando SQL le province che fanno parte di quella
specifica regione selezionata nel ComboBox1.
Connessione.Open()
ComboBox2.DataSource = SetDati.Tables("Province")
ComboBox2.ValueMember = "IDPROVINCIA"
ComboBox2.DisplayMember = "Provincia"
End Using
Utilizzare Visual Basic con MySQL
387
ComboBox2.SelectedIndex = -1
End Sub
Esattamente per quanto visto per il ComboBox1 si può dire la stessa cosa per il ComboBox2.
Il valore del campo IDPROVINCIA è nascosto all’utente che invece vedrà nella lista i nomi
delle province.
ComboBox2.DataSource = SetDati.Tables("Province")
ComboBox2.ValueMember = "IDPROVINCIA"
ComboBox2.DisplayMember = "Provincia"
Adesso che abbiamo selezionato una regione e quindi il ComboBox2 si è popolato con i nomi
delle province di quella regione, possiamo dalla lista selezionare una provincia, per vedere
la DataGridView popolarsi con i nomi e i dati dei comuni di quella specifica provincia.
Quindi utilizzando l’evento DropDownClosed del ComboBox2 lanceremo la ricerca dei co-
muni collegati a quella provincia.
Cursor = Cursors.WaitCursor
Connessione.Open()
Una volta creata la connessione e la query si associa la proprietà DataSource della Data-
GridView al dataset risultante, quindi seguono una serie di istruzioni che servono per dare
un formato alla DataGridView. L’istruzione With serve per non ripetere DataGridView1 in
ogni riga successiva. La maggior parte di queste istruzioni sono intuitive quindi non le ana-
lizzeremo.
DataGridView1.DataSource = SetDati.Tables("Comuni")
With DataGridView1
.Columns("Istat").Width = 60
.Columns("Comune").Width = 200
.Columns("Prefisso").Width = 50
.Columns("CAP").Width = 50
.Columns("CAP").DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter
.Columns("CodiceFiscale").Width = 50
.Columns("CodiceFiscale").DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter
End With
With DataGridView1.Columns("Abitanti")
.Width = 80
.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.DefaultCellStyle.Format = "##,##"
End With
End Using
Al termine viene richiamata la routine Calcola_Totali che restituisce la somma degli abitanti
della provincia sommando quelli dei singoli comuni.
Calcola_Totali()
Cursor = Cursors.Default
End Sub
Nello specifico, la routine esegue una query che raggruppa tutti i comuni di una provincia
e somma i suoi abitanti. Per la creazione di queste query, e per recuperare il comando SQL
che ne segue, mi faccio aiutare dall’utilità della creazione delle query presente in Microsoft
Access. Per maggiori informazioni consultate il capitolo che tratta dell’argomento nella se-
zione del libro dedicata ad Access.
Connessione.Open()
Quindi recupero il totale degli abitanti e lo metto nel TextBox. In realtà il risultato della
query di raggruppamento è una tabella con un solo record, dove troverete il totale deside-
rato.
t_Totale.TextAlign = HorizontalAlignment.Right
t_Totale.Text = Format(SetDati.Tables("Totale").Rows(0).Item(0), "##,##")
End Using
Cursor = Cursors.Default
End Sub
Infatti questa istruzione recupera il dato proprio dall’unico record della tabella e lo mette
nel TextBox.
Option Explicit On
Utilizzare Visual Basic con MySQL
391
Imports MySql.Data.MySqlClient
Che poi verranno utilizzate per la connessione, il comando da inviare al Server MySQL e le
credenziali dell’utente che normalmente è root.
Nella routine Form1_Load vengono adottate alcune limitazioni all’inserimento da parte
dell’utente e viene creata una gerarchia nel caso l’utente voglia utilizzare il tasto TAB (ta-
bulatore) dalla tastiera per passare da un TextBox ad un altro durante l’immissione dei dati.
Inoltre, vengono inizializzati i valori dei TextBox.
t_MYSQLServer.MaxLength = 30
t_MYSQLname.MaxLength = 20
t_MYSQLPass.MaxLength = 30
t_MYSQLUser.MaxLength = 20
t_MYSQLServer.TabIndex = 0
t_MYSQLname.TabIndex = 1
t_MYSQLPass.TabIndex = 2
t_MYSQLUser.TabIndex = 3
t_MYSQLServer.Text = "127.0.0.1"
t_MYSQLname.Text = "Prova001"
t_MYSQLPass.Text = "VBdazero2017"
t_MYSQLUser.Text = "root"
End Sub
Cursor = Cursors.WaitCursor
NomeDatabase = Trim(t_MYSQLname.Text)
NomeServer = Trim(t_MYSQLServer.Text)
Utente = Trim(t_MYSQLUser.Text)
Password = Trim(t_MYSQLPass.Text)
CreaDb()
Exit Sub
VisualBasic.NET 2019 – Partendo da Zero
392
End If
CreaTabellaAgenti()
CreaTabellaAliquote()
Cursor = Cursors.Default
End Sub
Try
Comando.ExecuteNonQuery()
Catch Eccezione As MySqlException
Connessione.Close()'Chiusura Connessione
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Risultato = False
Return Risultato
Utilizzare Visual Basic con MySQL
393
Exit Function
End Try
Connessione.Close()
Risultato = True
Return Risultato
End Function
NomeDatabase = Trim(t_MYSQLname.Text)
NomeServer = Trim(t_MYSQLServer.Text)
Utente = Trim(t_MYSQLUser.Text)
Password = Trim(t_MYSQLPass.Text)
CreaDb()
Nel caso che la creazione del database si concluda con successo la funzione restituisce un
valore Boolean che può essere Vero o Falso che utilizzeremo appunto per verificare il buon
fine delle operazioni. La funzione verrà analizzata più avanti nella spiegazione.
Quando il programma, dopo avere elaborato la funzione CreaDb() ritorna qui controlla se
tutto è andato a buon fine. Se la funzione restituisce il valore False allora si è verificato un
problema da segnalare all’operatore attraverso un preciso messaggio, e il programma ri-
torna alla schermata iniziale.
Exit Sub
End If
Se invece il valore è True allora prosegue con la creazione della prima tabella. Ogni tabella
viene creata attraverso una funzione come nel caso del database.
CreaTabellaAgenti()
Questo codice va ripetuto per ogni successiva tabella o altri oggetti come le Query che
volete creare nel database in modo che in caso d’errore, il programma non si blocca, e
inoltre risponde con un messaggio che indica dove si è verificato l’errore.
VisualBasic.NET 2019 – Partendo da Zero
394
La singola funzione, che crea il solo database, si presenta come nel riquadro successivo:
Try
Comando.ExecuteNonQuery()
Catch Eccezione As MySqlException
Connessione.Close() 'Chiusura Connessione
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Risultato = False
Return Risultato
Exit Function
End Try
Connessione.Close()
Risultato = True
Return Risultato
End Function
La dichiarazione ci fa capire che la funzione restituisce un valore tipo Boolean. Notate anche
che nessun parametro viene inviato alla funzione ().
Creo una stringa connessione per il Server MySQL senza specificare il nome di nessun da-
tabase.
La funzione restituisce il valore False e quindi esce e torna alla riga successiva da dove è
stata chiamata.
Se la connessione è avvenuta crea un comando da inviare al server MySQL specifico della
creazione di un database.
Provo ad eseguire il comando e in caso di problemi opera come nel caso fosse fallita la
connessione.
Try
Comando.ExecuteNonQuery()
Catch Eccezione As MySqlException
Connessione.Close() 'Chiusura Connessione
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Risultato = False
Return Risultato
Exit Function
End Try
Se invece ancora una volta tutto è filato liscio chiude la connessione e restituisce il valore
True.
Connessione.Close()
Risultato = True
Return Risultato
Per quanto riguarda la creazione delle tabelle il concetto è lo stesso eccetto la stringa di
comando.
Creare una tabella è possibile attraverso l’utilità WorkBench, in modo da poter recuperare
il comando SQL da passare al Server con un bel “copia e incolla”, altrimenti sarebbe impos-
sibile ricordarsi tutta la sintassi senza sbagliare una virgola…
StringaSQL = "CREATE TABLE `" & NomeDatabase & "`.`aliquoteiva` " &
"(`IDALIQUOTA` int(10) NOT NULL, " &
" `Descrizione` varchar(50) CHARACTER SET utf8 DEFAULT NULL, " &
" `valore` double DEFAULT NULL, " &
" `Detraibile` varchar(1) CHARACTER SET utf8 DEFAULT NULL," &
" `Indedicibilita` double DEFAULT NULL, " &
VisualBasic.NET 2019 – Partendo da Zero
396
" `Stampa` varchar(5) CHARACTER SET utf8 DEFAULT NULL, " &
" PRIMARY KEY (`IDALIQUOTA`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 "
StringaSQL = "ALTER TABLE `" & NomeDatabase & "`.`aliquoteiva` ADD INDEX
`IX_valore`(`valore`)"
Try
Comando = New MySqlCommand(StringaSQL, Connessione)
Comando.ExecuteNonQuery()
Risultato = True
Return Risultato
End Function
StringaSQL = "ALTER TABLE `" & NomeDatabase & "`.`aliquoteiva` ADD INDEX
`IX_valore`(`valore`)"
Per creare un indice per il campo Valore. Se avete dubbi fate riferimento al capitolo che
tratta di MySQL.
Utilizzare Visual Basic con MySQL
397
Visualizzare gli oggetti di un database MySQL con Visual Basic.
Questo progetto è utile per connettersi ad un server MySQL situato all’interno di una rete
locale di computer, come ad esempio un ufficio o un’azienda oppure sulla macchina dove
state sviluppando, e analizzare la struttura del Server elencando i database presenti, le
tabelle e i campi.
Il progetto presenta tre controlli ListBox. Nella lista di sinistra, a connessione avvenuta,
vengono elencati i database presenti sul server. In quella centrale, dopo aver selezionato
un qualsiasi database della lista di sinistra, vengono visualizzate le tabelle, e infine nella
lista di destra, i campi presenti nella tabella selezionata. Quando è in azione il progetto ha
questo aspetto.
Si inizia importando queste due librerie che serviranno per accedere agli oggetti della rete
e di MySQL.
Imports System.Net
Imports MySql.Data.MySqlClient
Quindi si dichiara le variabili che devono essere accessibili da ogni procedura presente
nell’oggetto form, identificato dalle dichiarazioni Public Class ed End Class.
Il codice che si trova nell’evento Load del form viene eseguito per primo all’avvio del pro-
gramma. Troviamo subito la chiamata (Rete()) ad una procedura, che si trova in fondo al
codice, che recupera il nome sulla rete e l’indirizzo IP del computer. Quindi il programma
eseguirà questa procedura, poi continuerà l’esecuzione fino all’ultima istruzione che ve-
diamo nel codice sottostante, e attenderà il verificarsi di qualche evento. Assegna inoltre la
password, ovviamente dovete modificarla con quella del vostro server MySQL, e il nome
dell’utente, che di solito e l’amministratore del server (root), e li fa apparire nei due rispet-
tivi TextBox. Per connettersi al server fate click sul pulsante Connetti presente nel form.
t_NomeRete.Enabled = False
Rete()
USERID = "root"
Password = "VBdazero2019"
t_Utente.Text = USERID
t_Password.Text = Password
End Sub
Nell’evento Click del pulsante si trova il codice che vedete nel box successivo.
ListBox1.Items.Clear()
ListBox2.Items.Clear()
ListBox3.Items.Clear()
USERID = Trim(t_Utente.Text)
Password = Trim(t_Password.Text)
ServerName = Trim(t_IndirizzoIP.Text)
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
ListBox1.Items.Add(Riga("Database_Name"))
Utilizzare Visual Basic con MySQL
399
Next
End Using
Cursor = Cursors.Default
End Sub
Vengono per prima cosa svuotate le ListBox da un eventuale contenuto precedente, dopo
di che viene creata la stringa di connessione al server MySQL, e quindi effettuata la con-
nessione. L’istruzione Using in Visual Basic è in realtà un blocco di istruzioni con un com-
portamento del tutto analogo a Try… Catch ed End Try. Si compone in tre fasi: acquisizione,
controllo ed eliminazione di una risorsa. La prima parte acquisisce una variabile che fa
riferimento ad una risorsa di sistema e la inizializza. L’istruzione Using può acquisire una o
più risorse di sistema; tutto ciò che si trova fra Using è End Using rappresenta l’utilizzo e
l’accesso alla risorsa e l’esecuzione delle necessarie azioni, mentre End Using elimina le
risorse sotto il controllo del blocco Using.
Viene quindi utilizzato un blocco Try… Catch ed End Try per gestire un eventuale problema
che si verifichi durante la connessione al database come ad esempio un Time Out, ovvero
un periodo di attesa troppo lungo dovuto al fatto che probabilmente il Server MySQL non
viene trovato. Quindi viene creato un oggetto tabella e viene detto alla connessione di
restituire l’elenco dei database.
ListBox1.Items.Add(Riga("Database_Name"))
Next
Quello che segue è il codice che si trova nell’evento SelectedIndexChanged del ListBox1.
Tutte le volte che viene fatto click su una voce presente in questa lista, viene eseguita una
query che elenca le tabelle del database selezionato, e il risultato viene elencato nel List-
Box2.
ListBox2.Items.Clear()
Try
Connessione.Open()
VisualBasic.NET 2019 – Partendo da Zero
400
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
End Using
Cursor = Cursors.Default
End Sub
Con questa istruzione si acquisisce le tabelle dello specifico database dalla connessione.
ListBox3.Items.Clear()
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
ListBox3.Items.Add(Riga(0))
Next
End Using
End Sub
Per accedere alla lista dei campi di una tabella è necessario creare un comando che esegue
una query che restituisce il contenuto di una tabella. Quindi attraverso un MySqlDataReader
eseguo il comando creato nella riga precedente. A questo punto creo una tabella con i nomi
dei campi.
La routine successiva serve per acquisire il nome del vostro computer sulla rete, e il suo
indirizzo IP, il secondo è necessario per effettuare la connessione al server MySQL. Ovvia-
mente, è possibile collegarsi anche a server locati su altre macchine semplicemente inse-
rendo un indirizzo IP valido nel TextBox presente sul Form.
Try
NomeSullaRete = Dns.GetHostName()
'oppure
'NomeSullaRete = My.Computer.Name
Try
IndirizzoIP = Dns.GetHostByName(NomeSullaRete).AddressList(0).ToString()
t_IndirizzoIP.Text = IndirizzoIP
t_NomeRete.Text = NomeSullaRete
End Sub
ListBox1.Items.Clear()
ListBox2.Items.Clear()
ListBox3.Items.Clear()
t_Password.Text = ""
End Sub
End Class
La parte di codice presente fra i due blocchi Try… End Try serve per intercettare le eccezioni
che si possono verificare quando si lancia un comando che interroga la rete tipo:
IndirizzoIP = Dns.GetHostByName(NomeSullaRete).AddressList(0).ToString()
Utilizzare Visual Basic con MySQL
403
Quindi procediamo alla selezione dei database dei quali vogliamo effettuare il backup dei
dati. Se fate click sul nome del database vedrete nella lista di destra l’elenco delle tabelle e
delle view presenti; nel caso si voglia effettuare dei backup parziali è anche possibile esclu-
derne una o più dall’operazione.
Se non vengono fatte selezioni da parte dell’utente, l’utilità di esportazione dei dati include
automaticamente tutti gli oggetti (Tabelle e View) nel backup, altrimenti è possibile sele-
zionare con gli appositi pulsanti (Select View e Select Tables) solo una delle due tipologie.
Per ritornare alla selezione completa degli oggetti è necessario togliere e poi rimettere il
segno di spunta accanto al rispettivo database nella lista di sinistra.
VisualBasic.NET 2019 – Partendo da Zero
404
A questo punto è possibile scegliere fra due tipologie di backup. La prima, Export to Dump
Project Folder, crea una cartella (solitamente, se non viene specificato diversamente,
dentro la cartella Documenti del vostro computer) dove all’interno troverete tanti file quante
sono le tabelle contenute in ogni database, con i relativi dati e struttura. In realtà sono dei
semplici file di testo leggibili anche con il blocco note di Windows.
La seconda opzione, Export to Self-Contained File, crea un singolo file dove dentro si
trovano tutti i dati di tutti i database. Personalmente utilizzo questa impostazione, però
nessuno vi vieta di adottare la prima opzione.
Volendo è possibile cambiare anche il nome del file di backup. Vi consiglio di lasciare il nome
che viene dato in automatico dal programma in quanto contiene la data del backup che
potrebbe risultare utile quando, ad esempio, vengono fatte spesso operazioni di backup e
volete riconoscere al volo quale file corrisponde ad una data specifica. Spesso non si elimina
immediatamente i file dei backup precedenti, ma vengono conservati anche per alcuni
giorni, a secondo ovviamente del tipo di lavoro svolto. Per uno sviluppatore i database
vengono utilizzati quasi esclusivamente come supporto allo sviluppo e spesso contengono
dati fittizzi, quindi non è strettamente necessario effettuarne una copia tutti i giorni.
Un’ultima opzione e quella che riporta Include Create Schema che serve, in caso di ripristino
dei dati, per ricreare la struttura del database nel caso non fosse assente sul server. (caso
di dati completamente persi) o di installazione ex-novo di un server MySQL. Quindi vi con-
siglio di spuntare questa casella.
Per far partire la procedura fate click sul pulsante Start Export in basso a destra nella
finestra. Nel nostro caso, come utilizzatori di MySQL a livello di sviluppo di programmi, non
è necessario ricorrere spesso al backup del dati. Chi invece lo utilizza in ambito lavorativo,
per motivi di sicurezza, ne fa un utilizzo piuttosto frequente, almeno una volta al giorno.
Restore
Si definisce così l’operazione di ripristino dei dati nella loro posizione a seguito di un pro-
blema. Se a causa di una nuova installazione del server MySQL su una macchina di sviluppo,
Utilizzare Visual Basic con MySQL
405
oppure un ripristino dati a seguito di un eliminazione maldestra, o anche un ripristino com-
pleto a causa della reinstallazione del sistema operativo Windows, dovete riportare i dati
esattamente dov’erano, effettuate questi passaggi.
Fate click sul collegamento Data Import/Restore nella parte sinistra della finestra. Sele-
zionate l’opzione Import from a Self-Contained File (se utilizzate questo tipo di backup)
quindi cercate il file da dove desiderate ripristinare i dati con l’apposita finestra, finché il
suo nome non si vede nel rispettivo riquadro (punto3 della figura successiva). Quindi fate
partire la procedura con il pulsante Start Import in basso a destra nella finestra.
Inserite un nome che possa identificare la connessione, nel mio caso è UFFICIO1, ma potete
effettuare la scelta del nome che ritenete più opportuno, quindi inserite l’indirizzo IP del
macchina dove risiede questo server. Se non siete a conoscenza di questo parametro an-
date sulla macchina che funge da server e digitate sul prompt dei comandi di Windows il
comando ipconfig. Per accedere al prompt andate sul Menu di avvio di Windows e cercate
la voce Sistema Windows. Quindi selezionate Prompt dei comandi.
Utilizzare Visual Basic con MySQL
407
Memorizzate la password di accesso al server, in modo da non doverla digitare ad ogni
nuova connessione, ed effettuate un test della connessione per verificare che tutto funzioni
come si deve prima di fare click sul tasto OK in basso a destra nella finestra.
Una volta creata la nuova connessione fate click sul pulsante che esegue la migrazione dei
dati come mostra la figura successiva.
Il prossimo passaggio è un sommario dei passaggi che verranno effettuati per portare a
termine la migrazione dei dati. Fa un riepilogo dei prerequisiti necessari per iniziare il tra-
sferimento. Fate click sul pulsante Start Migration in basso nella finestra.
VisualBasic.NET 2019 – Partendo da Zero
408
Questo passaggio serve per determinare quale è il server che rappresenta la sorgente dei
dati, ovvero da dove prendiamo i dati per trasferirli altrove. Dovete selezionare innanzitutto
la tipologia del database di partenza, che nel nostro caso è MySQL. Dalla lista al punto 1 è
possibile scegliere anche altre tipologie di sorgente, come ad esempio un file di Microsoft
Access oppure altri database con connessione ODBC (Open DataBase Connectivity), che
rappresenta un’interfaccia standard per il collegamento a qualsiasi database che supporta
questo tipo di connessione.
Al punto 2 dovere selezionare la connessione per accedere al database sorgente dei dati.
Questa connessione va creata precedentemente, come abbiamo visto all’inizio della proce-
dura, dalla pagina inziale dell’utilità WorkBench e memorizzata nella lista delle connessioni
che appare sempre nella pagina inziale.
Qualora vi dovesse chiedere una password, memorizzatela con pulsante Store in Vault, e
quindi fate una test della connessione col pulsante in basso a sinistra.
Se tutto va bene procediamo facendo click sul pulsante Next in basso a destra.
La figura successiva è esattamente uguale a quella precedente, e dunque è necessaria una
certa attenzione per evitare di confondere la Sorgente (source) dei dati con la Destinazione
(target) perché potrebbe creare non pochi problemi.
Come mostra la figura successiva, dovete scegliere la Destinazione dei dati, nel nostro caso
l’istanza locale del server MySQL ovvero la macchina verso dove state eseguendo la migra-
zione. In pratica i dati verranno acquisiti dal Server etichettato come UFFICIO1 e verranno
trasferiti nella macchina dove state operando il trasferimento. Si può fare anche il contrario
senza nessun problema. Questa utilità è particolarmente versatile.
Anche stavolta eseguite il test della connessione per verificare che tutto sia a posto prima
di andare al passaggio successivo, facendo click sul pulsante NEXT in basso a destra nella
finestra.
Utilizzare Visual Basic con MySQL
409
Il prossimo passaggio, che non riportiamo, verifica le connessioni e recupera la lista dei
database sul server Sorgente, quindi se tutto va come dovrebbe andare fate click sul pul-
sante Next in basso a destra.
Selezionate i database che desiderate migrare. Trasferite solo i database che conoscete
molto bene, ignorando quelli del sistema. Nel nostra esempio sono stati selezionati i data-
base biblioteca e world. Quindi fate click sul pulsante Next in basso nella finestra.
Anche il passaggio successivo e semplicemente informativo e quindi verrà saltato. Fate click
ancora sul pulsante Next.
È possibile eseguire delle migrazioni anche parziali delle tabelle o altri oggetti come le View
presenti nei database selezionati. Se desiderate traferire solo alcune tabelle fate click sul
pulsante Show Selection e selezionate gli oggetti che vi interessano, prima di andare al
passaggio successivo con il solito pulsante Next.
VisualBasic.NET 2019 – Partendo da Zero
410
Anche al prossimo passaggio, se tutto procedere senza intoppi, potete fare click sul pulsante
Next. Procedete ancora fino a quando sullo schermo non compare qualcosa del genere, che
vi rammenta che al momento non ci sono problemi di sorta. Quindi procedete ancora con
Next.
Se il database non è presente sul server di destinazione, lasciate le cose come stanno e
fate click sul pulsante Next.
Utilizzare Visual Basic con MySQL
411
Quindi ancora Next, e a questo punto sono stati generati i comandi che procederanno alla
migrazione dei dati. Fate ancora click sul pulsante Next.
Lasciate queste impostazioni così come le vedete e continuate come al solito con Next.
A questo punto ancora una finestra che non riportiamo mostra il risultato delle operazioni.
Fate click sul pulsante Finish.
Adesso dalla schermata principale di Workbench andate a controllare nella finestra Schemas
se i database sono tutti dove dovrebbero essere.
VisualBasic.NET 2019 – Partendo da Zero
412
Gli errori in Visual Basic
Sostanzialmente gli errori possono essere di tre tipi:
• Errori di Sintassi
• Errori di concetto ovvero il programma a livello di sintassi è perfetto ma non dà il
risultato giusto perché, ad esempio, ho sbagliato ad assegnare due variabili con-
fondendole fra loro
• Errori di Runtime o Eccezioni da gestire
Per quanto riguarda il primo tipo di errori questi vengono prontamente segnalati in fase di
digitazione del codice e quindi non li tratteremo nello specifico. Visual Basic in generale dà
dei suggerimenti che invece di risolvere il problema spesso lo complicano ulteriormente,
soprattutto per il fatto che i messaggi di errore sono incomprensibili all’utente medio. Di-
ciamo che ha un modo tutto suo di esternare quelli che sono gli errori che trova sulla sua
strada.
Alcuni di questi errori derivano anche da librerie non incluse correttamente nel progetto con
il comando Imports e questo è capibile per il fatto che un codice copiato e incollato che in
un altro progetto funzionava benissimo, in un nuovo progetto viene sottolineato in rosso.
Quindi verificate innanzitutto questa possibilità. Ad esempio se non importate le librerie per
accedere ai dati di MySQL il progetto non funzionerà mai.
Noi però ci concentreremo sugli errori che possono comparire in Runtime ovvero in fase di
esecuzione di un programma e su come si gestiscono le eccezioni, anche se già qualcosa
abbiamo visto nel codice d’esempio incluso nel libro.
Come mostra la figura sottostante durante l’esecuzione di un programma può accadere che
si blocchi e mostri un messaggio dal contenuto incomprensibile.
Gli errori in Visual Basic
413
A prima vista è abbastanza improbabile capire cos’è accaduto veramente e dove si trovi
l’errore, anche perché Visual Basic ha il vizio di scrivere messaggi come: “Riferimento a un
oggetto non impostato su un’istanza di oggetto”. Mi capite che è un messaggio perlomeno
strano perché non svela la vera natura dell’errore.
Nel nostro caso per fortuna la soluzione è abbastanza semplice in quanto si vede che il
nome del campo invocato nell’istruzione:
.Columns("IBN").HeaderText = "ISBN"
.Columns("ISBN").HeaderText = "ISBN"
Come si vede è nell’istruzione SQL che è stata chiamata erroneamente la tabella Libi invece
che Libri. Però grazie al fatto che qui qualche suggerimento Visual Basic ce l’ha dato è
possibile risolvere felicemente anche questa incombenza.
In altri casi però, quando si opera sulle variabili, queste possono assumere dei valori non
corretti e quindi generano errori o risultati indesiderati. In questo caso è necessario andare
a caccia dell’errore riga per riga ed analizzare il codice.
Per fare questo può essere utile la finestra di Controllo immediato detta anche Finestra
di comando che appare sullo schermo con la combinazione da tastiera CTRL+ALT+A op-
pure dal menu Visualizza alla voce Altre finestre.
VisualBasic.NET 2019 – Partendo da Zero
414
Supponiamo di avere fra le mani un programma che non ne vuole sapere di dare il risultato
giusto. Entrate nel codice e fate click in corrispondenza della riga dove volete che il pro-
gramma si fermi per visionare che valori assumono le singole variabili.
Verrà piazzato un punto rosso, che si rimuove semplicemente facendo click una seconda
volta nello stesso punto, dove il programma si arresterà momentaneamente per premet-
tervi di eseguire alcune operazioni di controllo.
A questo punto posso visionare il valore delle variabili in gioco i due modi: o porto il pun-
tatore del mouse in prossimità della variabile sulla stessa riga del punto d’interruzione,
oppure digito un punto interrogativo, seguito dal nome della variabile, direttamente nella
finestra di comando premendo il tasto Invio dalla tastiera.
Gli errori in Visual Basic
415
Tenete presente però che la variabile Risultato non è ancora stata calcolata se il punto
d’interruzione è sulla stessa riga.
In questo modo possiamo fare le nostre valutazioni in merito al valore assunto dalle altre
variabili coinvolte nell’operazione. Per andare all’istruzione successiva e continuare con il
flusso del codice premete il tasto F11 dalla tastiera.
Oppure F5 per continuare il programma fino alla fine o al prossimo punto d’interruzione.
VisualBasic.NET 2019 – Partendo da Zero
416
Trappole per errori
Ci sono però degli errori diversi da quelli che abbiamo visto finora e che possono generare
un’eccezione bloccare e quindi terminare il programma durante l’elaborazione. Non credo
che sia bello vedere sullo schermo un messaggio d’errore senza senso per l’utente che sta
lavorando a quel programma.
In questo caso è necessario creare una trappola per errori con la funzione Try, nella zona
dove si suppone che in fase di Runtime si possa generare un errore e quindi terminare in
modo non gradito un programma. È possibile così scegliere se visualizzare un messaggio
d’errore oppure riprendere l’esecuzione del programma da un altro punto.
L’utilizzo classico di questa funzionalità è ad esempio sulla connessione al database, dove
può venire impartito un comando di aggiornamento dei dati o cose di questo genere qui.
Provo a aprire la connessione al database
Try
Connessione.Open()
Se non si verificano errori tutto finisce qui e il programma continua l’esecuzione dall’istru-
zione successiva ad End Try
Altrimenti continua l’esecuzione senza fermarsi dalle istruzioni che trova dopo la parola
chiave Catch fino ad End Try e poi, se non trova un’istruzione adeguata che lo rimanda da
un’altra parte del programma, continua dopo l’istruzione End Try come nel caso precedente.
MsgBox(Eccezione.Message)
End Try
Nelle istruzioni di esempio viene creata una variabile Eccezione che conterrà l’errore che
viene generato dal sistema recuperato dalla libreria System.Exception.
L’istruzione che segue serve per visualizzare un messaggio sullo schermo che riporta il tipo
d’errore.
MsgBox(Eccezione.Message)
Exit Sub serve per uscire dalla ruotine se dopo End Try si trovano delle istruzioni che in
caso d’errore non devono essere eseguite. In questo specifico caso se la connessione fallisce
il programma non deve eseguire ulteriori istruzioni ma deve semplicemente uscire dalla
routine.
Nella circostanza seguente invece viene eseguito un comando su un database MySQL e in
questo caso l’eccezione non deriva da System.Exception a ma da MySqlException ovvero dalla
connessione MySQL.
Try
ObjAdp1.Update(ObjDataSet1, "DocumentiTestata")
ObjDataSet1.AcceptChanges()
End Try
Gli errori in Visual Basic
417
Informazioni sul sistema
Può essere utile, a volte, avere informazioni a proposito di alcune caratteristiche del com-
puter e, anche se Visual Basic dispone di strumenti molto più potenti di quelli che vediamo
in questo esempio, questo progetto può essere un buon punto di partenza per le informa-
zioni di base. Di solito i programmatori inseriscono queste istruzioni nel menu (?) che ab-
biamo visto nella parte del libro che tratta dei FormMDI e dei progetti con più finestre.
Il progetto presenta solo un ListBox come controllo dove verranno visualizzate le informa-
zioni, ma era possibile utilizzare anche altri controlli per visualizzare le informazioni sullo
schermo.
Option Explicit On
Imports System.IO
Imports System.Net
Try
NomeSullaRete = Net.Dns.GetHostName()
Try
IndirizzoIP = Net.Dns.GetHostByName(NomeSullaRete).AddressList(0).ToString()
End Sub
End Class
Disegnare con Visual Basic.
419
Disegnare con Visual Basic.
Se disegnare è stato il vostro sogno fin da bambini, con Visual Basic vi potete sbizzarrire.
In questo capitolo vedremo insieme le fondamenta del disegno e, dato che si tratta di un
argomento particolarmente vasto, non è possibile esporre tutte le sfumature di questa ca-
ratteristica in poche pagine. Possiamo invece partire da un insieme di caratteristiche da
offrire come materiale di spunto per affrontare poi eventuali approfondimenti, nel caso che
abbiate necessità di sviluppare uno specifico programma o app che riguardi quest’argo-
mento.
Innanzitutto chi dispone di una versione precedente alla 2017 di Visual Basic.NET deve
importare nello spazio dei nomi questa libreria altrimenti il codice non funzionerà.
Imports System.Drawing
Con le versioni 2017 e 2019 non è necessario in quanto è già inclusa nei riferimenti.
Adesso vediamo quali sono gli strumenti che Visual Basic ci mette a disposizione.
In teoria la preparazione è terminata qui inserendo questa linea di codice (si tratta di un
esempio).
in pratica il computer vuole conoscere le coordinate del punto di partenza e del punto di
arrivo della linea che deve disegnare. In questo caso le coordinate sono statiche mentre,
se voglio variare durante l’esecuzione del programma i valori di inizio e fine, basta dichia-
rare quattro variabili integer e passarle come parametri alla funzione DrawLine.
Dim X1 As Integer = 10
Dim X2 As Integer = 800
Dim Y1 As Integer = 400
Dim Y2 As Integer = 400
Nel codice allegato al libro troverete questo ed altri esempi. Quello che segue è un pro-
gramma che disegna una griglia di linee e gli assi cartesiani.
VisualBasic.NET 2019 – Partendo da Zero
420
Me.StartPosition = FormStartPosition.CenterScreen
End Sub
Next x
Next y
'Asse delle X
Disegno.DrawLine(Penna, 10, 410, 810, 410)
'asse delle y
Disegno.DrawLine(Penna, 410, 10, 410, 810)
End Sub
End Class
Questa parte di codice disegna delle linee parallele distanziate di 5 twip parallele all’asse
delle ordinate (Y)
Next x
Questa parte invece disegna delle linee parallele all’asse delle ascisse(X)
Next y
Disegnare con Visual Basic.
421
Disegnare un Rettangolo
Per disegnare un rettangolo su un oggetto Form di Visual Basic.NET esistono sostanzial-
mente due metodi. Il primo metodo disegna il rettangolo partendo da una coppia di coor-
dinate che rappresentano il punto di partenza, in pratica l’angolo in alto a sinistra del ret-
tangolo, e da due dimensioni, una larghezza e un’altezza.
Sintassi del comando:
Parametri:
Pennello: Oggetto Pen che determina il colore, la larghezza e lo stile del rettangolo.
X (Int32) Coordinata X dell'angolo superiore sinistro del rettangolo da disegnare.
Y (Int32) Coordinata Y dell'angolo superiore sinistro del rettangolo da disegnare.
Larghezza (Int32) Larghezza del rettangolo da disegnare.
Altezza (Int32) Altezza del rettangolo da disegnare.
Esempio di codice:
DrawRectangle(Pennello, Rettangolo)
Pennello: Oggetto Pen che determina il colore, la larghezza e lo stile del rettangolo.
Rettangolo: Struttura Rectangle che rappresenta il rettangolo da disegnare.
Oppure:
Dichiaro la classe Graphics che fornisce i metodi per disegnare oggetti in un Form. Per
attivare l’oggetto devo chiamare il metodo CreateGraphics().
Definisco il pennello, ovvero il tratto con il quale deve essere disegnato il rettangolo, nel
nostro caso viene specificato il colore e lo spessore del tratto.
Definisco una struttura Rectangle con le sue caratteristiche principali, coordinate del punto
di partenza ovvero l’angolo in alto a sinistra, la larghezza e l’altezza.
Questi parametri possono essere passati in modo indiretto sostituendo i numeri statici con
delle variabili (Integer) che possono variare all’interno del programma. Ad esempio:
Disegno.DrawRectangle(Pennello, Rettangolo)
Disegno.FillRectangle(Brushes.Green, Rettangolo)
Disegnare un Poligono.
Per quanto riguarda un poligono, una struttura che è caratterizzata da più angoli, quindi
più lati, è necessario definire una matrice di punti tipo Point. Ogni punto contiene la coor-
dinata del punto stesso sullo schermo e si dichiara semplicemente:
Ogni coppia di punti consecutivi specifica un lato del poligono e, se l’ultimo punto e il primo
punto definiti nella matrice non coincidono, creano l’ultimo lato del poligono.
Per creare una matrice di punti definisco ogni punto e poi li associo alla matrice
Disegno.DrawPolygon(Pennello, MatricediPunti)
Disegno.DrawPolygon(Pennello, MatricediPunti)
Disegno.FillPolygon(Brushes.LightBlue, MatricediPunti)
Ellisse
Questo oggetto viene generato a partire da un rettangolo e, nel caso di Visual Basic, l’ellisse
è inscritta nel rettangolo definito. Se le dimensioni dei quattro lati sono uguali, quindi il
rettangolo diventa un quadrato, l’ellisse diventa una circonferenza.
Iniziamo definendo l’oggetto Graphics ed il pennello:
Disegno.DrawEllipse(Pennello, Rettangolo)
Stringa
È possibile disegnare un testo in un Form in due modi diversi. Il primo metodo disegna la
stringa direttamente avvalendosi delle coordinate del punto di inizio della scrittura mentre
il secondo metodo in pratica inserisce il testo in un rettangolo, i cui contorni possono essere
visibili o meno. La sintassi dell’istruzione è la seguente:
Formato.FormatFlags = StringAlignment.Near
Disegno.DrawString(Stringa, Font1, Penna, 300, 300, Formato)
Disegnare con Visual Basic.
425
Formato.FormatFlags = StringAlignment.Center
Disegno.DrawString(Stringa, Font1, Penna, 300, 350, Formato)
Formato.FormatFlags = StringAlignment.Far
Disegno.DrawString(Stringa, Font1, Penna, 300, 400, Formato)
Crea una oggetto che rappresenta il formato che dovrà avere il testo che verrà disegnato.
Dim Formato As New StringFormat
Il codice che segue disegna tre volte il testo con tre allineamenti diversi con una linea che
mette in evidenza la differenza fra i vari allineamenti.
Formato.FormatFlags = StringAlignment.Near
Disegno.DrawString(Stringa, Font1, Penna, 300, 300, Formato)
Formato.FormatFlags = StringAlignment.Center
Disegno.DrawString(Stringa, Font1, Penna, 300, 350, Formato)
Formato.FormatFlags = StringAlignment.Far
Disegno.DrawString(Stringa, Font1, Penna, 300, 400, Formato)
Nel secondo caso la stringa di testo viene disegnata all’interno di un rettangolo, quindi è
necessario dichiarare prima un rettangolo e posizionarlo sullo schermo, e poi inserire la
stringa col testo.
La sintassi dell’istruzione è la seguente:
Disegna il rettangolo. In questo caso il colore del contorno del rettangolo è bianco ma se
desiderate che il rettangolo non si veda impostatelo come il colore di sfondo del form.
Disegno.DrawRectangle(Pens.White, Rettangolo)
Formato.LineAlignment = StringAlignment.Center
Formato.Alignment = StringAlignment.Center
Disegno.DrawRectangle(Pens.White, Rettangolo)
Icona
Può essere disegnato in un Windows Form anche un oggetto Icona. Insieme al codice alle-
gato al libro troverete una cartella che contiene un nutrito numero di icone da inserire nei
vostri progetti. Qui a seguito vi riporto il codice completo dell’esercizio. La prima parte serve
semplicemente, attraverso l’utilizzo del controllo OpenFileDialog, a selezionare un’icona che
poi verrà disegnata sul Form. In sostanza apre una finestra che vi permetterà di scegliere
l’icona. Per fare in modo che questo programma funzioni su tutti i computer è necessario
includere le prime tre righe di codice che servono per comporre il percorso iniziale, ovvero
in questo caso la Cartella Documenti del vostro computer.
Disegnare con Visual Basic.
427
Dim Informazione() As String = Split(My.User.Name, "\")
Dim NomeUtente As String = Informazione(1)
PercorsoImmagine = OpenFileDialog1.FileName
Else
Exit Sub
End If
Immagine
Qui si va decisamente sul complicato, non perché effettivamente lo sia, ma per la grandis-
sima quantità di informazioni e varianti sul tema che sono disponibili per questo tipo di
oggetto, per cui vi rimando al sito http://docs.microsoft.com/it-it/dotnet/api/ che rappre-
senta la documentazione ufficiale della Microsoft. Cercate la libreria System.Drawing e il
metodo DrawImage. Qui mi limito alla versione di base del codice:
PercorsoImmagine = OpenFileDialog1.FileName
VisualBasic.NET 2019 – Partendo da Zero
428
Else
Exit Sub
End If
La prima parte del codice l’abbiamo già vista anche nell’esempio precedente.
Questo capitolo può essere saltato a piè pari per poi essere ripreso in un
secondo tempo. Vi sono alcuni controlli che probabilmente avranno un uti-
lizzo sporadico nelle vostre applicazioni, mentre altri saranno utilizzati piut-
tosto di frequente. Vengono esposti con lo scopo di mostrarne il funziona-
mento in modo che possiate valutarne l’utilizzo nei vostri lavori, e avere su-
bito a disposizione istruzioni sul loro modo d’impiego.
Quindi potete continuare lo studio di Visual Basic da questo capitolo oppure dirigervi diret-
tamente ad altri capitoli come ad esempio i database o disegnare con Visual Basic.
MaskedTextBox
Si tratta di un controllo molto utile per gestire l’immissione dei dati da parte dell’utente.
Una parte importantissima di un programma è quella di impedire all’utente di inserire nei
vari campi dei valori che farebbero generare un errore di esecuzione, come ad esempio
date non valide, valori strampalati e formati non validi. Per aiutare l’immissione dei dati il
controllo fornisce una maschera che impedisce perlomeno un errore di formato.
La proprietà Mask permette di specificare la tipologia della maschera che ho riportato nella
tabella qui di seguito.
Esempio di codice:
Maschera Descrizione
Numerico, obbligatorio. Questo elemento accetterà qualsiasi singola cifra compresa
0
tra 0 e 9.
9 Numerico o Spazio, facoltativo.
Numerico o Spazio, facoltativo. Se questa posizione è vuota nella maschera, verrà
# considerato come uno spazio nella proprietà Text. Sono consentiti segni più (+) e
meno (-).
L Carattere alfabetico, obbligatorio. Limita l’inserimento alle lettere ASCII a-z e A-Z.
? Carattere alfabetico, facoltativo. Limita l'input alle lettere ASCII a-z e A-Z.
Carattere alfabetico, obbligatorio. Se la proprietà AsciiOnly è impostata su true, que-
&
sto elemento si comporta come l'elemento "L".
Carattere alfabetico, facoltativo. Qualsiasi carattere non di controllo. Se la proprietà
C
AsciiOnly è impostata su true, questo elemento si comporta come l'elemento "?".
Alfanumerico, obbligatorio. Se la proprietà AsciiOnly è impostata su true, gli unici
A caratteri che vengono accettati sono le lettere ASCII a-z e A-Z. Questo elemento Mask
si comporta come l'elemento "a".
Alfanumerico, facoltativo. Se la proprietà AsciiOnly è impostata su true, gli unici ca-
a ratteri che accetteranno sono le lettere ASCII a-z e A-Z. Questo elemento Mask si
comporta come l'elemento "A".
Segnaposto decimale. Il carattere di visualizzazione effettivo utilizzato sarà il simbolo
. decimale appropriato per il provider di formato, come determinato dalla proprietà For-
matProvider del controllo.
VisualBasic.NET 2019 – Partendo da Zero
430
Segnaposto Migliaia. Il carattere di visualizzazione effettivo usato sarà il segnaposto
, delle migliaia appropriato per il provider di formato, come determinato dalla proprietà
FormatProvider del controllo.
Separatore ora. Il carattere di visualizzazione effettivo usato sarà il simbolo di ora
: appropriato per il provider di formato, come determinato dalla proprietà FormatProvi-
der del controllo.
Separatore data. Il carattere di visualizzazione effettivo usato sarà il simbolo di data
/ appropriato per il provider di formato, come determinato dalla proprietà FormatProvi-
der del controllo.
Simbolo di valuta. Il carattere effettivo visualizzato sarà il simbolo di valuta appro-
$ priato per il provider di formato, come determinato dalla proprietà FormatProvider del
controllo.
< Converte tutti i caratteri che seguono in lettere minuscole.
> Converte tutti i caratteri che seguono in maiuscolo.
| Disabilitare uno spostamento precedente verso l'alto o lo spostamento verso il basso.
Fuga. Esclude un carattere di maschera, trasformandolo in un valore letterale. "\\" è
\
la sequenza di escape per una barra rovesciata.
Valori letterali. Tutti gli elementi non maschera verranno visualizzati nel MaskedText-
Tutti gli al-
Box. I valori letterali occupano sempre una posizione statica nella maschera in fase di
tri caratteri
esecuzione e non possono essere spostati o eliminati dall'utente.
Il codice che segue si trova nell’esempio allegato al libro nel progetto MaskedTextBox.
Option Explicit On
If (MaskedTextBox1.MaskFull) Then
Else
End If
End Sub
End Sub
Altri Controlli utili.
431
Private Sub MaskedTextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles
MaskedTextBox1.KeyDown
ToolTip1.Hide(MaskedTextBox1)
End Sub
If (MaskedTextBox1.MaskFull) Then
If Keyascii = 13 Then
If IsDate(MaskedTextBox1.Text) = True Then
ToolTip1.ToolTipTitle = "Inserimento OK"
ToolTip1.Show("Hai inserito i dati corretti !!", MaskedTextBox1, 120, 0,
2500)
MaskedTextBox2.Focus()
Exit Sub
Else
ToolTip1.ToolTipTitle = "Inserimento Errato"
ToolTip1.Show("Quella che hai inserito non è una data valida !!",
MaskedTextBox1, 120, 0, 2500)
End If
End If
End If
End Sub
End Class
End Sub
Quando l’inserimento da parte dell’utente vìola le regole che abbiamo dato con la proprietà
Mask allora viene generato l’evento MaskInputRejected, ovvero viene rifiutato il dato inse-
rito.
Si può utilizzare la proprietà MaskFull per verificare se sono stati inseriti tutti i caratteri
necessari, mentre la proprietà Text ci permette di recuperare il contenuto del campo for-
mattato in base alla maschera e alla proprietà TextMaskFormat.
Il controllo ToolTip è stato inserito per creare sullo schermo i messaggi d’errore indirizzati
all’utente se commette qualche violazione del formato.
If (MaskedTextBox1.MaskFull) Then
VisualBasic.NET 2019 – Partendo da Zero
432
ToolTip1.ToolTipTitle = "Errore: Hai inserito troppi dati"
ToolTip1.Show("Non puoi inserire ulteriori dati.",
MaskedTextBox1, 120, 0, 2000)
Else
End If
End Sub
E verrà visualizzato per 2 secondi (2000 millisecondi) alle coordinate (120, 0) twip a di-
stanza dal controllo MaskedTextBox1.
ToolTip1.Show("Non puoi inserire ulteriori dati. Elimina alcuni caratteri.",
MaskedTextBox1, 120, 0, 2000)
Else
End If
Quando viene premuto un qualsiasi tasto dalla tastiera per nascondere l’etichetta di mes-
saggio che si genererebbe.
ToolTip1.Hide(MaskedTextBox1)
End Sub
Questa parte di codice invece permette di convalidare i dati con il tasto Invio dalla tastiera
e verificare che quella che è stata inserita rappresenti una data valida a livello di sintassi.
Manda il cursore al TextBox o al MaskedTextBox successivo per l’inserimento di altro tipo
di dati.
If (MaskedTextBox1.MaskFull) Then
If Keyascii = 13 Then
If IsDate(MaskedTextBox1.Text) = True Then
ToolTip1.ToolTipTitle = "Inserimento OK"
ToolTip1.Show("Hai inserito i dati corretti !!", MaskedTextBox1, 120, 0,
2500)
MaskedTextBox2.Focus()
Exit Sub
Else
ToolTip1.ToolTipTitle = "Inserimento Errato"
ToolTip1.Show("Quella che hai inserito non è una data valida !!",
MaskedTextBox1, 120, 0, 2500)
End If
End If
End If
End Sub
Come per il controllo TextBox, diversi tasti di scelta rapida comuni non funzionano con
MaskedTextBox. In particolare, CTRL+R (Testo allineato a destra Text) e CTRL+L (Testo
allineato a sinistra).
RichTextBox
Questo controllo è utile per manipolare file RTF (Rich Text File) ovvero non semplici file di
testo ma file che supportano la formattazione del carattere, del paragrafo ed altre caratte-
ristiche tipiche di un programma di videoscrittura, come ad esempio Word.
RichTextBox può creare, modificare o salvare file in Formato RTF e TXT.
Dispone di diverse proprietà che è possibile utilizzare per applicare la formattazione a qual-
siasi parte del testo all'interno del controllo. Per effettuare delle modifiche è necessario
innanzitutto selezionare il testo. Solo il testo selezionato può essere assegnato alla format-
tazione dei caratteri e dei paragrafi. Dopo che è stata apportata un'impostazione a una
sezione di testo selezionata, tutto il testo immesso dopo la selezione viene formattato con
le stesse impostazioni, fino a quando non viene apportata una modifica dell'impostazione o
viene selezionata una sezione diversa del documento del controllo.
La proprietà SelectionFont consente di rendere il testo in grassetto o in corsivo, e può anche
modificare le dimensioni e il carattere tipografico del testo. La proprietà SelectionColor con-
sente di modificare il colore del testo. Per creare elenchi puntati, è possibile usare la pro-
prietà SelectionBullet. È inoltre possibile modificare la formattazione dei paragrafi impo-
stando le proprietà SelectionIndent, SelectionRightIndent e SelectionHangingIndent.
Fornisce inoltre metodi implementano l'apertura e il salvataggio di file.
Il metodo LoadFile consente di caricare un file di testo RTF o ASCII esistente nel controllo.
Il metodo SaveFile permette di salvare un file in formato RTF o ASCII.
Il controllo RichTextBox fornisce anche le funzionalità per la ricerca di stringhe di testo
all’interno di un documento attraverso il metodo Find.
Il codice dell’esercizio si trova nel progetto RichTextBox nel codice allegato al libro.
Il progetto dispone di un’area RichTextBox e tre pulsanti che rispettivamente servono per
creare un nuovo documento, aprirne uno esistente e salvare il documento creato o modifi-
cato dall’utente.
Il progetto è una versione base dimostrativa, quindi sta a voi apportarne eventuali migliorie,
ad esempio, inserendo altri pulsanti di formattazione rispetto a quello presente nel progetto
che serve semplicemente per mettere il testo in grassetto, magari aggiungendo una toolbar
per sfruttare le molte caratteristiche del controllo in questione.
Il codice dell’esercizio è il seguente:
VisualBasic.NET 2019 – Partendo da Zero
434
Public Class Form1
Controllo = False
p_Salva.Enabled = False
p_Apri.Enabled = True
End Sub
PercorsoFile = OpenFileDialog1.FileName
RichTextBox1.LoadFile(PercorsoFile)
Controllo = True
p_Apri.Enabled = True
p_Salva.Enabled = False
End Sub
End If
End Sub
p_Salva.Enabled = False
p_Apri.Enabled = True
PercorsoFile = SaveFileDialog1.FileName
End If
Controllo = True
RichTextBox1.SaveFile(PercorsoFile)
End Sub
p_Salva.Enabled = False
p_Apri.Enabled = True
Controllo = False
RichTextBox1.Clear()
End Sub
p_Salva.Enabled = True
End Sub
End Class
Imposta le caratteristiche inziali del controllo OpenFileDialog. Fa in modo che nella finestra
siano visibili i soli file RTF.
OpenFileDialog1.Title = "Apri File RTF"
OpenFileDialog1.InitialDirectory = DirectoryIniziale
OpenFileDialog1.Filter = "File RTF (*.rtf)|*.rtf"
Mostra la finestra all’operatore. Se questi annulla l’operazione il computer esce dalla routine
senza fare altro e attende nuovi comandi.
If OpenFileDialog1.ShowDialog = DialogResult.Cancel Then Exit Sub
Se invece viene selezionato, il file da aprire viene associato al metodo LoadFile e aperto
sullo schermo.
PercorsoFile = OpenFileDialog1.FileName
RichTextBox1.LoadFile(PercorsoFile)
La variabile viene messa a True per far capire che stiamo modificando il documento.
Controllo = True
Questa parte di codice salva un file distinguendo fra i file che già hanno un nome, quindi si
tratta di una modifica, e file che il nome non ce l’hanno ovvero creati ex novo, basandosi
sulla variabile che nel codice è chiamata Controllo. Se questa variabile vale False il file non
ha un nome, quindi viene aperta la finestra Salva con nome per permette all’operatore di
assegnargliene uno.
p_Salva.Enabled = False
p_Apri.Enabled = True
PercorsoFile = SaveFileDialog1.FileName
End If
Controllo = True
RichTextBox1.SaveFile(PercorsoFile)
FolderBrowserDialog
È un semplice controllo che vi permette selezionare una cartella e memorizzarne il percorso
in una variabile. Una versione ridotta del controllo OpenFileDialog dove era possibile sele-
zionare un file. Lo trovate fra gli esempi annessi al libro.
FolderBrowserDialog1.SelectedPath = PercorsoCartella
Quindi selezionate il controllo ImageList con un click e accedete alla proprietà Images.
Sullo schermo compare l’editor della raccolta immagini. Adesso, acquisiamo dalla cartella
che contiene le icone che di solito utilizzate per i vostri progetti, tutte le icone che saranno
necessarie per lo sviluppo di questo progetto, tenendo presente che è possibile aggiungere
o modificare questa lista in qualsiasi momento.
VisualBasic.NET 2019 – Partendo da Zero
440
Queste icone potranno essere utilizzate e condivise in qualsiasi altro controllo presente nel
form, e questo vi permette di velocizzare la progettazione. Il controllo ImageList incorpora
la risorsa, ad esempio un’icona, evitando di richiamare attraverso il codice il file originario,
che in caso di spostamento, genererebbe un’eccezione bloccando il programma.
Fate click sul pulsante Aggiungi in basso a sinistra nella finestra per creare la lista delle
immagini.
Accedete alla cartella dove si trovano le icone e aggiungete tutte quelle che ritenete neces-
sarie ripentendo più volte l’operazione. Assegnate nomi descrittivi ai vari elementi della lista
dalla proprietà Name, in modo da poterli agevolmente richiamare nel progetto. Non lasciate
i nomi originari sempre ammesso che non siano descrittivi.
Fate click sul pulsante OK in basso nella finestra per tornare al progetto.
Adesso aggiungiamo al form un controllo ToolStrip che rappresenta una Barra degli stru-
menti.
Altri Controlli utili.
441
Selezionate il controllo ToolStrip e accedete alla proprietà Items che rappresenta tutti gli
oggetti incorporati nel controllo. Questi possono essere pulsanti (Button), etichette(Label),
caselle di testo (TextBox), Separatori, pulsanti a discesa (DropDownButton) e altro visibile
nella lista. Non descriveremo tutte le possibilità che questo controllo offre in quanto sono
veramente tante e lascio a voi l’onere di scoprine le applicazioni.
Sullo schermo compare l’editor della raccolta Items.
Per semplicità illustrerò le possibilità che offre il controllo Button, che rappresenta un pul-
sante collocato sulla barra degli strumenti.
Selezionate dalla casella combinata un elemento da aggiungere, in questo caso una con-
trollo Button, e fate click sul pulsante Aggiungi alla destra della casella. È possibile inserire
sulla ToolStrip uno qualsiasi dei controlli che vedete nella lista, tenendo presente che è
possibile spostarli, rinominarli, eliminarli e aggiungerli in qualsiasi momento. L’importante
VisualBasic.NET 2019 – Partendo da Zero
442
è che a ogni controllo venga assegnato un nome descrittivo per evitare la continua apertura
della raccolta Items per verificare come si chiama un determinato controllo.
In questo caso, ad esempio, sono stati inseriti sulla barra cinque pulsanti. Ognuno di questi
oggetti ha diverse proprietà alle quali potete accedere anche dal codice oltre che dalla lista
che appare nella parte destra della finestra dell’editor della raccolta Items. Ad ogni pulsante
ho assegnato attraverso la proprietà Name un nome descrittivo. Completate le operazioni
facendo click sul pulsante OK in basso nella finestra.
Adesso che sono stati creati i pulsanti ed è stato assegnato a ciascuno un nome descrittivo,
vediamo come dal codice è possibile accedere ai controlli e assegnargli alcune proprietà.
Altri Controlli utili.
443
Nella raccolta del codice allegato al libro troverete nel progetto ImageList il codice che
riporto parzialmente nel box qui di seguito:
P_Apri.Image = ImageList1.Images.Item("I_Apri")
P_Apri.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
P_Apri.Text = "Apri"
P_Apri.TextAlign = ContentAlignment.MiddleRight
P_Apri.ImageAlign = ContentAlignment.MiddleLeft
P_Apri.Enabled = True
P_Chiudi.Image = ImageList1.Images.Item("I_Chiudi")
P_Chiudi.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
P_Chiudi.Text = "Chiudi"
P_Chiudi.TextAlign = ContentAlignment.MiddleRight
P_Chiudi.ImageAlign = ContentAlignment.MiddleLeft
P_Chiudi.Enabled = True
P_Connetti.Image = ImageList1.Images.Item("I_Connetti")
P_Connetti.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
P_Connetti.Text = "Connetti"
P_Connetti.TextAlign = ContentAlignment.MiddleRight
P_Connetti.ImageAlign = ContentAlignment.MiddleLeft
P_Connetti.Enabled = True
P_Disconnetti.Image = ImageList1.Images.Item("I_Disconnetti")
P_Disconnetti.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
P_Disconnetti.Text = "Disconnetti"
P_Disconnetti.TextAlign = ContentAlignment.MiddleRight
P_Disconnetti.ImageAlign = ContentAlignment.MiddleLeft
P_Disconnetti.Enabled = True
P_Esci.Image = ImageList1.Images.Item("I_Esci")
P_Esci.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
P_Esci.Text = "Esci"
P_Esci.TextAlign = ContentAlignment.MiddleRight
P_Esci.ImageAlign = ContentAlignment.MiddleLeft
P_Esci.Enabled = True
Innanzitutto assegna al pulsante, l’ordine delle assegnazioni ai vari pulsanti non è rilevante,
l’icona più adatta all’identificazione visiva del comando.
P_Apri.Image = ImageList1.Images.Item("I_Apri")
Assegno al pulsante uno stile che prevede la visualizzazione sul pulsante stesso di un’icona
e di un testo descrittivo del comando
P_Apri.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
Allineo il testo
P_Apri.TextAlign = ContentAlignment.MiddleRight
Allineo l’icona
P_Apri.ImageAlign = ContentAlignment.MiddleLeft
Attivo il pulsante. Questo comando è opzionale perché per default un pulsante è abilitato.
Però magari voglio che inizialmente sia disabilitato. In questo caso il parametro e False.
P_Apri.Enabled = True
VisualBasic.NET 2019 – Partendo da Zero
444
Il resto del codice personalizza i vari pulsanti presenti. Per attivare il codice dell’evento click
di un pulsante è sufficiente fare doppio click sul pulsante stesso, dove verrà inserito il codice
che dovrà essere eseguito se l’utente farà click sul pulsante in questione.
Le immagini della ImageList sono accessibili anche da altri eventuali controlli presenti nel
form o aggiunti successivamente.
TreeView
Il TreeView è un controllo piuttosto complesso e molto utilizzato nelle applicazioni desktop.
È quel componente che viene chiamato Riquadro di spostamento che solitamente appare
nella parte sinistra di una finestra di Windows, dove è possibile selezionare le risorse come
cartelle o altre risorse anche di rete. Quindi, un componente di utilizzo abbastanza fre-
quente. Queste, ovviamente, non solo le sole applicazioni che il TreeView può supportare.
Nel nostro esempio verrà utilizzato come controllo per recuperare la struttura di un server
MySQL e visualizzarla sullo schermo.
Ogni Server MySQL può contenere più database, il database può contenere tabelle e ogni
tabella può avere dei record e dei campi. Questo controllo ci permette di visualizzare questo
tipo di struttura in un modo detto “ad albero”, raggruppando gli oggetti in vari livelli e
ordinandoli alfabeticamente. Nella figura sottostante si può vedere l’aspetto che ha il pro-
getto in funzione.
Prima di analizzare il codice del progetto, ci soffermeremo sulle operazioni di base di questo
controllo. Per apportare delle modifiche all’elenco che appare nel TreeView è necessario
innanzitutto invocare il metodo:
TreeView1.BeginUpdate()
Altri Controlli utili.
445
Quindi operare l’aggiunta di una voce o un ramo dipendente da una voce o ulteriore livello
di ramificazione. Prima ovviamente le voci principali.
TreeView1.Nodes.Add("Lista 1")
Dove “Lista 1” è semplicemente la descrizione che compare come nodo di livello principale.
Per aggiungere un ramo a questa voce principale:
TreeView1.Nodes(0).Nodes.Add("Voce 1")
Anche in questo caso “Voce 1” è il nome che comparire sulla lista come ramo della voce
“Lista 1”. Quindi, se vogliamo aggiungere un’altra voce principale:
TreeView1.Nodes.Add("Lista 2")
TreeView1.Nodes(1).Nodes.Add("Voce 1")
Come si può notare, l’indice dell’oggetto Nodes, che rappresenta i nodi o rami, è 1, mentre
nel primo caso era 0. Quindi se volte aggiungere un sotto – sotto elemento è possibile farlo
cosi:
TreeView1.Nodes.Add("Lista 1")
TreeView1.Nodes(0).Nodes.Add("Voce 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 1")
TreeView1.BeginUpdate()
TreeView1.Nodes.Add("Lista 1")
TreeView1.Nodes(0).Nodes.Add("Voce 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 1")
TreeView1.EndUpdate()
TreeView1.ExpandAll()
Per fare in modo che siano apportate le modifiche è necessario concludere le stesse con il
metodo:
TreeView1.EndUpdate()
Mentre:
TreeView1.ExpandAll()
VisualBasic.NET 2019 – Partendo da Zero
446
fa in modo che tutti i rami presenti nel controllo vengano espansi, altrimenti risulteranno
collassati, ovvero saranno visibili solo le voci principali.
Se modificate il codice come nel box successivo:
TreeView1.BeginUpdate()
TreeView1.Nodes.Add("Lista 1")
TreeView1.Nodes(0).Nodes.Add("Voce 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 2")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 3")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 4")
TreeView1.Nodes(0).Nodes.Add("Voce 2")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 1")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 2")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 3")
TreeView1.Nodes(0).Nodes.Add("Voce 3")
TreeView1.EndUpdate()
TreeView1.ExpandAll()
TreeView1.BeginUpdate()
TreeView1.Nodes.Add("Lista 1")
TreeView1.Nodes(0).Nodes.Add("Voce 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 1")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 2")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 3")
TreeView1.Nodes(0).Nodes(0).Nodes.Add("Ramo 4")
TreeView1.Nodes(0).Nodes.Add("Voce 2")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 1")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 2")
TreeView1.Nodes(0).Nodes(1).Nodes.Add("Ramo 3")
TreeView1.Nodes(0).Nodes.Add("Voce 3")
TreeView1.Nodes.Add("Lista 2")
TreeView1.Nodes(1).Nodes.Add("Voce 1")
TreeView1.Nodes(1).Nodes.Add("Voce 2")
TreeView1.Nodes(1).Nodes(1).Nodes.Add("Ramo 1")
TreeView1.Nodes(1).Nodes(1).Nodes.Add("Ramo 2")
Altri Controlli utili.
447
TreeView1.Nodes(1).Nodes(1).Nodes.Add("Ramo 3")
TreeView1.Nodes(1).Nodes(1).Nodes.Add("Ramo 4")
TreeView1.Nodes(1).Nodes.Add("Voce 3")
TreeView1.Nodes.Add("Lista 3")
TreeView1.Nodes(2).Nodes.Add("Voce 1")
TreeView1.Nodes(2).Nodes.Add("Voce 2")
TreeView1.Nodes(2).Nodes.Add("Voce 3")
TreeView1.EndUpdate()
TreeView1.ExpandAll()
Un’altra caratteristica importante di questo controllo è che per realizzare una lista come
quella che vedete nella figura precedente, è possibile aggiungere rami e sotto-rami anche
in tempi successivi, ad esempio, se nella Lista 1 vi siete dimenticati un ramo, è possibile
aggiungerlo in qualsiasi momento ed in qualunque punto del codice, purché sia già stato
dichiarato il ramo principale, in questo caso Lista 1, altrimenti verrà generata un’eccezione
che bloccherà l’esecuzione del programma. Tutte le modifiche alla struttura andranno rea-
lizzate fra queste due righe di codice:
TreeView1.BeginUpdate()
………………………………
TreeView1.EndUpdate()
Per concludere:
TreeView1.Sort()
Elenca i nodi in ordine alfabetico, cosa molto utile in quanto, solitamente al posto delle
descrizioni utilizzate in questo esempio, si trovano voci ben più descrittive.
Dopo aver introdotto le caratteristiche principali del controllo TreeView, veniamo adesso al
progetto identificato con TreeView1 che si trova nel materiale di esempio allegato al libro.
Il codice completo del progetto lo trovate nel box successivo.
Imports MySql.Data.MySqlClient
VisualBasic.NET 2019 – Partendo da Zero
448
Public Class Form1
p_Connetti.Enabled = True
p_NuovaConnessione.Enabled = False
USERID = "root"
Password = "VBdazero2019"
ServerName = "127.0.0.1"
t_Utente.Text = USERID
t_Password.Text = Password
t_IndirizzoIP.Text = ServerName
End Sub
Cursor = Cursors.WaitCursor
TreeView1.ImageList = ImageList1
TreeView1.ImageIndex = 0 ' Per un ramo non selezionato
TreeView1.SelectedImageIndex = 1 'Per una ramo selezionato
p_Connetti.Enabled = False
p_NuovaConnessione.Enabled = True
USERID = Trim(t_Utente.Text)
Password = Trim(t_Password.Text)
ServerName = Trim(t_IndirizzoIP.Text)
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Altri Controlli utili.
449
Exit Sub
End Try
Connessione.Close()
DataBaseCorrente = 0
TreeView1.BeginUpdate()
TreeView1.Nodes.Add(Riga("Database_Name"))
TreeView1.EndUpdate()
Database = Riga("Database_Name")
Connessione1.Open()
TabellaCorrente = 0
Tabella = Riga1("Table_Name")
TreeView1.BeginUpdate()
TreeView1.Nodes(DataBaseCorrente).Nodes.Add(Tabella)
TreeView1.EndUpdate()
Connessione2.Open()
TreeView1.Nodes(DataBaseCorrente).Nodes(TabellaCorrente).Nodes.Add(Riga2(0))
Next
End Using
TabellaCorrente = TabellaCorrente + 1
Next
End Using
DataBaseCorrente = DataBaseCorrente + 1
VisualBasic.NET 2019 – Partendo da Zero
450
Next
Cursor = Cursors.Default
End Sub
TreeView1.Nodes.Clear()
End Sub
StartPosition = FormStartPosition.CenterScreen
End Sub
End Class
Vediamo adesso le parti salienti del progetto. Queste sono alcune proprietà della lista ad
albero.
Dato che viene utilizzata una ImageList per assegnare delle icone ai rami della TreeView
viene specificato da quale controllo la TreeView deve acquisire le immagini. Si usa una
ImageList in quanto incorpora le immagini ed evita di doverle richiamare da un file che, nel
caso venisse spostato, genererebbe un’eccezione bloccando il programma, e nel caso mi-
gliore non farebbe apparire le icone sulla TreeView.
TreeView1.ImageList = ImageList1
Nella ImageList sono presenti due Immagini. Quella di indice (0) è l’icona di una cartella
chiusa, quella di indice (1) è l’icona di una cartella aperta.
Questa linea di programma associa l’immagine con indice (0) che si trova nella ImageList
alla TreeView quando un ramo non è selezionato (immagine di una cartella chiusa).
TreeView1.ImageIndex = 0
Questa invece associa l’Immagine di indice (1) che si trova nella ImageList alla TreeView
quando un ramo è selezionato (immagine di una cartella aperta)
TreeView1.SelectedImageIndex = 1
Ottiene o imposta un valore che indica se un'etichetta del nodo dell'albero assume l'aspetto
di un collegamento ipertestuale al passaggio del mouse su di essa.
Altri Controlli utili.
451
TreeView1.HotTracking = True
TreeView1.ShowLines = True
Il progetto consiste in tre loop annidati che vanno ad analizzare ciascun database presente
nel server, quindi ricava l’elenco delle tabelle di un database, e per ogni tabella ricava
l’elenco dei campi. L’analisi di un server con diversi database piuttosto corposi richiede circa
10-15 secondi. Tenete presente che nella lista compariranno anche i database che fanno
parte del sistema del Server MySQL, e non solo quelli che avete creato voi personalmente.
In pratica il funzionamento di massima dei loop è il seguente. Viene creata una connessione
che richiede al server la lista dei database (Schemas) ospitati.
Questa lista viene memorizzata in un oggetto tabella.
Il primo loop, quello di livello maggiore di annidamento, ripete le operazioni annidate tante
volte quanti sono i database presenti nella lista.
Quindi crea i nodi di livello superiore inserendo il nome del database come livello principale
della struttura.
TreeView1.BeginUpdate()
TreeView1.Nodes.Add(Riga("Database_Name"))
TreeView1.EndUpdate()
Il secondo loop invece crea una tabella dove, per ogni database vengono recuperati i nomi
della tabelle che contiene.
Quindi inizia un loop che si concluderà quando saranno analizzate le tabelle del database
corrente definito dal primo loop.
Tabella = Riga1("Table_Name")
Verrà aggiunta al controllo TreeView come rami di una voce principale (DataBaseCorrente),
il nome della tabella in questione.
TreeView1.BeginUpdate()
TreeView1.Nodes(DataBaseCorrente).Nodes.Add(Tabella)
TreeView1.EndUpdate()
Poi verranno recuperati i nomi dei campi appartenenti a quella specifica tabella attraverso
una query.
Quindi verrà creata una tabella contenete i nomi dei campi presenti nella tabella stessa.
E i campi verranno aggiunti come nodi della voce della loro tabella di appartenenza.
Quindi verrà analizzata la tabella successiva di quello specifico database. Quando ha finito
di analizzare tutte le tabelle di quel database il loop andrà al database successivo e ripeterò
i due loop annidati.
L’utilizzo della parola chiave Using è dovuto al fatto che è necessario creare delle connes-
sioni nidificate per l’esecuzione delle query, e queste risorse vanno liberate prima della
connessione successiva altrimenti si potrebbe generare un’eccezione dovuta ad un numero
eccessivo di connessioni. D’altra parte ogni tabella va interrogata separatamente cosi come
ogni database, e per fare ciò è necessaria una nuova connessione.
Creare controlli personalizzati
453
Creare controlli personalizzati
Fin dagli albori di Visual Basic la possibilità di creare controlli personalizzati è stata una delle
caratteristiche più apprezzate dai programmatori, cosa che ha reso Visual Basic molto po-
polare presso questa comunità. Spesso è necessario creare controlli personalizzati in quanto
non è detto che fra gli innumerevoli controlli offerti da Visual Basic, ci sia quello che soddisfa
in pieno le nostre necessità. Inoltre il controllo personalizzato, come i controlli già disponibili
nell’ambiente di sviluppo, può essere incluso in qualsiasi progetto futuro, sfruttandone così
le caratteristiche riutilizzando il codice.
Per iniziare la nostra avventura nel mondo dei controlli personalizzati creiamo un nuovo
progetto dalla finestra che compare quando si avvia Visual Basic oppure dalla finestra prin-
cipale dell’ambiente di sviluppo selezionando dal menu File in alto a sinistra la voce Nuovo
Progetto (CTRL+N) dopo aver chiuso gli eventuali progetti aperti.
Al passaggio successivo scegliete la voce App Windows Forms (.NET Framework) come
di solito facciamo quando diamo inizio ad un nuovo progetto Windows Form.
Assegniamo adesso un nome descrittivo alla Soluzione (Una soluzione è il contenitore di
uno o più progetti) ad esempio “ProvaControllo”. Questa soluzione ci servirà per collaudare
il nostro controllo personalizzato, in quanto questi controlli non possono essere eseguiti
direttamente all’interno di Visual Studio.NET come fossero dei normali progetti.
La situazione iniziale è mostrata nella figura sottostante.
Fate click son il tasto DX del mouse sul nome che identifica la Soluzione e dalla voce Ag-
giungi scegliete Nuovo Progetto.
VisualBasic.NET 2019 – Partendo da Zero
454
Dalla lista dei nuovi progetti identificate Libreria di controlli Windows Form (.NET Fra-
mework) come mostra la figura successiva e fate click sul pulsante Avanti in basso a de-
stra.
Assegnato un nome descrittivo al controllo che desiderate creare. In questo esempio utiliz-
zerò un nome generico.
Adesso la situazione dovrebbe essere come quella illustrata nella figura successiva.
Creare controlli personalizzati
455
Il progetto del controllo personalizzato è stato aggiunto alla soluzione.
Il progetto che appare visualizzato in grassetto è quello che partirà per primo quando verrà
avviata la soluzione. Dato che un progetto Libreria di controlli Windows Form non può essere
avviato come un Windows Form è necessario fare in modo che la soluzione venga avviata
dal progetto corretto. Nel nostro caso l’avvio è già impostato nel modo adeguato, ma se
questo non dovesse verificarsi fate click con il tasto desto sul nome che identifica la solu-
zione nella lista e scegliete la voce Imposta Progetti di avvio.
Selezionate il progetto di avvio, che ovviamente non può essere il controllo personalizzato
ma il progetto Windows Form che fa parte della soluzione, e quindi fate click sul pulsante
OK in basso nella finestra.
VisualBasic.NET 2019 – Partendo da Zero
456
Per fare in modo che il progetto Windows Form possa accedere al controllo fate click con il
tato desto sulla voce che identifica il nome del Windows Form (nel nostro caso ProvaCon-
trollo) nella finestra Esplora Soluzioni e dal menu scegliete la voce Aggiungi. Quindi dal
sottomenu scegliete Riferimento.
Come mostra la figura successiva, fate click sulla voce Progetti e selezionate Soluzione.
Quindi nella lista centrale compare il nostro controllo personalizzato. Selezionatelo e fate
click sul pulsante OK ina basso nella finestra per portare a termine le operazioni.
Creare controlli personalizzati
457
Ora il controllo è disponibile nel nostro progetto come un normalissimo controllo al quale
siamo già abituati. Dalla finestra Esplora Soluzioni fate doppio click sulla voce che identifica
il vostro controllo personalizzato come mostra la figura sottostante e inserite il codice che
determina il funzionamento dell’oggetto.
VisualBasic.NET 2019 – Partendo da Zero
458
Utilizzate il codice presente nel progetto “ProvaControllo” che trovate allegato come mate-
riale aggiunto del libro. Se non digitate nulla il vostro controllo non sarà visibile nella Casella
degli strumenti (CTRL+ALT+X) nella parte sinistra dell’ambiente di sviluppo.
Quindi può essere aggiunto ai vostri progetti come se fosse un normale controllo.
Imports System.ComponentModel
Imports System.Math
Creare controlli personalizzati
459
La prima libreria è uno spazio dei nomi che contiene delle classi che vengono utilizzate per
implementare il comportamento di controlli in fase di progettazione e di esecuzione, ad
esempio, se voglio aggiungere una proprietà modificabile dalla finestra delle proprietà di un
controllo. Per accedere alla possibilità di visualizzare o non visualizzare una proprietà nella
lista delle proprietà di un controllo è necessario che la classe abbia un attributo chiamato:
Accanto alla dichiarazione delle classe. Poi troverete le variabili che devono essere accessi-
bili in tutta la classe.
Per creare una routine di proprietà è necessario utilizzare le parole chiave “Public Property”
e “End Property” che delimitano il codice che genera la proprietà. La Funzione deve essere
dello stesso tipo dei dati che vengono passati al controllo, ad esempio se invio al controllo
una serie di valori Integer per disegnare la torta, anche la funzione deve essere dello stesso
tipo.
La proprietà così com’è però non funziona senza le istruzioni Get e Set. Get recupera il
valore della proprietà, e Set imposta il valore di tale proprietà. In parole povere se devo
recuperare dei valori dal controllo è necessario scrivere il codice nella procedura Get, men-
tre se devo inviare valori al controllo devo scrivere il codice nella procedura Set.
Fra le istruzioni Get ed End Get non è necessario definire parametri.
Il codice che vedete nel box sottostante riceve 1 o più valori (fino a 12) attraverso una
matrice dinamica di nome Valore() e inserisce i valori ricevuti nella matrice Valori() per
utilizzarli nel codice del controllo. Tenete presente che una proprietà di un controllo può
impostare ma anche restituire valori, quindi per completare la Funzione inseriamo il codice
che restituisce il valore fra le parole Get e End Get.
Get
Return Valori
End Get
For j = 0 To Valore.Length - 1
Valori(j) = Valore(j)
Next
End Set
End Property
Se desiderate che la proprietà compaia anche nella finestra delle proprietà del controllo in
fase di progettazione inserite il codice che vedete nel box sottostante prima della funzione.
VisualBasic.NET 2019 – Partendo da Zero
460
Get
Return ControlSize1
End Get
ControlSize1 = Size1
End Set
End Property
Oppure di impostare la dimensione del carattere delle etichette dei valori che compaiono
sul grafico.
Get
Return LabelFontSize1
End Get
LabelFontSize1 = _LabelFontSize
End Set
End Property
Get
Return LabelFont1
End Get
LabelFont1 = _LabelFont
End Set
End Property
Creare controlli personalizzati
461
Questa proprietà invece permette di selezionare se sulle etichette devono essere riportati i
valori o le percentuali dei valori, riferiti alla percentuale che ogni valore assume rispetto al
totale dei valori. A questa proprietà è sufficiente assegnare un valore True o False.
Get
Return LabelType1
End Get
LabelType1 = _LabelType
End Set
End Property
Le ho chiamate in modo che i nomi siano vicini fra di loro nella finestra delle proprietà per
facilitare l’identificazione. Per vedere la finestra delle proprietà basta trascinare il controllo
dentro un form.
L’ultima proprietà è utile per posizionare le etichette a una distanza variabile dal centro
della torta.
Get
Return LabelDistance1
End Get
Vediamo il codice che si trova nell’evento Load del controllo. Questo codice assegna i colori
ad una matrice che poi verranno utilizzati dalla torta per i suoi spicchi. I colori sono inver-
tibili a piacimento.
Colori(0) = Color.Red
Colori(1) = Color.Yellow
Colori(2) = Color.LightGreen
Colori(3) = Color.LightGray
Colori(4) = Color.MediumPurple
Colori(5) = Color.LightBlue
Colori(6) = Color.Lavender
Colori(7) = Color.LightSkyBlue
Colori(8) = Color.Magenta
Colori(9) = Color.ForestGreen
Colori(10) = Color.Navy
Colori(11) = Color.Tan
End Sub
Abbiamo visto come sia possibile aggiungere una proprietà ad un controllo. Adesso ci oc-
cuperemo invece di come sia possibile aggiungere un metodo. Questa possibilità risulta più
semplice che nel caso precedente, infatti basta aggiungere una routine Public.
Nel codice che trovate nel box successivo viene semplicemente cancellato tutto quello che
era visualizzato sul controllo in precedenza (magari una torta precedente), basandosi sulla
creazione di un rettangolo di grandezza uguale alla superfice del controllo, riempito dello
stesso colore dello sfondo delle finestre. Poi l’azione viene spostata sulla routine Calcola().
Calcola()
End Sub
Questa routine entra in azione dopo che il controllo ha ricevuto il metodo RefreshControl(),
utilizza i dati ricevuti dal controllo tramite la proprietà Values e li elabora per creare il
grafico. Quella che vedete in queste pagine è la versione semplificata del controllo, interes-
sante ma con funzionalità ridotte, dato la complessità e la lunghezza del codice necessario
per realizzare il controllo (ci vorrebbe mezzo libro solo per lui). Magari quando avete un po'
di tempo potere apportare delle modifiche personali al controllo per migliorarne le presta-
zioni.
Se al controllo non viene inviata nessuna informazione sul quale carattere tipografico deve
utilizzare per le etichette, allora viene impostato “Verdana”. Allo stesso modo, se non viene
specificata la dimensione del carattere viene impostato il valore 10.
Vengono eseguite alcune operazioni preliminari, quale la creazione di variabili che verranno
utilizzate durante l’esecuzione del programma.
Me.Width = ControlSize1
Me.Height = ControlSize1
Dim SommaValori As Integer = 0
Per prima cosa viene fatta la somma dei valori ricevuti per metterli in relazioni alle percen-
tuali. La somma dei valori rappresenta il 100% della torta.
For j = 0 To Valori.Length - 1
If Valori(j) = 0 Then Exit For
SommaValori = SommaValori + Valori(j)
Next
Viene calcolata la percentuale dei valori. Quando trova un valore uguale a zero esce dal
ciclo For…Next e procede con il programma.
For j = 0 To Valori.Length - 1
If Valori(j) = 0 Then Exit For
Percentuali(j) = Round((Valori(j) / SommaValori * 100), 2)
Next
Memorizza il numero dei valori validi presenti nella matrice. Ricordo che è possibile passare
al controllo da 1 a 12 valori.
k = j
Adesso si calcola gli angoli che ciascun valore rappresenterà sul grafico a torta. Poi si calcola
la posizione delle etichette che si trovano a metà dell’angolo che rappresenta ciascun valore.
Si crea un matrice (PA) dove gli angoli sono rappresentati come somma del precedente. Ad
esempio la terza etichetta parte a meta del suo settore, ma come angolo di riferimento ha
la somma degli altri due che la precedono sommata alla metà del suo settore.
For j = 0 To k - 1
Etichette(j) = Round(Angoli(j) / 2, 2)
Next
For j = 1 To k - 1
PA(j) = PA(j - 1) + Angoli(j - 1)
Etichette(j) = Etichette(j) + PA(j)
Next
Poi si passa a disegnare la torta in senso orario. Viene disegnato uno spicchio che poi viene
sommato al secondo e così via fino al giro completo.
For j = 0 To k - 1
If Angoli(j) = 0 Then Exit For
Dim Pennello As New SolidBrush(Colori(j))
Disegno.FillPie(Pennello, Rettangolo, AngoloPartenza, Angoli(j))
AngoloPartenza = AngoloPartenza + Angoli(j)
Next
A questo punto vengono disegnate le etichette di valori. Sono distribuite all’interno della
torta lungo un cerchio concentrico più piccolo di quello del grafico, e la loro distanza dal
centro è regolabile, ovviamente entro certi limiti, in quanto se troppo vicino al centro si
potrebbero sovrapporre, mentre se troppo lontane c’è il rischio che debordino dal controllo
e quindi non sarebbero visibili.
RaggioEtichette = 180
Else
RaggioEtichette = LabelDistance1
End If
Questo ciclo disegna le etichette. Inoltre determina in base alla variabile LabelType1 se
deve visualizzare i valori o le percentuali relative.
For j = 0 To k - 1
Disegno.DrawString(Valori(j).ToString,
Font1, Brushes.Black, CoordinataX, CoordinataY, Formato)
Else
Testo = Percentuali(j).ToString + "%"
Disegno.DrawString(Testo, Font1, Brushes.Black,
CoordinataX, CoordinataY, Formato)
End If
Next
End Sub
Questa proprietà viene chiamata dal codice quando si deve resettare la torta prima di in-
viare altri valori.
Erase Valori
ReDim Valori(11)
End Sub
Adesso vediamo come utilizzare il controllo in fase di progettazione. È possibile farlo in due
modi. Il primo modo è quello classico di trascinare un controllo nel form dove lo vogliamo
utilizzare. Il secondo e crearlo da codice come oggetto senza effettuare alcun trascinamento
del controllo nel form. Nel progetto incluso nel codice allegato al libro sono presenti en-
trambi i metodi. Nel Form1 troviamo il caso dell’oggetto creato dal codice, mentre nel se-
condo si trova il metodo classico.
Iniziamo dal secondo caso. Nel box successivo è riportato il codice che si trova nella Classe
Form1 della soluzione ProvaControllo. Il Form presenta un pulsante che serve per far partire
l’elaborazione dei dati.
Option Explicit On
Exit Sub
Torte.ResetValues()
VisualBasic.NET 2019 – Partendo da Zero
466
Torte.Values = {50, 110, 180, 75}
Torte.RefreshControl()
End Sub
End Class
Sfruttando la programmazione ad oggetti, creo un oggetto Torte che si basa sul nostro
controllo personalizzato.
Imposto la coordinata del punto di partenza nel Form del controllo. La seconda riga di codice
è opzionale. Serve per assegnare le dimensioni all’oggetto che, nel nostro caso, vengono
assegnate dalla proprietà personalizzata ControlSize.
Durante l’esecuzione di un programma, se si desidera inviare altri dati al controllo per una
nuova elaborazione è sufficiente inserire queste tre righe.
Torte.ResetValues()
Torte.Values = {50, 110, 180, 75}
Torte.RefreshControl()
Per quanto riguarda il metodo classico, dopo aver trascinato il nostro controllo dalla casella
degli strumenti all’interno del form, e sufficiente assegnare questo codice all’evento Click
di un pulsante. Quindi, allo stesso evento si aggiunge il codice del box successivo che è lo
stesso del caso precedente, per attivare il controllo.
Questo perché la cartella Documenti, come tante altre del vostro computer, si trovano in
un percorso così composto:
Se non fosse per queste righe il codice funzionerebbe solo nel vostro computer.
Questa prima parte del codice vi posizionerebbe all’interno della Cartella dei file dell’utente
(quella con il vostro nome che si trova sul Desktop tanto per intenderci)
Benché appaia su due righe il codice può essere scritto anche su una sola (se ci sta). Questa
nuova versione di Visual Basic permette di scrivere una riga di codice particolarmente lunga
in maniera più semplice delle versioni precedenti senza utilizzare simboli di accapo.
Informazioni e operazioni su File e Cartelle
469
Questo comando permette di eliminare la cartella solo se è vuota, altrimenti crea un errore
(eccezione non gestita nel linguaggio corrente) che interrompe il flusso del programma. Per
maggiori informazioni fate riferimento alla gestione degli errori in Visual Basic.
Per anticiparvi la sorpresa potete ad esempio fare cosi:
End Try
State attenti perché la cartella e quindi anche il suo contenuto non vanno nel
cestino di Windows. Utilizzate la massima attenzione quando usate questi
comandi.
Questo codice fa apparire sullo schermo la classica finestra, alla quale siete più che abituati,
che chiede una conferma sul fatto che la cartella e tutto il suo contenuto vadano gettati nel
cestino. Le risposte che da l’utente, che quindi può anche annullare l’operazione, vanno
trattate come il caso precedente, perché possono creare delle eccezioni non gestite che
bloccherebbero il programma.
Per maggiore chiarezza ho allineato i parametri ma ricordate che il codice può essere scritto
anche tutto su una riga o interrotto in altra posizione rispetto agli esempi che vediamo in
queste pagine. Il valore “True” serve per visualizzare sullo schermo la barra di progresso.
End If
Non c’è bisogno di ricordare tutti sti giochini a memoria o se per il momento
valutate che il capitolo non sia interessante saltatelo pure a piè pari. Queste
operazioni possono risultare molto utili anche in futuro o quando svilupperete
programmi più impegnativi.
Se per l’eliminazione c’è bisogno di una conferma da parte dell’utente allora il comando
diventa.
Copia di File
Il codice completo dell’esercizio è visibile nel riquadro successivo. In questo caso viene
copiato un file dalla cartella Documenti al Desktop
My.Computer.FileSystem.CopyFile(
Percorso & NomeFile, Percorso2 & NomeFile, overwrite:=False)
Il parametro overwrite serve ad evitare che nel caso sul Desktop esistesse già un file con
lo stesso nome, venga sovrascritto.
Spostare un file
Vale quanto detto per le cartelle (directory)il codice in questo caso e:
Rinominare un file
Per cambiare il nome ad un file potete utilizzare il codice d’esempio riportato nel riquadro
successivo.
Vengono dichiarate alcune stringhe che conterranno le informazioni recuperate dal file in
questione. Sinceratevi che il file esista per evitare che il computer restituisca qualche ecce-
zione e si blocchi durante l’esecuzione.
Informazioni e operazioni su File e Cartelle
473
Progetto FileInfo.
Il progetto che analizziamo in questo capitolo ci permette di avere informazioni su file e
cartelle, come ad esempio la data di creazione, quella di ultima modifica ecc. Lo spazio dei
nomi System.IO fornisce delle classi che offrono funzionalità per la gestione dei file e delle
cartelle (directory). Questo progetto è realizzato con due Listbox, un Button, un Textbox,
un ComboBox, due Label e un FolderBrowserDialog. All’avvio fate click sul pulsante Apri
cartella. È impostata come cartella inziale la cartella documenti, quindi potete fare un’altra
scelta o fare semplicemente click sul pulsante OK. La lista sottostante viene popolata con i
nomi dei file e delle cartelle presenti nella cartella scelta. Se selezionate un file o una Di-
rectory dalla lista avrete informazioni aggiuntive sulla selezione effettuata.
Nell’immagine sottostante si vede il progetto in funzione. Per effettuare una nuova interro-
gazione fate click sul pulsante Apri Cartella ed effettuare una nuova scelta.
Option Explicit On
Imports System.IO
TextBox1.ScrollBars = ScrollBars.Vertical
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
TextBox1.Font = Carattere
ListBox1.Font = Carattere
ListBox2.Font = Carattere
Try
ComboBox1.Items.Add(HDD.Name & " - Spazio totale: "
& Format(HDD.TotalSize, "##,##"))
Catch
Exit Try
End Try
Next
ComboBox1.SelectedIndex = 0
End Sub
Info_Disco()
Exit Sub
End If
ListBox1.Items.Clear()
ListBox2.Items.Clear()
'Cerca le cartelle
For Each Oggetto As String In Directory.GetDirectories(PercorsoCartella)
ListBox1.Items.Add(My.Computer.FileSystem.GetDirectoryInfo(Oggetto))
Next
'Cerca i file
For Each Oggetto As String In Directory.GetFiles(PercorsoCartella)
ListBox1.Items.Add(My.Computer.FileSystem.GetFileInfo(Oggetto))
Informazioni e operazioni su File e Cartelle
475
Next
End Sub
End If
End Sub
Leggi_Cartella()
Leggi_File()
End If
End Sub
ListBox2.Items.Clear()
ListBox2.Items.Add("Data Creazione: " & Info.CreationTime)
ListBox2.Items.Add("Data Ultimo Accesso: " & Info.LastAccessTime)
ListBox2.Items.Add("Data Ultima Modifica: " & Info.LastWriteTime)
End Sub
VisualBasic.NET 2019 – Partendo da Zero
476
ListBox2.Items.Clear()
ListBox2.Items.Add("Estensione: " & Info.Extension)
ListBox2.Items.Add("Dimensione: " & Format(Info.Length, "##,##"))
ListBox2.Items.Add("Data Creazione: " & Info.CreationTime)
ListBox2.Items.Add("Data Ultimo Accesso: " & Info.LastAccessTime)
ListBox2.Items.Add("Data Ultima Modifica: " & Info.LastWriteTime)
End Sub
End Class
Come prima cosa importo lo spazio dei nomi che mi permette di accedere alle classi neces-
sarie per avere informazioni suoi file.
Imports System.IO
Imposto il percorso iniziale e una matrice che serve per memorizzare il testo che descrive
il tipo di unità contenute nel computer, esempio disco fisso, lettore DVD ecc.
TextBox1.ScrollBars = ScrollBars.Vertical
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
TextBox1.Font = Carattere
Informazioni e operazioni su File e Cartelle
477
ListBox1.Font = Carattere
ListBox2.Font = Carattere
ComboBox1.SelectedIndex = 0
End Sub
Questa parte di codice recupera i nomi di tutte le unità logiche presenti nel computer. Il
metodo GetDrives() crea una matrice dinamica di tipo DriveInfo che rappresenta le unità
logiche di un computer e le elenca nel ComboBox inclusa l’informazione dello spazio totale
di ciascuna unità.
Ripete un ciclo For Each per ogni elemento della matrice recuperando il nome e la dimen-
sione di ogni unità. Viene inserita anche una trappola per errori per evitare un eventuale
blocco del programma, se si dovesse verificare qualche eccezione nella lettura delle infor-
mazioni di una specifica unità.
Exit Try
End Try
Next
Questa parte di codice viene eseguita appena si fa click sul pulsante Apri Cartella. Per
prima cosa viene eseguita la procedura Info_Disco() che valuta la tipologia di disco logico.
(vedi codice della procedura più avanti)
Info_Disco()
Quindi imposta come percorso iniziale quello della cartella Documenti del computer pren-
dendo il dato dalla variabile PercorsoCartella.
FolderBrowserDialog1.SelectedPath = PercorsoCartella
Exit Sub
End If
ListBox1.Items.Clear()
ListBox2.Items.Clear()
Visualizza nella prima etichetta il numero di cartelle contenuto nel percorso specificato dalla
scelta dell’utente.
Nella seconda etichetta troviamo il numero dei file contenuti nella Directory selezionata
dall’utente.
Elenca nella lista tutte le cartelle presenti nel percorso selezionato dall’utente.
'Cerca le cartelle
For Each Oggetto As String In Directory.GetDirectories(PercorsoCartella)
ListBox1.Items.Add(My.Computer.FileSystem.GetDirectoryInfo(Oggetto))
Next
ListBox1.Items.Add(My.Computer.FileSystem.GetFileInfo(Oggetto))
Next
Questa istruzione rappresenta una matrice con dentro i nomi delle directory.
Directory.GetDirectories(PercorsoCartella)
Directory.GetFiles(PercorsoCartella)
La procedura Info_Disco invece ricava le informazioni sull’unità del disco fisso del computer.
End If
DriveInfo è una classe che fornisce accesso alle informazioni di un’unità, come ad esempio
lo spazio totale, quello libero, o il formato del file system del disco. Il metodo GetDriveInfo
restituisce un oggetto che contiene queste informazioni. Per quanto riguarda il tipo di disco,
il metodo restituisce un codice riportato in una matrice (TipoUnita) che viene sfruttata per
dare una descrizione all’informazione, dato che questa restituisce dei numeri che vanno da
1 a 6.
Tenete presente che le unità logiche nel computer sono identificate dal sistema operativo
come ai tempi del vecchio MS-DOS. (C:\) corrisponde alla prima unità logica fissa. Le unità
per i dischetti (A:\) e (B:\) oggi non sono più utilizzate, mentre un’unità CD-DVD è alta-
mente probabile che si identifichi con la lettera (D:\). Questo però dipende anche da quante
unità logiche sono presenti nel computer. Oggi è possibile, ad esempio, inserire nelle porte
USB presenti nel computer memorie di massa che fino a qualche anno fa non esistevano.
Anche queste una volta inserite saranno identificate da una lettera dell’alfabeto.
L’istruzione successiva verifica prima di iniziare l’interrogazione se il drive è pronto
Quando cambia la selezione nel Listbox1 è necessario, dato che il computer andrà a cercare
le informazioni sull’oggetto selezionato, sapere se questo è un file o una cartella in quanto
il recupero delle informazioni è diverso. Quindi con la Classe DirectoryInfo si va a controllare
se si tratta di una cartella. Se la risposta è affermativa verrà eseguita la procedura corri-
spondente, altrimenti verrà eseguita la procedura riservata ai files.
Leggi_Cartella()
Leggi_File()
End If
End Sub
Nel caso di una cartella si interroga col il metodo GetDirectoryInfo. Prima si recupera nome
e percorso della cartella dalla ListBox1.
Viene creato un oggetto DirectoryInfo per la cartella specificata nella stringa NomeCartella.
Per visualizzare le caratteristiche di una cartella, come la data di creazione, dell’ultimo ac-
cesso e dell’ultima modifica, si aggiungono queste informazioni alla ListBox2. Vengono can-
cellati eventuali valori presenti nella ListBox2.
ListBox2.Items.Clear()
ListBox2.Items.Add("Data Creazione: " & Info.CreationTime)
ListBox2.Items.Add("Data Ultimo Accesso: " & Info.LastAccessTime)
ListBox2.Items.Add("Data Ultima Modifica: " & Info.LastWriteTime)
Nel caso di un file si interroga con il metodo GetFileInfo. Si recupera il nome e il percorso
del file dalla ListBox1
ListBox2.Items.Clear()
ListBox2.Items.Add("Estensione: " & Info.Extension)
ListBox2.Items.Add("Dimensione: " & Format(Info.Length, "##,##"))
ListBox2.Items.Add("Data Creazione: " & Info.CreationTime)
ListBox2.Items.Add("Data Ultimo Accesso: " & Info.LastAccessTime)
ListBox2.Items.Add("Data Ultima Modifica: " & Info.LastWriteTime)
Per recuperare informazioni sui quattro attributi canonici dei file, Archivio, Sola Lettura,
Nascosto e di Sistema.
Date un nome al nuovo progetto, magari diverso da quello in figura dato che si riferisce ad
un progetto già esistente se avete scaricato il codice d’esempio allegato al libro.
Fate click in basso a destra sul pulsante Crea per creare il progetto.
Una volta creato il nuovo progetto fate click sul menu Progetto e quindi dalla lista scegliete
la voce Proprietà come mostrato nella figura successiva per aggiungere i riferimenti ne-
cessari altrimenti il progetto non funzionerà.
Visual Basic & Word
483
Aggiungete i riferimenti necessari per il funzionamento del progetto, in questo caso dai
riferimenti COM e fra le librerie dei tipi cercate Microsoft Word 16.0 Object Library,
tenendo presente che il numero della versione varia al variare della versione di Word in-
stallata sul vostro computer. Nel nostro caso si riferisce a Word 2019.
Qualora non fosse disponibile è probabile che sul vostro computer non sia installato qualche
componente aggiuntivo come quando abbiamo visto nel capitolo di Microsoft Access. Prov-
vedete a procurarvelo e installarlo.
Salvate il progetto come mostra la figura successiva.
VisualBasic.NET 2019 – Partendo da Zero
484
Il progetto finito ha l’aspetto che vedete nella figura successiva. È composto da un TextBox
in versione MultiLine, ovvero abilitato dalla finestra delle proprietà a scrivere su più righe
che ci servirà per visualizzare un testo ripreso da un qualsiasi file di testo presente sul
computer.
Option Explicit On
Imports System.IO
Imports Microsoft.Office.Interop.Word
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
End Sub
Cursor = Cursors.WaitCursor
ApplicazioneWord = CreateObject("Word.Application")
ApplicazioneWord.Visible = True
Stringa1 = Documento.Content.Paragraphs.Add()
Stringa1.Range.Font.Name = "Verdana"
Stringa1.Range.Font.Bold = True
Stringa1.Range.Font.Size = 14
Stringa1.Range.Text = "Titolo della Pagina"
Stringa1.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
VisualBasic.NET 2019 – Partendo da Zero
486
' Dichiaro di volere inserire un altro paragrafo dopo
Stringa1.Range.InsertParagraphAfter()
Stringa2 = Documento.Content.Paragraphs.Add()
Stringa2.Range.Font.Name = "Verdana"
Stringa2.Range.Font.Bold = False
Stringa2.Range.Font.Size = 12
Stringa2.Range.Text = "Questa è un'immagine (almeno credo)"
Stringa2.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphJustify
Stringa2.Range.InsertParagraphAfter()
Stringa3 = Documento.Content.Paragraphs.Add()
Stringa3.Range.Font.Name = "Verdana"
Stringa3.Range.Font.Bold = True
Stringa3.Range.Font.Size = 10
Stringa3.Range.Text = TextBox1.Text
Stringa3.Range.InsertParagraphAfter()
Stringa4 = Documento.Content.Paragraphs.Add()
Stringa4.Range.Font.Name = "Verdana"
Stringa4.Range.Font.Bold = True
Stringa4.Range.Font.Size = 10
Try
Stringa4.Range.InlineShapes.AddPicture(PercorsoImmagine, True, True)
Catch
End Try
Stringa4.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
Intestazione.Font.ColorIndex = WdColorIndex.wdDarkRed
Intestazione.Font.Size = 12
Intestazione.Text = "Intestazione"
Next
Cursor = Cursors.Default
Visual Basic & Word
487
End Sub
PercorsoImmagine = LCase(OpenFileDialog1.FileName)
PictureBox1.Image = Image.FromFile(PercorsoImmagine)
End If
End Sub
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "Apri File di Testo"
OpenFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
OpenFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
NomeFile = OpenFileDialog1.FileName
End If
End Sub
End Class
Per cominciare vanno importate le librerie per la gestione dei file e per l’utilizzo delle fun-
zionalità di Word.
Imports System.IO
Imports Microsoft.Office.Interop.Word
La parte del codice che si trova nel riquadro sottostante l’abbiamo già incontrata nel capitolo
che tratta delle finestre di dialogo, in questo caso OpenFileDialog, quindi se avete qualche
dubbio in proposti consultatelo.
OpenFileDialog1.FileName = ""
OpenFileDialog1.Title = "Apri File di Testo"
OpenFileDialog1.InitialDirectory = "C:\Users\" & NomeUtente & "\Documents\"
OpenFileDialog1.Filter = "File di Testo (*.txt)|*.txt|Tutti i File (*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
NomeFile = OpenFileDialog1.FileName
End If
End Sub
Anche la successiva parte del codice è una vecchia conoscenza; l’abbiamo già vista quando
affrontavamo l’argomento PictureBox.
PercorsoImmagine = LCase(OpenFileDialog1.FileName)
PictureBox1.Image = Image.FromFile(PercorsoImmagine)
End If
End Sub
La parte del codice che sta all’interno dell’evento click del pulsante Crea ha invece bisogno
qui qualche delucidazione. Quando viene premuto il pulsante Crea Documento Word,
dopo che abbiamo acquisito testo e immagine con il codice visto in precedenza, metto il
puntatore del mouse in attesa.
Visual Basic & Word
489
Cursor = Cursors.WaitCursor
Un documento di Word.
Quattro paragrafi.
Avvio la creazione dell’oggetto e lo rendo visibile. A fine procedura comparirà sullo schermo
il documento. Se la proprietà fosse impostata su False non apparirebbe nulla sullo schermo
ma il documento di Word verrebbe creato ugualmente (cercate nella vostra Cartella Docu-
menti.)
ApplicazioneWord = CreateObject("Word.Application")
ApplicazioneWord.Visible = True
Documento = ApplicazioneWord.Documents.Add()
Documento.Content.Paragraphs.Add()
Crea un paragrafo.
Stringa1 = Documento.Content.Paragraphs.Add()
Stringa1.Range.Font.Name = "Verdana"
Stringa1.Range.Font.Bold = True
Stringa1.Range.Font.Size = 14
Stringa1.Range.Text = "Titolo della Pagina"
Stringa1.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
Stringa1.Range.InsertParagraphAfter()
Stringa2 = Documento.Content.Paragraphs.Add()
VisualBasic.NET 2019 – Partendo da Zero
490
E definisco le caratteristiche del nuovo paragrafo. Il testo va inserito nella proprietà Text
dell’oggetto Stringa2 che non è una semplice stringa di testo ma rappresenta un paragrafo
con le sue caratteristiche.
Stringa2.Range.Font.Name = "Verdana"
Stringa2.Range.Font.Bold = False
Stringa2.Range.Font.Size = 12
Stringa2.Range.Text = "Questa è un'immagine (almeno credo)"
Stringa2.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphJustify
Stringa2.Range.InsertParagraphAfter()
Aggiungo un terzo paragrafo. Stavolta aggiungo il testo che si trova nel TextBox1
Stringa3 = Documento.Content.Paragraphs.Add()
Stringa3.Range.Font.Name = "Verdana"
Stringa3.Range.Font.Bold = True
Stringa3.Range.Font.Size = 10
Stringa3.Range.Text = TextBox1.Text
Stringa3.Range.InsertParagraphAfter()
Stringa4 = Documento.Content.Paragraphs.Add()
Stringa4.Range.Font.Name = "Verdana"
Stringa4.Range.Font.Bold = True
Stringa4.Range.Font.Size = 10
Try
Stringa4.Range.InlineShapes.AddPicture(PercorsoImmagine, True, True)
Catch
End Try
Allineo l’immagine.
Stringa4.Range.Paragraphs.Alignment = WdParagraphAlignment.wdAlignParagraphCenter
Questa sezione di codice invece aggiunge un testo all’intestazione di ogni pagina del docu-
mento.
Next
Questo invece aggiunge un piè di pagina ad ogni pagina del documento. Omettete pure
nelle vostre applicazioni quelle parti di codice le cui caratteristiche non vi necessitano per
quella specifica applicazione.
Visual Basic & Word
491
PiediPagina.Font.ColorIndex = WdColorIndex.wdDarkRed
PiediPagina.Font.Size = 12
PiediPagina.Text = "edizionifutura.com"
Next
Cursor = Cursors.Default
Come per altri casi trattasi di pozzo senza fondo quindi se desiderate spingervi oltre con-
sultate la documentazione ufficiale della Microsoft.
VisualBasic.NET 2019 – Partendo da Zero
492
Visual Basic & Excel
Anche Excel ha un debole per Visual Basic e viceversa, nel senso che esattamente per
quanto visto con Word anche in questo caso è possibile creare documenti, salvarli e cento-
mila altre diavolerie che qualcuno di voi saprà senz’altro fare quando si trova Excel fra le
mani. Quindi per motivi ovvi non starò qui a spiegarvi come funziona Excel, e se proprio vi
volete togliere questa curiosità vi rimando al libro “Excel da Principiante a Esperto” scritto
da me dove troverete una vasta esposizione delle funzionalità di Excel.
Questo tipo di programma che va sotto la categoria dei “Fogli Elettronici” o “Fogli di Calcolo”
è veramente versatile e si adatta velocemente ai mille problemi che è possibile incontrare
nel lavoro quotidiano.
Per sviluppare questo esercizio ho utilizzato Excel per realizzare un bilancio Entrate/Uscite
che vuole essere da spunto per eventuali vostre idee.
Quindi supponendo che conosciate lo strumento in questione partiamo per la nostra avven-
tura creando un nuovo progetto con i passaggi già visti in precedenza e assegnate un nome
al progetto. Il codice completo è disponibile con il materiale allegato al libro se non volete
digitare tutto il codice dall’inizio.
Quando il progetto viene generato fate click sul menu Progetto e dalla lista selezionate la
voce Proprietà del progetto in questione come mostra la figura successiva.
Quindi andate alla scheda Riferimenti per aggiungere quello che ci vuole per fare in modo
che Visual Basic interloquisca con Excel. Fate click sul pulsante Aggiungi in basso a destra
ricordando che per ogni nuovo progetto che cominciate è necessario sempre aggiungere
quei riferimenti che non sono di “serie” nell’ambiente di sviluppo di Visual Basic.
Visual Basic & Excel
493
Il riferimento in questione si chiama Microsoft Excel 16.0 Object Library quindi selezio-
natelo e fate click sul pulsante OK in basso a destra nella finestra.
Come si vede nella figura successiva il progetto a livello estetico è composto solo da un
pulsante che provvederà a fare partire tutta la procedura.
VisualBasic.NET 2019 – Partendo da Zero
494
Quando avvierete il progetto il risultato finale è simile a quello della figura successiva.
Quindi, avendo una mezza idea di quello che sarà il risultato finale andiamo ad analizzare
il codice dell’esercizio.
Option Explicit On
Imports Microsoft.Office.Interop.Excel
End Sub
Cursor = Cursors.WaitCursor
Dim j As Integer
ApplicazioneExcel = CreateObject("Excel.Application")
ApplicazioneExcel.Visible = True
CartellaExcel = ApplicazioneExcel.Workbooks.Add
Foglio = CartellaExcel.Sheets.Add
'Formatta il Titolo
With Foglio.Range("A1")
.Font.Name = "Verdana"
.Font.Size = 18
.Font.Bold = True
.VerticalAlignment = XlVAlign.xlVAlignCenter
.HorizontalAlignment = XlHAlign.xlHAlignCenter
End With
For j = 3 To 13
Next j
Foglio.Range("D" & j).Formula = "=B" & j & "- C" & j & " "
Next j
Foglio.Range("A1", "E1").EntireColumn.AutoFit()
Cursor = Cursors.Default
End Sub
End Class
Imports Microsoft.Office.Interop.Excel
Questa parte di codice è una vecchia conoscenza e serve per recuperare il nome dell’utente
nel computer che sta eseguendo il programma. Inoltre crea una variabile che assegna un
nome al documento di Excel che salveremo.
Dim j As Integer
Dichiaro l’applicazione Excel, la cartella di lavoro, ovvero l’insieme dei fogli che Excel può
contenere, e un foglio singolo.
Creo l’oggetto applicazione di Excel e la rendo visibile. Come nel caso di Word a seconda
dell’applicazione che volete realizzare può essere tenuta anche invisibile all’operatore.
ApplicazioneExcel = CreateObject("Excel.Application")
ApplicazioneExcel.Visible = True
CartellaExcel = ApplicazioneExcel.Workbooks.Add
Foglio = CartellaExcel.Sheets.Add
'Formatta il Titolo
With Foglio.Range("A1")
.Font.Name = "Verdana"
.Font.Size = 18
.Font.Bold = True
.VerticalAlignment = XlVAlign.xlVAlignCenter
.HorizontalAlignment = XlHAlign.xlHAlignCenter
End With
For j = 3 To 13
Next j
Creo una formula nella posizione B14 e C14 del foglio di calcolo dove verrà visualizzato il
totale della colonna Entrate e della colonna Uscite e do un formato ai risultati.
Maggiori informazioni sui formati è possibile ricavarle direttamente da Excel nel riquadro
Numeri. Quando si apre la scheda che vedete nella figura sottostante scegliete la scheda
Numero e andate su Personalizzato per visionare i formati disponibili.
Creo dinamicamente la formula dei saldi. Potevo anche scrivere tutte le formule ma ho
preferito fare così modificando con una variabile dinamica, che si incrementa ad ogni ciclo,
Visual Basic & Excel
499
il valore delle coordinate delle celle e quindi anche delle formule, tenendo presente che la
formula in ogni cella avrebbe questo formato =B3-C3 e ripetuta per tutte le celle successive
quindi (=B4-C4 e così via)
Foglio.Range("D" & j).Formula = "=B" & j & "- C" & j & " "
Next j
Foglio.Range("A1", "E1").EntireColumn.AutoFit()
Infine dò un nome alla linguetta del foglio che compare in basso su Excel.
E quindi salvo il documento. Cercatelo nella Cartella Documenti del vostro computer.
Cursor = Cursors.Default
VisualBasic.NET 2019 – Partendo da Zero
500
La Stampa con Visual Basic
Come già accennato nel capitolo delle Finestre di Dialogo, la stampa con Visual Basic merita
un capitolo a sé, in quanto si tratta di un argomento particolarmente complesso. Va detto,
innanzi tutto, che esistono dei componenti aggiuntivi di terze parti che facilitano la stampa
rispetto alle funzionalità incluse in Visual Basic, che a prima vista in effetti risultano piutto-
sto complesse, tanto che buona parte dei programmatori opta quasi subito per l’adozione
di queste soluzioni alternative. Io vi suggerisco di studiarvi invece questo capitolo prima di
trarre delle conclusioni in quanto queste “soluzioni alternative” spesso e volentieri hanno
un costo che non giustifica il risultato finale, anche se in alcuni casi arrivano al risultato
molto prima delle funzionalità di stampa incluse in Visual Basic.
Per stampare avete bisogno sostanzialmente di tre controlli presenti fra i tanti disponibili in
Visual Basic:
Quindi per iniziare la nostra avventura è necessario includere in un Form questi tre controlli.
L’esempio che viene mostrato in questa capitolo è particolarmente complesso perché prova
a coprire quanti più argomenti possibile, in modo da fornire un quadro abbastanza ampio
di quello che rappresenta la stampa in Visual Basic.
Ovviamente ai dati statici del progetto, come i dati dei clienti e dei prodotti, vanno sostituite
variabili magari prelevate da un database di Access, MySQL o SQLServer, e quindi questa
parte del progetto spetta a voi.
Il progetto presenta una casella combinata (ComboBox) e due pulsanti. La casella combi-
nata serve per scegliere la tipologia del documento da stampare, in questo caso Fattura o
documento di trasporto ecc., mentre i pulsanti servono per lanciare la stampa su carta o in
PDF.
Nell’evento click del pulsante Stampa troverete questa parte di codice:
PrintPreviewDialog1.ControlBox = True
PrintPreviewDialog1.UseAntiAlias = True
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog()
Serve per visualizzare la casella di controllo sulla barra del titolo della finestra (in pratica in
alto a destra comparirà o meno la X per chiudere la finestra).
PrintPreviewDialog1.ControlBox = True
Tutto il resto del codice si trova nell’evento PrintPage del controllo PrintDocument1 che si
genera facendo doppio click sul controllo in basso nella finestra di progettazione. Se avete
dubbi controllate il codice allegato al libro.
Questa parte del codice gestisce la tipologia di caratteri e lo spessore degli elementi grafici
presenti nella stampa della pagina. Per maggiori informazioni potete consultare il capitolo
che tratta del disegno con Visual Basic.
Dim Y As Integer
La variabile Y viene utilizzata per determinare in qual punto della pagina stampare, si rife-
risce a un punto sulla verticale. (come l’asse delle Y in un grafico)
Crea una variabile che poi servirà per allineare rispetto al margine di 30 punti gli elementi
grafici.
Dim MargineSinistro As Integer = 30
Queste due variabili che seguono sono state utilizzate per rendere il programma più leggi-
bile. Recupera dalle impostazioni della pagina quanto è alta la pagina in punti.
Dim AltezzaPagina As Integer = e.PageBounds.Height
Recupera l’altezza del font in punti. Questo può essere utili per adattare il numero delle
righe che vengono stampante per pagina a seconda della grandezza del carattere. Più
grande è il carattere minore sarà il numero delle righe che possono essere stampate in una
pagina.
Dim AltezzaFont3 As Integer = Int(Font3.GetHeight(e.Graphics))
Il codice che segue è un esempio di come sia possibile stampare un logo o un’immagine,
che si trova da qualche parte nel vostro computer, e inserirla nella stampa di un documento.
Questo ovviamente è solo un esempio. Ulteriori considerazioni le troverete nel capitolo che
riguarda il disegno di un’immagine con VB.NET. Non dovreste avere difficoltà a interpretare
queste linee di codice.
Questa parte di codice crea un rettangolo dove poi si andrà ad inserire i dati che riguardano
l’azienda.
In questa parte invece stampa fisicamente il riquadro con i dati dell’azienda. La stringa con
i dati dell’azienda l’ho omessa ma si trova nel codice nell’esempio.
'Disegna il box
e.Graphics.DrawRectangle(Pens.White, RiquadroAzienda)
'Disegna la stringa inserendola dentro al box
e.Graphics.DrawString(DatiAzienda, Font4, Brushes.Black,
RectangleF.op_Implicit(RiquadroAzienda), FormatoAzienda)
Segue tutta una parte di codice di facile interpretazione che serve sostanzialmente a creare
i riquadri con le informazioni e a scriverci dentro le stesse.
La Stampa con Visual Basic
503
Questa istruzione calcola quante righe posso entrare nella pagina basandosi sullo spazio già
occupato da tutti i riquadri che abbiamo già stampato, diviso la grandezza del carattere con
cui vengono stampate le righe degli articoli in fattura.
Interlinea = Font3.GetHeight(e.Graphics)
Questa parte riguarda il primo loop, ovvero il ciclo si ripete per ogni articolo presente in
fattura. Ovviamente qui i dati sono statici. Nel codice di esempio troverete, nei commenti,
le righe di codice che servono per collegarsi con un controllo DataGridView.
For j = 1 To RigheperPagina
'Quantità - Colonna 6
QuantitaRiga = 15
e.Graphics.DrawString(Format(QuantitaRiga, "##,##"),
Font4, Brushes.Black, 555, Y, FormatoStringa)
'Prezzo Unitario
PrezzoUnitarioRiga = 39.5
e.Graphics.DrawString(Format(PrezzoUnitarioRiga, "##.00"),
Font4, Brushes.Black, 612, Y, FormatoStringa)
'Sconto Cliente
ScontoRiga = 30
e.Graphics.DrawString(Format(ScontoRiga, FormatoZero), Font4,
Brushes.Black, 655, Y, FormatoStringa)
'Imponibile
ImponibileRiga = QuantitaRiga * PrezzoUnitarioRiga
ImponibileRiga = ImponibileRiga - (ImponibileRiga / 100 * ScontoRiga)
e.Graphics.DrawString(Format(ImponibileRiga, "##,##.00"),
Font4, Brushes.Black, 712, Y, FormatoStringa)
'Aliquota %
VAT = 0
e.Graphics.DrawString(VAT, Font4, Brushes.Black, 746, Y, FormatoStringa)
'Codice Aliquota
e.Graphics.DrawString("40", Font4, Brushes.Black, 770, Y, FormatoStringa)
Riga = Riga + 1
'quando la riga di stampa è arrivata alla fine della griglia degli articoli
' stampa il piè di pagina
If Riga = TotaleRighe Then
Exit For
End If
Next j
Il resto del codice stampa il piè di pagina, ovvero tutte le informazioni che si trovano dopo
le righe degli articoli della fattura, oltre ad un secondo loop che stampa le aliquote iva
qualora ne fossero presenti più di una nel documento.
Questa che segue è una della parti più importanti. Quando termina la parte del codice che
riguarda il piè di pagina e si arriva all’etichetta (Uscita:), se dopo i vari incrementi della
variabile riga, che viene incrementata per ogni articolo stampato nel documento, il totale
delle righe è ancora maggiore significa che ci sono ulteriori articoli da stampare e quindi
necessitiamo di un’ulteriore pagina.
Uscita:
'nel caso che il numero degli articoli sia elevato e il documento necessiti di altre pagine
NumeroPagina = NumeroPagina + 1
e.HasMorePages = True
Else
e.HasMorePages = False
Riga = 0
NumeroPagina = 1
End If
Viene generata una nuova pagina e, per ogni nuova pagina, viene ripetuta tutta la parte
del codice che sta nell’evento PrintPage del controllo PrintDocument1.
e.HasMorePages = True
Se invece il totale delle righe risulta essere uguale alla variabile riga allora non c’è bisogno
di ulteriori pagine.
e.HasMorePages = False
In questo modo siete in grado di stampare anche documenti molto complessi. La parte più
lunga quando si sviluppa un programma di stampa sta nel posizionare correttamente tutti
gli elementi nel foglio, cosa che spesso necessita di molti tentativi. Fortunatamente dispo-
niamo dell’anteprima di stampa che ci permette di risparmiare carta.
Riepilogando il funzionamento essenziale della procedura avremo:
La Stampa con Visual Basic
505
Importo la libreria che contiene gli oggetti grafici:
Imports System.Drawing.Printing
Riga è una variabile che viene incrementata tutte le volte che stampa una riga per valutare
a che punto si trova la stampa. Attenzione, le sole righe che vengono ripetute nel docu-
mento, in questo caso le righe dei prodotti della fattura (potrebbe essere anche una lista di
nomi).
è una variabile che memorizza il numero della pagina che viene stampata (compare sulla
stampa)
In questa parte di codice vengono inizializzate le variabili e il controllo per l’anteprima della
pagina.
Riga = 0
NumeroPagina = 1
PrintPreviewDialog1.UseAntiAlias = True
PrintPreviewDialog1.ControlBox = True
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog()
End Sub
Poi disegna alcuni riquadri e altri elementi grafici, riquadri, immagini, linee ecc.
'Disegna il Logo con l'intestazione della ditta inserire ***** il codice qui
TotaleRighe = DataGridView1.RowCount
Questo è il loop principale. Dopo aver stampato l’intestazione del documento ne stampa le
righe delle informazioni. Questo loop viene eseguito fino a quando non si raggiunge il limite
massimo per pagina, contenuto nella variabile RigheperPagina oppure quando la Riga di
stampa, ovvero quella che è stata appena stampata, raggiunge il Totale delle righe (Totale-
Righe) da stampare.
For j = 1 To RigheperPagina
'quando la riga di stampa è arrivata alla fine della griglia degli articoli
' stampa il piè di pagina
If Riga = TotaleRighe Then
Exit For
End If
Next j
Questo è il secondo loop. È su esempio nel caso vi trovaste a gestire una altro riepilogo di
dati.
For j = 0 To NumeroAliquote - 1
La Stampa con Visual Basic
507
'**************************
' Riepilogo aliquote IVA **
'**************************
' Stampa dettagli aliquote iva inserite il codice qui
Y = Y + 20
Next j
Quando nel caso che il numero degli articoli sia elevato e il documento necessiti di altre
pagine. Tenete presente che:
TotaleRighe Rappresenta il numero totale delle righe del documento ottenuto dalla Da-
taGridView che li visualizza a schermo.
Riga È una variabile che conta quante righe sono già stampate
RigheperPagina È il calcolo approssimativo di quante righe possono entrare in un pagina
tenendo presente la grandezza del carattere utilizzata.
Interlinea Dentro questa variabile troverete quanto vale la distanza fra riga e riga
tenendo presente il tipo di carattere (Font) utilizzato per la stampa delle
righe di riepilogo.
Quando il computer alla fine della procedura incontra questa parte di codice valuta se il
totale delle righe è ancora maggiore della numero di righe già stampate.
NumeroPagina = NumeroPagina + 1
e.HasMorePages = True
Else
e.HasMorePages = False
Riga = 0
NumeroPagina = 1
End If
End Sub
End Class
NumeroPagina = NumeroPagina + 1
e.HasMorePages = True
e.HasMorePages = False
Riga = 0
NumeroPagina = 1
VisualBasic.NET 2019 – Partendo da Zero
508
Stampa di un documento in PDF
Stampare un documento in formato PDF non è un’operazione complessa. Vale quando detto
fin qui con poche varianti sul tema. Il codice qui si seguito crea un file dove viene memo-
rizzato in formato PDF il documento che compare nell’anteprima di pagina come ad esempio
un documento come quello del caso precedente. L’unica cosa che cambia sono queste righe
di programma:
La prima riga sceglie come stampante di destinazione il componente Microsoft Print to PDF
presente fra le stampanti nel sistema operativo Windows 10.
Imposta la stampante:
PrintDocument1.PrinterSettings.PrinterName = "Microsoft Print to PDF"
Attiva la stampa su file. Quando si stampa con un qualsiasi programma, nella finestra di
dialogo, avrete senz’altro notato un riquadro con un segno di spunta che riporta: Stampa
su File. Normalmente questa caratteristica è impostata su False.
PrintDocument1.DefaultPageSettings.PrinterSettings.PrintToFile = True
Il resto del codice qui di seguito semplicemente crea un nome valido per il file che state
stampando. Dato che il programma, da dove proviene questo codice, era stato studiato in
origine per la fatturazione, prende la data odierna, il numero della fattura e la tipologia del
documento, ovvero fattura o documento di trasporto ecc., e miscelando queste tre infor-
mazioni crea un nome del file che il computer può visualizzare facilmente in ordine di data.
Ad esempio se la data del documento è 25/03/2021 la prima parte del nome del file diventa
“20210325”. In questo modo quando si apre la cartella dove si trovano questi documenti il
computer li mette naturalmente in ordine di data cominciando dall’anno, il mese e il giorno.
'LeggiCliente()
Riga = 0
NumeroPagina = 1
'A questo punto alla stringa viene aggiunto anche il nome del
'file oltre che il percorso
PercorsoFilePDF = PercorsoFile & NomeFile
'*******************************
'** Stampa PDF per Windows 10***
'*******************************
PrintDocument1.PrinterSettings.PrinterName = "Microsoft Print to PDF"
PrintDialog1.Document = PrintDocument1
PrintDocument1.DefaultPageSettings.PrinterSettings.PrintToFile = True
PrintDocument1.DefaultPageSettings.PrinterSettings.PrintFileName = PercorsoFilePDF
PrintDocument1.Print() 'Stampa il file PDF
Cursor = Cursors.Default
Formatta una data in senso inverso a quello a cui siamo abituati, Anno, Mese e Giorno.
Dim DataDoc As String = Format(DataDocumento, "yyyyMMdd")
Formatta un numero e lo rende a lunghezza fissa (lo si evince dal numero degli zeri) riem-
piendo con degli zeri la lunghezza mancante, ad esempio 125 lo trasforma in “000125”
Dim NumeroDoc As String = Format(NumeroDocumento, "000000")
Crea una stringa che rappresenta il nome del file concatenando le informazioni:
NomeFile = DataDoc & Tipofile & NumeroDoc & ".pdf"
VisualBasic.NET 2019 – Partendo da Zero
510
Specifica il percorso del file, ovvero in quale cartella finirà quel file.
PercorsoFile = "C:\Users\" & NomeUtente & "\Documents\Documenti Emessi\" &
AnnoDocumento & "\"
Questa parte di codice crea la cartella Documenti Emessi nel caso non esistesse.
Un file XML su può aprire anche col Blocco Note di Windows, perché in pratica si tratta di
un normale file di testo con estensione .xml anziché .txt
In un file XML la sede di un’azienda potrebbe, ad esempio, essere identificata così:
<Sede>
<Indirizzo>VIA GUGLIELMO MARCONI</Indirizzo>
<NumeroCivico>32</NumeroCivico>
<CAP>40137</CAP>
<Comune>BOLOGNA</Comune>
<Provincia>BO</Provincia>
<Nazione>IT</Nazione>
</Sede>
Quindi ci sono forti analogie con il linguaggio HTML, quello utilizzato per costruire pagine
Web per intenderci. È presente un tag di apertura e uno di chiusura (si riconosce dal simbolo
/) entro i quali sono presenti i dati.
Ci sono altri tag che racchiudono blocchi di informazioni, come ad esempio <Sede> e
</Sede> oppure tag che identificano una ripetizione di linee come ad esempio le righe di
una fattura che contengono la lista dei prodotti.
<DettaglioLinee>
<NumeroLinea>8</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>ISBN</CodiceTipo>
<CodiceValore>978-88-89600-60-3</CodiceValore>
</CodiceArticolo>
<Descrizione>DIVENTA PROGRAMMATORE PARTENDO DA ZERO</Descrizione>
<Quantita>39.00</Quantita>
<UnitaMisura>NR</UnitaMisura>
<PrezzoUnitario>17.775</PrezzoUnitario>
<PrezzoTotale>693.22</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N5</Natura>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>9</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>ISBN</CodiceTipo>
<CodiceValore>978-88-89600-51-1</CodiceValore>
</CodiceArticolo>
<Descrizione>EXCEL 2016 - DA PRINCIPIANTE A ESPERTO</Descrizione>
<Quantita>4.00</Quantita>
<UnitaMisura>NR</UnitaMisura>
VisualBasic.NET 2019 – Partendo da Zero
512
<PrezzoUnitario>12.825</PrezzoUnitario>
<PrezzoTotale>51.30</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N5</Natura>
</DettaglioLinee>
In questo caso ogni riga della fattura corrisponde ad un articolo che avrà un prezzo, una
quantità, un’unità di misura e via discorrendo. Ogni riga della fattura è identificata con tutto
ciò che si trova entro questi due Tag.
<DettaglioLinee>
</DettaglioLinee>
<CodiceArticolo>
<CodiceTipo>ISBN</CodiceTipo>
<CodiceValore>978-88-89600-60-3</CodiceValore>
</CodiceArticolo>
E quindi da altre caratteristiche proprie come la descrizione, unità di misura, prezzo e altro.
La cosa importante è ricordare che quando si trova il tag che identifica una caratteristica ci
deve essere la sua controparte di chiusura, che può essere sulla stessa riga se i dati sono
limitati ad una caratteristica come ad esempio il prezzo, oppure può essere anche molto
lontana se definisce un blocco di informazioni come ad esempio:
<DettaglioLinee>
<CodiceArticolo>
<CodiceTipo>ISBN</CodiceTipo>
<CodiceValore>978-88-89600-60-3</CodiceValore>
</CodiceArticolo>
<Descrizione>DIVENTA PROGRAMMATORE PARTENDO DA ZERO</Descrizione>
<Quantita>39.00</Quantita>
<UnitaMisura>NR</UnitaMisura>
<PrezzoUnitario>17.775</PrezzoUnitario>
<PrezzoTotale>693.22</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
</DettaglioLinee>
Proprio perché possono identificare e delimitare un blocco anche piuttosto corposo di infor-
mazioni.
Un file XML ha una struttura estremamente variabile che dipende da come sono strutturati
i dati. Ad esempio, una fattura elettronica è articolata in una miriade di blocchi, ma è pos-
sibile identificarne due fra i principali, la testata (Header) e il corpo (Body) delle informa-
zioni. Quando i documenti adottando uno standard risulta molto più facile classificarli e
consultarli o creare dei programmi di analisi dei dati ad hoc.
XML
513
<FatturaElettronicaHeader>
………………
………………
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
………………
………………
</FatturaElettronicaBody>
</ns>
Nel codice allegato al libro ho proposto due progetti, uno piuttosto semplice che analizza e
crea uno schema XML della struttura di un database e lo salva in un file XML, mentre l’altro
un po' più complesso, dove oltre alla struttura vengono allegati anche i dati.
Il progetto presenta tre button, tre textbox e una listbox. Non scenderò in dettagli sullo
standard XML e su tutte le considerazioni del caso, ma cercherò di limitarmi al minimo
indispensabile per diventare subito produttivi. Come esempio viene utilizzato il database
world che si trova nel server MySQL che avete installato sulla macchina dove sviluppate. Il
programma funziona con tutti i database, purché non particolarmente voluminosi in quanto
la generazione del file XML necessiterebbe di diverso tempo. Il codice completo del progetto
e riportato nel box successivo.
Imports MySql.Data.MySqlClient
Imports System.Xml
Public Class Form1
USERID = "root"
Password = "VBdazero2019"
ServerName = "127.0.0.1"
t_Utente.Text = USERID
t_Password.Text = Password
t_IndirizzoIP.Text = ServerName
p_XML.Enabled = False
p_Disconnetti.Enabled = False
End Sub
Cursor = Cursors.WaitCursor
VisualBasic.NET 2019 – Partendo da Zero
514
ListBox1.Items.Clear()
USERID = Trim(t_Utente.Text)
Password = Trim(t_Password.Text)
ServerName = Trim(t_IndirizzoIP.Text)
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
ListBox1.Items.Add(Riga("Database_Name"))
Next
p_Disconnetti.Enabled = True
p_Connetti.Enabled = False
Cursor = Cursors.Default
End Sub
Cursor = Cursors.WaitCursor
USERID = Trim(t_Utente.Text)
Password = Trim(t_Password.Text)
ServerName = Trim(t_IndirizzoIP.Text)
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
Connessione.Close()
writer.WriteStartElement("Tabella")
writer.WriteElementString("Nome", Riga("Table_Name"))
NomeTabella = Riga("Table_Name")
Connessione.Open()
Do While LettoreDati.Read()
For Each Riga1 As DataRow In SchemaTabella.Rows 'Ripete i campi per ogni record
NomeCampo = Riga1(0).ToString
Try
writer.WriteElementString(NomeCampo, LettoreDati.GetString(NomeCampo))
Catch
writer.WriteElementString(NomeCampo, " ")
End Try
Next
Comando = Nothing
LettoreDati = Nothing
Connessione = Nothing
writer.Flush()
Next
writer.WriteEndElement()
writer.WriteEndDocument()'Tag di chiusura dell'intero documento
End If
Cursor = Cursors.Default
End Sub
End Sub
End Class
Innanzitutto vanno importate queste due librerie che permettono rispettivamente di colle-
garsi ad un server MySQL e di accedere agli oggetti XML di Visual Basic.
Imports MySql.Data.MySqlClient
Imports System.Xml
Adesso analizziamo le parti salienti. Questo codice può essere utilizzato come base per
vostri progetti futuri o per modifiche che rendano ancora migliore il progetto stesso.
La prima parte del codice ci permette di collegarci al server per prendere la lista dei data-
base e visualizzarli nella listbox.
XML
517
Cursor = Cursors.WaitCursor
ListBox1.Items.Clear()
USERID = Trim(t_Utente.Text)
Password = Trim(t_Password.Text)
ServerName = Trim(t_IndirizzoIP.Text)
Try
Connessione.Open()
Catch Eccezione As System.Exception
Cursor = Cursors.Default
MsgBox(Eccezione.Message)
Exit Sub
End Try
ListBox1.Items.Add(Riga("Database_Name"))
Next
p_Disconnetti.Enabled = True
p_Connetti.Enabled = False
Cursor = Cursors.Default
End Sub
Viene creata in memoria una tabella che recupera la lista dei database dall’oggetto connes-
sione, e quindi la passa alla listbox.
ListBox1.Items.Add(Riga("Database_Name"))
Next
Adesso passiamo alla parte più importante che serve appunto per generare il file XML.
Innanzitutto, se nessun database è selezionato dalla lista, questa linea di codice impedisce
semplicemente di andare avanti nel programma.
VisualBasic.NET 2019 – Partendo da Zero
518
If ListBox1.SelectedIndex = -1 Then Exit Sub
Quindi dopo aver preparato la connessione ai dati, crea una stringa col percorso del file
dopo la generazione, che di solito è la cartella Documenti del computer. Questo percorso
può essere modificato a piacimento a secondo delle vostre necessità o preferenze.
Nella variabile Database viene memorizzato il nome del database per la connessione.
Questa riga di codice permette di accedere alle impostazioni del generatore XML, dopo aver
creato un oggetto che si chiama settings. (potete anche chiamarlo impostazioni o come
desiderate)
settings.Indent = True
settings.NewLineOnAttributes = True
settings.IndentChars = (ControlChars.Tab)
settings.OmitXmlDeclaration = False
La riga successiva serve per scrivere, nel file XML, ogni attributo in una nuova riga con un
livello aggiuntivo di rientro. L’indentazione serve per rientrare le righe del codice esatta-
mente come si fa in Visual Basic per rendere più leggibile il codice. Inoltre viene impostato
che ciascun attributo sia disposto su righe diverse con un livello aggiuntivo di rientro. (Lo
spazio che c’è fra il margine sinistro e la riga di codice)
settings.Indent = True
settings.NewLineOnAttributes = True
settings.IndentChars = (ControlChars.Tab)
Fa in modo di non omettere la dichiarazione inziale di un file XML, che fa capire che quello
che segue ha un formato XML.
<?xml version="1.0" encoding="utf-8"?>
settings.OmitXmlDeclaration = False
Creo un oggetto di nome writer che servirà per scrivere il file XML. Vengono assegnate
all’oggetto il percorso e il nome del file, che per semplicità è lo stesso del database, e le
impostazioni fatte nelle righe precedenti.
Viene aggiunto un tag con il nome del file all’interno del documento XML.
XML
519
writer.WriteStartElement("ns", NomeFile)
<Database>
<Nome>world</Nome>
</Database>
Inizia un loop che termina quando ha ripetuto una certa procedura per ogni tabella presente
nel database.
Per ogni tabella è necessario raggruppare i vari record, ogni record come vedete presenta
più campi. Quindi il valore di ogni campo viene riportato nella struttura e identificato con i
relativi tag. Tutti i record vengono ripetuti fino all’ultimo record di una tabella, quindi tro-
veremo il tag di chiusura per passare alla tabella successiva. Nell’esempio sottostante, per
semplicità, si vedono solo i primi due record della tabella. Ogni campo è delimitato dal suo
tag come cosi i record e le tabelle. Per quanto riguarda quest’ultimi, dato che contengono
più dati strutturati al loro interno, è probabile che il tag di chiusura sia anche piuttosto
distante da quello di apertura.
<Tabella>
<Tabella>city</Tabella>
<Record>
<ID>1</ID>
<Name>Kabul</Name>
<CountryCode>AFG</CountryCode>
<District>Kabol</District>
<Population>1780000</Population>
</Record>
<Record>
<ID>2</ID>
<Name>Qandahar</Name>
<CountryCode>AFG</CountryCode>
<District>Qandahar</District>
VisualBasic.NET 2019 – Partendo da Zero
520
<Population>237500</Population>
</Record>
</Tabella>
Attenzione al fatto che aperture e chiusure devono tornare altrimenti è probabile che Visual
Basic restituisca un errore impedendo la creazione del file risultante. Perdersi fra i vari tag
è più facile di quanto non crediate.
writer.WriteStartElement("Tabella")
writer.WriteElementString("Nome", Riga("Table_Name"))
Le prossime righe recuperano il nome della tabella e creano un comando SQL che serve per
recuperare i dati dalla tabella stessa, ovvero i dati e i nomi dei campi.
NomeTabella = Riga("Table_Name")
StringaSQL = "Select * FROM " & Riga("Table_Name")
Si crea una connessione utilizzando la stringa che abbiamo visto prima, tenendo presente
che il lettore dati è un oggetto della classe MySqlDataReader, dichiarato prima del loop. Per
ogni tabella viene ripetuta questa procedura. Con le due righe successive viene recuperato
lo schema della tabella, ovvero il nome dei campi che si trovano nella tabella.
LettoreDati = Comando.ExecuteReader()
SchemaTabella = LettoreDati.GetSchemaTable()
Questo loop si ripete fino a quando non ha letto tutti i record della tabella, e crea dei tag di
apertura e di chiusura con il nome del campo e il relativo contenuto. Da notare che, nel
caso un campo assumesse il valore Null, ovvero e sempre stato vuoto fin dalla sua crea-
zione, lo scrittore dei dati XML può generare un’eccezione e bloccare l’esecuzione del pro-
gramma. Quindi, è necessario inserire un blocco Try, Catch, End Try per porre rimedio a
questo problema.
Do While LettoreDati.Read()
For Each Riga1 As DataRow In SchemaTabella.Rows 'Ripete i campi per ogni record
NomeCampo = Riga1(0).ToString
Try
writer.WriteElementString(NomeCampo, LettoreDati.GetString(NomeCampo))
Catch
XML
521
writer.WriteElementString(NomeCampo, " ")
End Try
Next
Loop
Al termine del loop interno inserisce il tag di chiusura della tabella. Elimina la connessione
e il lettore dei dati i modo da resettarli per la connessione successiva, e ripete il ciclo prin-
cipale, identificato con Next, per la tabella successiva. Quando ha finito le tabelle del data-
base inserisce il tag di chiusura nel documento e invia i dati al generatore di file XML. Quindi
crea il file vero e proprio e termina la procedura. Viene rifatta la connessione al database
perché questa accede alla singola tabella per verificarne le caratteristiche.
Comando = Nothing
LettoreDati = Nothing
Connessione = Nothing
writer.Flush()
Next
writer.WriteEndElement()
writer.WriteEndDocument()'Tag di chiusura dell'intero documento
Andate adesso nella cartella dove l’applicazione ha salvato il file e verificate il funziona-
mento dell’applicazione.
Il metodo Flush() scarica il contenuto del buffer dei dati che si sono accumulati nell’oggetto
XmlWriter. Questo oggetto fornisce un metodo veloce per generare flussi di dati o, come
nel nostro caso, file contenenti dati formattati come XML.
writer.Flush()
Il metodo Close() chiude l’oggetto writer e scrive i dati scaricati dal buffer dei dati nel file
XML. Queste righe fanno un controllo per verificare che l’oggetto non sia già stato chiuso.
I metodi principali per scrivere gli elementi sono: WriteElementString che scrive un ele-
mento che contiene una stringa di caratteri.
Stringa1 = "Database"
Stringa2 = "World"
writer.WriteElementString(Stringa1, Stringa2)
VisualBasic.NET 2019 – Partendo da Zero
522
Risultato:
<Database>World</Database>
Stringa1 = "Database"
Risultato:
<Database>
………………
</Database>
writer.WriteEndDocument()
writer.Flush()
writer.Close()
Distribuire un’applicazione
523
Distribuire un’applicazione
Quando un progetto è terminato se lo si vuole installare su altri computer o distribuire ad
un cliente o agli amici è necessario creare quello che in gergo viene chiamato il Setup del
programma. Fate click sul menu Compilazione in alto nella finestra e dalla lista scegliete
la voce Pubblica seguita dal nome del vostro progetto.
Come mostra la figura successiva potete creare un pacchetto di installazione per distribuirlo
attraverso il un CD-ROM o DVD-ROM ma sono possibili anche altre soluzioni che trascure-
remo al momento.
VisualBasic.NET 2019 – Partendo da Zero
524
Al termine della procedura che di solito dura pochi secondi a seconda anche della consi-
stenza del programma, si apre automaticamente sullo schermo la finestra dove si trovano
i file che verranno utilizzati per l’installazione. Il programma Setup provvederà all’installa-
zione della vostra applicazione.
Ovviamente è inutile farla partire dal vostro computer in quanto il funzionamento è assicu-
rato. Se volete verificare veramente che tutto funzioni come si deve, dovete installarlo su
un computer che non sia il vostro dove è probabile che manchi qualche componente che
dovrete provvedere ad installare in modo indipendente, come ad esempio le librerie Con-
nector.net di MySQL.
VisualBasic.NET 2019 – Partendo da Zero
526
Appendici
Le parole chiave in Visual Basic.
Questo elenco riporta le parole chiave del linguaggio Visual Basic che non possono essere
utilizzate per identificare variabili o altri elementi di programmazione come ad esempio
routine o funzioni, perché genererebbero degli errori. È possibile superare questa restrizione
racchiudendo il nome tra parentesi quadre [].
MySQL:
https://www.mysql.com/it/
https://www.mysql.com/it/downloads/
Indice