La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ing. Stefano Cadei -- Java1 Visual Basic Introduzione.

Presentazioni simili


Presentazione sul tema: "Ing. Stefano Cadei -- Java1 Visual Basic Introduzione."— Transcript della presentazione:

1 Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

2 Ing. Stefano Cadei -- Java2 Origini antiche 1964: BASIC (Beginners All Purpose Symbolic Instruction Code) (+) General Purpose (+) Semplicità (+) Third Generation (--) Poca potenza espressiva (--) Non ottimizzato per HW/SO (--) Non orientato agli oggetti (+) Bill Gates ne costruisce un interprete Pascal (1969) C (1972) C++ (1983) Utilizzato prevalentemente per scopi didattici

3 Ing. Stefano Cadei -- Java3 Le Graphical User Interfaces 70s: Sistemi Unix / 1982: MS-DOS 1.0 : NO GUI 1984: Macintosh 1984: X Window System (MIT, ambito Unix) 1985: Windows 1.0 Ambienti operativi basati su EVENTI Programmazione Modale Programmazione Event Driven Ambienti operativi basati su GUI Linea Comando Ambiente grafico

4 Ing. Stefano Cadei -- Java4 Le GUI (2)

5 Ing. Stefano Cadei -- Java5 Da console a GUI Non cambia le strutture di controllo (cicli, ecc) Cambia profondamente il modo di gestire linput/output da e verso il mondo esterno Input: passaggio alla programmazione EVENT DRIVEN Viene meno il concetto di istruzione di lettura Scrittura di Routine di risposta ad eventi (no readline(stringa)) Una complessa gestione dei messaggi è gestita dall ambiente Output: invocazione di opportune API Grafiche writeln(Hello World)MsgBox(Hello World)

6 Ing. Stefano Cadei -- Java6 Programmazione con Console Immagine tratta da Programmare Windows 3.1 – 1993)

7 Ing. Stefano Cadei -- Java7 Programmazione con GUI Immagine tratta da Programmare Windows 3.1 – 1993)

8 Ing. Stefano Cadei -- Java8 Programmazione con GUI (2) Programmazione diretta con API grafiche ed eventi relativamente complessa (--) Difficoltà per i programmatori provenienti da MSDOS e Unix (--) Necessità di una dettagliata comprensione dei meccanismi di generazione ed inoltro di eventi (--) Di fatto solo il C/C++ si rivela inizialmente facilmente adattabile alla nuova situazione Necessità di semplificazione

9 Ing. Stefano Cadei -- Java9 Visual Basic (1991?- 94): Visual Basic Linguaggio derivato dal BASIC Fortemente integrato con Windows Supporto (parziale) alla progr. ad oggetti Introduce la programmazione visuale Parte dellinterfaccia grafica del programma viene disegnata e non più codificata (IDE) Il controllo sintattico (e quando possibile semantico) delle istruzioni viene eseguito allistante Introdotta anche con altri linguaggi (Visual C++)

10 Ing. Stefano Cadei -- Java10 Integrated Devel. Environment

11 Ing. Stefano Cadei -- Java11 Visual Basic (3) (--) Il linguaggio eredita i limiti del BASIC (poca potenza espressiva, non ottimizzato per lHW) (+) Eredita la semplicità del BASIC (+) Lambiente di sviluppo per la programmazione visuale lo rende un prodotto di successo (??) Lambiente evita (impedisce?) al programmatore di conoscere i dettagli sulla gestione degli eventi Perché proprio BASIC? ….(Bill Gates?)

12 Ing. Stefano Cadei -- Java12 Visual Basic (4) La definizione di Visual Basic. third-generation (1) event-driven (2) integrated development environment (IDE) Visual Basic (VB) is the third-generation (1) event-driven (2) programming language and integrated development environment (IDE) […]. graphical development (3) VB is also considered a relatively easy to learn and use programming language, because of its graphical development (3) features and BASIC heritage (4) (Wikipedia)

13 Ing. Stefano Cadei -- Java13 Altri Visual Basic 1995: Visual Basic for Application (VBA) Integrazione di Visual Basic in altre applicazioni Word Excel Access Power Point Concetto di programma embedded (MACRO) Programmazione visuale diversa rispetto a VB Presenza di nuovi oggetti (fogli di lavoro) IDE più limitato Linguaggio di fatto identico a VB tradizionale

14 Ing. Stefano Cadei -- Java14 Altri Visual Basic (2) 2001: Microsoft introduce.NET Modello completamente ad oggetti Accesso diverso alle API di sistema 2002: Visual Basic.NET Nuova versione del linguaggio che opera su.NET (+) Approccio ad oggetti pulito (--) Non compatibile con Visual Basic tradizionale

15 Ing. Stefano Cadei -- Java15 Visual Basic: 3 linguaggi La situazione oggi (2009)

16 Ing. Stefano Cadei -- Java16 Contenuto del corso Parte 1 IDE Visual Basic (comune per VB e VB.NET) Programmazione base in VB 6.0 Elementi del linguaggio e primi programmi Strutture di controllo : If / For /While / Do-Loop Array e Funzioni Finestre multiple, nuovi eventi e nuovi componenti Parte 2 IDE VBA Programmazione base in VBA Interazione con fogli Excel Interazione con il sistema operativo Parte 3 Cenni di VB.NET

17 Ing. Stefano Cadei -- Java17 Introduzione In sintesi Fino a input/output console Introduzione GUI => rivoluzione nell I/O Eventi API Grafiche Disegno dellinterfaccia (IDE Grafico) Programmazione event driven Visual Basic / VBA / VB.NET

18 Ing. Stefano Cadei -- Java18 Come un corso di nuoto? La teoria da sola non basta (manuali, corsi, …) Anzi, spesso la pratica permette di trovare soluzioni empiriche ai problemi Molti praticoni non sanno giustificare ciò che fanno Ma sono estremamente efficaci Analogia con il nuoto Chi impara da solo non ha uno stile corretto, però sta a galla e non ha paura Impossibile imparare a nuotare senza entrare in piscina Anche il solo bagnarsi o giocare aiuta a prendere confidenza Lesperienza diretta è fondamentale Avere confidenza con lambiente è fondamentale

19 Ing. Stefano Cadei -- Java19 Visual Basic (classico) Ambiente di lavoro (IDE)

20 Ing. Stefano Cadei -- Java20 L IDE Compiti Fornitura strumenti progettazione visuale Compilazione Linking Generazione codice eseguibile Codice Sorgente Descrizione GUI CompilazioneLinking Linguaggio macchina eseguibile Dipendenze con il SO (Windows only)

21 Ing. Stefano Cadei -- Java21 Ambiente di lavoro (2) Avvio : scelta del tipo di applicazione Nel corso useremo EXE standard

22 Ing. Stefano Cadei -- Java22 Ambiente di lavoro (3) Parti dellambiente di lavoro: Barra degli strumenti (toolbox) Barra dei menù (menubar) Area disegno Form Finestra proprietà del progetto Finestra proprietà delloggetto attuale

23 Ing. Stefano Cadei -- Java23 Le parti dell IDE

24 Ing. Stefano Cadei -- Java24 Compilazione ed esecuzione Il bottone Play (compila ed esegui) Senza scrivere nulla viene mostrata una finestra vuota

25 Ing. Stefano Cadei -- Java25 Un prog. realmente vuoto? In realtà il programma generato reagisce allinput dellutente Finestra spostabile Finestra ridimensionabile Finestra riducibile a icona L IDE nasconde molti dettagli di basso livello per Gestione grafica Gestione eventi basilari Senza un adeguato IDE risultato difficile da ottenere

26 Ing. Stefano Cadei -- Java26 Il primo programma Creazione (visuale) di Hello World Dalla barra degli strumenti selezionare un componente Label Nella finestra di disegno form posizionare la label Modificare la proprietà Caption della label creata con Hello World

27 Ing. Stefano Cadei -- Java27 Il primo programma (2) Lesecuzione di Hello World

28 Ing. Stefano Cadei -- Java28 Una piccola miglioria… Modifica delle proprietà di un elemento visuale

29 Ing. Stefano Cadei -- Java29 Un Hello World più articolato… Primo esempio di programmazione event driven Gestione dellevento click Inserire un pulsante nel form Doppio click sul pulsante Compare una nuova finestra: leditor di codice Visual Basic

30 Ing. Stefano Cadei -- Java30 Leditor di codice Generatore dellevento Tipo di evento Codice dellevento

31 Ing. Stefano Cadei -- Java31 Leditor di codice (2) Il programmatore inserisce a questo punto le istruzioni da compiere in seguito al click (scrive la routine di risposta ad evento) Nessuna necessità di gestire esplicitamente messaggi L IDE nasconde tutti i dettagli su come fa ad arrivare in quel punto il flusso del programma Il sistema operativo inoltra le coordinate e gli estremi dellevento e richiama la routine di risposta associata al componente generatore

32 Ing. Stefano Cadei -- Java32 Le routine di risposta ad eventi L IDE scrive automaticamente lintestazione e la chiusura della routine di risposta: Parole chiave: Sub e End Sub Specificatore di visibilità (Private o Public) Nome della routine: oggettoGeneratore_evento(parametri) Esempio Private Sub Command1_Click() End Sub

33 Ing. Stefano Cadei -- Java33 Il secondo programma Invocazione da codice di API grafica: MsgBox Hello world from button

34 Ing. Stefano Cadei -- Java34 Ambiente di lavoro In sintesi: IDE composto da diverse parti Toolbox e Form Area per disegnare linterfaccia dellapplicazione Codice formato da routine di risposta ad eventi (event driven programming) Possibilità di chiamare da codice API grafiche

35 Ing. Stefano Cadei -- Java35 Visual Basic Elementi del linguaggio e primi programmi

36 Ing. Stefano Cadei -- Java36 Variabili Dichiarazione di una variabile Parole chiave Dim e as Tipo di una variabile Tipo semplice Istanza di un oggetto

37 Ing. Stefano Cadei -- Java37 Variabili (2) Esempi dichiarazione tipo semplice Dim variabile1 as Integer Dim variabile2 as Long Dim variabile3 as String Esempi dichiarazione oggetto Dim variabile1 As Cell Dim variabile2 as Row

38 Ing. Stefano Cadei -- Java38 Variabili(3)

39 Ing. Stefano Cadei -- Java39 Un primo esempio Private Sub Command1_Click() Dim a As Integer Dim b As Integer a = 100 b = 200 MsgBox a + b End Sub = operatore di assegnamento

40 Ing. Stefano Cadei -- Java40 Un secondo esempio Private Sub Command1_Click() Dim a As Integer Dim b As Integer a = InputBox("Inserisci a") b = InputBox("Inserisci b") MsgBox a + b End Sub

41 Ing. Stefano Cadei -- Java41 Analisi dei due esempi Mostrano luso di variabili intere Utilizzano due API di Windows per l I/O: MsgBox per loutput InputBox per linput Approccio NON EVENT DRIVEN Concettualmente non differiscono da writeln e readln (o istruzioni analoghe) Linput blocca lesecuzione Unica differenza: finestra invece di caratteri

42 Ing. Stefano Cadei -- Java42 Analisi dei due esempi (2) Abbandono dellidea di richiedere un input in un determinato momento Lutente inserisci gli input in ordine sparso Al verificarsi di un determinato evento viene eseguita lelaborazione Come accedere al contenuto inserito? Dove sono memorizzati i valori?

43 Ing. Stefano Cadei -- Java43 I componenti e le proprietà In generale, ogni componente grafico (bottone, textbox o altro) dispone di un certo numero di proprietà Modificabili dall IDE Leggibili e scrivibili da codice In generale, le routine di risposta ad eventi leggono il valore di certe proprietà e ne impostano altre

44 Ing. Stefano Cadei -- Java44 Il componente TextBox Modificando la proprietà Name si modifica il nome delloggetto grafico Tale nome è utilizzabile da codice Inseriamo due TextBox: Text1 e Text2

45 Ing. Stefano Cadei -- Java45 Il componente TextBox (2) Accesso da codice alloggetto Il nome delloggetto è accessibile nel codice come qualunque altra variabile Accesso da codice alle proprietà OGGETTO.PROPRIETA Es. Text1.Text Es. Text1.BackColor Proprietà Text Contiene il contenuto attuale del campo di testo Utilizzabile come variabile contenente il valore dellinput

46 Ing. Stefano Cadei -- Java46 Un esempio event driven Private Sub Command1_Click() Dim a As Integer Dim b As Integer a = Text1.text b = Text2.text MsgBox a + b End Sub Accesso alla proprietà text delloggetto textbox

47 Ing. Stefano Cadei -- Java47 I commenti Private Sub Command1_Click() Dim a As Integer Dim b As Integer a = Text1.text b = Text2.text MsgBox a + b End Sub Accesso alla proprietà text delloggetto textbox Il carattere (apice) introduce un commento

48 Ing. Stefano Cadei -- Java48 Ancora sulle routine di risposta Le routine di risposta ad un evento DEVONO essere veloci in esecuzione Non è pensabile scrivere molte istruzioni che tengano impegnata la macchina a lungo Il sistema operativo è in grado (entro certi limiti) di interrompere un esecuzione troppo lunga, oppure addirittura bloccata (PREEMPTION) Tuttavia, questa interruzione ad opera del sistema operativo, pur impedendo alla macchina di bloccarsi, non permette una corretta ripresa dellelaborazione degli eventi Esistono meccanismi più sofisticati (thread, timer) per gestire casi di lunghe sequenze di istruzioni Nei casi basilari (come quelli di questo corso) le routine di risposta agli eventi DEVONO ESSERE BREVI

49 Ing. Stefano Cadei -- Java49 Esercizio: area rettangolo Linterfaccia richiesta

50 Ing. Stefano Cadei -- Java50 Esercizio: area rettangolo (2) Il codice Private Sub Command1_Click() 'dichiarazione variabili Dim base As Integer Dim altezza As Integer Dim area As Integer 'accesso alle proprietà dei campi di input base = textBase.Text altezza = textAltezza.Text 'calcolo dell'area area = base * altezza 'scrittura a video dell'output MsgBox "L'area vale " & Str(area) End Sub NON SONO ISTRUZIONI DI INPUT, MA DI LETTURA PROPRIETA

51 Ing. Stefano Cadei -- Java51 El. ling. e primi programmi In sintesi: Struttura Dim-As per dichiarazione variabili Accesso alle proprietà dei componenti grafici in sostituzione delle istr. di input Il componente TextBox Commenti con (apice)

52 Ing. Stefano Cadei -- Java52 Visual Basic Strutture di controllo: If / For / While / Do

53 Ing. Stefano Cadei -- Java53 If - Else If Text1.Text > Text2.Text Then textEsito.Text = "Primo maggiore di secondo" Else textEsito.Text = "Secondo maggiore di primo" End If Sintassi If condizione Then istruzioni Else istruzioni End If Esempio

54 Ing. Stefano Cadei -- Java54 If – Else (2) Operatori di confronto: >, =,<= Operatore di uguaglianza Identico alloperatore di assegnamento In controtendenza rispetto agli altri linguaggi Pascal: ass. :=, uguaglianza = C, C++, Java, JavaScript : ass. =, uguaglianza == a = 10 If a = 10 then

55 Ing. Stefano Cadei -- Java55 If – Else : esercizio Soluzione di un equazione di 2° grado (in campo reale) a coefficienti interi Controllo del DELTA Se DELTA > 0 => due soluzioni Se DELTA = 0 => una soluzione (due uguali) Se DELTA nessuna soluzione

56 Ing. Stefano Cadei -- Java56 If – Else : esercizio (2) Preparazione dell interfaccia con IDE Obiettivo

57 Ing. Stefano Cadei -- Java57 If – Else : esercizio (3) Sei TextBox: tre di input e due di output TextA TextB TextC TextEquazione TextRisultato }

58 Ing. Stefano Cadei -- Java58 If – Else : esercizio (4) Private Sub Command1_Click() 'dichiarazione delle variabili Dim a As Integer Dim b As Integer Dim c As Integer Dim delta As Integer Dim x1 As Double Dim x2 As Double 'acquisizione dei valori dell'input (non bloccante, già inseriti) a = textA.Text b = textB.Text c = textC.Text 'scrittura a video dell'equazione textEquazione.Text = Str(a) + "x^2 +" + Str(b) + "x +" + Str(c)

59 Ing. Stefano Cadei -- Java59 If – Else : esercizio (5) 'calcolo del delta delta = b * b - 4 * a * c 'controllo del delta, calcolo e scrittura del risultato If delta > 0 Then x1 = (-b + Sqr(delta)) / (2 * a) x2 = (-b - Sqr(delta)) / (2 * a) textRisultato.Text = "x1 = " + Str(x1) + "x2 = " + Str(x2) Else If delta = 0 Then x1 = (-b + Sqr(delta)) / (2 * a) x2 = x1 textRisultato.Text = "x1 = " & x1 + "x2 = " & x2 Else textRisultato.Text = "Nessuna soluzione reale" End If End Sub

60 Ing. Stefano Cadei -- Java60 Il controllo sugli input Necessità di impedire il calcolo con input non previsti La proprietà Textbox.Text accede ad un testo Se il testo rappresenta un valore numerico naturale, la stringa viene automaticamente convertita in numero Altrimenti viene segnalato un errore RunTime

61 Ing. Stefano Cadei -- Java61 Il controllo sugli input (2) Istruzione Val(Stringa) Converte un testo in valore numerico In caso di caratteri alfabetici restituisce 0 'acquisizione dei valori dell'input (non bloccante, già inseriti) a = Val(textA.Text) b = Val(textB.Text) c = Val(textC.Text) Possibile un controllo preliminare If Val(textA.Text) = 0 then …

62 Ing. Stefano Cadei -- Java62 For Permette di eseguire un blocco di istruzioni un numero noto di volte Sintassi For contantore=valoreIniziale To valoreFinale istruzioni Next contatore

63 Ing. Stefano Cadei -- Java63 For (2) Esempio Private Sub Command1_Click() 'dichiarazione variabili Dim i As Integer Dim somma As Integer calcolo della somma dei primi 10 numeri For i = 1 To 10 somma = somma + i Next i MsgBox "La somma dei primi 10 numeri vale " & somma End Sub

64 Ing. Stefano Cadei -- Java64 For : esercizio Calcolo del fattoriale di un numero Metodo iterativo (esiste anche soluzione ricorsiva) Interfaccia richiesta

65 Ing. Stefano Cadei -- Java65 For : esercizio (2) Private Sub Command1_Click() 'dichiarazione variabili Dim i As Integer Dim n As Integer Dim fattoriale As Integer 'lettura degli input dai campi di testo n = Val(textNumero.Text) fattoriale = 1 'calcolo del fattoriale For i = 1 To n fattoriale = fattoriale * i Next i 'scrittura del risultato textValore.Text = fattoriale End Sub For i = n To 1 Step -1 fattoriale = fattoriale * i Next i Ciclo a contatore decrescente

66 Ing. Stefano Cadei -- Java66 While / Do-Loop Permettono di eseguire un blocco di istruzioni fino a quando una condizione è rispettata While: Ciclo a CONDIZIONE INIZIALE Do-Loop: Ciclo a CONDIZIONE FINALE Sintassi While Inizializzazione variabili While condizione istruzioni Wend Sintassi Do-Loop Do istruzioni Loop While|Until condizione

67 Ing. Stefano Cadei -- Java67 While / Do-Loop (2) i = 1 While i <= n fattoriale = fattoriale * i i = i + 1 Wend Esempio While i = 1 Do fattoriale = fattoriale * i i = i + 1 Loop While i <= n Esempi Do-Loop (1) i = 1 Do fattoriale = fattoriale * i i = i + 1 Loop Until i > n Esempi Do-Loop (2)

68 Ing. Stefano Cadei -- Java68 Strutture di controllo In sintesi: If-Else For Tradizionale Contatore decrescente While Do-Loop Condizione di rimanenza (Do-Loop While) Condizione di uscita (Do-Loop Until) Esercizi Equazione di secondo grado Fattoriale

69 Ing. Stefano Cadei -- Java69 Attenzione alluso dei cicli! Come già detto, le routine di risposta ad un evento devono essere veloci in esecuzione per non bloccare lelaborazione degli altri eventi Luso dei cicli può diventare pericoloso Cicli troppo lunghi Cicli INFINITI Errore tipico: nei cicli While e Do ci si dimentica di incrementare il contatore Per usare cicli lunghi occorre inserire esplicitamente istruzioni avanzate di gestione del flusso del programma Operazione non sempre agevole: Visual Basic fornisce un ambiente molto semplice da utilizzare in modo standard, ma abbastanza restio a modifiche al funzionamento predefinito

70 Ing. Stefano Cadei -- Java70 Visual Basic Array e Funzioni

71 Ing. Stefano Cadei -- Java71 Array Array: sequenza ordinata di variabili dello stesso tipo (sia semplice che strutturato) Singoli elementi accessibili tramite indicizzazione Array monodimensionale : vettore Array n-dimensionale : matrice Sintassi dim nomeArray(dimensione) as tipo Esempio Dim vettore(10) As Integer

72 Ing. Stefano Cadei -- Java72 Indici degli array In VB gli indici di un array partono dal valore 0 e arrivano ad n-1 Un array di 10 elementi ha indici da 0 – 9 Esempio Private Sub Form_Load() Dim a(10) As Integer Dim i As Integer For i = 0 To 10 a(i) = i Next i End Sub Sforamento non segnalato ?????? (11 posizioni assegnate)

73 Ing. Stefano Cadei -- Java73 Indici degli array(2) VB, durante le interpretazioni di debug, esegue run time il controllo sul valore degli indici degli array Tuttavia, la dichiarazione di un array alloca un valore in più rispetto al parametro dimensione Significati corretti della sintassi: Dim array(indice_ultimoElemento) as tipo Dim array(numeroElementi - 1) as tipo Spesso si considera (in modo non esatto) come semantica della sintassi la prima esposta, perdendo quindi un elemento dellarray

74 Ing. Stefano Cadei -- Java74 Indici degli array(3) Listruzione UBound (upper-bound) permette di conoscere lultimo indice di un vettore, e quindi corrisponde alla dimensione di un array meno uno Sintassi UBound(vettore) Esempio Dim vettore(10) As Integer MsgBox UBound(vettore)

75 Ing. Stefano Cadei -- Java75 Array di dimensione variabile Situazioni in cui la dimensione dellarray non è nota a priori Dichiarazione iniziale di un array con dimensione non precisata Utilizzo dellistruzione Redim per dimensionamento runtime Sintassi ReDim nomeArray(dimensione)

76 Ing. Stefano Cadei -- Java76 Redim (esempio) Private Sub Form_Load() dichiarazione vettore con dimensione non speficata Dim vettore() As Integer impostazione della dimensione del vettore ReDim vettore(10) MsgBox UBound(vettore) redimensionamento del vettore ReDim vettore(100) MsgBox UBound(vettore) End Sub

77 Ing. Stefano Cadei -- Java77 Matrici Array bidimensionale: vettore di vettori Sintassi Dim matrice (righe-1)(colonne-1) as tipo Stesso problema della dichiarazione degli array (i parametri sono in realtà i valori degli ultimi indici) Esempio 'dichiarazione matrice 2X2 Dim matrice(1, 1) As Double

78 Ing. Stefano Cadei -- Java78 Esempio Calcolo del determinante di una matrice quadrata 'dichiarazione matrice 2X2 Dim determinante, matrice(1, 1) As Double matrice(0, 0) = 1 matrice(0, 1) = 2 matrice(1, 0) = 3 matrice(1, 1) = 4 determinante = matrice(0, 0) * matrice(1, 1) - matrice(1, 0) * matrice(0, 1) MsgBox determinante

79 Ing. Stefano Cadei -- Java79 Esercizio Soluzione di un sistema lineare di due equazioni in due incognite con metodo di Cramer Interfaccia richiesta

80 Ing. Stefano Cadei -- Java80 Esempio: soluzione Private Sub Command1_Click() Dim matriceX(1, 1) as Double, matriceY(1, 1) as Double, matriceD(1, 1) as Double Dim detX, detY, detD As Double Dim x, y As Double 'popolamento matrice D matriceD(0, 0) = textA1.Text matriceD(0, 1) = textB1.Text matriceD(1, 0) = textA2.Text matriceD(1, 1) = textB2.Text 'popolamento matrice X matriceX(0, 0) = textC1.Text matriceX(0, 1) = textB1.Text matriceX(1, 0) = textC2.Text matriceX(1, 1) = textB2.Text

81 Ing. Stefano Cadei -- Java81 Esempio: soluzione (2) 'popolamento matrice y matriceY(0, 0) = textA1.Text matriceY(0, 1) = textC1.Text matriceY(1, 0) = textA2.Text matriceY(1, 1) = textC2.Text 'calcolo determinanti detX = matriceX(0, 0) * matriceX(1, 1) - matriceX(1, 0) * matriceX(0, 1) detY = matriceY(0, 0) * matriceY(1, 1) - matriceY(1, 0) * matriceY(0, 1) detD = matriceD(0, 0) * matriceD(1, 1) - matriceD(1, 0) * matriceD(0, 1) 'calcolo di X e Y x = detX / detD y = detY / detD labelRisultatoX.Caption = "X=" & x labelRisultatoY.Caption = "Y=" & y End Sub

82 Ing. Stefano Cadei -- Java82 Subroutine e Function Modularizzazione del codice in sottoprogrammi La gestione eventi vista sino ad ora fa ampiamente uso di questo approccio Subroutine (sub): sottoprogramma che non restituisce nulla al chiamante Function: sottoprogramma che restituisce un valore al chiamante

83 Ing. Stefano Cadei -- Java83 Subroutine e Function (2) Sintassi SubRoutine Public/Private Sub Nome (parametri) Esempio Sintassi Function Public/Private Function Nome (parametri) as tipoRitornato Private Sub Prova (a As Integer, b As Integer) Private Function Somma (a As Integer, b As Integer) as Integer

84 Ing. Stefano Cadei -- Java84 Subroutine e Function (3) Invocazione subroutine nomeSubRoutine [SPAZIO] parametri Esempio Invocazione function Variabile = nomeFunction (parametri) nomeFunction [SPAZIO] parametri Esempio Prova 3, 4 Variabile = Somma(3, 4)

85 Ing. Stefano Cadei -- Java85 Function: valore di ritorno Per ritornare un valore al chiamante, una function utilizza una sintassi simile ad un assegnamento Esempio: Private Function Pari(numero As Integer) As Boolean Dim esito As Boolean If (numero Mod 2 = 0) Then esito = True Else esito = False End If assegnamento del valore di ritorno Pari = esito End Function

86 Ing. Stefano Cadei -- Java86 Function: valore di ritorno (2) Non è necessario assegnare il valore di ritorno al termine della function In realtà, non esiste alcuna istruzione esplicita di ritorno Listruzione di assegnamento del valore di ritorno è un vero assegnamento ad una variabile di tipo funzione In sostanza, il nome della function è visto (anche) come una variabile a cui assegnare il valore di ritorno

87 Ing. Stefano Cadei -- Java87 Passaggio di array I vettori vengono implicitamente passati per riferimento Qualunque siano le dimensioni dell array coinvolto, una sub/function che deve ricevere tale array come parametro segue la seguente sintassi Private/Public Sub (vettore() as tipo) Private/Public Function (vettore() as tipo) as tipoRest. Le parentesi tonde indicano che si sta passando un array di dimensione imprecisata

88 Ing. Stefano Cadei -- Java88 Il passaggio dei parametri I parametri di una subroutine o di una function possono essere passati per valore o per riferimento Passaggio per valore: ByVal Passaggio per riferimento : ByRef Private Sub NomeSub(ByVal a As Integer, ByVal b As Integer)

89 Ing. Stefano Cadei -- Java89 Passaggio per valore Con il passaggio per valore, il valore passato alla subroutine o function dal programma invocante è copiato nella parte di memoria occupata dalla funzione Ogni modifica sul parametro effettuata dalla funzione ha un effetto solo locale, in quanto le scritture vengono effettuate su una copia della variabile originale

90 Ing. Stefano Cadei -- Java90 Passaggio per riferimento Con il passaggio per riferimento, il chiamante passa implicitamente alla subroutine/function lindirizzo di memoria della variabile da processare In questo caso, il sottoprogramma invocato può modificare direttamente larea di memoria del codice chiamante

91 Ing. Stefano Cadei -- Java91 Passaggio parametri: esempio Si supponga di voler utilizzare una subroutine di scambio fra due valori allinterno del seguente programma Private Sub Command1_Click() Dim n1 As Integer Dim n2 As Integer n1 = 4 n2 = 2 Scambia n1, n2 MsgBox n1 MsgBox n2 End Sub

92 Ing. Stefano Cadei -- Java92 Passaggio parametri: es. (2) Se si utilizza ByVal lo scambio non avviene Vengono scambiate solo le copie locali Codice corretto con ByRef Private Sub Scambia(ByRef a As Integer, ByRef b As Integer) Dim temp As Integer temp = a a = b b = temp End Sub

93 Ing. Stefano Cadei -- Java93 Il passaggio di parametri (2) Se non viene utilizzata alcuna specifica sul tipo di passaggio dei parametri, di default VB6 utilizza ByRef Tuttavia, quando la sub/function invocata può scrivere sui parametri, è fortemente consigliato che il programmatore specifichi consapevolmente il tipo di passaggio Differenze tra VB e VB.NET (default ByVal)

94 Ing. Stefano Cadei -- Java94 Passaggio di array I vettori vengono implicitamente passati per riferimento Qualunque siano le dimensioni dell array coinvolto, una sub/function che deve ricevere tale array come parametro segue la seguente sintassi Private/Public Sub (vettore() as tipo) Private/Public Function (vettore() as tipo) as tipoRest. Le parentesi tonde indicano che si sta passando un array di dimensione imprecisata

95 Ing. Stefano Cadei -- Java95 Esercizio 1 Private Function Massimo(vettore() As Integer) As Integer Dim i As Integer max = vettore(0) For i = 1 To UBound(vettore) If vettore(i) > max Then max = vettore(i) End If Next i Massimo = max End Function Scrivere una funzione che calcola il valore massimo di un vettore

96 Ing. Stefano Cadei -- Java96 Esercizio (2) Scrivere una funzione per il calcolo del determinante ed utilizzarla allinterno del programma per il calcolo del determinante Private Function Det(m() As Double) As Double Dim valore As Double valore = m(0, 0) * m(1, 1) - m(1, 0) * m(0, 1) Det = valore End Function

97 Ing. Stefano Cadei -- Java97 Visual Basic Fineste multiple, nuovi eventi e nuovi componenti

98 Ing. Stefano Cadei -- Java98 I programmi visti fino ad ora TextBox, Label e Bottoni Reazione al solo click su un pulsante Un solo Form (le MsgBox non sono form) La finestra Proprietà del progetto non è stata mai utilizzata

99 Ing. Stefano Cadei -- Java99 Aggiunta di un nuovo Form Proprietà del progetto Pulsante destro su cartella Form Inserisci Form

100 Ing. Stefano Cadei -- Java100 Aggiunta di un nuovo Form(2) Il nuovo form ha uno spazio dei nomi separato rispetto a quello precedente E possibile dare nomi ai componenti grafici anche se questi sono uguali a quelli di un altro form Il form che viene visualizzato per primo è comunque quello precedente (salvo modifiche alle impostazioni del progetto) Per aprire il nuovo Form nomeNuovoForm.Show

101 Ing. Stefano Cadei -- Java101 Il componente ComboBox Permette di selezionare un valore da una lista I vari elementi sono visualizzati in un menù a tendina Problemi da affrontare: Come popolare la lista? Quando popolare la lista? Qual è il valore corrente?

102 Ing. Stefano Cadei -- Java102 Metodo per il caricamento Metodo di un oggetto Funzione che è incapsulata dentro un oggetto Permette di far eseguire qualcosa alloggetto Ogni variabile associata ad un componente grafico è in realtà un oggetto formato da proprietà e metodi Metodo addItem delloggetto combo Esempio di caricamento Dove inserire il codice di caricamento? Combo1.AddItem "Rettangolo" Combo1.AddItem "Triangolo" Combo1.AddItem "Cerchio"

103 Ing. Stefano Cadei -- Java103 Levento Form_Load E un evento che viene attivato quando un form è stato caricato e PRIMA di essere visualizzato Normalmente contiene tutte le inizializzazioni della finestra Il codice che popola la lista del componente ComboBox va inserito qui Doppio click sulla superficie del form per accedere al codice

104 Ing. Stefano Cadei -- Java104 Caricamento e accesso Private Sub Form_Load() 'popolamento della lista Combo1.AddItem "Rettangolo" Combo1.AddItem "Triangolo" Combo1.AddItem "Cerchio" 'impostazione del valore di default Combo1.ListIndex = 0 End Sub Indici che partono da 0 MsgBox Combo1.Text Caricamento (dentro Form_Load) Accesso (dove occorre…)

105 Ing. Stefano Cadei -- Java105 Diramazione dellesecuzione A seconda del valore selezionato si eseguono azioni diverse Soluzione con If-Annidati If combo1.ListIndex = 0 then Else If combo1.ListIndex = 1 then Else If combo1.ListIndex = 2 then Else End If End if

106 Ing. Stefano Cadei -- Java106 Select-Case Una nuova struttura di controllo permette di evitare gli If Annidati Sintassi Select Case Combo1.ListIndex Case 0 istruzioni caso 0 Case 1 istruzioni caso 1 Case 2 istruzioni caso 2 End Select Select Case elementoDaControllare Case 0: istruzioni Case 1 istruzioni …. End Select Esempio

107 Ing. Stefano Cadei -- Java107 Il componente PictureBox Caricamento dinamico Picture1.Picture = LoadPicture("C:\image.jpg")

108 Ing. Stefano Cadei -- Java108 Esercizio: Geometria Calcolare larea di Rettangolo Quadrato Parallelogramma Rombo in base ad una scelta fatta con un comboBox, visualizzando al volo limmagine della figura geometrica scelta.

109 Ing. Stefano Cadei -- Java109 Esercizio: Geometria (2) Cambio dellimmagine Routine eseguita ad ogni click sul combo Private Sub Combo1_Click() Select Case Combo1.ListIndex Case 0 Picture1.Picture = LoadPicture("c:\rettangolo.jpg") Case 1 Picture1.Picture = LoadPicture("c:\triangolo.jpg") Case 2 Picture1.Picture = LoadPicture("c:\cerchio.jpg") End Select End Sub

110 Ing. Stefano Cadei -- Java110 Finestra multiple, nuovi eventi e nuovi componenti In sintesi: Form multipli Evento Form_Load Componente ComboBox Struttura Select-Case Componente PictureBox Esercizio Geometria

111 Ing. Stefano Cadei -- Java111 VBA Introduzione

112 Ing. Stefano Cadei -- Java112 Descrizione GUI Differenza concettuale con VB CompilazioneLinkingLoading Interpretazione Visual Basic VBA Codice Sorgente Binario eseguibile Programma in esecuzione Binario Eseguibile Office Office (Excel) in esecuzione Istruzioni VB File Office VBA

113 Ing. Stefano Cadei -- Java113 Applicazioni VBA Un applicazione VBA viene interpretata da Office Un applicazione VBA viene spesso chiamata MACRO Caratteristiche delle macro Esecuzione lenta (interpretazione di un P-Code intermedio) Accesso diretto agli oggetti del file di dati che contiene lapplicazione VBA Capacità di eseguire codice maligno (essendo unapplicazione a tutti gli effetti) VIRUS informatici contenuti dentro file Word o Excel VIRUS che vengono eseguiti quando si avvia lapplicazione ospitante

114 Ing. Stefano Cadei -- Java114 Il linguaggio Elementi del linguaggio completamente identici a Visual Basic tradizionale Oggetti e componenti grafici standard molto simili (un sottoinsieme di VB) Oggetti nuovi per linterazione con le applicazioni ospitanti Excel (fogli, celle, grafici) In sostanza, chi sa programmare in VB standard programma anche in VBA Lo stesso non vale per VB.NET

115 Ing. Stefano Cadei -- Java115 VBA: lambiente di lavoro Lambiente di lavoro diventa Office Considereremo come applicazione ospitante di riferimento Excel (2003) Visualizzazione della Toolbar

116 Ing. Stefano Cadei -- Java116 VBA: lambiente di lavoro (2) Inserimento di un bottone Strumenti di controllo Nessun Form utilizzato Il foglio stesso contiene gli oggetti Strumenti di controllo

117 Ing. Stefano Cadei -- Java117 VBA: l IDE Visual Basic Doppio click sul pulsante per aprire un IDE molto simile a quello di VB Non cè la toolbar (si trova nel foglio)

118 Ing. Stefano Cadei -- Java118 VBA: Hello World All interno della routine di risposta allevento click invochiamo lAPI MsgBox Stesse API di Visual Basic Il titolo della finestra mostrata è Microsoft Excel perché lapplicazione che il sistema operativo sta eseguendo non è lapplicazione VBA, ma quella ospitante

119 Ing. Stefano Cadei -- Java119 La modalità progettazione Quando si fa doppio click su di un pulsante lambiente apre l IDE VB e passa alla modalità di progettazione Il click su qualunque elemento fa riaprire l IDE VB Per tornare alla modalità desecuzione occorre selezionare Esci da Modalità Progettazione nella barra degli strumenti VB

120 Ing. Stefano Cadei -- Java120 Labilitazione delle macro Normalmente le macro sono disabilitate Prevenzione da virus (primi anni 2000) Possibili diversi livelli di protezione

121 Ing. Stefano Cadei -- Java121 Labilitazione delle macro (2)

122 Ing. Stefano Cadei -- Java122 VBA: Introduzione In sintesi Macro VBA eseguite in applicazione Office ospitante Codice interpretato Linguaggio identico a Visual Basic Necessità di visualizzare barra strumenti VB Il foglio di calcolo contiene gli oggetti grafici Modalità progettazione ed esecuzione

123 Ing. Stefano Cadei -- Java123 VBA Interazione con Excel

124 Ing. Stefano Cadei -- Java124 Ogni foglio di excel è un oggetto identificato da un nome Attributi Metodi Il tipo di oggetto è WorkSheet Una eventuale dichiarazione di oggetto è del tipo dim mioFoglio as WorkSheet In questo corso useremo solamente gli worksheet predefiniti Di default esiste sempre loggetto foglio1 Accesso al foglio di lavoro

125 Ing. Stefano Cadei -- Java125 Proprietà cells di un oggetto WorkSheets Permette di vedere un foglio di calcolo come una matrice bidimensionale Sintassi: nomeFoglio.cells(indiceRiga, indiceColonna) La matrice è utilizzabile sia in lettura che in scrittura Lettura : variabile = foglio1.cells(1,1) Scrittura: foglio1.cells(2,2) = 50 La matrice cells

126 Ing. Stefano Cadei -- Java126 Con la proprietà cells è possibile popolare dinamicamente le celle di un foglio Esempio: inserimento 10 numeri nella prima riga Esempio: inserire dati Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 Foglio1.Cells(1, i) = Math.rnd(1) Next I End Sub

127 Ing. Stefano Cadei -- Java127 E possibile associare un grafico che visualizza i valori delle celle selezionate Quando si aggiornano i dati delle celle da codice anche il grafico si aggiorna automaticamente (+) Meccanismo molto potente: si ottengono rappresentazioni grafiche di vario tipo senza sforzo programmativo (grafica complessa direttamente) (--) Meccanismo inefficiente: il rendering dei grafici è molto lento rispetto a soluzioni programmate esplicitamente Inefficienza aggravata dal fatto che VBA è interpretato Esempio: inserire dati (2)

128 Ing. Stefano Cadei -- Java128 E possibile associare un grafico che visualizza i valori delle celle selezionate Quando si aggiornano i dati delle celle da codice anche il grafico si aggiorna automaticamente Grafico dinamico dei dati

129 Ing. Stefano Cadei -- Java129 Esercizio: sinusoide Obiettivo: disegnare una sinusoide, e alla pressione di un bottone traslarla (a destra) di un valore configurabile Interfaccia richiesta

130 Ing. Stefano Cadei -- Java130 Levento Activate Le inizializzazioni necessarie alla corretta esecuzione di una macro vanno fatte nella routine di risposta allevento Activate Simile a FormLoad nel caso di VB classico

131 Ing. Stefano Cadei -- Java131 VBA: Interazione con Excel In sintesi Accesso al foglio di lavoro La matrice cells Levento Activate

132 Ing. Stefano Cadei -- Java132 Visual Basic / VBA Interazione con il SO: DoEvents e API (cenni)

133 Ing. Stefano Cadei -- Java133 Routine di risposta lunghe? Si è detto che …le routine di risposta ad un evento DEVONO essere veloci in esecuzione Requisito dovuto al fatto che mentre è in esecuzione una routine di risposta ad un evento, normalmente nessun altro evento viene elaborato Cosa fare nel caso in cui la routine di risposta è intrinsecamente lunga? Cosa fare nel caso in cui una routine di risposta sia ricorsiva (con molte chiamate ricorsive)?

134 Ing. Stefano Cadei -- Java134 Lelaborazione degli eventi Ciò che conta è che la routine di risposta non blocchi lelaborazione di altri eventi Lelaborazione di eventi avviene in seguito alla comunicazione data dal sistema operativo Se la routine è breve, allora al termine della sua esecuzione levento viene elaborato Se la routine contiene istruzioni esplicite di input (come InputBox), durante lattesa gli altri eventi vengono elaborati Altrimenti, è necessario inserire allinterno della routine una esplicita istruzione per controllare la presenza di altri eventi e avviarne lelaborazione La nuova elaborazione si affianca a quella corrente

135 Ing. Stefano Cadei -- Java135 DoEvents Listruzione per forzare il controllo di eventi e lavvio della loro elaborazione è DoEvents Listruzione può essere tradotta con le seguenti pseudo-istruzioni Controlla se è presente qualche messaggio segnalante un evento Se si, avvia la corrispondente routine di risposta Alterna nellavanzamento la routine corrente e quella appena caricata

136 Ing. Stefano Cadei -- Java136 Accesso alle API di sistema Un sistema operativo come Windows mette a disposizione molte funzioni richiamabili allinterno dei linguaggi di programmazione Tali funzioni formano la Application Programming Interface (API) di sistema Laccesso alle API normalmente non avviene esplicitamente Il compilatore traduce le istruzioni in chiamate ad opportuni moduli del sistema operativo Esempio tipico: MsgBox Hello World

137 Ing. Stefano Cadei -- Java137 Accesso alle API di sistema (2) Laccesso esplicito alle API di sistema permette di eseguire istruzioni che non sono presenti nel linguaggio utilizzato Utilizzo delle API concettualmente simile allinvocazione dei comandi DOS/Unix, anche se con architettura software di basso livello radicalmente diversa Le API di Windows sono contenute allinterno di alcuni file con estensione DLL Kernel32.dll : funzioni a basso livello (es. timer) Gdi32.dll : funzioni grafiche User.dll : funzioni a livello utente

138 Ing. Stefano Cadei -- Java138 Uso di API di sistema con VB Uso delle API non banale Necessità di conoscerne linterfaccia Necessità di conoscerne lubicazione (file DLL) Direttiva Declare Sintassi Declare Sub NomeAPI Lib NomeDLL (parametri) Esempio Una volta dichiarata, la funzione è utilizzabile come un elemento del linguaggio Public Declare Sub Sleep Lib "kernel32.dll" (ByVal s As Long)

139 Ing. Stefano Cadei -- Java139 Obiettivo: simulare la traslazione continua di un onda sinusoidale Pulsanti Start/Stop Grafico con Excel (VBA) Es.: grafico in movimento

140 Ing. Stefano Cadei -- Java140 Es.: grafico in movimento dichiarazione di utilizzo dellAPI Sleep contenuta in Kernel32.dll Private Declare Sub Sleep Lib "kernel32" (ByVal millisecs As Long) Dim ferma As Boolean Private Sub CommandButton2_Click() ferma = True End Sub evento di attivazione del foglio di calcolo Private Sub Worksheet_Activate() ferma = False End Sub

141 Ing. Stefano Cadei -- Java141 Es.: grafico in movimento Private Sub CommandButton1_Click() Dim i As Integer Dim fase As Integer ferma = False accesso al valore della fase fase = Foglio1.Cells(1, 2) calcolo dei valori della funzione sinusoidale For j = 1 To 10 For i = 1 To 63 Foglio1.Cells(i, 1) = Math.Sin(i / 10 - fase / 50) Next i Next j

142 Ing. Stefano Cadei -- Java142 Es.: grafico in movimento aggiornamento della fase (traslazione) Foglio1.Cells(1, 2) = fase + 1 invocazione dellAPI di sistema per lo sleep di 100 ms Sleep 100 invocazione di DoEvents per far avanzare gli altri eventi DoEvents reinvocazione condizionata della funzione di animazione If ferma = False Then CommandButton1_Click End If End Sub

143 Ing. Stefano Cadei -- Java143 VB/VBA: Interazione con il SO In sintesi Meccanismo base elaborazione eventi DoEvents Direttiva Declare per API sistema operativo Esempio Sinusoide in movimento

144 Ing. Stefano Cadei -- Java144 Visual Basic Timer e API GDI

145 Ing. Stefano Cadei -- Java145 Il controllo Timer Componente che genera un evento di tipo Timer regolarmente allo scadere di un intervallo di tempo impostabile Componente grafico visibile solo in fase di progettazione (non visibile a runtime) Molto utile per animazioni grafiche e simulazioni di movimento

146 Ing. Stefano Cadei -- Java146 Il controllo Timer (2) Proprietà Interval Contiene il valore in millisecondi dellintervallo di tempo tra un evento ed il successivo Il valore è in realtà un valore minimo e non è da considerarsi esatto (sistema operativo non real time) Non utilizzare Timer, Visual Basic o Windows per applicazioni in cui la precisione degli intervalli di tempo è un requisito indispensabile

147 Ing. Stefano Cadei -- Java147 Il controllo Timer (3) Ai fini pratici è possibile considerare il controllo Timer come un generatore di evento ad intervalli regolari Il programmatore deve solamente scrivere la routine di risposta allevento Possibile utilizzo contemporaneo di più timer

148 Ing. Stefano Cadei -- Java148 Le API GDI Tra le varie API di Windows sono particolarmente utili le Graphic Device Interfaces API (GDI) Tali API permettono di disegnare liberamente sulle finestre NB. In questo corso vedremo una trattazione semplificata delle API GDI, trascurando alcuni aspetti troppo tecnici

149 Ing. Stefano Cadei -- Java149 Le API GDI (2) API contenute nella libreria dinamica gdi32.dll Necessario dichiarare i prototipi delle funzioni da utilizzare Aspetto scomodo di VB Di ogni funzione va dichiarato il prototipo Consigliabile raggruppare i prototipi in opportuni moduli riutilizzabili

150 Ing. Stefano Cadei -- Java150 Le API GDI (3) Le API GDI non sono istruzioni Visual Basic, ma funzioni messe a disposizione dal sistema operativo La documentazione relativa alle funzioni da utilizzare va cercata nella documentazione di sistema Un link molto utile:

151 Ing. Stefano Cadei -- Java151 Esempio duso di API GDI Function LineTo: permette di disegnare una linea partendo dalla posizione precedente (quale?) e con le impostazioni precedenti (quali?) Prototipo (da dichiarare!!!) Private Declare Function LineTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long Esempio LineTo hdc, 100, 100

152 Ing. Stefano Cadei -- Java152 Esempio duso di API GDI (2) Il primo parametro hdc è un HANDLE, cioè un numero intero (long) associato ad un elemento del sistema operativo Nel caso particolare è un handle ad un Device Context (DC) In questo corso useremo sempre hdc

153 Ing. Stefano Cadei -- Java153 Il ridisegno della finestra Se si prova a trascinare la finestra con la linea disegnata fuori dallo schermo, al rientro la linea è sparita Il motivo del mancato ridisegno risiede nel fatto che nessuno ha istruito la finestra (il form) di ridisegnare la linea Nei controlli predefiniti (Label, TextBox, ecc) il ridisegno è gestito in automatico

154 Ing. Stefano Cadei -- Java154 Levento Form_Paint Quando una finestra deve essere ridisegnata sullo schermo, viene generato un evento di tipo Form_Paint Prima viene gestito il disegno nel modo di default previsto dal sistema operativo (disegno dei componenti grafici standard) Al termine della gestione di base viene lanciato Form_Paint, lasciando al programmatore la gestione di altri disegni

155 Ing. Stefano Cadei -- Java155 Levento Form_Paint: esempio Nellesempio di disegno di una linea, affinchè sia gestito correttamente il ridisegno è sufficiente inserire linvocazione di LineTo allinterno della routine di risposta a Form_Paint

156 Ing. Stefano Cadei -- Java156 Le API principali LineTo hdc, x, y Permette di disegnare una linea MoveToEx hdc, x, y, point Permette di posizionare il cursore virtuale in un punto SelectObject hdc, object Permette di applicare un oggetto al contesto grafico CreatePen hdc, style, width, color Permette di creare un oggetto penna per scrivere Textout hdc, x, y, string, ncount Permette di disegnare una stringa di testo

157 Ing. Stefano Cadei -- Java157 Le API principali (2) CreatePen e SelectObject vengono di solito applicate in sequenza Viene creato un nuovo tipo di cursore (pen) Viene applicato il cursore al contesto voluto Esempio dichiarazione dell handle alla pen Dim hPen as Long creazione della pen e applicazione al contesto grafico hPen = CreatePen(PS_SOLID, 15, RGB(255, 0, 0)) SelectObject hdc, hPen

158 Ing. Stefano Cadei -- Java158 Esercizio: moto parabolico Scrivere un programma in Visual Basic che permetta di simulare il moto parabolico di un punto materiale sfruttando le API GDI di Windows

159 Ing. Stefano Cadei -- Java159 JAVA Introduzione: una strana storia

160 Ing. Stefano Cadei -- Java160 La nascita di Java 1995: La situazione C / C++ Sviluppo professionale Sviluppo di software di base Interazione con dispositivi elettronici Visual Basic Sviluppo applicazioni semplici sotto Windows Pascal / Fortran Ambiente accademico Sviluppo didattico RPG / COBOL Ambito software gestionale/contabile

161 Ing. Stefano Cadei -- Java161 Perchè un nuovo linguaggio? Il progetto JAVA nasce nel 1991 (nome originale OAK) e richiede quattro anni di sviluppo Spinta iniziale: cambiare approccio alla progettazione di programmi per i microcomputer dellelettronica di consumo Portabilità Limitatezza delle risorse

162 Ing. Stefano Cadei -- Java162 Lidea del ByteCode Obiettivo: rendere i programmi portabili fra diverse piattaforme Due soluzioni note: Fornire il compilatore per ogni piattaforma (--) Necessario ricompilare / rilinkare Usare un interprete (--) Lentezza Lidea di JAVA: Compilazione in codice binario di una macchina virtuale (JVM, Java Virtual Machine) Interprete delle istruzioni macchina della JVM Quindi, compilazione + interpretazione

163 Ing. Stefano Cadei -- Java163 Lidea del ByteCode (2) Compilazione LoadingInterpretazione Codice Sorgente ByteCode Programma in esecuzione JVM in esecuzione Slogan: Write once, run anywhere Di fatto la portabilità da raggiungere attraverso luso di un interprete Linterprete è però relativamente efficiente, perché esegue quasi del codice macchina

164 Ing. Stefano Cadei -- Java164 Un C++ più semplice? Lidea della compilazione intermedia poteva essere applicata anche ai linguaggi esistenti Tra i linguaggi esistenti il più adatto era il C++ Usato per tutto il software di base Orientato agli oggetti Compatibile con il C Il C usato spessissimo per programmare lelettronica Il C++ non era gradito al 100%: E un linguaggio relativamente complesso Alcune caratteristiche del C++ sono davvero utili?

165 Ing. Stefano Cadei -- Java165 Il World Wide Web Progetto iniziale di JAVA: Nuovo C++ semplificato e pulito Linguaggio semi-compilato con ByteCode JVM per elettronica di consumo Nel primi anni 90 nuova rivoluzione: nasce il World Wide Web Problema della compatibilità tra piattaforme diverse Stesso concetto della compatibilità fra diversi dipositivi hardware Il team di sviluppo decide di cogliere la palla al balzo

166 Ing. Stefano Cadei -- Java166 Finalmente JAVA Sintassi molto simile a C/C++ Programmazione ad oggetti pura Eliminazione aspetti complessi (puntatori, allocazioni dinamiche, ecc) del C++ Linguaggio semi-compilato (ByteCode) Sviluppo guidato dal World Wide Web Intento di fornire tramite internet veri e propri programmi e non solo dati formattati

167 Ing. Stefano Cadei -- Java167 Uninfanzia difficile Lidea iniziale di JAVA nei confronti del WEB aveva precorso i tempi Mondo informatico non pronto Windows da casa diffuso in modo massiccio Microsoft non crede inizialmente (o non vuol credere?) nel WEB Linee dati a bassa velocità (56 Kbps) Impossibile scaricare al volo un programma JAVA NetScape crea JAVAScript (DIVERSO!!!!)

168 Ing. Stefano Cadei -- Java168 Cambio di target Lidea dei programmi per Internet (Applet) non decolla Java è però molto apprezzato Dal mondo accademico: pulito, elegante, portabile Dal mondo professionistico: simile al C++ JAVA si sposta sempre più verso lo sviluppo di applicazioni gestionali Grandi progetti Grandi risorse (RAM) ( ndr. curioso vista lintento iniziale ) Interazione con DataBase

169 Ing. Stefano Cadei -- Java169 Java oggi Tre versioni Java EE (Enterprise Edition) Java ME (Mobile Edition) Java SE JSP: Java Server Page Programmazione lato server per il Web Mondo molto vasto Oggetti binari precompilati Ambienti di sviluppo Altro…

170 Ing. Stefano Cadei -- Java170 JAVA (Un) Ambiente di sviluppo

171 Ing. Stefano Cadei -- Java171 Più di un ambiente Situazione radicalmente diversa rispetto a Visual Basic Ambiente di sviluppo non legato al linguaggio Possibile sviluppare con qualsiasi editor Diverse versioni di JAVA Considereremo le versioni successive alla 1.2

172 Ing. Stefano Cadei -- Java172 JRE e JDK Java Runtime Environment (JRE) Macchina virtuale Java (interprete) Codice di libreria in bytecode Launcher di applicazioni Java Development KIT Compilatore JAVA (da sorgente a bytecode) Debugger JDK include spesso JRE, non viceversa

173 Ing. Stefano Cadei -- Java173 JDK e ambienti di sviluppo Differenti versioni di JDK (e di corrispondenti JRE) La versione del JDK può essere considerata equivalente al concetto di versione del linguaggio JDK non è un ambiente di sviluppo in senso stretto Nessun editor predefinito Mancanza di IDE

174 Ing. Stefano Cadei -- Java174 JDK e ambienti di sviluppo (2) Diversi sviluppatori hanno proposto ambienti di sviluppo basati su JDK Ambiente di sviluppo SUN: NetBeans Ambiente ufficiale Molti strumenti avanzati di sviluppo Molto oneroso in termini di risorse Eclipse Ambiente relativamente snello (non troppo)

175 Ing. Stefano Cadei -- Java175 JAVA Introduzione e primi programmi

176 Ing. Stefano Cadei -- Java176 Una nota preliminare… Java è un linguaggio ad oggetti (quasi) puro Tutto è un oggetto Anche il programma stesso è un oggetto, che appartiene ad una determinata classe Java è relativamente restrittivo Nome del file sorgente vincolato (cfr. più avanti) Java consente sia la programmazione event driven che la programmazione procedurale classica

177 Ing. Stefano Cadei -- Java177 Tre diversi Hello World Java può essere utilizzato in tre diverse modalità Linea di comando Interfaccia grafica stand alone Applet eseguita allinterno di un browser Con Java esiste quindi un Hello World diverso per ognuna delle tre modalità

178 Ing. Stefano Cadei -- Java178 Hello World a linea comando public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } Il file sorgente contenente il codice deve chiamarsi HelloWorld.java (vincolo obbligatorio) Il file contenente il bytecode si chiamerà HelloWorld.class

179 Ing. Stefano Cadei -- Java179 Hello World con GUI import javax.swing.*; public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); JLabel label = new JLabel("Hello World"); label.setBounds(40,40,100,40); frame.setLayout(null); frame.add(label); frame.setBounds(10, 10, 200, 200); frame.setVisible(true); }

180 Ing. Stefano Cadei -- Java180 L applet Hello World import java.applet.*; import java.awt.*; public class Prova extends Applet{ public void paint(Graphics g){ g.drawString("Hello World", 10, 10); }

181 Ing. Stefano Cadei -- Java181 Analisi dei tre Hello World Tutti e tre i programmi contengono la dichiarazione di una classe pubblica Il motivo di questa sintassi è che ogni programma è esso stesso un oggetto Il primo ed il secondo programma contengono una funzione main(), mentre il terzo (lapplet) non ha un punto di entrata

182 Ing. Stefano Cadei -- Java182 Il metodo main Nella nomenclatura JAVA la funzione main viene chiamata metodo main I metodi sono funzioni appartenenti ad oggetti che permettono di eseguire operazioni sugli stessi o accedere ad alcune proprietà Essendo il programma stesso un oggetto, main è perciò chiamato metodo

183 Ing. Stefano Cadei -- Java183 Il metodo main (2) Il metodo main dei primi due esempi riceve come parametro un vettore di stringhe (normalmente chiamato args) Tale vettore contiene le stringhe testuali passate al programma java dal programma invocante Tipicamente rappresentano le opzioni passate da linea di comando

184 Ing. Stefano Cadei -- Java184 Listruzione import Negli esempi 2 e 3, nelle prime righe sono presenti delle istruzioni import Listruzione import serve a rendere visibili delle funzioni e delle classi di libreria allinterno del programma corrente Non è indispensabile usare import Possibile referenziare esplicitamente ogni volta la classe o la funzione voluta Di fatto import viene sempre utilizzato

185 Ing. Stefano Cadei -- Java185 Le Applet Lapplet dellesempio numero 3 è sostanzialmente un insieme di funzioni di risposta ad eventi In questo senso, vista la mancanza di punti dentrata, può essere considerata simile allapproccio Visual Basic Tuttavia, unapplet Java necessita di essere ospitata allinterno di un altro programma, tipicamente un browser web

186 Ing. Stefano Cadei -- Java186 Variabili Dichiarazione di una variabile Tipo nome Tipo di una variabile Tipo semplice Istanza di un oggetto

187 Ing. Stefano Cadei -- Java187 Variabili (2) Esempi dichiarazione tipo semplice Esempi dichiarazione oggetto int a; Char b; String stringa; Object oggetto; JFrame frame;

188 Ing. Stefano Cadei -- Java188 Perché quasi puro? Java è uno dei linguaggi che più si avvicina al paradigma OOP (object oriented programming) puro Ciò che non lo rende OOP puro è la presenza dei tipi di dati semplici, che NON SONO OGGETTI Interi Float Ecc. La scelta è dovuta a motivi di efficienza (gli oggetti richiedono molto più codice di lavoro per essere trattati)

189 Ing. Stefano Cadei -- Java189 Tipi di dati semplici

190 Ing. Stefano Cadei -- Java190 Le classi Wrapper Se il programmatore lo desidera, può rendere il codice completamente ad oggetti attraverso lutilizzo delle Classi Wrapper In sostanza, ogni tipo semplice è incapsulabile in un oggetto (nel vero senso del termine) che lo contiene

191 Ing. Stefano Cadei -- Java191 Dichiarazione e istanziazione Nel caso di variabili di tipo oggetto esiste una netta differenza fra dichiarazione e istanziazione Dichiarazione: viene dichiarato che si userà un oggetto di un certo tipo Lo spazio per contenere loggetto NON È ALLOCATO IN MEMORIA Istanziazione: effettiva allocazione in memoria di un oggetto

192 Ing. Stefano Cadei -- Java192 Dichiarazione e istanziazione (2) Listanziazione di un oggetto avviene attraverso lutilizzo delloperatore new Esempio: Nota: le righe che iniziano con // sono dei commenti //dichiarazione stringa String stringa; //istanziazione della stringa in memoria stringa = new String(Stringa di prova);

193 Ing. Stefano Cadei -- Java193 Dichiarazione e istanziazione (3) È fondamentale capire la differenza semantica fra dichiarazione di un tipo semplice e di un tipo oggetto Tipo semplice: viene riservata in memoria unarea destinata a contenere il dato (semantica classica della dichiarazione) Istanza oggetto: la sola dichiarazione non comporta lassegnazione di alcuna memoria riservata a contenere loggetto

194 Ing. Stefano Cadei -- Java194 Dichiarazione e istanziazione (4) Cosa succede quando si dichiara un oggetto? Viene allocata in memoria una piccolissima zona destinata a contenere lindirizzo delloggetto che verrà creato Quando loggetto viene istanziato tramite loperatore new, il suo contenuto viene messo in memoria e lindirizzo di tale memoria è assegnato alla variabile dichiarata

195 Ing. Stefano Cadei -- Java195 Dichiarazione e istanziazione (5)

196 Ing. Stefano Cadei -- Java196 Dichiarazione e istanziazione (6) La parte di memoria destinata a contenere lindirizzo delloggetto è chiamata riferimento alloggetto Per chi conoscesse C++, il concetto è simile (ma non uguale) allutilizzo di puntatori Un reference non è però un puntatore Aritmetica degli indirizzi non permessa Allocazione dinamica gestita dalla JVM

197 Ing. Stefano Cadei -- Java197 Confrontare due oggetti Il confronto di due tipi semplici non equivale al confronto di due oggetti a == b ? NO!!!

198 Ing. Stefano Cadei -- Java198 Confrontare due oggetti (2) Per confrontare luguaglianza tra due oggetti diversi è necessario invocare opportuni metodi degli stessi a.equals(b) ? SI!!!

199 Ing. Stefano Cadei -- Java199 Copia di oggetti Assegnare un riferimento (tipo semplice) ad un altro non provoca la copia del contenuto delloggetto referenziato a == b ? SI!!!

200 Ing. Stefano Cadei -- Java200 JAVA Input/Output da linea di comando: cenni

201 Ing. Stefano Cadei -- Java201 Istruzioni di I/O modali Istruzioni di input/output esplicite per la linea di comando Output: System.out.println(stringa) Input : System.in.read() In generale lI/O da linea di comando in JAVA è caratterizzato da una organizzazione complessa che non approfondiremo

202 Ing. Stefano Cadei -- Java202 Istruzioni di I/O modali (2) Le istruzioni di input di System.in sono troppo elementari (trattano byte) Esempio: int a = System.in.read() Per effettuare l input (ma anche loutput) è necessario includere il package java.io import java.io.*; Il pacchetto di input è utile anche per programmi grafici (es. lettura da rete)

203 Ing. Stefano Cadei -- Java203 Il meccanismo a cipolla Istanziazione di oggetti che incapsulano al loro interno altri oggetti Usatissimo nell IO di JAVA (contestato) Esempio: import java.io.*; …. BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); … Input.readLine();

204 Ing. Stefano Cadei -- Java204 Le eccezioni nell io (cenni) Unistruzione come quella di read dallinput può generare un comportamento imprevisto (eccezione) Listruzione di input deve obbligatoriamente essere inserita in un blocco di gestione delle eccezioni Coppia di istruzioni try-catch

205 Ing. Stefano Cadei -- Java205 Le eccezioni nell io: esempio import java.io.*; class a{ public static void main(String args[]){ System.out.println(Hello"); try{ BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String stringa = input.readLine(); System.out.println("inserito:"+stringa); }catch(Exception e){} }

206 Ing. Stefano Cadei -- Java206 Lettura di numeri interi Lettura di una stringa e successiva conversione in numero con Integer.parseInt(stringa) Anche questo metodo genera eccezioni Esempio: BufferedReader(new InputStreamReader(System.in)); … numero = Integer.parseInt(Input.readLine());

207 Ing. Stefano Cadei -- Java207 JAVA Strutture di controllo: If/For/While/Do/Switch

208 Ing. Stefano Cadei -- Java208 If - Else If (a>1) System.out.println(a maggiore 1); Sintassi if (condizione)if (condizione) istruzione { elseistruzioni istruzione} else { istruzioni } Esempio

209 Ing. Stefano Cadei -- Java209 If – Else (2) Operatori di confronto: >, =,<= Operatore di uguaglianza diverso dalloperatore di assegnamento == uguaglianza = assegnamento Lutilizzo delloperatore di assegnamento in una condizione NON E UN ERRORE SINTATTICO

210 Ing. Stefano Cadei -- Java210 Luso di {} I caratteri { e } servono rispettivamente ad aprire e chiudere un blocco di istruzioni Un blocco di istruzioni può essere considerato come un blocco di codice trattato in modo unico allinterno delle istruzioni condizionali Tutte le variabili dichiarate allinterno di un blocco racchiuso fra { e } sono visibili SOLO ALLINTERNO DEL BLOCCO (scope locale) La posizione dei caratteri { e } non conta

211 Ing. Stefano Cadei -- Java211 If – Else : esercizio Soluzione di un equazione di 2° grado (in campo reale) a coefficienti interi Utilizzo dellinterfaccia a linea di comando (no event driven) Controllo del DELTA Se DELTA > 0 => due soluzioni Se DELTA = 0 => una soluzione (due uguali) Se DELTA nessuna soluzione

212 Ing. Stefano Cadei -- Java212 For Permette di eseguire un blocco di istruzioni un numero noto di volte Utilizzabile facilmente anche per implementare cicli equivalenti a while Possibili for senza variabile contatore Sintassi For (istruzioni di inizializzazione; condizione di iterazione; incremento){ istruzioni }

213 Ing. Stefano Cadei -- Java213 For: esempio Scrittura su una riga delle cifre da 0 a 9 public class Prova{ public static void main(String args[]){ int i=0; for (i=0; i<10; i= i +1){ System.out.print(i + " "); } Dichiarazione nel ciclo for (int i=0; i<10; i= i +1){

214 Ing. Stefano Cadei -- Java214 Gli operatori ++ e -- Java (come anche JavaScript, C e C++) dispone di due operatore di incremento/decremento compatti: ++ e - - Lapplicazione di questi operatore ad una variabile permette di incrementare o decrementare una variabile di una unità Loperatore assegna già la variabile con il nuovo valore incrementato Molto usati nei cicli for for (int i=0; i<10; i++)

215 Ing. Stefano Cadei -- Java215 Gli operatori ++ e -- (2) Gli operatori ++ e -- possono essere sia prefissi che postfissi i++ e ++i hanno lo stesso effetto La differenza fra i due tipi di applicazione (prefissa e postfissa) riguarda listante in cui loperatore è applicato allinterno di una espressione complessa

216 Ing. Stefano Cadei -- Java216 Gli operatori ++ e -- (3) Gli operatori prefissi eseguono lincremento prima di ogni altra operazione riguardante la variabile (priorità massima) Gli operatori postfissi eseguono lincremento dopo ogni altra operazione riguardante la variabile (priorità minima) Esempio int a=0; If (a++ == 0) // true a =0; If (++a == 0) // false, a è uguale a 1

217 Ing. Stefano Cadei -- Java217 For: esercizio Calcolo del fattoriale in modo iterativo da linea di comando

218 Ing. Stefano Cadei -- Java218 While / Do While Permettono di eseguire un blocco di istruzioni fino a quando una condizione è rispettata Entrambi sono cicli con condizione di iterazione e non di uscita Sintassi While Inizializzazione variabili While (condizione){ istruzioni } Sintassi Do-While Do{ istruzioni }while(condizione); punto e virgola

219 Ing. Stefano Cadei -- Java219 Break public class Prova{ public static void main(String args[]){ int i = 0; while(true){ System.out.println(i); i = i + 1; if (i == 10) break; } Permette una USCITA ANTICIPATA dal ciclo Esce dal ciclo saltando tutto le altre istruzioni Esempio

220 Ing. Stefano Cadei -- Java220 Continue public class Prova{ public static void main(String args[]){ int i=0; for (i=1; i<10; i++){ System.out.print(i + " "); if (i%2 == 0) continue; System.out.print("\n"); } Permette una ITERAZIONE ANTICIPATA del cliclo Riparte dallinizio del ciclo saltando tutto le altre istruzioni (controllando la condizione di iterazione) Esempio

221 Ing. Stefano Cadei -- Java221 JAVA Un semplice template di Applet

222 Ing. Stefano Cadei -- Java222 Le Applet Le Applet sono programmi eseguiti allinterno di un browser web Non dispongono di un punto di ingresso (non cè il metodo main) Utilizzabili per eseguire piccole simulazioni grafiche Penseremo unapplet come un insieme di routine di risposta ad eventi

223 Ing. Stefano Cadei -- Java 223 Lo scheletro di unapplet import java.applet.*; import java.awt.*; public class Prova extends Applet implements Runnable{ //metodo equiparabile all OnLoad di Visual Basic public void init(){ Thread t = new Thread(this); t.start(); } //metodo equiparabile alla sub Form_Paint di Visual Basic public void paint(Graphics g){ //…istruzioni } //metodo contenenti le istruzioni del programma public void run(){ }

224 Ing. Stefano Cadei -- Java224 Lo scheletro di unapplet Lo scheletro proposto non è in realtà quello minimo Presenza di Thread Presenza delle parole chiave extends erunnable Concetti di ereditarietà e polimorfismo Esempio proposto con lintento di fornire un template per esigenze specifiche

225 Ing. Stefano Cadei -- Java225 Simulazione pendolo import java.applet.*; import java.awt.*; public class Prova extends Applet implements Runnable{ int x=100,y=100; int l = 100; public void init(){ Thread t = new Thread(this); t.start(); } public void paint(Graphics g){ g.drawLine(100,0,x,y); g.setColor(Color.RED); g.fillOva(x-5, y-5, 10, 10); }

226 Ing. Stefano Cadei -- Java226 Simulazione pendolo (2) public void run(){ int t = 0; while(true){ double teta = Math.PI/4 * Math.cos(Math.sqrt(9.81/l)*0.5*t) * Math.exp(-0.005*t); x = (int)(l*Math.sin(teta)); y = (int)(l*Math.cos(teta)); repaint(); try{ Thread.sleep(20); }catch(Exception e){} t++; }


Scaricare ppt "Ing. Stefano Cadei -- Java1 Visual Basic Introduzione."

Presentazioni simili


Annunci Google