Date post: | 01-May-2015 |
Category: |
Documents |
Upload: | severiano-morini |
View: | 249 times |
Download: | 2 times |
Ing. Stefano Cadei -- Java 1
Visual Basic
Introduzione
Ing. Stefano Cadei -- Java 2
Origini “antiche”
1964: BASIC (Beginner’s 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
Ing. Stefano Cadei -- Java 3
Le Graphical User Interfaces
70’s: 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
Ing. Stefano Cadei -- Java 4
Le GUI (2)
Ing. Stefano Cadei -- Java 5
Da console a GUI
Non cambia le strutture di controllo (cicli, ecc) Cambia profondamente il modo di gestire l’input/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”)
Ing. Stefano Cadei -- Java 6
Programmazione con Console
Immagine tratta da “Programmare Windows 3.1” – 1993)
Ing. Stefano Cadei -- Java 7
Programmazione con GUI
Immagine tratta da “Programmare Windows 3.1” – 1993)
Ing. Stefano Cadei -- Java 8
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
Ing. Stefano Cadei -- Java 9
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 dell’interfaccia grafica del programma viene disegnata e non più codificata (IDE)
Il controllo sintattico (e quando possibile semantico) delle istruzioni viene eseguito all’istante
Introdotta anche con altri linguaggi (Visual C++)
Ing. Stefano Cadei -- Java 10
Integrated Devel. Environment
Ing. Stefano Cadei -- Java 11
Visual Basic (3)
(--) Il linguaggio eredita i limiti del BASIC (poca potenza espressiva, non ottimizzato per l’HW)
(+) Eredita la semplicità del BASIC
(+) L’ambiente di sviluppo per la programmazione visuale lo rende un prodotto di successo
(??) L’ambiente evita (impedisce?) al programmatore di conoscere i dettagli sulla gestione degli eventi
Perché proprio BASIC? ….(Bill Gates?)
Ing. Stefano Cadei -- Java 12
Visual Basic (4)
La “definizione” di Visual Basic.
Visual Basic (VB) is the third-generationthird-generation (1) (1) event-event-driven (2) driven (2) programming language and integrated integrated development environment (IDE)development environment (IDE) […].
VB is also considered a relatively easy to learn and use programming language, because of its graphical graphical development (3) development (3) features and BASIC heritage (4)”
(Wikipedia)
Ing. Stefano Cadei -- Java 13
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
Ing. Stefano Cadei -- Java 14
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
Ing. Stefano Cadei -- Java 15
Visual Basic: 3 linguaggi
La situazione oggi (2009)
Ing. Stefano Cadei -- Java 16
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
Ing. Stefano Cadei -- Java 17
Introduzione
In sintesi Fino a 1984-1985 input/output console Introduzione GUI => rivoluzione nell’
I/O Eventi API Grafiche
Disegno dell’interfaccia (IDE Grafico) Programmazione event driven Visual Basic / VBA / VB.NET
Ing. Stefano Cadei -- Java 18
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 L’esperienza diretta è fondamentale Avere confidenza con l’ambiente è fondamentale
Ing. Stefano Cadei -- Java 19
Visual Basic (classico)
Ambiente di lavoro (IDE)
Ing. Stefano Cadei -- Java 20
L’ IDE
Compiti Fornitura strumenti progettazione visuale Compilazione Linking Generazione codice eseguibile
Codice Sorgente
Descrizione GUI
Compilazione
Linking
Linguaggio “macchina” eseguibile
Dipendenze con il SO (Windows only)
Ing. Stefano Cadei -- Java 21
Ambiente di lavoro (2)
Avvio : scelta del tipo di applicazione Nel corso useremo EXE standard
Ing. Stefano Cadei -- Java 22
Ambiente di lavoro (3)
Parti dell’ambiente di lavoro: Barra degli strumenti (toolbox) Barra dei menù (menubar) Area disegno Form Finestra proprietà del progetto Finestra proprietà dell’oggetto attuale
Ing. Stefano Cadei -- Java 23
Le parti dell’ IDE
Ing. Stefano Cadei -- Java 24
Compilazione ed esecuzione
Il bottone Play (compila ed esegui) Senza scrivere nulla viene mostrata
una finestra vuota
Ing. Stefano Cadei -- Java 25
Un prog. realmente vuoto?
In realtà il programma generato reagisce all’input dell’utente
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
Ing. Stefano Cadei -- Java 26
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”
Ing. Stefano Cadei -- Java 27
Il primo programma (2)
L’esecuzione di “Hello World”
Ing. Stefano Cadei -- Java 28
Una piccola miglioria…
Modifica delle proprietà di un elemento visuale
Ing. Stefano Cadei -- Java 29
Un Hello World più articolato…
Primo esempio di programmazione event driven
Gestione dell’evento click Inserire un pulsante nel form Doppio click sul pulsante
Compare una nuova finestra: l’editor di codice Visual Basic
Ing. Stefano Cadei -- Java 30
L’editor di codice
Generatore dell’evento Tipo di evento Codice dell’evento
Ing. Stefano Cadei -- Java 31
L’editor 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 dell’evento e richiama la routine di risposta associata al componente generatore
Ing. Stefano Cadei -- Java 32
Le routine di risposta ad eventi
L’ IDE scrive automaticamente l’intestazione 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) EsempioPrivate Sub
Command1_Click()
End Sub
Ing. Stefano Cadei -- Java 33
Il secondo programma
Invocazione da codice di API grafica:
MsgBox “Hello world from button”
Ing. Stefano Cadei -- Java 34
Ambiente di lavoro
In sintesi: IDE composto da diverse parti Toolbox e Form Area per disegnare
l’interfaccia dell’applicazione Codice formato da routine di risposta
ad eventi (event driven programming)
Possibilità di chiamare “da codice” API grafiche
Ing. Stefano Cadei -- Java 35
Visual Basic
Elementi del linguaggio
e primi programmi
Ing. Stefano Cadei -- Java 36
Variabili
Dichiarazione di una variabile Parole chiave “Dim” e “as”
Tipo di una variabile Tipo semplice Istanza di un oggetto
Ing. Stefano Cadei -- Java 37
Variabili (2)
Esempi dichiarazione tipo sempliceDim variabile1 as IntegerDim variabile2 as LongDim variabile3 as String
Esempi dichiarazione oggettoDim variabile1 As CellDim variabile2 as Row
Ing. Stefano Cadei -- Java 38
Variabili(3)
Ing. Stefano Cadei -- Java 39
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
Ing. Stefano Cadei -- Java 40
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
Ing. Stefano Cadei -- Java 41
Analisi dei due esempi
Mostrano l’uso di variabili intere Utilizzano due API di Windows per l’
I/O: MsgBox per l’output InputBox per l’input
Approccio NON EVENT DRIVEN Concettualmente non differiscono da writeln e
readln (o istruzioni analoghe) L’input blocca l’esecuzione Unica differenza: finestra invece di caratteri
Ing. Stefano Cadei -- Java 42
Analisi dei due esempi (2)
Abbandono dell’idea di richiedere un input in un determinato momento L’utente inserisci gli input in ordine sparso Al verificarsi di un determinato evento viene
eseguita l’elaborazione
Come accedere al contenuto inserito?
Dove sono memorizzati i valori?
Ing. Stefano Cadei -- Java 43
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
Ing. Stefano Cadei -- Java 44
Il componente TextBox
Modificando la proprietà Name si modifica il nome dell’oggetto grafico
Tale nome è utilizzabile da codice Inseriamo due TextBox: Text1 e Text2
Ing. Stefano Cadei -- Java 45
Il componente TextBox (2) Accesso da codice all’oggetto
Il nome dell’oggetto è 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
dell’input
Ing. Stefano Cadei -- Java 46
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 dell’oggetto textbox
Ing. Stefano Cadei -- Java 47
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 dell’oggetto textbox
Il carattere ‘ (apice) introduce un commento
Ing. Stefano Cadei -- Java 48
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 dell’elaborazione 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
Ing. Stefano Cadei -- Java 49
Esercizio: area rettangolo
L’interfaccia richiesta
Ing. Stefano Cadei -- Java 50
Esercizio: area rettangolo (2)
Il codicePrivate 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’
NON SONO ISTRUZIONI DI INPUT, MA DI LETTURA PROPRIETA’
Ing. Stefano Cadei -- Java 51
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)
Ing. Stefano Cadei -- Java 52
Visual Basic
Strutture di controllo:If / For / While / Do
Ing. Stefano Cadei -- Java 53
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 Thenistruzioni
Else istruzioniEnd If
Esempio
Ing. Stefano Cadei -- Java 54
If – Else (2)
Operatori di confronto: >,<,=,>=,<= Operatore di uguaglianza
Identico all’operatore di assegnamento
In controtendenza rispetto agli altri linguaggi Pascal: ass. “:=“, uguaglianza “=“ C, C++, Java, JavaScript : ass. “=“, uguaglianza “==“
a = 10If a = 10 then
Ing. Stefano Cadei -- Java 55
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 < 0 => nessuna soluzione
Ing. Stefano Cadei -- Java 56
If – Else : esercizio (2)
Preparazione dell’ interfaccia con IDE
Obiettivo
Ing. Stefano Cadei -- Java 57
If – Else : esercizio (3)
Sei TextBox: tre di input e due di output TextA TextB TextC
TextEquazione TextRisultato
}
Ing. Stefano Cadei -- Java 58
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)
Ing. Stefano Cadei -- Java 59
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 IfEnd Sub
Ing. Stefano Cadei -- Java 60
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
Ing. Stefano Cadei -- Java 61
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 …
Ing. Stefano Cadei -- Java 62
For
Permette di eseguire un blocco di istruzioni un numero noto di volte
Sintassi For contantore=valoreIniziale To valoreFinaleistruzioni
Next contatore
Ing. Stefano Cadei -- Java 63
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 " & sommaEnd Sub
Ing. Stefano Cadei -- Java 64
For : esercizio
Calcolo del fattoriale di un numero Metodo iterativo (esiste anche soluzione
ricorsiva) Interfaccia richiesta
Ing. Stefano Cadei -- Java 65
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 = fattorialeEnd Sub
For i = n To 1 Step -1 fattoriale = fattoriale * iNext i
Ciclo a contatore decrescente
Ing. Stefano Cadei -- Java 66
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
variabiliWhile condizione
istruzioniWend
Sintassi Do-LoopDo
istruzioniLoop While|Until
condizione
Ing. Stefano Cadei -- Java 67
While / Do-Loop (2)
i = 1While i <= n fattoriale = fattoriale * i i = i + 1Wend
Esempio While
i = 1Do fattoriale = fattoriale * i i = i + 1Loop While i <= n
Esempi Do-Loop (1)
i = 1Do fattoriale = fattoriale * i i = i + 1Loop Until i > n
Esempi Do-Loop (2)
Ing. Stefano Cadei -- Java 68
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
Ing. Stefano Cadei -- Java 69
Attenzione all’uso dei cicli! Come già detto, le routine di risposta ad un
evento devono essere veloci in esecuzione per non bloccare l’elaborazione degli altri eventi
L’uso 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
Ing. Stefano Cadei -- Java 70
Visual Basic
Array e Funzioni
Ing. Stefano Cadei -- Java 71
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 EsempioDim vettore(10) As Integer
Ing. Stefano Cadei -- Java 72
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 EsempioPrivate 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)
Ing. Stefano Cadei -- Java 73
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 dell’array
Ing. Stefano Cadei -- Java 74
Indici degli array(3)
L’istruzione UBound (upper-bound) permette di conoscere l’ultimo 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)
Ing. Stefano Cadei -- Java 75
Array di dimensione variabile
Situazioni in cui la dimensione dell’array non è nota a priori
Dichiarazione iniziale di un array con dimensione non precisata
Utilizzo dell’istruzione Redim per dimensionamento runtime
Sintassi ReDim nomeArray(dimensione)
Ing. Stefano Cadei -- Java 76
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
Ing. Stefano Cadei -- Java 77
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 2X2Dim matrice(1, 1) As Double
Ing. Stefano Cadei -- Java 78
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
Ing. Stefano Cadei -- Java 79
Esercizio Soluzione di un sistema lineare di
due equazioni in due incognite con metodo di Cramer
Interfaccia richiesta
Ing. Stefano Cadei -- Java 80
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
Ing. Stefano Cadei -- Java 81
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=" & yEnd Sub
Ing. Stefano Cadei -- Java 82
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
Ing. Stefano Cadei -- Java 83
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
Ing. Stefano Cadei -- Java 84
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)
Ing. Stefano Cadei -- Java 85
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
Ing. Stefano Cadei -- Java 86
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 L’istruzione 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
Ing. Stefano Cadei -- Java 87
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
Ing. Stefano Cadei -- Java 88
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)
Private Sub NomeSub(ByVal a As Integer, ByVal b As Integer)
Ing. Stefano Cadei -- Java 89
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
Ing. Stefano Cadei -- Java 90
Passaggio per riferimento
Con il passaggio per riferimento, il chiamante passa implicitamente alla subroutine/function l’indirizzo di memoria della variabile da processare
In questo caso, il sottoprogramma invocato può modificare direttamente l’area di memoria del codice chiamante
Ing. Stefano Cadei -- Java 91
Passaggio parametri: esempio
Si supponga di voler utilizzare una subroutine di scambio fra due valori all’interno del seguente programmaPrivate Sub Command1_Click() Dim n1 As Integer Dim n2 As Integer n1 = 4 n2 = 2 Scambia n1, n2 MsgBox n1 MsgBox n2End Sub
Ing. Stefano Cadei -- Java 92
Passaggio parametri: es. (2)
Se si utilizza ByVal lo scambio non avviene Vengono scambiate solo le copie locali
Codice corretto con ByRefPrivate Sub Scambia(ByRef a As Integer, ByRef b As Integer) Dim temp As Integer temp = a a = b b = tempEnd Sub
Ing. Stefano Cadei -- Java 93
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)
Ing. Stefano Cadei -- Java 94
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
Ing. Stefano Cadei -- Java 95
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 = maxEnd Function
Scrivere una funzione che calcola il valore massimo di un vettore
Ing. Stefano Cadei -- Java 96
Esercizio (2)
Scrivere una funzione per il calcolo del determinante ed utilizzarla all’interno 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 = valoreEnd Function
Ing. Stefano Cadei -- Java 97
Visual Basic
Fineste multiple, nuovi eventi e nuovi componenti
Ing. Stefano Cadei -- Java 98
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
Ing. Stefano Cadei -- Java 99
Aggiunta di un nuovo Form
Proprietà del progetto Pulsante destro su cartella “Form”
Inserisci Form
Ing. Stefano Cadei -- Java 100
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
Ing. Stefano Cadei -- Java 101
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?
Ing. Stefano Cadei -- Java 102
Metodo per il caricamento
Metodo di un oggetto Funzione che è “incapsulata” dentro un oggetto Permette di far eseguire qualcosa all’oggetto Ogni variabile associata ad un componente
grafico è in realtà un oggetto formato da proprietà e metodi
Metodo addItem dell’oggetto combo Esempio di caricamento
Dove inserire il codice di caricamento?
Combo1.AddItem "Rettangolo" Combo1.AddItem "Triangolo" Combo1.AddItem "Cerchio"
Ing. Stefano Cadei -- Java 103
L’evento 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
Ing. Stefano Cadei -- Java 104
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 = 0End Sub
Indici che partono da
0
MsgBox Combo1.Text
Caricamento (dentro Form_Load)
Accesso (dove occorre…)
Ing. Stefano Cadei -- Java 105
Diramazione dell’esecuzione
A seconda del valore selezionato si eseguono azioni diverse
Soluzione con If-Annidati
If combo1.ListIndex = 0 thenElse If combo1.ListIndex = 1 then Else If combo1.ListIndex = 2 then Else End If End IfEnd if
Ing. Stefano Cadei -- Java 106
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 elementoDaControllareCase 0: istruzioni
Case 1 istruzioni
….End Select
Esempio
Ing. Stefano Cadei -- Java 107
Il componente PictureBox
Caricamento dinamicoPicture1.Picture = LoadPicture("C:\image.jpg")
Ing. Stefano Cadei -- Java 108
Esercizio: Geometria
Calcolare l’area di Rettangolo Quadrato Parallelogramma Rombo
in base ad una scelta fatta con un comboBox, visualizzando al volo l’immagine della figura geometrica scelta.
Ing. Stefano Cadei -- Java 109
Esercizio: Geometria (2)
Cambio dell’immagine 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 SelectEnd Sub
Ing. Stefano Cadei -- Java 110
Finestra multiple, nuovi eventi e nuovi componenti
In sintesi: Form multipli Evento Form_Load Componente ComboBox Struttura Select-Case Componente PictureBox Esercizio “Geometria”
Ing. Stefano Cadei -- Java 111
VBA
Introduzione
Ing. Stefano Cadei -- Java 112
Descrizione GUI
Differenza concettuale con VB
Compilazione
Linking
Loading
Loading
Interpretazione
Visual Basic
VBA
Codice Sorgente
Binario eseguibile
Programma in esecuzione
Binario Eseguibile Office
Office (Excel) in esecuzione Istruzioni VB
File Office
VBA
Ing. Stefano Cadei -- Java 113
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 l’applicazione VBA
Capacità di eseguire codice maligno (essendo un’applicazione a tutti gli effetti) VIRUS informatici contenuti dentro file Word o Excel VIRUS che vengono eseguiti quando si avvia l’applicazione
ospitante
Ing. Stefano Cadei -- Java 114
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 l’interazione 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
Ing. Stefano Cadei -- Java 115
VBA: l’ambiente di lavoro
L’ambiente di lavoro diventa Office Considereremo come applicazione ospitante di
riferimento Excel (2003) Visualizzazione della Toolbar
Ing. Stefano Cadei -- Java 116
VBA: l’ambiente di lavoro (2)
Inserimento di un bottone
Strumenti di controllo
Nessun Form utilizzato Il foglio stesso contiene gli
oggetti
Strumenti di controllo
Ing. Stefano Cadei -- Java 117
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)
Ing. Stefano Cadei -- Java 118
VBA: Hello World
All’ interno della routine di risposta all’evento click invochiamo l’API MsgBox
Stesse API di Visual Basic
Il titolo della finestra mostrata è “Microsoft Excel” perché l’applicazione che il sistema operativo sta eseguendo non è l’applicazione VBA, ma quella ospitante
Ing. Stefano Cadei -- Java 119
La modalità progettazione
Quando si fa doppio click su di un pulsante l’ambiente apre l’ IDE VB e passa alla modalità di progettazione
Il click su qualunque elemento fa riaprire l’ IDE VB Per tornare alla modalità d’esecuzione occorre
selezionare “Esci da Modalità Progettazione” nella barra degli strumenti VB
Ing. Stefano Cadei -- Java 120
L’abilitazione delle macro
Normalmente le macro sono disabilitate Prevenzione da virus (primi anni 2000)
Possibili diversi livelli di protezione
Ing. Stefano Cadei -- Java 121
L’abilitazione delle macro (2)
Ing. Stefano Cadei -- Java 122
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
Ing. Stefano Cadei -- Java 123
VBA
Interazione con Excel
Ing. Stefano Cadei -- Java 124
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 l’oggetto “foglio1”
Accesso al foglio di lavoro
Ing. Stefano Cadei -- Java 125
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”
Ing. Stefano Cadei -- Java 126
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
Ing. Stefano Cadei -- Java 127
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)
Ing. Stefano Cadei -- Java 128
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
Ing. Stefano Cadei -- Java 129
Esercizio: sinusoide Obiettivo: disegnare una sinusoide, e
alla pressione di un bottone traslarla (a destra) di un valore configurabile
Interfaccia richiesta
-1,5
-1
-0,5
0
0,5
1
1,5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61
Serie1
Ing. Stefano Cadei -- Java 130
L’evento Activate
Le inizializzazioni necessarie alla corretta esecuzione di una macro vanno fatte nella routine di risposta all’evento Activate
Simile a FormLoad nel caso di VB classico
Ing. Stefano Cadei -- Java 131
VBA: Interazione con Excel
In sintesi Accesso al foglio di lavoro La matrice cells L’evento Activate
Ing. Stefano Cadei -- Java 132
Visual Basic / VBA
Interazione con il SO: DoEvents e API
(cenni)
Ing. Stefano Cadei -- Java 133
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)?
Ing. Stefano Cadei -- Java 134
L’elaborazione degli eventi Ciò che conta è che la routine di risposta non
blocchi l’elaborazione di altri eventi L’elaborazione di eventi avviene in seguito alla
comunicazione data dal sistema operativo Se la routine è breve, allora al termine della sua
esecuzione l’evento viene elaborato Se la routine contiene istruzioni esplicite di input
(come InputBox), durante l’attesa gli altri eventi vengono elaborati
Altrimenti, è necessario inserire all’interno della routine una esplicita istruzione per controllare la presenza di altri eventi e avviarne l’elaborazione
La nuova elaborazione si affianca a quella corrente
Ing. Stefano Cadei -- Java 135
DoEvents
L’istruzione per forzare il controllo di eventi e l’avvio della loro elaborazione è DoEvents
L’istruzione 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 nell’avanzamento la routine corrente
e quella appena caricata
Ing. Stefano Cadei -- Java 136
Accesso alle API di sistema Un sistema operativo come Windows
mette a disposizione molte funzioni richiamabili all’interno dei linguaggi di programmazione
Tali funzioni formano la Application Programming Interface (API) di sistema
L’accesso alle API normalmente non avviene esplicitamente Il compilatore traduce le istruzioni in
chiamate ad opportuni moduli del sistema operativo
Esempio tipico: MsgBox “Hello World”
Ing. Stefano Cadei -- Java 137
Accesso alle API di sistema (2)
L’accesso esplicito alle API di sistema permette di eseguire istruzioni che non sono presenti nel linguaggio utilizzato
Utilizzo delle API concettualmente simile all’invocazione dei comandi DOS/Unix, anche se con architettura software di basso livello radicalmente diversa
Le API di Windows sono contenute all’interno di alcuni file con estensione “DLL”
Kernel32.dll : funzioni a basso livello (es. timer) Gdi32.dll : funzioni grafiche User.dll : funzioni a livello utente
Ing. Stefano Cadei -- Java 138
Uso di API di sistema con VB
Uso delle API non banale Necessità di conoscerne l’interfaccia Necessità di conoscerne l’ubicazione (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)
Ing. Stefano Cadei -- Java 139
Obiettivo: simulare la traslazione continua di un onda sinusoidale
Pulsanti Start/Stop Grafico con Excel (VBA)
Es.: grafico in movimento
Ing. Stefano Cadei -- Java 140
Es.: grafico in movimento
‘dichiarazione di utilizzo dell’API Sleep contenuta in Kernel32.dllPrivate Declare Sub Sleep Lib "kernel32" (ByVal millisecs As Long)
Dim ferma As Boolean
Private Sub CommandButton2_Click() ferma = TrueEnd Sub
‘evento di attivazione del foglio di calcoloPrivate Sub Worksheet_Activate() ferma = FalseEnd Sub
Ing. Stefano Cadei -- Java 141
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
Ing. Stefano Cadei -- Java 142
Es.: grafico in movimento
‘aggiornamento della fase (traslazione) Foglio1.Cells(1, 2) = fase + 1 ‘invocazione dell’API 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
Ing. Stefano Cadei -- Java 143
VB/VBA: Interazione con il SO
In sintesi Meccanismo base elaborazione eventi DoEvents Direttiva Declare per API sistema
operativo Esempio Sinusoide in movimento
Ing. Stefano Cadei -- Java 144
Visual Basic
Timer e API GDI
Ing. Stefano Cadei -- Java 145
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
Ing. Stefano Cadei -- Java 146
Il controllo Timer (2)
Proprietà Interval Contiene il valore in millisecondi dell’intervallo
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
Ing. Stefano Cadei -- Java 147
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 all’evento
Possibile utilizzo contemporaneo di più timer
Ing. Stefano Cadei -- Java 148
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
Ing. Stefano Cadei -- Java 149
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
Ing. Stefano Cadei -- Java 150
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:http://custom.programming-in.net/articles/art9-2.asp?lib=gdi32.dll
Ing. Stefano Cadei -- Java 151
Esempio d’uso 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
EsempioLineTo hdc, 100, 100
Ing. Stefano Cadei -- Java 152
Esempio d’uso 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
Ing. Stefano Cadei -- Java 153
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
Ing. Stefano Cadei -- Java 154
L’evento 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
Ing. Stefano Cadei -- Java 155
L’evento Form_Paint: esempio
Nell’esempio di disegno di una linea, affinchè sia gestito correttamente il ridisegno è sufficiente inserire l’invocazione di LineTo all’interno della routine di risposta a Form_Paint
Ing. Stefano Cadei -- Java 156
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
Ing. Stefano Cadei -- Java 157
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 penDim hPen as Long ‘creazione della pen e applicazione al contesto graficohPen = CreatePen(PS_SOLID, 15, RGB(255, 0, 0))SelectObject hdc, hPen
Ing. Stefano Cadei -- Java 158
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
Ing. Stefano Cadei -- Java 159
JAVA
Introduzione: una strana storia
Ing. Stefano Cadei -- Java 160
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
Ing. Stefano Cadei -- Java 161
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 dell’elettronica di consumo
Portabilità Limitatezza delle risorse
Ing. Stefano Cadei -- Java 162
L’idea 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
L’idea di JAVA: Compilazione in codice binario di una macchina
virtuale (JVM, Java Virtual Machine) Interprete delle istruzioni “macchina” della JVM
Quindi, compilazione + interpretazione
Ing. Stefano Cadei -- Java 163
L’idea del ByteCode (2)
Compilazione
Loading
Interpretazione
Codice Sorgente ByteCode
Programma in esecuzioneJVM
JVM in esecuzione
Slogan: “Write once, run anywhere” Di fatto la portabilità da raggiungere
attraverso l’uso di un interprete L’interprete è però relativamente
efficiente, perché esegue “quasi” del codice macchina
Ing. Stefano Cadei -- Java 164
Un C++ più semplice? L’idea 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 l’elettronica Il C++ non era gradito al 100%:
E’ un linguaggio relativamente complesso Alcune caratteristiche del C++ sono davvero
utili?
Ing. Stefano Cadei -- Java 165
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”
Ing. Stefano Cadei -- Java 166
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
Ing. Stefano Cadei -- Java 167
Un’infanzia difficile L’idea 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!!!!)
Ing. Stefano Cadei -- Java 168
Cambio di target L’idea 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 l’intento
iniziale) Interazione con DataBase
Ing. Stefano Cadei -- Java 169
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…
Ing. Stefano Cadei -- Java 170
JAVA
(Un) Ambiente di sviluppo
Ing. Stefano Cadei -- Java 171
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
Ing. Stefano Cadei -- Java 172
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
Ing. Stefano Cadei -- Java 173
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
Ing. Stefano Cadei -- Java 174
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)
Ing. Stefano Cadei -- Java 175
JAVA
Introduzione e primi programmi
Ing. Stefano Cadei -- Java 176
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
Ing. Stefano Cadei -- Java 177
Tre diversi “Hello World”
Java può essere utilizzato in tre diverse modalità
Linea di comando Interfaccia grafica stand alone Applet eseguita all’interno di un browser
Con Java esiste quindi un “Hello World” diverso per ognuna delle tre modalità
Ing. Stefano Cadei -- Java 178
“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
Ing. Stefano Cadei -- Java 179
“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);
}}
Ing. Stefano Cadei -- Java 180
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);}
}
<head></head><body>
<applet code="Prova" width=100 height=100></applet></body>
Ing. Stefano Cadei -- Java 181
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 (l’applet) non ha un punto di entrata
Ing. Stefano Cadei -- Java 182
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”
Ing. Stefano Cadei -- Java 183
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
Ing. Stefano Cadei -- Java 184
L’istruzione import Negli esempi 2 e 3, nelle prime righe
sono presenti delle istruzioni “import” L’istruzione import serve a rendere
visibili delle funzioni e delle classi di libreria all’interno del programma corrente
Non è indispensabile usare import Possibile referenziare esplicitamente ogni
volta la classe o la funzione voluta Di fatto import viene sempre utilizzato
Ing. Stefano Cadei -- Java 185
Le Applet L’applet dell’esempio numero 3 è
sostanzialmente un insieme di funzioni di risposta ad eventi
In questo senso, vista la mancanza di punti d’entrata, può essere considerata simile all’approccio Visual Basic
Tuttavia, un’applet Java necessita di essere “ospitata” all’interno di un altro programma, tipicamente un browser web
Ing. Stefano Cadei -- Java 186
Variabili
Dichiarazione di una variabile Tipo nome
Tipo di una variabile Tipo semplice Istanza di un oggetto
Ing. Stefano Cadei -- Java 187
Variabili (2)
Esempi dichiarazione tipo semplice
Esempi dichiarazione oggetto
int a;Char b;
String stringa;Object oggetto;JFrame frame;
Ing. Stefano Cadei -- Java 188
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)
Ing. Stefano Cadei -- Java 189
Tipi di dati semplici
Ing. Stefano Cadei -- Java 190
Le classi Wrapper
Se il programmatore lo desidera, può rendere il codice completamente ad oggetti attraverso l’utilizzo delle Classi Wrapper
In sostanza, ogni tipo semplice è incapsulabile in un oggetto (nel vero senso del termine) che lo contiene
Ing. Stefano Cadei -- Java 191
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 l’oggetto NON È
ALLOCATO IN MEMORIA Istanziazione: effettiva allocazione in
memoria di un oggetto
Ing. Stefano Cadei -- Java 192
Dichiarazione e istanziazione (2)
L’istanziazione di un oggetto avviene attraverso l’utilizzo dell’operatore new
Esempio:
Nota: le righe che iniziano con // sono dei commenti
//dichiarazione stringaString stringa;
//istanziazione della stringa in memoriastringa = new String(“Stringa di prova”);
Ing. Stefano Cadei -- Java 193
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 un’area destinata a contenere il dato (semantica classica della dichiarazione)
Istanza oggetto: la sola dichiarazione non comporta l’assegnazione di alcuna memoria riservata a contenere l’oggetto
Ing. Stefano Cadei -- Java 194
Dichiarazione e istanziazione (4)
Cosa succede quando si dichiara un oggetto? Viene allocata in memoria una
piccolissima zona destinata a contenere l’indirizzo dell’oggetto che verrà creato
Quando l’oggetto viene istanziato tramite l’operatore new, il suo contenuto viene messo in memoria e l’indirizzo di tale memoria è assegnato alla variabile dichiarata
Ing. Stefano Cadei -- Java 195
Dichiarazione e istanziazione (5)
Ing. Stefano Cadei -- Java 196
Dichiarazione e istanziazione (6)
La parte di memoria destinata a contenere l’indirizzo dell’oggetto è chiamata “riferimento” all’oggetto
Per chi conoscesse C++, il concetto è simile (ma non uguale) all’utilizzo di puntatori
Un reference non è però un puntatore Aritmetica degli indirizzi non permessa Allocazione dinamica gestita dalla JVM
Ing. Stefano Cadei -- Java 197
Confrontare due oggetti
Il confronto di due tipi semplici non equivale al confronto di due oggetti
a == b ? NO!!!
Ing. Stefano Cadei -- Java 198
Confrontare due oggetti (2)
Per confrontare l’uguaglianza tra due oggetti diversi è necessario invocare opportuni metodi degli stessi
a.equals(b) ? SI!!!
Ing. Stefano Cadei -- Java 199
Copia di oggetti
Assegnare un riferimento (tipo semplice) ad un altro non provoca la copia del contenuto dell’oggetto referenziato
a == b ? SI!!!
Ing. Stefano Cadei -- Java 200
JAVA
Input/Output da linea di comando: cenni
Ing. Stefano Cadei -- Java 201
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 l’I/O da linea di comando in JAVA è caratterizzato da una organizzazione complessa che non approfondiremo
Ing. Stefano Cadei -- Java 202
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 l’output) è necessario includere il package java.io import java.io.*;
Il pacchetto di input è utile anche per programmi grafici (es. lettura da rete)
Ing. Stefano Cadei -- Java 203
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();
Ing. Stefano Cadei -- Java 204
Le eccezioni nell’ io (cenni)
Un’istruzione come quella di read dall’input può generare un comportamento imprevisto (eccezione)
L’istruzione di input deve obbligatoriamente essere inserita in un blocco di gestione delle eccezioni
Coppia di istruzioni try-catch
Ing. Stefano Cadei -- Java 205
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){} }}
Ing. Stefano Cadei -- Java 206
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());
Ing. Stefano Cadei -- Java 207
JAVA
Strutture di controllo: If/For/While/Do/
Switch
Ing. Stefano Cadei -- Java 208
If - Else
If (a>1)System.out.println(“a maggiore 1”);
Sintassi if (condizione) if (condizione)istruzione {
else istruzioni istruzione }
else{
istruzioni}
Esempio
Ing. Stefano Cadei -- Java 209
If – Else (2)
Operatori di confronto: >,<,==,>=,<= Operatore di uguaglianza diverso
dall’operatore di assegnamento == uguaglianza = assegnamento
L’utilizzo dell’operatore di assegnamento in una condizione NON E’ UN ERRORE SINTATTICO
Ing. Stefano Cadei -- Java 210
L’uso 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 all’interno delle istruzioni condizionali
Tutte le variabili dichiarate all’interno di un blocco racchiuso fra { e } sono visibili SOLO ALL’INTERNO DEL BLOCCO (scope locale)
La posizione dei caratteri { e } non conta
Ing. Stefano Cadei -- Java 211
If – Else : esercizio
Soluzione di un equazione di 2° grado (in campo reale) a coefficienti interi
Utilizzo dell’interfaccia a linea di comando (no event driven)
Controllo del DELTA Se DELTA > 0 => due soluzioni Se DELTA = 0 => una soluzione (due
uguali) Se DELTA < 0 => nessuna soluzione
Ing. Stefano Cadei -- Java 212
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
SintassiFor (istruzioni di inizializzazione; condizione di iterazione; incremento){istruzioni
}
Ing. Stefano Cadei -- Java 213
For: esempio
Scrittura su una riga delle cifre da 0 a 9public 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 ciclofor (int i=0; i<10; i= i +1){
Ing. Stefano Cadei -- Java 214
Gli operatori ++ e --
Java (come anche JavaScript, C e C++) dispone di due operatore di incremento/decremento compatti: “++” e “- -”
L’applicazione di questi operatore ad una variabile permette di incrementare o decrementare una variabile di una unità L’operatore assegna già la variabile con il
nuovo valore incrementato Molto usati nei cicli forfor (int i=0; i<10; i++)
Ing. Stefano Cadei -- Java 215
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 l’istante in cui l’operatore è applicato all’interno di una espressione complessa
Ing. Stefano Cadei -- Java 216
Gli operatori ++ e -- (3)
Gli operatori prefissi eseguono l’incremento prima di ogni altra operazione riguardante la variabile (priorità massima)
Gli operatori postfissi eseguono l’incremento dopo ogni altra operazione riguardante la variabile (priorità minima)
Esempioint a=0;If (a++ == 0) // truea =0;If (++a == 0) // false , a è uguale a 1
Ing. Stefano Cadei -- Java 217
For: esercizio
Calcolo del fattoriale in modo iterativo da linea di comando
Ing. Stefano Cadei -- Java 218
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
variabiliWhile
(condizione){ istruzioni
}
Sintassi Do-WhileDo{
istruzioni}while(condizione);
punto e virgola
Ing. Stefano Cadei -- Java 219
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
Ing. Stefano Cadei -- Java 220
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 dall’inizio del ciclo saltando tutto le
altre istruzioni (controllando la condizione di iterazione)
Esempio
Ing. Stefano Cadei -- Java 221
JAVA
Un semplice template di Applet
Ing. Stefano Cadei -- Java 222
Le Applet
Le Applet sono programmi eseguiti all’interno di un browser web
Non dispongono di un punto di ingresso (non c’è il metodo main)
Utilizzabili per eseguire piccole simulazioni grafiche
Penseremo un’applet come un insieme di routine di risposta ad eventi
Ing. Stefano Cadei -- Java223
Lo scheletro di un’applet
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 Basicpublic void paint(Graphics g){
//…istruzioni}
//metodo contenenti le istruzioni del programmapublic void run(){}
}
Ing. Stefano Cadei -- Java 224
Lo scheletro di un’applet
Lo scheletro proposto non è in realtà quello minimo Presenza di Thread Presenza delle parole chiave
“extends” e “runnable”Concetti di ereditarietà e polimorfismo
Esempio proposto con l’intento di fornire un template per esigenze specifiche
Ing. Stefano Cadei -- Java 225
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);
}
Ing. Stefano Cadei -- Java 226
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 = 100 + (int)(l*Math.sin(teta));y = (int)(l*Math.cos(teta));repaint();try{
Thread.sleep(20);}catch(Exception e){}t++;
}}
}