ing. stefano cadei -- java1 visual basic introduzione

226
Ing. Stefano Cadei -- Java 1 Visual Basic Introduzione

Upload: severiano-morini

Post on 01-May-2015

250 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 1

Visual Basic

Introduzione

Page 2: Ing. Stefano Cadei -- Java1 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

Page 3: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 4: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 4

Le GUI (2)

Page 5: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”)

Page 6: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 6

Programmazione con Console

Immagine tratta da “Programmare Windows 3.1” – 1993)

Page 7: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 7

Programmazione con GUI

Immagine tratta da “Programmare Windows 3.1” – 1993)

Page 8: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 9: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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++)

Page 10: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 10

Integrated Devel. Environment

Page 11: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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?)

Page 12: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 13: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 14: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 15: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 15

Visual Basic: 3 linguaggi

La situazione oggi (2009)

Page 16: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 17: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 18: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 19: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 19

Visual Basic (classico)

Ambiente di lavoro (IDE)

Page 20: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 21: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 21

Ambiente di lavoro (2)

Avvio : scelta del tipo di applicazione Nel corso useremo EXE standard

Page 22: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 23: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 23

Le parti dell’ IDE

Page 24: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 24

Compilazione ed esecuzione

Il bottone Play (compila ed esegui) Senza scrivere nulla viene mostrata

una finestra vuota

Page 25: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 26: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 27: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 27

Il primo programma (2)

L’esecuzione di “Hello World”

Page 28: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 28

Una piccola miglioria…

Modifica delle proprietà di un elemento visuale

Page 29: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 30: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 30

L’editor di codice

Generatore dell’evento Tipo di evento Codice dell’evento

Page 31: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 32: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 33: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 33

Il secondo programma

Invocazione da codice di API grafica:

MsgBox “Hello world from button”

Page 34: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 35: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 35

Visual Basic

Elementi del linguaggio

e primi programmi

Page 36: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 37: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 38: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 38

Variabili(3)

Page 39: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 40: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 41: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 42: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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?

Page 43: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 44: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 45: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 46: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 47: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 48: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 49: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 49

Esercizio: area rettangolo

L’interfaccia richiesta

Page 50: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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’

Page 51: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 52: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 52

Visual Basic

Strutture di controllo:If / For / While / Do

Page 53: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 54: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 55: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 56: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 56

If – Else : esercizio (2)

Preparazione dell’ interfaccia con IDE

Obiettivo

Page 57: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 57

If – Else : esercizio (3)

Sei TextBox: tre di input e due di output TextA TextB TextC

TextEquazione TextRisultato

}

Page 58: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 59: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 60: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 61: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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 …

Page 62: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 63: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 64: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 64

For : esercizio

Calcolo del fattoriale di un numero Metodo iterativo (esiste anche soluzione

ricorsiva) Interfaccia richiesta

Page 65: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 66: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 67: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 68: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 69: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 70: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 70

Visual Basic

Array e Funzioni

Page 71: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 72: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 73: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 74: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 75: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 76: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 77: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 78: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 79: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 79

Esercizio Soluzione di un sistema lineare di

due equazioni in due incognite con metodo di Cramer

Interfaccia richiesta

Page 80: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 81: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 82: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 83: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 84: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 85: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 86: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 87: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 88: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 89: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 90: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 91: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 92: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 93: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 94: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 95: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 96: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 97: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 97

Visual Basic

Fineste multiple, nuovi eventi e nuovi componenti

Page 98: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 99: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 99

Aggiunta di un nuovo Form

Proprietà del progetto Pulsante destro su cartella “Form”

Inserisci Form

Page 100: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 101: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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?

Page 102: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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"

Page 103: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 104: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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…)

Page 105: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 106: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 107: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 107

Il componente PictureBox

Caricamento dinamicoPicture1.Picture = LoadPicture("C:\image.jpg")

Page 108: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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.

Page 109: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 110: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 111: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 111

VBA

Introduzione

Page 112: Ing. Stefano Cadei -- Java1 Visual Basic 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

Page 113: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 114: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 115: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 116: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 117: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 118: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 119: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 120: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 121: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 121

L’abilitazione delle macro (2)

Page 122: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 123: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 123

VBA

Interazione con Excel

Page 124: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 125: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 126: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 127: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 128: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 129: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 130: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 131: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 131

VBA: Interazione con Excel

In sintesi Accesso al foglio di lavoro La matrice cells L’evento Activate

Page 132: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 132

Visual Basic / VBA

Interazione con il SO: DoEvents e API

(cenni)

Page 133: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)?

Page 134: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 135: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 136: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 137: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 138: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 139: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 140: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 141: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 142: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 143: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 144: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 144

Visual Basic

Timer e API GDI

Page 145: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 146: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 147: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 148: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 149: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 150: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 151: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 152: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 153: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 154: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 155: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 156: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 157: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 158: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 159: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 159

JAVA

Introduzione: una strana storia

Page 160: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 161: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 162: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 163: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 164: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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?

Page 165: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 166: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 167: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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!!!!)

Page 168: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 169: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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…

Page 170: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 170

JAVA

(Un) Ambiente di sviluppo

Page 171: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 172: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 173: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 174: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 175: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 175

JAVA

Introduzione e primi programmi

Page 176: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 177: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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à

Page 178: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 179: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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);

}}

Page 180: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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>

Page 181: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 182: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”

Page 183: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 184: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 185: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 186: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 186

Variabili

Dichiarazione di una variabile Tipo nome

Tipo di una variabile Tipo semplice Istanza di un oggetto

Page 187: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 187

Variabili (2)

Esempi dichiarazione tipo semplice

Esempi dichiarazione oggetto

int a;Char b;

String stringa;Object oggetto;JFrame frame;

Page 188: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 189: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 189

Tipi di dati semplici

Page 190: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 191: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 192: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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”);

Page 193: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 194: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 195: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 195

Dichiarazione e istanziazione (5)

Page 196: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 197: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 197

Confrontare due oggetti

Il confronto di due tipi semplici non equivale al confronto di due oggetti

a == b ? NO!!!

Page 198: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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!!!

Page 199: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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!!!

Page 200: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 200

JAVA

Input/Output da linea di comando: cenni

Page 201: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 202: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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)

Page 203: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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();

Page 204: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 205: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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){} }}

Page 206: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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());

Page 207: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 207

JAVA

Strutture di controllo: If/For/While/Do/

Switch

Page 208: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 209: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 210: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 211: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 212: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

}

Page 213: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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){

Page 214: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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++)

Page 215: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 216: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 217: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 217

For: esercizio

Calcolo del fattoriale in modo iterativo da linea di comando

Page 218: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 219: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 220: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 221: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

Ing. Stefano Cadei -- Java 221

JAVA

Un semplice template di Applet

Page 222: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 223: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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(){}

}

Page 224: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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

Page 225: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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);

}

Page 226: Ing. Stefano Cadei -- Java1 Visual Basic Introduzione

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++;

}}

}