12.07.2015 Views

Dispensa ed Esercizi in Linguaggio Visual Basic - Teletu

Dispensa ed Esercizi in Linguaggio Visual Basic - Teletu

Dispensa ed Esercizi in Linguaggio Visual Basic - Teletu

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

VISUAL BASICCos’e’ VBVB e’ un l<strong>in</strong>guaggio di programmazione che consente di realizzare applicativi eseguibili nell’ambienteMicrosoft W<strong>in</strong>dows; i progetti che vengono realizzati appaiono e funzionano come tutti i programmistandard di W<strong>in</strong>dow.Esistono cent<strong>in</strong>aia di l<strong>in</strong>guaggi di programmazione e ognuno di essi e’ nato per risolvere particolariproblemi. La maggior parte dei l<strong>in</strong>guaggi tradizionali (come P A SCA L, CO BO L, BA SI C) sono consideratil<strong>in</strong>guaggi proc<strong>ed</strong>urali nel senso che il programma specifica passo passo la seq uenza di tutte le operazioni(cioe’ la logica del programma determ<strong>in</strong>a la successiva istruzione da eseguire, <strong>in</strong> risposta a condizioni ea richieste dell’utente); tali l<strong>in</strong>guaggi sono anche detti strutturati, <strong>in</strong> q uanto basati su strutture dicontrollo fondamentali (seq uenza, selezione e iterazioni) che consentono al programmatore dicontrollare il flusso del programma.A bbiamo utilizzato <strong>in</strong>oltre il l<strong>in</strong>guaggio SQ L, che e’ un l<strong>in</strong>guaggio non proc<strong>ed</strong>urale ma strutturato, checonsente di realizzare le operazioni fondamentali sulle basi di dati (proiezione, selezione econgiunzione). I nfatti esistono anche l<strong>in</strong>guaggi di programmazione non proc<strong>ed</strong>urali che utilizzano unapproccio alla programmazione diverso: la programmazione orientata agli oggetti (O O P , obj ect orient<strong>ed</strong>programm<strong>in</strong>g) e la programmazione basata su eventi; tali l<strong>in</strong>guaggi vengono anche detti “aprogrammazione visuale” (visual programm<strong>in</strong>g) e consentono di produrre software basato sull’usodell’<strong>in</strong>terfaccia grafica.Microsoft considera VB un l<strong>in</strong>guaggio basato sugli eventi, nel senso che ogni azione dell’utente (come lapressione di un tasto o il clic del mouse su un pulsante) puo’ provocare l’attivazione di un evento ch<strong>ed</strong>eterm<strong>in</strong>a l’esecuzione di una rout<strong>in</strong>e (o proc<strong>ed</strong>ura) <strong>Basic</strong> scritta dal programmatore; q u<strong>in</strong>di l’ord<strong>in</strong>e <strong>in</strong>cui viene eseguito il codice dipende dagli eventi che si verificano, che a loro volta dipendono dalleoperazioni svolte dall’utente e non prev<strong>ed</strong>ibili dal programmatore (<strong>in</strong> q uesto senso il l<strong>in</strong>guaggio e’ “nonproc<strong>ed</strong>urale” ). VB e’ comunq ue un l<strong>in</strong>guaggio strutturato perche’ utilizza le strutture di controllofondamentali.L’ambiente VBA ll’apertura del programma viene visualizzata la seguente f<strong>in</strong>estra (I D E: I ntegrat<strong>ed</strong> D evelopmentEnvironment):81234567dove:1


1. f<strong>in</strong>estra pr<strong>in</strong>cipale VB2 . barra dei menu’3. barra degli strumenti4. f<strong>in</strong>estra del form5. f<strong>in</strong>estra progetto6. casella degli strumenti (controlli VB)7. f<strong>in</strong>estra delle proprieta’ (dei form e dei controlli)8. apre la f<strong>in</strong>estra del codiceN ella casella degli strumenti sono presenti i seguenti controlli standard:CONTROLLO NOME DESCRIZIONE AZIONEPo<strong>in</strong>ter P untatore Se non e’ selezionato un altro controllo e’ sempreattivo; consente di spostare e ridimensionare ilform e i controlliPicture box Casella immag<strong>in</strong>e Crea il contenitore per grafici .bmp, .ico, .j pg, .gifche l’utente non puo’ modificareLabel Etichetta <strong>Visual</strong>izza un messaggio o un’<strong>in</strong>testazione chel’utente non puo’ modificareTex t box Casella di testo Crea un box di testo <strong>in</strong> cui l’utente puo’ <strong>in</strong>serire omodificare datiF rame Cornice Crea una cornice per contenere altri controlliCommand P ulsante di comando P ulsante di comando che esegue una azionebutton associata (O K , annulla,… )Check box Casella di controllo Consente di gestire le scelte dell’utente(vero/falso, si/no)Option button P ulsante di opzione Consente di scegliere una sola azione tra un<strong>in</strong>sieme di opzioni possibiliCombo box Casella comb<strong>in</strong>ata Consente all’utente di operare una sceltascrivendola <strong>in</strong> un box di testo o selezionando unascelta <strong>in</strong> elencoList box Casella di riepilogo P resenta all’utente una lista all’<strong>in</strong>terno della q ualepuo’ scegliereH oriz ontal- Barra di Crea una barra di scorrimento orizzontale overtical scroll scorrimento verticale per muoversi nelle liste o nei form dibar orizzontale- grande dimensione; puo’ essere usata anche perverticale<strong>in</strong>dicare la posizione attuale <strong>in</strong> un range di valoriTimer T imer Consente l’uso di un orologio per far partireun’esecuzione con uno specifico <strong>in</strong>tervallo di tempoDrive list box Casella di riepilogo P ermette all’utente di selezionare il disco (A o C)delle unita’durante l’esecuzione di un’applicazioneDirectory list Casella di riepilogo P ermette all’utente di selezionare cartelle delbox delle cartelle disco durante l’esecuzione di un’applicazioneF ile list boxCasella di riepilogo P ermette all’utente di scegliere i file durant<strong>ed</strong>ei filel’esecuzione di un’applicazioneShape Forma I nserisce nel form figure tipo rettangoli, cerchi,ellissiL<strong>in</strong>e L<strong>in</strong>ea D isegna l<strong>in</strong>ee verticali, orizzontali, obliq ueImage I mmag<strong>in</strong>e <strong>Visual</strong>izza un’immag<strong>in</strong>e BMP , JP EG, GI F, WMF oun’icona I CO e funziona da pulsante di comandoOLE Contenitore Consente al programmatore di creare applicazioni2


O LE che possono visualizzare o permettere lamodifica di dati provenienti da altre applicazioni:essi possono essere modificati all’<strong>in</strong>ternodell’applicazione nella q uale sono stati creatiData Controllo dei dati P er creare applicazioni <strong>in</strong> grado di visualizzare emanipolare le tabelle di un data baseQ uesti sono i controlli normalmente presenti nella casella degli strumenti; per aggiungere un controllosi seleziona la voce “componenti” dal menu’ di scelta rapida della casella degli strumenti, che si aprefacendo clic con il pulsante destro sulla casella stessa; viene visualizzata la f<strong>in</strong>estra di dialogo“componenti” <strong>in</strong> cui scegliere il controllo.A ltri controlli:BD GridGriglia associata al Consente di <strong>in</strong>serire un controllo che permette all’utente didatabasemanipolare i dati di una tabella di databaseCrystal Generatore di Consente di disegnare il layout di stampa, <strong>in</strong> autocomposizione,Report report attraverso una serie di f<strong>in</strong>estre di dialogoCome si lavora <strong>in</strong> VBI n VB si lavora con oggetti, che possi<strong>ed</strong>ono proprieta’ e metodi. Gli oggetti sono form e controll i; unoggetto puo’ essere un s<strong>in</strong>golo elemento di un’applicazione, oppure una <strong>in</strong>tera applicazione. Si puo’pensare ad un oggetto come ad un sostantivo (es. form: f<strong>in</strong>estra, label: etichetta, ecc.)Un form e’ una f<strong>in</strong>estra che costituisce l’<strong>in</strong>terfaccia per l’utente dell’applicazione; ogni form puo’contenere controlli, immag<strong>in</strong>i grafiche o altri form.Un controllo e’ uno strumento disegnato dal programmatore su un form utilizzando la casella deglistrumenti, per ricevere <strong>in</strong>put e visualizzare outputLe proprieta’ forniscono <strong>in</strong>formazioni relative ad un oggetto (il nome, il colore, la dimensione, ilfunzionamento, ecc); si puo’ pensare alla proprieta’ come ad un aggettivo che descrive l’oggetto.T ra le proprieta’ presenti <strong>in</strong> ogni oggetto troviamo:N ame: il nome dell’oggetto, che e’ possibile modificare (label, text box… .)Caption: e’ il nome che appare sul controllo (es pulsante) e viene assegnato dal programmatoreLe azioni associate ad un oggetto sono dette metodi; un metodo e’ un verbo della programmazioneorientata agli oggetti (show, pr<strong>in</strong>t, move, clear, ecc) e consente di def<strong>in</strong>ire il comportamento di unoggetto durante l’esecuzione dell’applicazione (piu’ avanti v<strong>ed</strong>remo diversi esempi).Un progetto VB e’ l’<strong>in</strong>sieme di form, codice e file dell’applicazione; la realizzazione di un progetto VB e’suddivisa <strong>in</strong> tre fasi:1. def<strong>in</strong>izione dell’<strong>in</strong>terfaccia utente: si imposta lo schermo che l’utente v<strong>ed</strong>ra’ q uando eseguel’applicazione; <strong>in</strong> q uesta fase si def<strong>in</strong>iscono i form e i controlli, cioe’ tutti gli oggetti che sarannousati nel progetto.2 . impostazione delle proprietà degli oggett i: si descrive ogni oggetto presente nel progettoassegnando le proprieta’, cioe’ scegliendole nella f<strong>in</strong>estra delle proprieta’.3. scrittura del codice <strong>Basic</strong>: si scrivono le rout<strong>in</strong>e necessarie per poter eseguire il progettoutilizzando il l<strong>in</strong>guaggio <strong>Basic</strong> (ad un oggetto puo’ essere associato il codice: cliccando due voltesull’oggetto o utilizzando l’apposito pulsante, viene aperta la f<strong>in</strong>estra del codice); si notera’ q uantepoche istruzioni sono necessarie per creare un potente programma W<strong>in</strong>dows (a differenza deil<strong>in</strong>guaggi proc<strong>ed</strong>urali).Come impostare il progettocreare una cartella per il progetto; ogni progetto VB presenta almeno due file:N omeform.FRM (<strong>Visual</strong> <strong>Basic</strong> Form File): e’ il file contenente il form del progetto(<strong>in</strong>izialmente i nostri progetti avranno un solo form); se il progetto e’ composta da piu’ formavremo tanti file di form3


N omeprogetto.VBP (VB P roj ect): e’ il file del progetto, che contiene i nomi (metadati) deglialtri file presenti nel progettoI noltre possono essere presenti altri file:N omeprogetto.VBW: contiene <strong>in</strong>formazioni sul formN omeprogetto.EX E: e’ il file eseguibile, che non necessita del l<strong>in</strong>guaggio VB per essereeseguito; puo’ essere creato al term<strong>in</strong>e del progetto e fornito all’utente senza il file diprogettodisegnare il primo form dell’applicazione utilizzando la casella degli strumenti, associare le proprieta’ai controlli e scrivere il codiceeseguire il progetto per controllare il funzionamento dell’applicazione (aprire il menu ESEGUI escegliere A VVI A oppure premere il pulsante A VVI A nella barra degli strumenti oppure premere F5)se il progetto funziona correttamente e’ possibile creare il file eseguibile scegliendo FI LE/ CREAnomeprogetto.EX E e specificando opzioni come il numero di versione, l’icona dell’applicazione, l’autore,ecc.; il file eseguibile consente di lanciare l’applicazione da W<strong>in</strong>dows (dopo aver chiuso l’ambiente VB)cliccando due volte sull’icona, come per q ualsiasi applicazione W<strong>in</strong>dows.O ra apprenderemo l’uso del l<strong>in</strong>guaggio svolgendo diversi esercizi, relativi ai seguenti argomentiP rogetto 1: utilizzo di form, pulsanti <strong>ed</strong> etichetteP rogetto 2 : utilizzo di caselle di testo e metodiP rogetto 3: il codice VB: dati e strutture di controlloP rogetto 4: un po’ di relax, Splash screen e def<strong>in</strong>izione di menu’P rogetto 5: gestione di vettoriP rogetto 6: gestione di fileP rogetto 7: gestione di tabelle di databaseP rogetto 8: VB e SQ LP rogetto 9: report di stampa4


PROGETTO 1 : utiliz z o di form, pulsanti <strong>ed</strong> etichetteQ uesto semplice progetto visualizza il messaggio “ciao ciao ciao” q uando l’utente clicca sul pulsante“premimi” , e si chiudera’ q uando l’utente preme il pulsante “esci” .I nnanzitutto creiamo un cartella P RO GET T O 1 e una sottocartella (ad es. P RI MO ) che conterra’ tutti ifile del progetto; entrare <strong>in</strong> ambiente VB e scegliere il tipo di progetto EX E standard; se la f<strong>in</strong>estradel form non e’ attiva, selezionarla cliccando su “f<strong>in</strong>estra progetto” (v.5).O ra disegniamo l’<strong>in</strong>terfaccia grafica.I l primo oggetto dell’applicazione e’ la f<strong>in</strong>estra del form le cui proprieta’ sono evidenziate nella f<strong>in</strong>estradelle proprieta’: il nome e’ form1 (non lo modifichiamo) e la caption pr<strong>ed</strong>ef<strong>in</strong>ita e’ form1; modifichiamo lacaption scrivendo “messaggio” : q uesto e’ il titolo che apparira’ nella barra della f<strong>in</strong>estra. P ossiamo anchemodificare il colore dello sfondo della f<strong>in</strong>estra modificando la proprieta’ Backcolor.I l secondo oggetto e’ un’etichetta (che conterra’ il testo del messaggio); disegnamola sul form; il nomee’ label1, ma possiamo modificarlo <strong>in</strong> LblMessaggio; cancelliamo la caption <strong>in</strong> modo che non appaia nullaall’<strong>in</strong>terno dell’etichetta e impostiamo la proprieta’ backcolor allo stesso colore della f<strong>in</strong>estra.I l terzo e q uarto oggetto da disegnare sul form sono pulsanti di comando; il primo pulsante ha nomepr<strong>ed</strong>ef<strong>in</strong>ito Command1 e lo modifichiamo <strong>in</strong> CmdP remimi; digitiamo la caption “premimi” e scegliamo ilfont del carattere; il secondo pulsante si chiama Command2 (lo modifichiamo <strong>in</strong> CmdEsci) , impostiamola caption “esci” e il font.Q uesto deve essere l’aspetto del form dopo aver <strong>in</strong>serito i controlli:N ameCaptionForm1messaggioN ame LblMessaggio N ame Cmdpremimi N ame CmdEsciCaption Caption premimi Caption esciFont Comic… Font Comic… Font Comic…N B e’ possibile copiare uno o piu’ oggetti usando le solite funzioni “copia” e “<strong>in</strong>colla” !O ra dobbiamo scrivere il codice, cioe’ dobbiamo associare ai controlli il codice che descrive le azioni dacompiere <strong>in</strong> corrispondenza degli eventi che accadono durante l’esecuzione del programma.P er aprire la f<strong>in</strong>estra del codice basta fare doppio clic sull’oggetto.5


I niziamo dal pulsante “premimi” : q uando l’utente clicca (provoca l’evento click) sul pulsante(CmdP remimi) deve apparire il messaggio nell’etichetta (LblMessaggio); il codice e’ il seguente:Private Sub CmdPremimi_Click()'visualizza il messaggio nell'etichettaLblMessaggio.Caption = "ciao ciao ciao"End SubT utte le rout<strong>in</strong>e <strong>in</strong>iziano con la parola riservata “private sub” e term<strong>in</strong>ano con “end sub” ;“CmdP remimi_Click()” <strong>in</strong>dica l’azione associata al pulsante; il commento <strong>in</strong>izia con ‘;LblMessaggio.caption=” ciao… ” associa all’etichetta la scritta “ciao..” , che appare q uando viene premuto ilpulsante CmdP remimi.O ra associamo il codice al pulsante “esci” :Private Sub CmdEsci_Click()'permette di term<strong>in</strong>are l'applicazioneEndEnd SubQ uando l’utente preme (click) il pulsante (CmdEsci), l’applicazione term<strong>in</strong>a (end).O ra verifichiamo il funzionamento dell’applicazione; per lanciare l’esecuzione si puo’:Scegliere ESEGUI /A VVI AP remere il pulsante avvia nella barra degli strumentiP remere F5D urante l’esecuzione il form assume q uesto aspetto:Se il programma funziona correttamente, possiamo creare l’eseguibile (EX E): scegliere FI LE/ “creanomeprogetto.exe” , decidere la dest<strong>in</strong>azione (es. la cartella progetto1) e il nome del file eseguibile (esciao).O ra dobbiamo salvare l’<strong>in</strong>tero progetto nella cartella progetto1: scegliere FI LE/SA LVA P RO GET T OCO N N O ME; vengono salvati form1 e progetto1.P er eseguire l’applicazione all’esterno dell’ambiente VB ora basta cliccare sull’ icona denom<strong>in</strong>ata “ciao” .NOTA: gli oggetti presentano dei nomi pr<strong>ed</strong>ef<strong>in</strong>iti (es. Command1, Command2 , Label1, ecc.); comeabbiamo visto q uesti nomi possono essere modificati con nomi significativi. D i solito si usa il prefissoCmd per i Command, Lbl per le label, T xt per le caselle di testo. N on e’ obbligatorio farlo, ma e’conveniente q uando un’applicazione contiene molti controlli di cui si potrebbe dimenticare il nome.N el seguito si utilizzeranno, per comodita’, i nomi pr<strong>ed</strong>ef<strong>in</strong>iti.Eserciz io: creare un’applicazione (v. figura) che visualizzi q uattro diversi proverbi a seconda delpulsante che viene premuto e che permetta di term<strong>in</strong>are premendo il pulsante uscita.6


soluzione (memorizzare tutti i file del progetto <strong>in</strong> una sottocartella della cartella P RO GET T O 1):D escrizione dei controlli utilizzati :FO RM1: name: form1; caption: “proverbi” ; font:… .ET I CHET T A : name: label1; caption: nessuna; font:… ..P ULSA N T E1: name: command1; caption: “proverbio 1” ; font:… .P ULSA N T E2 : name: command2 ; caption: “proverbio 2 ” ;font:… .P ULSA N T E3: name: command3; caption: “proverbio 3” ; font:… .P ULSA N T E4: name: command4; caption: “proverbio 4” ; font:… .P ULSA N T E5: name: command5; caption: “esci”I l codice associato ai controlli e’:Private Sub Command1 _Click()'visualizza un proverbioLabel1 .Caption = "tanto va la gatta al lardo che ci lascia lo z amp<strong>in</strong>o"End SubPrivate Sub Command2_Click()'visualizza un proverbioLabel1 .Caption = "cielo a pecorelle acqua a cat<strong>in</strong>elle"End SubPrivate Sub Command3 _Click()'visualizza un proverbioLabel1 .Caption = "meglio un uovo oggi che una gall<strong>in</strong>a domani"End SubPrivate Sub Command4 _Click()'visualizza un proverbioLabel1 .Caption = "il matt<strong>in</strong>o ha l'oro <strong>in</strong> bocca"End SubPrivate Sub Command5_Click()EndEnd SubEserciz io: creare un’applicazione con c<strong>in</strong>q uepulsanti; premendo un pulsante appare un saluto<strong>in</strong> una l<strong>in</strong>gua; premendo un altro pulsante apparelo stesso saluto <strong>in</strong> un'altra l<strong>in</strong>gua; ecc. deveessere <strong>in</strong>cluso un pulsante che permette diuscire (v.figura). Usare sempreuna sottocartella7


eserciz io. O ra costruiamo una maschera menu’ pr<strong>in</strong>cipale, che consente di aprire altre due f<strong>in</strong>estre.Q u<strong>in</strong>di realizziamo un progetto costituito da tre form, come nella figura:I l primo form (form1) contiene:Un’etichetta (labe1) con caption:” menu’ pr<strong>in</strong>cipale”Un frame (frame1) con caption: scelteUn pulsante di comando (command1 del form1) a cui e’ associato il codice per l’uscita dal programmaD ue pulsanti di opzione (option1 con caption: “prima f<strong>in</strong>estra” e option2 con caption: “secondaf<strong>in</strong>estra” ) a cui e’ associato il codice per l’apertura delle rispettive f<strong>in</strong>estreI l secondo form (form2 ) contiene:Un’etichetta (labe1 nel form2 ) con caption:” prima f<strong>in</strong>estra”Un pulsante di comando (command1 del form2 ) a cui e’ associato il codice per chiudere la f<strong>in</strong>estra,cioe’ scaricare il form da memoria centrale e consentire di visualizzare il menu’ pr<strong>in</strong>cipaleA nalogamente il terzo form (form3) contiene label1 e command1I l codice associato e’:Private Sub Command1 _Click()'term<strong>in</strong>a l'esecuzione del programmaEndEnd SubPrivate Sub F orm_Load()'controlla il caricamento del form1W <strong>in</strong>dowState = 2 ‘visualizza il form a tutto schermo, ma si puo’ omettereOption1 .Value = F alseOption2.Value = F alseEnd SubPrivate Sub Option1 _Click()'visualizza il form2 "prima f<strong>in</strong>estra"F orm2.ShowEnd SubPrivate Sub Option2_Click()'visualizza il form3 "seconda f<strong>in</strong>estra"F orm3 .ShowEnd SubPrivate Sub Command1 _Click()'scarica il form2Unload MeEnd SubPrivate Sub Command1 _Click()'scarica il form3Unload MeEnd SubShow e’ un metodo che permette la visualizzazione del form; Unload Me e’ l’istruzione con cui il formscarica se stesso dalla memoria8


A i f<strong>in</strong>i della documentazione del progetto e’ possibile stampare form e codice utilizzando il comandoStampa dal menu’ File.9


PROGETTO 2: utiliz z o di caselle di testo e metodiQ uesto progetto consente di eseguire la somma di due numeri <strong>in</strong>seriti dall’utente q uando viene premutoil tasto “+” e si chiude q uando l’utente preme il pulsante “esci” .I nnanzitutto creiamo un cartella P RO GET T O 2 che conterra’ tutti i file del progetto; entrare <strong>in</strong>ambiente VB e scegliere il tipo di progetto EX E standard; se la f<strong>in</strong>estra del form non e’ attiva,selezionarla cliccando su “f<strong>in</strong>estra progetto” (v.5).O ra disegniamo l’<strong>in</strong>terfaccia grafica.I l primo oggetto dell’applicazione e’ la f<strong>in</strong>estra del form le cui proprieta’ sono evidenziate nella f<strong>in</strong>estradelle proprieta’: il nome e’ form1 (non lo modifichiamo) e la caption pr<strong>ed</strong>ef<strong>in</strong>ita e’ form1; modifichiamo lacaption scrivendo “calcola” : q uesto e’ il titolo che apparira’ nella barra della f<strong>in</strong>estra. P ossiamo anchemodificare il colore dello sfondo della f<strong>in</strong>estra modificando la proprieta’ Backcolor.I l secondo oggetto e’ un’etichetta (che conterra’ il testo “somma di due numeri” ); disegnamola sul form;il nome e’ label1; cancelliamo la caption, digitiamo il testo desiderato e impostiamo la proprieta’backcolor allo stesso colore della f<strong>in</strong>estra.I l terzo e q uarto oggetto da disegnare sul form sono pulsanti di comando; il primo pulsante ha nomeCommand1, digitiamo la caption “+” e scegliamo il font del carattere; il secondo pulsante si chiamaCommand2 , impostiamo la caption “esci” e il font.O ra disegnamo tre oggetti di tipo caselle di testo; le caselle di testo hanno nome textn (dove n <strong>in</strong>dica ilnumero di etichetta), e text impostato a textn (non esiste la proprieta’ caption); per fare <strong>in</strong> modo chela casella appaia vuota si cancella la proprieta’ text.la prima casella ha nome text1 e cancelliamo text1 dalla proprieta’ text; proc<strong>ed</strong>iamo <strong>in</strong> modo analogo perla seconda e la terza.I noltre <strong>in</strong>seriamo un controllo l<strong>in</strong>ea dopo le due caselle di testo e impostiamo la proprieta’borderwidth=2 (consente di avere una l<strong>in</strong>ea piu’ spessa).Q uesto deve essere l’aspetto del form dopo aver <strong>in</strong>serito i controlli:N ame Form1 N ame Label1Caption calcola Caption Somma…N ameT extT ext1N ameCaption +Command1N ame T ext2 N ame Cammand2T ext Caption esciN ame T ext3 N ame L<strong>in</strong>e1T ext Borderwidth 2ora associamo ai controlli il codice che descrive le azioni da compiere <strong>in</strong> corrispondenza degli eventi cheaccadono durante l’esecuzione del programma, <strong>in</strong> risposta alle azioni dell’utente.Q uando l’utente preme il pulsante “+” (command1), nella casella text3 deve apparire la somma dei duenumeri <strong>in</strong>seriti; q uando l’utente preme “esci” (command2 ) l’applicazione term<strong>in</strong>a:Private Sub Command1 _Click()10


'calcola la somma dei numeri <strong>in</strong>seriti nelle caselle'di testo text1 e text2Tex t3 .Tex t = Val(Tex t1 .Tex t) + Val(Tex t2.Tex t)End SubPrivate Sub Command2_Click()'esce dal programmaEndEnd SubVal e’ una funzione che restituisce il valore numerico del contenuto di una casella di testo.Verifichiamo il funzionamento dell’applicazione, creiamo il file eseguibile e salviamo il progetto nellacartella P RO GET T O 2 .P erfezioniamo l’applicazione! Riapriamo il nostro progetto.Vogliamo <strong>in</strong>serire un pulsante che azzera il contenuto delle tre caselle contenenti gli operandi e ilrisultato, per ripetere l’operazione; <strong>in</strong>oltre, dopo l’azzeramento, il cursore deve apparire nella primacasella di testo per <strong>in</strong>serire un nuovo numero.I nseriamo sul form un pulsante command3 impostandone la caption a “azzera” ; il codice da associare alcomando e’:Private Sub Command3 _Click()'azzera le caselle di testo'e riporta il cursore sulla primaTex t1 .Tex t = " "Tex t2.Tex t = " "Tex t3 .Tex t = " "Tex t1 .SetF ocusEnd SubSetfocus e’ un metodo che riporta il cursore nella prima casella di testo. P ossiamo anche fare <strong>in</strong> modoche, dopo aver premuto il tasto “+” <strong>ed</strong> aver visualizzato il risultato, sia attivo il tasto“azzera” (command3); associamo alla casella del risultato (text3) il codice:Private Sub Tex t3 _Change()'porta il cursore sul pulsante "azzera"Command3 .SetF ocusEnd SubUn ultimo perfezionamento: q uando si lancia per la prima volta l’applicazione il cursore non appare nellaprima casella di testo; per fare <strong>in</strong> modo che cio’ avvenga bisogna associare al caricamento del form taleazione:Private Sub F orm_Load()'sposta il cursore sulla prima casella di testoF orm1 .ShowTex t1 .SetF ocusEnd SubI l metodo show visualizza il form dell’applicazione (form1); dopo aver mostrato il form, il cursore vienespostato sulla prima casella di testo (text1).11


Eserciz io creare un’applicazione (come <strong>in</strong> figura) che permetta di eseguire le q uattro operazionifondamentali premendo q uattro pulsanti con i relativi simboli; deve essere presente anche un pulsant<strong>ed</strong>i azzeramento (c) e di uscita (off); (sappiamo che non e’ possibile dividere un numero per zero; comefare? V<strong>ed</strong>remo oltre)12


PROGETTO 3 : il codice VB: dati e strutture di controlloA tutti gli oggetti e’ associato un codice, cioe’ istruzioni scritte <strong>in</strong> l<strong>in</strong>guaggio VB; le istruzioni sonoorganizzate <strong>in</strong> rout<strong>in</strong>e, che <strong>in</strong> VB si chiamano SUB e FUN CT I O N .La SUB ha la seguente struttura:La FUN CT I O N ha la struttura:Sub nome()F unction nome (parametri) as valore….….End SubEnd F unctionD i solito Sub e Function sono prec<strong>ed</strong>ute dal tipo P RI VA T E, per <strong>in</strong>dicare una rout<strong>in</strong>e locale, cioe’ visibilesolo all’<strong>in</strong>terno del form e vengono associate ai controlli cliccando due volte sull’oggetto. Ma il codice,oltre che associato ai controlli, puo’ essere <strong>in</strong>serito nei progetti m<strong>ed</strong>iante i moduli (ricordate A ccess?):essi sono componenti dell’applicazione VB registrati <strong>in</strong> file con estensione .BA S.I l codice e’ P UBLI C per <strong>in</strong>dicare che i dati e le rout<strong>in</strong>e sono accessibili da q ualunq ue form.Una rout<strong>in</strong>e puo’ richiamare al suo <strong>in</strong>terno un’altra rout<strong>in</strong>e (scomposizione top- down):P rivate sub operando1_Ch’ange()A zzeraEnd subP rivate Sub azzera()Label1.caption = “ “End subI l l<strong>in</strong>guaggio VB e’ <strong>in</strong>terpretato (non compilato), nel senso che l’attivita’ di controllo s<strong>in</strong>tattico vieneeffettuata durante l’attivita’ di <strong>ed</strong>it<strong>in</strong>g, segnalando gli errori con un messaggio.Le caratteristiche di VB sono:Le frasi di commento <strong>in</strong>iziano con un apostrofo, <strong>in</strong> q ualsiasi punto del testoL’assegnazione di un valore ad una variabile avviene con l’istruzione: nome variabile = valoreI nomi delle variabili devono <strong>in</strong>iziare con una lettera e possono contenere numeri e lettere f<strong>in</strong>o a unmassimo di 40 caratteriI tipi di dati sono:tipo di dato Dimensione IntervalloByte 1 byte D a 0 a 2 55Boolean 2 byte T rue o falseI nteger 2 byte D a –32 768 a 32 767Long 4 byte D a –2 147483648 a 2 147483647S<strong>in</strong>gle 4 byte Virgola mobile a precisione s<strong>in</strong>golaD ouble 8 byte Virgola mobile a precisione doppiaD ate 8 byte D al 1 gennaio 100 al 31 dicembre 9999Currency 8 byte Molto grande ! per la valutaStr<strong>in</strong>g Lunghezza str<strong>in</strong>ga D a 1 a circa 65400I n VB (come <strong>in</strong> <strong>Basic</strong>) non e’ obbligatorio dichiarare le variabili prima di usarle (a differenza di P ascal,Cobol, ecc): la dichiarazione di una variabile avviene la prima volta che viene <strong>in</strong>contrata; puo’ sembrareun vantaggio perche’ rende piu’ snello il codice, ma nasconde un’<strong>in</strong>sidia: se il nome di una variabile vienesuccessivamente scritto <strong>in</strong> modo errato, viene <strong>in</strong>terpretato come una nuova variabile di cui e’ possibileperdere il controllo.E’ buona regola di programmazione dichiarare sempre le variabili; si puo’ fare <strong>in</strong> modo che vengarichiesta la dichiarazione esplicita di tutte le variabili di un modulo, <strong>in</strong>serendo l’istruzione “O ptionExplicit” nella sezione dichiarazioni del modulo; <strong>in</strong>oltre e’ possibile <strong>in</strong>serire automaticamente l’istruzione“O ption Explicit” <strong>in</strong> tutti i nuovi moduli scegliendo “O pzioni” dal menu’ “strumenti” e, nella sch<strong>ed</strong>a“A mbiente” , attivare “dichiarazione di variabili obbligatoria” .La dichiarazione deve essere fatta nella sezione “generale” per le variabili che devono essere visibili datutte le rout<strong>in</strong>e; se una variabile e’ locale puo’ essere dichiarata nella Sub che la utilizza.13


P er dichiarare i tipi di dato si usa l’istruzione D I M; per esempio, per dichiarare le seguenti variabili:dim nome as str<strong>in</strong>g, scelta as <strong>in</strong>teger…per i vettori e le matrici:dim vettore(m<strong>in</strong>imo to massimo) as long (es: dim vettore(1 to 50) as str<strong>in</strong>g)dim matrice(m<strong>in</strong>imo to Massimo, m<strong>in</strong>imo to Massimo) as <strong>in</strong>tegerN ella dichiarazione delle variabili si puo’ appendere al nome delle variabili il carattere che <strong>in</strong>dica iltipo, <strong>in</strong> q uesto modo: nomevariabile$ <strong>in</strong>vece di D im nomevariabile as str<strong>in</strong>gcarattere Tipo di dato% I nteger& Long! S<strong>in</strong>gle# D ouble@Currency$ Str<strong>in</strong>gLe strutture di controllo sono:• SelezioneP rimo modo: If condiz ione then istruz ioni[else istruz ioni]end ifSecondo modo: if condiz ione thenIstruz ioniElseif condiz ione thenIstruz ioniElseIstruz ioniEndif• Ripetizione:primo modo: do [while|until] condiz ioneistruz ioniloopsecondo modo: doistruz ioniloop [while| until] condiz ionecon contatore: for contatore=valore <strong>in</strong>iz iale to valore f<strong>in</strong>ale [step <strong>in</strong>cremento]istruz ion<strong>in</strong>ex t contatore Selezione multipla: select case selettoreCase valore1istruz ioniCase valore2Istruz ioni…case elseistruz ioniend selectesempio di selez ione: riprendiamo l’ultimo esercizio della lezione prec<strong>ed</strong>ente. Sappiamo che non e’possibile effettuare la divisione per zero; q u<strong>in</strong>di se il secondo operando e’ zero, dobbiamo gestirel’errore per evitare il blocco del programma.A ssociamo al pulsante relativo alla divisione (command2 ) un controllo sul contenuto della casella text2 :14


Private Sub Command2_Click()'calcola il q uoziente dei numeri <strong>in</strong>seriti nelle caselle'di testo text1 e text2 e controlla che il secondo numero sia diverso da zeroIf Val(Tex t2.Tex t) = 0 ThenMsgBox "impossibile dividere per z ero, <strong>in</strong>serire un altro numero"Tex t2.SetF ocusElseTex t3 .Tex t = Val(Tex t1 .Tex t) / Val(Tex t2.Tex t)End IfEnd SubMsgBox e’ una funzione che consente l’output dei risultati: visualizza un box di dialogo (il cui testo e’scritto tra virgolette “… .. “) e chi<strong>ed</strong>e all’utente di premere un pulsante di comando (v. figura: q uesto none’ un form e non deve essere disegnato dal programmatore).T ext2 .SetFocus riporta il cursore sulla casella di testo text2 per <strong>in</strong>serire un altro numero.I l problema poteva essere risolto anche <strong>in</strong> altro modo, pur utilizzando la struttura di controllo I F.Private Sub Command2_Click()'se il valore del secondo numero e' zero visualizza ERRO RE nella casella del risultatoIf Val(Tex t2.Tex t) = 0 ThenTex t3 .Tex t = "ERRORE"Tex t2.SetF ocusElseTex t3 .Tex t = Val(Tex t1 .Tex t) / Val(Tex t2.Tex t)End IfEnd SubEsempio di ripetiz ione: creare un’applicazione per il calcolo dell’ipotenusa di un triangolo rettangolo; ilprogramma offre all’utente diverse possibilita’ per effettuare il calcolo:1. <strong>in</strong>serendo i valori dei due cateti nelle apposite caselle di testo2 . scegliendo i valori dei due cateti attraverso le barre di scorrimento3. attivando un generatore automatico di numeri <strong>in</strong>teri che vengono assegnati ai due catetiN ameN ameHscroll1Hscoll2Private Sub Command1 _Click()‘calcola l’ipotenusa q uando viene premuto il pulsante “ipotenusa”Tex t3 .Tex t = Sqr(Val(Tex t1 .Tex t) ^ 2 + Val(Tex t2.Tex t) ^ 2)End SubPrivate Sub Command2_Click()‘esce dall’applicazione q uando viene premuto “f<strong>in</strong>e”EndEnd Sub15


Private Sub Command3 _Click()‘azzera le caselle di testo q uando viene premuto “azzera”Tex t1 .Tex t = " "Tex t2.Tex t = " "Tex t3 .Tex t = " "Tex t1 .SetF ocusEnd SubPrivate Sub Command4 _Click()‘effettua un calcolo automatico da 0 a 1 00 quando si preme‘“calcolo automatico”F or i = 1 To 1 00Tex t1 .Tex t = ITex t1 .RefreshH Scroll1 .Value = iF or j = 1 To 1 00Tex t2.Tex t = jTex t2.RefreshH Scroll2.Value = jTex t3 .Tex t = Sqr(i ^ 2 + j ^ 2)Tex t3 .RefreshNex t jNex t iEnd SubPrivate Sub H Scroll1 _Change()‘assegna un valore alla prima casella di testo <strong>in</strong> base alla posizione‘della barra di scorrimentoTex t1 .Tex t = H Scroll1 .ValueEnd SubPrivate Sub H Scroll2_Change()Tex t2.Tex t = H Scroll2.ValueEnd SubEffettivamente q uesto esempio di ciclo e’ molto stupido!!!I l metodo Refresh aggiorna il contenuto delle caselle di testo per ogni valore calcolato.Esempio di selez ione multipla: calcolo della radice q uadrata di un numero.I l programma accetta da tastiera un numero attraverso una f<strong>in</strong>estra di <strong>in</strong>put e ne calcola la radiceq uadrata, <strong>in</strong>tercettando le situazioni di errore (attraverso la struttura select case) che si verificanoq uando il numero e’ negativo.D isegniamo il form con i due pulsanti come nella prima figura:f<strong>in</strong>estra di <strong>in</strong>put I N P UT BO Xf<strong>in</strong>estra di output MSGBO XLe due f<strong>in</strong>estre accanto al form non devono essere disegnate <strong>in</strong> q uanto sono relative a funzioni def<strong>in</strong>itenel codice.si utilizzano:la funzione I nputbox, che consente l’<strong>in</strong>put dei dati e <strong>in</strong> cui viene specificato il testo che devecomparire nella f<strong>in</strong>estra e il titolo della f<strong>in</strong>estra; la s<strong>in</strong>tassi e’ la seguente:N O MEVA RI A BI LE = I N P UT BO X (“richiesta del dato” , “testo della f<strong>in</strong>estra (non obbligatorio)” )16


la funzione Sgn, che restituisce il segno di un numero N ; se assume valore 0 il segno e’ 0, se assumevalore 1 il segno e’ positivo, altrimenti e’ negativo; Msgbox e’ la funzione che consente l’output attraverso una f<strong>in</strong>estra di dialogo; la & serve aconcatenare le str<strong>in</strong>ghe; la s<strong>in</strong>tassi e’ la seguente:MSGBO X “testo per la visualizzazione del dato” & N O MEVA RI A BI LE, ,obbligatorio)”I l codice associato ai controlli e’ il seguente:Dim n As Double‘dichiarazione della variabile nella sezione GEN ERA LEPrivate Sub Command1 _Click()'codice associato al pulsante "radice q uadrata"n = InputBox ("<strong>in</strong>serisci il numero su cui calcolare la radice quadrata", "radice quadrata")Select Case Sgn(n)Case 1MsgBox "la radice quadrata di " & n & " è " & Sqr(n)Case 0MsgBox "la radice quadrata di " & n & " è z ero"Case ElseMsgBox "la radice quadrata di " & n & " è immag<strong>in</strong>aria"End SelectEnd Sub“testo della f<strong>in</strong>estra (nonPrivate Sub Command2_Click()'codice associato al pulsante "uscita"EndEnd SubO ra potete provare a svolgere un esercizio analogo: scrivere un’applicazione che consenta di calcolarele soluzioni di un’eq uazione di secondo grado.Utilizzate il seguente form; se non ci riuscite, q uesta e’ la soluzione:Private Sub CmdCalcola_Click()A = InputBox ("<strong>in</strong>serisci il 1 ° coefficiente", "<strong>in</strong>serimento coefficienti")B = InputBox ("<strong>in</strong>serisci il 2° coefficiente", "<strong>in</strong>serimento coefficienti")C = InputBox ("<strong>in</strong>serisci il 3 ° coefficiente", "<strong>in</strong>serimento coefficienti")DELTA = B ^ 2 - 4 * A * CSelect Case Sgn(DELTA)Case 0X = - B / 2 * AMsgBox "due soluz ioni co<strong>in</strong>cidenti; X= " & X, , "soluz ione"Case 1dichiarazione delle variabili nella sezione “generale” X1 = (- B - Sqr(DELTA)) / 2 * ADim A As Double X2 = (- B + Sqr(DELTA)) / 2 * ADim B As Double MsgBox "due soluz ioni X1 =" & X1 & " e X2=" & X2, , "soluz ione"Dim C As Double Case ElseDim DELTA As Double MsgBox "nessuna soluz ione reale", , "soluz ione"Dim X As DoubleEnd SelectDim X1 As DoubleEnd SubDim X2 As DoublePrivate Sub CmdEsci_Click()EndEnd SubEffettivamente gli esempi fatti f<strong>in</strong>ora relativamente alle strutture di controllo sono abbastanzasemplici per programmatori esperti come voi! L’<strong>in</strong>tenzione, tuttavia, e’ q uella di fornire le basi dell<strong>in</strong>guaggio e la logica di lavoro, lasciando al programmatore tutti i relativi approfondimenti del l<strong>in</strong>guaggio(utilizzando gli appositi testi e manuali).P er tale motivo non tratteremo la gestione dei vettori e delle matrici e accenneremo soltanto allagestione dei file; approfondiremo <strong>in</strong>vece il trattamento delle tabelle di database e delle q uery <strong>in</strong> SQ Lall’<strong>in</strong>terno del l<strong>in</strong>guaggio VB.17


PROGETTO 4 : Un po’ di relax , Splash screen e def<strong>in</strong>iz ione di menu’I mpariamo a gestire figure e spostamenti nel form; realizziamo un progetto contenente un’immag<strong>in</strong>e <strong>in</strong>alto a s<strong>in</strong>istra, che puo’ essere spostata utilizzando le barre di scorrimento orizzontale e verticale, perraggiungere un’altra figura <strong>in</strong> basso a destra.I l form, con caption “aiutami… ” dovra’ avere q uesto aspetto:I controlli presenti nel form sono:P rima immag<strong>in</strong>e con nome I mage1 (Calimero o altro) e picturea sceltaSeconda immag<strong>in</strong>e con nome I mage2 (P riscilla o altro) erelativa pictureBarra di scorrimento orizzontale (attenzione ad impostare leproprieta’! provate)Barra di scorrimento verticale (idem)P ulsante con nome command1 e caption “esci”A ssociamo agli oggetti il codice:Private Sub Command1 _Click()‘esce dal programmaEndEnd SubPrivate Sub H Scroll1 _Change()‘assegna un valore alla posizione dell’immag<strong>in</strong>e <strong>in</strong> base‘alla posizione della barra di scorrimento orizzontaleImage1 .Left = H Scroll1 .ValueEnd SubPrivate Sub hscroll1 _scroll()‘rende visibile l’immag<strong>in</strong>e q uando si aziona la barraImage1 .Left = H Scroll1 .ValueEnd SubPrivate Sub VScroll1 _Change()Image1 .Top = VScroll1 .ValueEnd SubPrivate Sub vscroll1 _scroll()Image1 .Top = VScroll1 .ValueEnd SubO ra vogliamo rendere un po’ piu’ sofisticata la nostra applicazione; avrete certamente osservato chenella maggior parte delle applicazioni che “girano” sotto W<strong>in</strong>dows appare una schermata dipresentazione alla partenza del software per dare <strong>in</strong>formazioni sul nome del programma, sull’autore, sulnumero di versione ecc. Q uesta schermata <strong>in</strong> genere scompare dopo un certo numero di secondi o dopola pressione di un pulsante. I n gergo <strong>in</strong>formatico q uesta schermata <strong>in</strong>iziale si chiama Splash Screen.Q u<strong>in</strong>di ora vogliamo <strong>in</strong>serire nella nostra applicazione una schermata di q uesto tipo.D al menu’ “progetto” scegliere “<strong>in</strong>serisci form” e selezionare “schermata <strong>in</strong>iziale” . Lo splash che apparecontiene diversi oggetti: teniamo l’immag<strong>in</strong>e ma cambiamo la picture scegliendo l’immag<strong>in</strong>e chepreferiamo; cancelliamo tutti gli altri oggetti e <strong>in</strong>seriamo un timer; impostiamo le proprieta’ del timer( enabl<strong>ed</strong> : true; <strong>in</strong>terval:5000; significa che l’azione associata verra’ effettuata per 5000 millisecondo,circa 5 secondi).18


Lo splash dovrebbe apparire cosi’, e scriviamo il codice associato all’oggetto timer (cliccandosull’oggetto per aprire la f<strong>in</strong>estra del codice):Private Sub Timer1 _Timer()'chiude la splash form dopo un certo numero di millisec,rende visibile la‘form1 e disattiva il timerUnload frmSplashF orm1 .Visible = TrueTimer1 .Enabl<strong>ed</strong> = F alseEnd SubN.B. l’oggetto TIMER non sara’ piu’ visibile <strong>in</strong> fase di esecuz ione!O ra dobbiamo aggiornare il codice associato al form1; clicchiamo sul form1 per aprire la f<strong>in</strong>estra delcodice e <strong>in</strong>seriamo:Private Sub F orm_Load()'rende <strong>in</strong>visibile la form1 e richiama la splash formF orm1 .Visible = F alsefrmSplash.ShowEnd SubP roviamo il progetto, creiamo l’eseguibile e salviamo.T utte le applicazioni per W<strong>in</strong>dows sono configurate <strong>in</strong> modo da poter essere utilizzati sia tramitemouse che tramite tastiera. F<strong>in</strong>ora abbiamo realizzato applicazioni che venivano gestite tramite mouse,ma si puo’ fare <strong>in</strong> modo di def<strong>in</strong>ire tasti di scelta rapida attraverso la pressione della letterasottol<strong>in</strong>eata.A d esempio, per uscire dall’applicazione prec<strong>ed</strong>ente l’utente deve ciccare con il mouse sul tasto “esci” ;ma possiamo fare <strong>in</strong> modo che l’applicazione term<strong>in</strong>i premendo “E” (cioe’ il carattere che nel tastoappare sottol<strong>in</strong>eato); per def<strong>in</strong>ire un tasto di q uesto tipo si deve <strong>in</strong>serire il carattere & (e commerciale)davanti alla lettera da usare come tasto di scelta rapida.Q u<strong>in</strong>di nell’esempio prec<strong>ed</strong>ente modifichiamo la caption “esci” , scrivendo “&esci” :L’utente avra’ la possibilta’ di muoversi nell’applicazione utilizzando i tasti (la tabulazione perpassare da un controllo ad un altro; la comb<strong>in</strong>azione A LT + la lettera sottol<strong>in</strong>eata).A vremmo anche potuto def<strong>in</strong>ire un tasto diverso, ad esempio la S, <strong>in</strong> q uesto modo: “e&sci” .P er def<strong>in</strong>ire i tasti di scelta bisogna utilizzare alcuni accorgimenti:Q uando possibile usare i tasti standard di W<strong>in</strong>dows (es.: la E per ESCI , la S per SA LVA , la F perFI LE, ecc.)A ssicurarsi di non assegnare a due controlli lo stesso tasto di sceltaUn tipo di form aggiuntivo che si puo’ usare <strong>in</strong> un progetto e’ la “f<strong>in</strong>estra <strong>in</strong>formaz ioni” come q uella chesi trova nella maggior parte dei programmi W<strong>in</strong>dows nel menu’ ?. I n genere la f<strong>in</strong>estra <strong>in</strong>formazionifornisce il nome e la versione del progetto; per crearla scegliere “progetto” , “<strong>in</strong>serisci form” eselezionare il form “f<strong>in</strong>estra <strong>in</strong>formazioni su” .Viene visualizzato il form “FrmA bout” di cui si imposta la caption, losfondo ecc. E’ possibile effettuare modifiche (modificare l’immag<strong>in</strong>e<strong>in</strong>serendone una a scelta, immettere le <strong>in</strong>formazioni e cancellare icontrolli che non <strong>in</strong>teressano come System); il controllo commandcontrassegnato con O K contiene gia’ il codice per scaricare il formq uando viene premuto e q u<strong>in</strong>di non deve essere modificato.O ra v<strong>ed</strong>remo come attivare q uesta f<strong>in</strong>estra!19


Le applicazioni per W<strong>in</strong>dows presentano <strong>in</strong> genere dei menu’, contenenti dei comandi che possono essereutilizzati <strong>in</strong> sostituzione dei pulsanti di comando: ad esempio il menu’ FI LE, che a sua volta puo’contenere il sottomenu’ A P RI , N UO VO , ST A MP A , CHI UD I … ., il menu’ VI SUA LI ZZA , ecc.Spesso le applicazioni presentano anche il menu’ “?” contenente la “guida il l<strong>in</strong>ea “ e una “f<strong>in</strong>estraI nformazioni” .Vogliamo q u<strong>in</strong>di <strong>in</strong>serire dei menu’ al di sotto della barra del titolo di un form; utilizziamo comeapplicativo il progetto prec<strong>ed</strong>ente (Calimero). I n particolare vogliamo creare un menu “file” contenenteil sottomenu’ “esci” e un menu” ?” contenente “<strong>in</strong>formazioni su” . I menu’ devono presentare una strutturautilizzando gli <strong>in</strong>dici (<strong>in</strong> genere si parte da 0, ma si puo’ anche partire da 1); nel nostro casi prev<strong>ed</strong>iamotale struttura:0.File (o &File, per rendere attivo il pulsante di scelta rapida attraverso il tasto F)1.Esci (o &Esci)1.? (o &?)1.<strong>in</strong>formazioni (o &I nformazioni)P er impostare i menu’ si utilizza la f<strong>in</strong>estra ED I T O R D I MEN U’ dal menu ST RUMEN T I , essendoposizionati sul form pr<strong>in</strong>cipale (form1) <strong>in</strong> cui deve essere <strong>in</strong>serito il menu’.P roc<strong>ed</strong>iamo <strong>in</strong> q uesto modo:Compilare la caption con “&File” e assegnare N ame MnuFile;digitare 0 nella casella I ndex e premere su “successivo (l’utilizzodi & permette l’uso del pulsante di scelta rapida!)P er impostare il sottomenu’ “esci” premere la freccia versodestra, che imposta il livello di rientro del menuN ella casella caption scrivere “&Esci” e nella casella N ame“MnuEsci” ; assegnare I ndex: 1Cliccare sulla freccia verso s<strong>in</strong>istra per tornare al prec<strong>ed</strong>entelivello di menu’N ella caption digitare “&?” ,il nome “Mnu?” e assegnare I ndex 2 ;premere su successivoP er impostare il sottomenu’ “?” premere la freccia versodestra, che imposta il livello di rientro del menuN ella caption scrivere “&<strong>in</strong>formazioni su” , assegnare il nome“Mnu<strong>in</strong>fo” e <strong>in</strong>dex 1L’<strong>ed</strong>itor dovrebbe apparire come nella figura successivaA l term<strong>in</strong>e premere O KN ell’<strong>ed</strong>itor di menu’ avrete senz’altro notato la casella “Shortcut” (scorciatoie): permette di assegnaread una comb<strong>in</strong>azione di tasti (es CRT L+V) una determ<strong>in</strong>ata azione (pensate ai menu’ di Word!!!). Sevolete, provate ad usarla.D opo aver premuto O K , il form1contiene la barra dei menu’ (v. figura adestra); non abbiamo f<strong>in</strong>ito! D obbiamoassociare ad ogni comando del menu’ ilrelativo codice.Con il form aperto aperto <strong>in</strong> fase diprogettazione aprire il menu File escegliere “esci” ; viene visualizzata laf<strong>in</strong>estra del codice relativa allarout<strong>in</strong>e MnuEsci_click()A ssociamo il codice che permette di term<strong>in</strong>are l’applicazione:Private Sub mnuEsci_Click(Index As Integer)EndEnd Sub20


P roc<strong>ed</strong>iamo <strong>in</strong> modo analogo per il codice relativo all’apertura della f<strong>in</strong>estra <strong>in</strong>formazioni:Private Sub MnuInfo_Click(Index As Integer)frmAbout.ShowEnd Sub(la f<strong>in</strong>estra <strong>in</strong>formazione e’ un form di nome FrmA bout, a cui si associa il metodo Show).D opo aver controllato l’esecuzione dell’applicazione, create l’eseguibile e salvate l’<strong>in</strong>tero progetto(naturalmente avrete creato una apposita cartella per contenere tutti i file del progetto).Eserciz io: ora potete provare a creare uno Spalsh screen, una f<strong>in</strong>estra <strong>in</strong>formazioni e dei menu’ ancheper altri progetti; prendete ad esempio il progetto 2 .I n q uesto caso possiamo prev<strong>ed</strong>ere la seguente struttura di menu’:0.&File1.&Esci2 .a&zzera1.&O perazioni1.&somma2 .so&ttrai3.&moltiplica4.&dividi3.&?1.&<strong>in</strong>formazioniO ra che abbiamo familiarizzato con l’ambiente VB, lo utilizzeremo per la gestione dei file seq uenziali (liricordate?) anche se solo parzialmente. I l nostro obiettivo e’ di utilizzare VB come <strong>in</strong>terfaccia nell’usocon database; v<strong>ed</strong>remo come aggiornare e visualizzare i dati di tabelle create con un D BMS comeMicrosoft access e come visualizzare i risultati di <strong>in</strong>terrogazioni SQ L.21


PROGETTO 5: gestione dei vettoriLa gestione dei vettori e delle matrici puo’ essere realizzata <strong>in</strong> diversi modi; <strong>in</strong> ogni caso si deve fareriferimento ai concetti teorici, alla programmazione strutturata e alla scomposizione top-down.Esempio 1 : caricare <strong>in</strong> un vettore N numeri <strong>in</strong>teri (max 10) e visualizzarliSi puo’ pr<strong>ed</strong>isporre il seguente form, associando agli oggetti il codice:Dim vet(0 To 1 0) As IntegerDim I As IntegerDim N As IntegerPrivate Sub Cmdesci_Click()‘consente di uscire dall’applicazioneEndEnd Subdurante il funz ionamento appariranno le seguentif<strong>in</strong>estre:per la richiesta del numero di elementi:Private Sub carica()'carica max 10 numeri <strong>in</strong> un vettoreDoN = InputBox ("quanti elementi? (max 1 0)", "carica")Loop Until N


Private Sub Cmdesci_Click()EndEnd Subper def<strong>in</strong>ire il numero di elementi del vettoreper caricare gli N elementi:Private Sub carica()'carica max 10 numeri <strong>in</strong> un vettoreDoN = InputBox ("quanti elementi? (max 1 0)", "carica")Loop Until N


per l’<strong>in</strong>serimento del nome da Sub ricerca()cercare:Loop Until N


PROGETTO 6: gestione dei fileI file di dati li conosciamo gia’: li abbiamo trattati utilizzando un l<strong>in</strong>guaggio proc<strong>ed</strong>urale adatto alleapplicazioni gestionali (CO BO L); di conseguenza presumo che vi ricordiate q uali sono le organizzazionidei file (seq uenziali e a <strong>in</strong>dici) e le operazioni che possono essere effettuate su un file.V<strong>ed</strong>iamo q u<strong>in</strong>di solo alcuni semplici esempi per gestire file di dati <strong>in</strong> VB.Eserciz io 1 : realizziamo un’applicazione che permetta di <strong>in</strong>serire dati <strong>in</strong> un file seq uenziale e dileggerli.Create una cartella P RO GET T O 5 e una sottocartella FI LE, <strong>in</strong> cui verranno <strong>in</strong>seriti tutti i file delprogetto.L’applicazione e’ costituita da tre form:form <strong>in</strong>iziale Form per l’<strong>in</strong>serimento Form per la visualizzazionename:frm<strong>in</strong>izio N ame: form1 N ame: form2caption: pr<strong>in</strong>cipale Caption:gestione di file seq uenziale Caption:dati <strong>in</strong>seriticontiene due pulsanti di opzione, due Contiene tre etichette, tre caselle di Contiene gli stessi elementi del form1etichette e un pulsantetesto e due pulsantiN .B. f<strong>in</strong>ora abbiamo utilizzato i diversi oggetti (form, etichette, pulsanti… ) dell’applicazione VB con <strong>in</strong>omi di default; ora che conosciamo meglio il l<strong>in</strong>guaggio possiamo abituarci a def<strong>in</strong>ire nomi significativiper gli oggetti; nel nostro esempio il form (schermata pr<strong>in</strong>cipale) viene chiamato FRMI N I ZI O e i dueform successivi vengono r<strong>in</strong>om<strong>in</strong>ati FO RM1 e FO RM2 . I n modo analogo abbiamo r<strong>in</strong>om<strong>in</strong>ato i pulsanti: ilpulsante con la caption “f<strong>in</strong>e” e’ stato nom<strong>in</strong>ato Cmdf<strong>in</strong>e, il pulsante con caption “<strong>in</strong>serisci” e’Cmd<strong>in</strong>serisci; le caselle di testo si chiamano “nome” , “cognome” , “<strong>in</strong>dirizzo” (come i campi checontengono)D opo aver disegnato l’<strong>in</strong>terfaccia dobbiamo associare il codice ai diversi controlli; per q uanto riguarda ilform <strong>in</strong>iziale (frm<strong>in</strong>izio), non c’e’ nulla di nuovo (v. progetto 1):Private Sub Cmdf<strong>in</strong>e_Click()'term<strong>in</strong>a l'applicazioneEndEnd SubPrivate Sub F orm_Load()'controlla il caricamento del form di <strong>in</strong>izioOption1 .Value = F alseOption2.Value = F alseEnd SubPrivate Sub Option1 _Click()'visualizza il form1 per <strong>in</strong>serimento datiF orm1 .ShowEnd SubPrivate Sub Option2_Click()'visualizza il form2 per visualizzazione datiF orm2.ShowF orm2! Cmdleggi.setfocus‘porta il cursore sul pulsante Cmdleggi‘ poiche’ Cmdleggi appartiene al form2 deve essere specificato con form2 !End Sub25


P er q uanto riguarda il form1 e form2 dobbiamo considerare le operazioni relative al trattamento deifile seq uenziali.P er poter essere utilizzato, un file deve essere aperto; l’apertura puo’ essere <strong>in</strong> O UT P UT (per lacreazione), A P P EN D (per aggiungere dati <strong>in</strong> fondo al file; eq uivale EX T EN D <strong>in</strong> Cobol) e I N P UT (perleggere i dati); per <strong>in</strong>serire i dati utilizziamo la modalita’ A P P EN D , perche’ <strong>in</strong> VB puo’ essere usataanche per creare il file, se ancora non esiste. L’istruzione di apertura e’: O P EN “N O MEFI LE.D A T ” FO R[O UT P UT | A P P EN D | I N P UT ] A S #N (dove #N e’ il numero del buffer di memoria assegnato al file).L’istruzione WRI T E #N o P RI N T #N consente di scrivere i dati nel file seq uenziale; I N P UT #N e’l’istruzione per la lettura.La chiusura del file viene realizzata con l’istruzione CLO SE #N .A ssociamo al form1 e ai relativi oggetti il seguente codice:Private Sub F orm_Load()'apre il file seq uenziale per creazione e aggiunta dati; deve essere specificato il percorsoOpen "a:\progetto5\file\anagrafe.dat" F or Append As #1End SubPrivate Sub CmdInserisci_Click()'scrive i dati nel fileW rite #1 , nome.Tex t ‘o PRINT #1W rite #1 , cognome.Tex tW rite #1 , <strong>in</strong>diriz z o.Tex tnome.Tex t = " "cognome.Tex t = " "<strong>in</strong>diriz z o.Tex t = " "Cmd<strong>in</strong>serisci.SetF ocus ‘dopo aver premuto tab porta il cursore sul pulsante <strong>in</strong>serisci, per memorizzare i datiEnd SubPrivate Sub Cmdesci_Click()'chiude il file e scarica il form1Close #1Unload MeEnd SubI l codice associato al form2 e relativi oggetti differisce per le istruzioni di lettura:Private Sub F orm_Load()‘apre il file per la letturaOpen "a:\progetto5\file\anagrafe.dat" F or Input As #1End SubPrivate Sub Cmdleggi_Click()'consente la lettura del file assegnando i campi alle caselle di testoDim varnome As Str<strong>in</strong>g, varcognome As Str<strong>in</strong>g, var<strong>in</strong>diriz z o As Str<strong>in</strong>gIf Not EOF (1 ) ThenInput #1 , varnome, varcognome, var<strong>in</strong>diriz z onome.Tex t = varnomecognome.Tex t = varcognome<strong>in</strong>diriz z o.Tex t = var<strong>in</strong>diriz z oCmdleggi.setfocus‘il pulsante leggi deve essere premuto per leggere il successivo recordElseMsgBox "non ci sono altri dati", , F orm2.Caption‘Fomr2 .caption <strong>in</strong>sesta il msgbox con la caption di form2 ; si puo’ omettereCmdtorna.setfocusEnd IfEnd SubPrivate Sub Cmdtorna_Click()'chiude il file e scarica il form2Close #1Unload MeEnd Sub26


Q uesto progetto potrebbe essere completato con una Splash form, una f<strong>in</strong>estra <strong>in</strong>formazioni e un menusotto la barra del titolo; provate!A bbiamo trattato solo la scrittura e la lettura dei record di un semplice file seq uenziale (<strong>in</strong> cui i recordvengono letti sempre a partire dal primo), ma sappiamo che le operazioni possono anche essere di altrotipo (modifica, ricerca, elaborazioni varie); esistono <strong>in</strong>oltre anche i file ad accesso diretto, che offronomaggiore velocita’ <strong>ed</strong> efficienza nella gestione. Se avrete occasione di doverli gestire, q uesteconoscenze di base e, soprattutto, l’utilizzo di un buon manuale vi potra’ essere di aiuto!Eserciz io 2: (molto car<strong>in</strong>o) realizzare un’applicazione che simuli un programma di elaborazione testi (adesempio il blocco note di W<strong>in</strong>dows), per gestire testi <strong>in</strong> formato .txt. T ale programma permette diaprire un nuovo file, aprire un file gia’ esistente, di salvarne uno nuovo e di uscire dal programmastesso; <strong>in</strong>oltre permette anche di tagliare o copiare testo <strong>in</strong> un nuovo file.I l file <strong>in</strong> cui viene scritto il testo e’ un file di dati perche’ dovra’ essere aperto (<strong>in</strong> output perpermettere la memorizzazione, <strong>in</strong> <strong>in</strong>put per la lettura) e chiuso al term<strong>in</strong>e delle elaborazioni.I l nostro progetto e’ costituito dal form pr<strong>in</strong>cipale (form1), da uno splash form (frmsplash; se volete,sapete gia’ come gestirlo) e da una f<strong>in</strong>estra <strong>in</strong>formazioni (frmabout).N el form1 <strong>in</strong>seriamo i seguenti oggetti:Una casella di testo adatta a contenere piu’ righe: name text1;multil<strong>in</strong>e true (consente l’<strong>in</strong>serimento di testo di grandi dimensioni su piu’righe); scrollbars both (produce l’attivazione automatica delle barre discorrimento orizzontali e verticali q uando il testo ecc<strong>ed</strong>e le dimensionidella f<strong>in</strong>estra)Un controllo CO MMO N D I A LO G per le f<strong>in</strong>estre di dialogo comuni; e’ uncontrollo standard che consente di visualizzare f<strong>in</strong>estre di dialogo di usocomune nelle applicazioni W<strong>in</strong>dows (q uali la f<strong>in</strong>estra A pri, Salva con nome,ecc.); se non e’ presente nella casella degli strumenti, puo’ essereaggiunto scegliendo “componenti” dall’elenco che si apre cliccando con iltasto destro sulla casella stessa e mettendo il segno di spunta sulcontrollo stesso (Microsoft Common D ialog Control). I l controllo deveessere <strong>in</strong>serito <strong>in</strong> un punto q ualsiasi del form, ma rimarra’ nascostoall’utente durante l’esecuzione dell’applicazione.Una barra dei menu (che sapete costruire)La barra dei menu’ sara’ organizzata <strong>in</strong> q uesto modo:CAPTION NAME INDEX&FileMnuFile&N uovo MnuFileitem 0&A pri MnuFileitem 1&Salva con nome MnuFileitem 2&Esci MnuFileitem 3&Modifica MnuModificaI tem&T aglia MnuModificaI tem 0&Copia MnuModificaI tem 1&I ncolla MnuModificaI tem 2&?MnuI nfo&I nformazione MnuI nfoitem 0D opo aver def<strong>in</strong>ito i menu’ (v. progetto 4) occorre associare ad ogni voce e sottovoce il codice dellerout<strong>in</strong>e che devono essere eseguite q uando l’utente fa una scelta nei menu’.27


Le rout<strong>in</strong>e utilizzano i seguenti nomi per gli oggetti: Form1 per il form, T ext1 per la casella di testo eCmdialog1 per il controllo delle f<strong>in</strong>estre di dialogo comuni (poiche’ <strong>in</strong> fase di disegno degli oggettiabbiamo lasciato i nomi di default, non li modifichiamo; ma avremmo anche potuto cambiarli!… ).P er aprire la f<strong>in</strong>estra del codice si clicca su una voce di menu’.Le rout<strong>in</strong>e utilizzano variabile di lavoro Filename che dichiariamo nella parte “generale” delle f<strong>in</strong>estradel codice e contiene il nome del file utilizzato:O ra associamo il seguente codice al menu “File” , utilizzando la selezione multipla per controllare l’<strong>in</strong>diceassociato ai sottomenu’ (i commenti al sorgente sono prec<strong>ed</strong>uti da ‘):Private Sub MnuF ileItem_Click(Index As Integer)Select Case Index'I ndex e' il selettore per controllare la voce di menu' selezionata'corrisponde all'<strong>in</strong>dice assegnato nell'<strong>ed</strong>itor di menu'Case 0 'N UO VOTex t1 .Tex t = " " 'svuota la casella di testofilename = "senz a nome"F orm1 .Caption = "trattamento di testi:" & filename ‘assegna alla f<strong>in</strong>estra il nome del fileCase 1 'A P RICmDialog1 .F ilter = "tutti i file (*.*) |*.*| file di testo(*.tx t) |*.tx t|"CmDialog1 .F ilterIndex = 2 ‘visualizza i file * .* e * .txtCmDialog1 .ShowOpen 'visualizza la f<strong>in</strong>estra di dialogo A P RIfilename = CmDialog1 .filenameOpen filename F or Input As #1'apre il fileF orm1 .Caption = “trattamento di testi” & F ilename ‘assegna alla f<strong>in</strong>estra il nome del file apertoTex t1 .Tex t = Input(LOF (1 ), 1 )'legge il contenuto del file e lo assegna alla casella di testoClose #1 'chiude il fileCase 2'SA LVA CO N N O MECmDialog1 .F ilter = "tutti i file (*.*) |*.*| file di testo (*.tx t) |*.tx t|"CmDialog1 .F ilterIndex = 2CmDialog1 .ShowSave'visualizza la f<strong>in</strong>estra di dialogo SA LVA con nomefilename = CmDialog1 .filenameOpen filename F or Output As #1'apre il file per l'outputPr<strong>in</strong>t #1 , Tex t1 .Tex t'scrive il testo nel file aperto; si puo’ usare anche WRI T EClose #1'chiude il fileCase 3 'ESCIEndEnd SelectEnd SubI n q uesta rout<strong>in</strong>e Filename e’ il nome del file di testo che viene creato o modificato.La gestione del file fisico su disco e’ realizzata con le istruzioni O P EN per l’apertura, CLO SE per lachiusura, I N P UT per la lettura e P RI N T per la scrittura; la funzione LO F restituisce la lunghezza <strong>in</strong>byte del file aperto e #1 <strong>in</strong>dica il numero del buffer di I /O (ricordate?) utilizzato per le operazioni sulfile.A l controllo CMD I A LO G1 vengono associati i seguenti metodi:•SHO WO P EN : per aprire la f<strong>in</strong>estra di dialogo “A pri” delle applicazioni W<strong>in</strong>dows•SHO WSA VE: per aprire la f<strong>in</strong>estra di dialogo “salva con nome”•FI LT ER<strong>in</strong>dex: imposta l’elenco dei tipi di file nelle f<strong>in</strong>estre di dialogo “A pri” e “salva con nome” .A nalogamente associamo il seguente codice al menu “Modifica” :Private Sub MnuModificaItem_Click(Index As Integer)Select Case Index'I ndex e' il selettore per controllare la voce di menu' selezionata'corrisponde all'<strong>in</strong>dice assegnato nell'<strong>ed</strong>itor di menu'28


Case 0'e' stato scelto T A GLI AClipboard.ClearClipboard.SetTex t Tex t1 .SelTex t 'copia il testo selezionatoTex t1 .SelTex t = " "'cancella il testo selezionatoCase 1'e' stato scelto CO P I AClipboard.ClearClipboard.SetTex t Tex t1 .SelTex t 'copia il testo selezionato negli A ppuntiCase 2'e' stato scelto I N CO LLATex t1 .Tex t = Tex t1 .Tex t + Clipboard.GetTex t() '<strong>in</strong>colla il testo dagli appunti nel punto desiderato o <strong>in</strong> nuovo doc.End SelectEnd SubLe scelte “taglia, copia, <strong>in</strong>colla” utilizzano l’oggetto CLI P BO A RD , che rappresenta gli A P P UN T I diW<strong>in</strong>dows, e nel q uale vengono conservati i caratteri selezionati e copiati/tagliati.P er la gestione del menu’ “Modifica” e’ necessaria una rout<strong>in</strong>e per controllare la presenza di testoselezionato; cio’ significa che, se non e’ stato selezionato testo, le opzioni T A GLI A (voce di menu’ 0) eCO P I A (voce di menu’ 1) non devono essere attive (devono apparire <strong>in</strong> grigio chiaro perche’ non possonoessere scelte).Si utilizza la proprieta’ EN A BLED del menu (che puo’ assumere valore true o false).La proprieta’ della casella di testo SELLEN GHT contiene la lunghezza del testo selezionato; se non e’stato selezionato testo, la condizione T EX T .SELLEN GHT >0 restituisce valore FA LSE e q u<strong>in</strong>di rende<strong>in</strong>abilitata la voce di menu corrispondente.La rout<strong>in</strong>e associata al menu modifica e’ q u<strong>in</strong>di la seguente:Private Sub MnuModifica_click()'disattiva taglia e copia se non c'e testo selezionatoMnuModificaItem(0).Enabl<strong>ed</strong> = (Tex t1 .SelLength > 0)MnuModificaItem(1 ).Enabl<strong>ed</strong> = (Tex t1 .SelLength > 0)End SubA ssociamo alla terza voce di menu (?) il seguente codice:Private Sub MnuInfoitem_Click(Index As Integer)'visualizza la f<strong>in</strong>estra <strong>in</strong>formazionifrmAbout.ShowEnd SubN aturalmente dovete aver creato la f<strong>in</strong>estra <strong>in</strong>formazioni (frmabout)!Se avete creato anche lo splash screen, associate il relativo codice (vi ricordate come si fa? v.progetto 4)O ra e’ il momento di provare l’applicazione; car<strong>in</strong>a vero?Create l’eseguibile e salvate. Q uesto e’ il vostro blocco notes personale!29


PROGETTO 7: gestione di tabelle di databaseE’ possibile utilizzare VB per scrivere progetti che consentono di visualizzare, modificare e <strong>in</strong>serire<strong>in</strong>formazioni <strong>in</strong> un database relazionale.P er poter gestire le tabelle di una database (es. A ccess) e’ necessario utilizzare il controlloD A T A presente nella casella degli strumentiPrimo esempio: Realizziamo un’applicazione che consente di visualizzare cognome e nome dei cittad<strong>in</strong>i.(consiglio: create una cartella P RO GET T O 6, <strong>in</strong> cui <strong>in</strong>serirete le sottocartelle relative agli esempi chesvilupperemo).I nnanzitutto occorre creare il database A N A GRA FE.MD B con A ccess (attenzione: VB 5.0 supportaversione di A ccess f<strong>in</strong>o alla ’97, q u<strong>in</strong>di se create il database con A ccess 2 000 salvatelo nella versione’97); il database contiene la tabella CI T T A D I N O (CO D , CO GN O ME, N O ME, SESSO , … .).D isegniamo l’<strong>in</strong>terfaccia dell’applicazione:Essa contiene :I l form1 con caption “visualizzazione dati anagrafici”D ue etichette (label1, label1) rispettivamente con caption“cognome” e “nome”D ue caselle di testo a cui assegniamo name CO GN O ME e N O MEe text azzeratoUn controllo data1Un pulsante di comando con caption “esci” a cui verra’ associatoil codice per uscire dall’applicazioneO ra occorre assegnare le seguenti proprieta’ al controllo D A T A 1:proprieta’ CO N N ECT : si seleziona il tipo di database a cui connettersi; VB propone A ccess di default,ma se il database e’ diverso (D BI I I o altro) deve essere specificato il nome del databasecorrispondenteproprieta’ D A T A BA SEN A ME: si specifica il percorso e il nome del database, corrispondente al file diA ccess con estensione .mdb (nel nostro caso A N A GRA FE.MD B); per specificare correttamente ilpercorso, premere sul pulsante con i punt<strong>in</strong>i e scegliereproprieta’ RECO RD SO URCE: si specifica il nome della tabella contenuta nel database; aprendo il menu’a tend<strong>in</strong>a vengono visualizzate le tabelle disponibili, nel nostro caso CI T T A D I N O ; (il recordsource puo’essere anche una q uery del database o un comando select di SQ LP ossiamo anche impostare la caption del controllo al nome della tabella di cui vengono visualizzati idati e scegliere il font di caratteri desiderato.Le caselle di testo devono visualizzare i dati della tabella; dobbiamo q u<strong>in</strong>di assegnare le seguentiproprieta’:P RI MA CA SELLA D I CO GN O ME SECO N D A CA SELLA D I T EST O N O MET EST ON ame: cognome N ame: nomeD ataSource D ata1 D ataSource D ata1D ataField CO GN O ME D atafield N O MED A T A SO URCE <strong>in</strong>dica il controllo D A T A a cui il campo si riferisceD A T A FI ELD <strong>in</strong>dica il nome del campo da associare alla casella di testo; si puo’ scegliere il campodesiderato nella casella comb<strong>in</strong>ata, <strong>in</strong> cui viene mostrato l’elenco dei campi disponibile, se e’ gia’ statadef<strong>in</strong>ita’ la proprieta’ D ataSource.P ossiamo impostare anche il font dei caratteri per entrambe le casella di testo.A ssociamo al pulsante Command1 la rout<strong>in</strong>e per uscire dall’applicazione (e’ l’unica riga di codice ch<strong>ed</strong>ovete scrivere!); proviamo ad eseguirla e, se funzione correttamente, creiamo il file eseguibile.30


Q uando viene eseguita l’applicazione, viene visualizzato il primo recorddella tabella; le frecce presenti nel controllo D A T A permettono lanavigazione tra i record.O ra potete provare a visualizzare i dati provenienti anche da tabelle oq uery di altri database!Secondo esempio: presentare i dati della tabella CI T T A D I N O <strong>in</strong> forma tabellare.I l controllo aggiuntivo D BGRI D consente di visualizzare i dati della tabella secondo una griglia di righee colonne (come nella modalita’ “visualizzazione foglio dati” di A ccess).D i solito tale controllo non e’ presente nella casella degli strumenti, ma ora sappiamo come si faad aggiungerlo (scegliere Microsoft D ata Bound Grid Control).D isegnate un form con i seguenti controlli:Una LA BEL con caption “archivio cittad<strong>in</strong>i”Un controllo D A T A 1 con le proprieta’ vistenell’esempio prec<strong>ed</strong>ente; tale controllo serve soloper def<strong>in</strong>ire la tabella di riferimento per il controlloD BGrid e puo’ restare nascosta durantel’esecuzione, impostandone la proprieta’ Visibile aFalse Un pulsante di commando CO MMA N D 1 a cui verra’associato il codice per uscire dall’applicazioneun controllo D BGRI D con nome D BGRI D 1,stabilendo le dimensioni adeguate con iltrasc<strong>in</strong>amento del mouse; tale controllo deve essereassociato al controllo D A T A gia’ presente nel form:si def<strong>in</strong>isce la proprieta’ D A T A SO URCE: D ata1.Eseguendo l’applicazione si visualizzano i dati contenuti nella tabellaCI T T A D I N O secondo una griglia di righe e colonne, tra le q uali ci sipuo’ muovere con i tasti freccia, con il mouse o con le barre discorrimento; con q uesta modalita’ di rappresentazioni dei dati sonoammesse modifiche sui valori dei campi, ma non e’ possibile <strong>in</strong>serire oelim<strong>in</strong>are record.Terz o esempio: realizziamo un’applicazione che consenta di effettuare le operazioni di manipolazione(<strong>in</strong>serimento, modifica, cancellazione e ricerca) e di navigazione sui dati di una tabella con appositeistruzioni scritte <strong>in</strong> codice VB.D isegniamo un form (form1 con caption “sch<strong>ed</strong>a anagrafica cittad<strong>in</strong>o” ) con i seguenti controlli:31


un frame con caption “dati anagrafici”sette etichette con caption “codice” , “cognome” , “nome” ,…sette caselle di testo (text1, text2 ,… ) con proprieta’ text azzerataun controllo D A T A 1 impostandone le proprieta’ per collegarlo al databaseA N A GRA FE e alla tabella CI T T A D I N O ; tale controllo serve solo per def<strong>in</strong>ire ildatabase da utilizzare e puo’ restare nascosto durante l’esecuzione,impostandone la proprieta’ Visibile a Falsenove pulsanti di comando (“prec<strong>ed</strong>ente” , “successivo” , “primo” e “ultimo” per lanavigazione nel database; “nuovo” per aggiungere un record; “modifica” permodificare i dati; “cerca” per ricercare un record <strong>in</strong> base al cognome; “elim<strong>in</strong>a”per cancellare il record corrente” ; “esci” per term<strong>in</strong>are l’applicazione)N el def<strong>in</strong>ire la caption di ogni pulsante potete usare il simbolo & per def<strong>in</strong>ire i tasti di scelta rapida (v.progetto4); <strong>in</strong>oltre e’ sempre possibile def<strong>in</strong>ire una barra dei menu’ che consenta di svolgere le stesseoperazioni previste con i pulsanti.O ra associamo il codice VB; nella sezione “generale” dichiariamo le seguenti variabili:Dim CONT As Integer‘contatore che consente di controllare se il database ‘ vuoto o noDim TROVATO As Integer ‘deviatore che controlla se il record cercato esisteDim CERCA As Str<strong>in</strong>g‘variabile che conterra’ il cognome per la ricerca del recordLe operazioni di manipolazione sulla tabella (<strong>in</strong>serimento, modifica e cancellazione) sono rappresentat<strong>ed</strong>ai metodi A D D N EW, ED I T e D ELET E; <strong>in</strong>oltre le operazioni di <strong>in</strong>serimento e modifica devono seguit<strong>ed</strong>al metodo UP D A T E (<strong>ed</strong> e’ opportuno anche aggiornare il contenuto della tabella al controllo D A T A 1 conil metodo REFRESH); la navigazione tra i record viene realizzata con i metodi MO VEFI RST (primo),MO VELA ST (ultimo), MO VEN EX T (successivo) e MO VEP REVI O US (prec<strong>ed</strong>ente), prev<strong>ed</strong>endo opportunicontrolli q uando si e’ posizionati sul primo (BO F= beg<strong>in</strong>n<strong>in</strong>g of file) o ultimo record (EO F= end of file).A i controlli q u<strong>in</strong>di associamo il seguente codice:Private Sub F orm_Load()'all’esecuzione controlla che ci siano record <strong>in</strong> archivioData1 .RefreshCONT = 0If Not Data1 .Recordset.EOF ThenCONT = Data1 .Recordset.RecordCountEnd IfIf CONT = 0 ThenMsgBox "archivio vuoto"End IfEnd SubPrivate Sub Command1 _Click()'<strong>in</strong>serisce un nuovo recordData1 .Recordset.AddNew 'aggiunge un nuovo recordData1 .Recordset.Update 'registra il nuovo recordData1 .Recordset.MoveLast 'si posiziona sul record vuoto per aspetto dell’applicazione durante il fuunzionamentoEnd Sub ‘consentire l'<strong>in</strong>serimento deidatiPrivate Sub Command2_Click()'modifica un recordIf CONT = 0 ThenMsgBox "archivio vuoto, impossibile modificare"Else: MsgBox "posiz ionarsi sul record da modificare"Data1 .Recordset.Edit 'pr<strong>ed</strong>ispone per la scritturaData1 .Recordset.Update 'registra il recordEnd IfEnd SubPrivate Sub Command3 _Click()'ricerca seq uenziale <strong>in</strong> base al cognome32


CERCA = InputBox ("<strong>in</strong>serire cognome:", "ricerca")Data1 .Recordset.MoveF irst 'si posiziona sul primo recordTROVATO = 0Do 'ripete per ogni recordIf CERCA = Data1 .Recordset("cognome") ThenTROVATO = 1Else: Data1 .Recordset.MoveNex t 'passa al record successivoEnd IfLoop Until (TROVATO = 1 ) Or (Data1 .Recordset.EOF )If TROVATO = 0 ThenMsgBox "record <strong>in</strong>esistente", , "ricerca" '<strong>in</strong>stesta il msgboxEnd IfEnd SubPrivate Sub Command4 _Click()'elim<strong>in</strong>a un recordData1 .Recordset.Delete 'cancella il recordData1 .Refresh'aggiorna il contenuto della tabellaData1 .Recordset.MoveLast 'si posiziona sull'ultimo record memorizzatoEnd SubPrivate Sub Command5_Click()'si posiziona sul record prec<strong>ed</strong>ente, controllando l'<strong>in</strong>izio del file BO FData1 .Recordset.MovePreviousIf Data1 .Recordset.BOF ThenData1 .Recordset.MoveF irstMsgBox "non ci sono altri record prec<strong>ed</strong>enti", , "record"End IfEnd SubPrivate Sub Command6_Click()'si posiziona sul record successivo, controllando la f<strong>in</strong>e del file EO FData1 .Recordset.MoveNex tIf Data1 .Recordset.EOF ThenData1 .Recordset.MoveLastMsgBox "non ci sono altri record successivi", , "record"End IfEnd SubPrivate Sub Command7_Click()'permette il posizionamento sul primo recordData1 .Recordset.MoveF irstEnd SubPrivate Sub Command8_Click()'permette il posizionamento sul'ultimo recordData1 .Recordset.MoveLastEnd SubPrivate Sub Command9 _Click()'esce dall'applicazioneEndEnd Sub33


PROGETTO 8: VB e SQ LN egli esempi prec<strong>ed</strong>enti l’<strong>in</strong>sieme dei dati che venivano associati al controllo D A T A provenivano da unatabella del database, il cui nome era specificato nella proprieta’ recordsource; <strong>in</strong> realta’ l’<strong>in</strong>sieme deidati che possono essere associati al controllo D A T A possono anche risultare da un’<strong>in</strong>terrogazione SQ Lscritta all’<strong>in</strong>terno del codice VB associato ad un controllo (es. pulsante).Esempio: data la tabella CI T T A D I N O del database A N A GRA FE, realizziamo un progetto che consentadi realizzare tre tipi di <strong>in</strong>terrogazioni:1.elenco dei cittad<strong>in</strong>i di un certo sesso2 .elenco dei cittad<strong>in</strong>i il cui cognome <strong>in</strong>izia con una certa lettera3.elenco dei cittad<strong>in</strong>i con r<strong>ed</strong>dito superiore ad un certo valorevisualizzando cognome e nome dei cittad<strong>in</strong>i che corrispondono alle caratteristiche richieste.Sappiamo come realizzare q ueste istruzione <strong>in</strong> SQ L; ora v<strong>ed</strong>iamo come associarle al codice VB.Realizziamo la seguente <strong>in</strong>terfaccia:Con i seguenti controlli:un controllo D A T A 1 con caption “cittad<strong>in</strong>o” , D A T A BA SEN A MEassociato al file di database su disco (specificare il percorso) eRECO RD SO URCE associato a CI T T A D I N Odue etichette con caption CO GN O ME, N O MEdue caselle di testo con text azzerata e D A T A FI ELD associatarispettivamente a CO GN O ME e N O MEq uattro pulsanti di comando <strong>in</strong> cui <strong>in</strong>serire una opportuna caption(“elenco cittad<strong>in</strong>i… ” , “f<strong>in</strong>e” ) prev<strong>ed</strong>endo i tasti di scelta rapidaO ra associamo ai q uattro pulsanti il seguente codice:‘dichiarazione delle variabili nella sezione “generale”Dim MIOSQ L As Str<strong>in</strong>g ‘str<strong>in</strong>ga di codice SQ LDim CERCAS As Str<strong>in</strong>g ‘variabile contenente il sesso da cercareDim INIZIALE As Str<strong>in</strong>g ‘variabile contenente l’<strong>in</strong>iziale del cognome da cercareDim CONT As Integer ‘contatore dei recordDim VALORE As Double ‘variabile contenente il valore m<strong>in</strong>imo di r<strong>ed</strong>ditoPrivate Sub Command1 _Click()'ricerca i cittad<strong>in</strong>i di un certo sessoCERCAS = InputBox ("sesso:", "ricerca") ‘visualizza un box per <strong>in</strong>serire il sesso da cercareMIOSQ L = " "‘istruzione SQ LMIOSQ L = MIOSQ L + "SELECT COGNOME, NOME "MIOSQ L = MIOSQ L + "F ROM CITTADINO "MIOSQ L = MIOSQ L + "W H ERE SESSO= '" + CERCAS + "' "MIOSQ L = MIOSQ L + "ORDER BY COGNOME, NOME;"Data1 .RecordSource = MIOSQ L ‘associa alla proprieta’ il codice SQ LData1 .Refresh ‘aggiorna l’orig<strong>in</strong>e dei dati associata a D A T A 1CONT = 0‘controlla che ci sia corripondenza nella ricercaIf Not Data1 .Recordset.EOF ThenCONT = Data1 .Recordset.RecordCountEnd IfIf CONT = 0 ThenMsgBox "nessun record trovato", 1 6, "risultato" ‘visualizza un messaggio di tipo 16 se non ci sono recordEnd IfEnd SubPrivate Sub Command2_Click()'ricerca i cittad<strong>in</strong>i con cognome avente una certa <strong>in</strong>izialeINIZIALE = InputBox ("<strong>in</strong>iz iale del cognome:", "ricerca")MIOSQ L = " "MIOSQ L = MIOSQ L + "SELECT COGNOME, NOME "MIOSQ L = MIOSQ L + "F ROM CITTADINO "34


MIOSQ L = MIOSQ L + "W H ERE COGNOME LIKE '" + INIZIALE + "' & '*' "MIOSQ L = MIOSQ L + "ORDER BY COGNOME, NOME;"Data1 .RecordSource = MIOSQ LData1 .RefreshCONT = 0If Not Data1 .Recordset.EOF ThenCONT = Data1 .Recordset.RecordCountEnd IfIf CONT = 0 ThenMsgBox "nessun record trovato", 1 6, "risultato"End IfEnd SubPrivate Sub Command3 _Click()'ricerca dei cittad<strong>in</strong>i con r<strong>ed</strong>dito superiore ad un certo valoreVALORE = InputBox ("valore m<strong>in</strong>imo di r<strong>ed</strong>dito:", "ricerca")MIOSQ L = " "MIOSQ L = MIOSQ L + "SELECT COGNOME, NOME "MIOSQ L = MIOSQ L + "F ROM CITTADINO "MIOSQ L = MIOSQ L + "W H ERE REDDITO > " + Str(VALORE) + " "MIOSQ L = MIOSQ L + "ORDER BY COGNOME, NOME;"Data1 .RecordSource = MIOSQ LData1 .RefreshCONT = 0If Not Data1 .Recordset.EOF ThenCONT = Data1 .Recordset.RecordCountEnd IfIf CONT = 0 ThenMsgBox "nessun record trovato", 1 6, "risultato"End IfEnd SubPrivate Sub Command4 _Click()'esce dall'applicazioneEndEnd SubLe istruzioni SQ L sono costruite su piu’ righe per comodita’ di lettura e devono rispettare la s<strong>in</strong>tassi ,compresi gli spazi e i punti e virgola (<strong>in</strong>fatti al term<strong>in</strong>e di ogni riga, prima di “ c’e’ uno spazio). I l Valor<strong>ed</strong>el codice <strong>in</strong>serito da tastiera viene concatenato alla str<strong>in</strong>ga SQ L con l’operatore + (normalmente taleparametro apparirebbe tra parentesi q uadre nelle istruzioni [ … ])D urante l’esecuzione, effettuando la ricerca sul sesso, appaiono le seguenti f<strong>in</strong>estre;per l’<strong>in</strong>serimento del sesso (M o F) dacercareq uesto messaggio appare seviene <strong>in</strong>seritoun valore assurdoSe <strong>in</strong>vece esistono dei record corrispondenti, vienevisualizzato il primo (possibile visualizzare tutti glialtri utilizzando i pulsanti del controllo D A T A 1):O ra potete provare a realizzare altre applicazioni con diverse istruzioni SQ L, utilizzando anche altridatabase (ne abbiamo realizzati tantissimi; avete solo l’imbarazzo della scelta!).P rovate ad utilizzare tutti i controlli che abbiamo esam<strong>in</strong>ato: splash screen, menu, f<strong>in</strong>estra<strong>in</strong>formazioni, form pr<strong>in</strong>cipale da cui vengono aperti altri form, ecc.35


PROGETTO 9 : Report di stampaI dati di una tabella o i risultati di una q uery possono essere stampati su carta utilizzando duemodalita’.Primo modo: il modo piu’ semplice consiste nell’utilizzare l’oggetto P r<strong>in</strong>ter, che corrisponde allastampante pr<strong>ed</strong>ef<strong>in</strong>ita nell’ambiente W<strong>in</strong>dows; le righe di stampa vengono <strong>in</strong>viate alla stampante con ilmetodo P r<strong>in</strong>t seguito dalla variabile da stampare. Si possono def<strong>in</strong>ire le caratteristiche di stampautilizzando le proprieta’ dell’oggetto P r<strong>in</strong>ter:•Fontname: per il nome del font dei caratteri•FontSize: per la dimensione•FontBold: valore booleano per il grassetto (true stampa con grassetto, false senza)•FontI talic: valore booleano per il corsivo•FontUnderl<strong>in</strong>e: valore booleano per il sottol<strong>in</strong>eatoT utte le righe che usano il metodo P r<strong>in</strong>t vengono trasferite <strong>in</strong> un buffer, che viene <strong>in</strong>viato allastampante q uando viene eseguito il comando EndD oc.Utilizziamo il primo esempio di P RO GET T O 6 per stampare i cognomi e nomi dei cittad<strong>in</strong>i.Aggiungiamo al form un pulsante e cui assegniamo nome CmdStampa e caption&Stampa; al pulsante deve essere assegnato il seguente codice:Private Sub CmdStampa_Click()'stampa l'elenco dei cittad<strong>in</strong>i con cognome e nomeData1 .Recordset.MoveF irst ‘si posiziona sul primo recordPr<strong>in</strong>ter.F ontName = "times new roman"Pr<strong>in</strong>ter.F ontSiz e = 1 2Pr<strong>in</strong>ter.F ontBold = F alseDoPr<strong>in</strong>ter.Pr<strong>in</strong>t Data1 .Recordset("COGNOME"); Tab; Data1 .Recordset("NOME")Data1 .Recordset.MoveNex t ‘si sposta al record successivoLoop Until Data1 .Recordset.EOFPr<strong>in</strong>ter.EndDocEnd SubA bbiamo gia’ visto il significato delle diverse proprieta’ utilizzate; “T ab” serve ad <strong>in</strong>serire un salto ditabulazione nella riga di stampa.Secondo modo: e’ un metodo un po’ piu’ sofisticato. L’ambiente di programmazione VB offre lapossibilita’ di costruire dei report di stampa <strong>in</strong> modo veloce utilizzando un componente aggiuntivodenom<strong>in</strong>ato Crystal report: e’ un generatore di report simile a q uello contenuto <strong>in</strong> A ccess e consente didisegnare il layout di stampa, <strong>in</strong> autocomposizione, attraverso una serie di f<strong>in</strong>estre di dialogo. (vieneattivato dal menu’ “aggiunte” di VB con la scelta “progettazione report” ). Sul risultato si puo’ poi<strong>in</strong>tervenire manualmente.I l file cosi’ creato viene salvato su disco <strong>in</strong> un file con estensione .rpt.P roviamo a generare un report che permetta di stampare il contenuto di tutti i campi della tabellaCI T T A D I N O del database A N A GRA FI CA ; prima di tutto progettiamo il seguente form:P oi attiviamo il generatore di report <strong>in</strong>serendo tutti i campiq uando ci vengono richieste durante la proc<strong>ed</strong>ura; salviamo ilreport con il nome A N A GRA FE.RP T .O ra dobbiamo <strong>in</strong>serire nel form un controllo <strong>in</strong> grado di richiamareil report creato. T ale controllo si chiama “Crystal report” e, senon e’ presente nella casella degli stumenti, sappiamo come<strong>in</strong>serirlo. I l controllo viene posizionato nel form ma rimane<strong>in</strong>visibile durante l’esecuzione. A l controllo dobbiamo associare laproprieta’ ReportFilename, scegliendo il nome del report nellaf<strong>in</strong>estra di dialogo.36


P oi <strong>in</strong>seriamo nel form un pulsante CmdStampa con caption &Stampa per consentire all’utente dieseguire la stampa; il codice associato e’ il seguente:Private Sub Cmdstampa_Click()‘esegue la stampaCrystalReport1 .Action = 1End SubN aturalmente dovete ricordarvi anche del pulsante Esci.Q uesto e’ il risultato q uando si attiva la stampa:Con il codice viene associato allaproprieta’ action del crystal reportil valore 1, che attiva la stampa sucarta; <strong>in</strong> alternativa 0 stampa <strong>in</strong> unaf<strong>in</strong>estra di anteprima e 2 stampa sufile.O ra che siete diventati bravissimi potete svolgere la seguente esercitazione.Utilizzando A ccess create un database A ZI EN D A contenete le seguenti tabelle:CLI EN T E(CO D CLI , RA GI O N ESO CI A LE, T ELEFO N O , I N D I RI ZZO … , CO D LO C)LO CA LI T A (CO D LO C, N O ME)Create un’applicazione VB contenente un form pr<strong>in</strong>cipale che consenta di acc<strong>ed</strong>ere ai dati delle tabelle,ad alcune <strong>in</strong>terrogazioni e alle stampe (scegliete voi q uali); <strong>in</strong>serite anche i menu’, lo splash screen e laf<strong>in</strong>estra <strong>in</strong>formazioni37

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!