La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ing. Stefano Cadei -- Java

Presentazioni simili


Presentazione sul tema: "Ing. Stefano Cadei -- Java"— Transcript della presentazione:

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

2 Ing. Stefano Cadei -- Java
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 GUI Linea Comando Ambiente grafico Ambienti operativi basati su EVENTI Programmazione Modale Programmazione “Event Driven” Ing. Stefano Cadei -- Java

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

5 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Visual Basic (4) La “definizione” di Visual Basic. Visual Basic (VB) is the third-generation (1) event-driven (2) programming language and integrated development environment (IDE) […]. VB is also considered a relatively easy to learn and use programming language, because of its graphical development (3) features and BASIC heritage (4)” (Wikipedia) Ing. Stefano Cadei -- Java

13 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Introduzione In sintesi Fino a 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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
L’ IDE Compiti Fornitura strumenti progettazione visuale Compilazione Linking Generazione codice eseguibile Dipendenze con il SO (Windows only) Descrizione GUI Linguaggio “macchina” eseguibile Compilazione Linking Codice Sorgente Ing. Stefano Cadei -- Java

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

22 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
L’editor di codice Generatore dell’evento Tipo di evento Codice dell’evento Ing. Stefano Cadei -- Java

31 Ing. Stefano Cadei -- Java
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) Esempio Private Sub Command1_Click() End Sub Ing. Stefano Cadei -- Java

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

34 Ing. Stefano Cadei -- Java
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 Elementi del linguaggio e primi programmi
Visual Basic Elementi del linguaggio e primi programmi Ing. Stefano Cadei -- Java

36 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Variabili (2) Esempi dichiarazione tipo semplice Dim variabile1 as Integer Dim variabile2 as Long Dim variabile3 as String Esempi dichiarazione oggetto Dim variabile1 As Cell Dim variabile2 as Row Ing. Stefano Cadei -- Java

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

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

40 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
I commenti Il carattere ‘ (apice) introduce un commento 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

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 codice Private Sub Command1_Click() 'dichiarazione variabili Dim base As Integer Dim altezza As Integer Dim area As Integer 'accesso alle proprietà dei campi di input base = textBase.Text altezza = textAltezza.Text 'calcolo dell'area area = base * altezza 'scrittura a video dell'output MsgBox "L'area vale " & Str(area) End Sub NON SONO ISTRUZIONI DI INPUT, MA DI LETTURA PROPRIETA’ 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 Strutture di controllo: If / For / While / Do
Visual Basic Strutture di controllo: If / For / While / Do Ing. Stefano Cadei -- Java

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

54 Ing. Stefano Cadei -- Java
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 = 10 If a = 10 then Ing. Stefano Cadei -- Java

55 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
If – Else : esercizio (2) Preparazione dell’ interfaccia con IDE Obiettivo Ing. Stefano Cadei -- Java

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

58 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 x2 = x1 textRisultato.Text = "x1 = " & x1 + "x2 = " & x2 textRisultato.Text = "Nessuna soluzione reale" End If End 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 Ing. Stefano Cadei -- Java
For Permette di eseguire un blocco di istruzioni un numero noto di volte Sintassi For contantore=valoreIniziale To valoreFinale istruzioni Next contatore Ing. Stefano Cadei -- Java

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

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

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

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

67 Ing. Stefano Cadei -- Java
While / Do-Loop (2) Esempio While i = 1 While i <= n fattoriale = fattoriale * i i = i + 1 Wend Esempi Do-Loop (1) Esempi Do-Loop (2) i = 1 Do fattoriale = fattoriale * i i = i + 1 Loop While i <= n i = 1 Do fattoriale = fattoriale * i i = i + 1 Loop Until i > n 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 Ing. Stefano Cadei -- Java
Visual Basic Array e Funzioni Ing. Stefano Cadei -- Java

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

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

73 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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) End Sub Ing. Stefano Cadei -- Java

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

78 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Esercizio Soluzione di un sistema lineare di due equazioni in due incognite con metodo di Cramer Interfaccia richiesta Ing. Stefano Cadei -- Java

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

82 Ing. Stefano Cadei -- Java
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 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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 programma Private Sub Command1_Click() Dim n1 As Integer Dim n2 As Integer n1 = 4 n2 = 2 Scambia n1, n2 MsgBox n1 MsgBox n2 End Sub 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 ByRef Private Sub Scambia(ByRef a As Integer, ByRef b As Integer) Dim temp As Integer temp = a a = b b = temp End 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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Esercizio 1 Scrivere una funzione che calcola il valore massimo di un vettore Private Function Massimo(vettore() As Integer) As Integer Dim i As Integer max = vettore(0) For i = 1 To UBound(vettore) If vettore(i) > max Then max = vettore(i) End If Next i Massimo = max End Function Ing. Stefano Cadei -- Java

96 Ing. Stefano Cadei -- Java
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 = valore End Function Ing. Stefano Cadei -- Java

97 Fineste multiple, nuovi eventi e nuovi componenti
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Caricamento e accesso Caricamento (dentro Form_Load) Private Sub Form_Load() 'popolamento della lista Combo1.AddItem "Rettangolo" Combo1.AddItem "Triangolo" Combo1.AddItem "Cerchio" 'impostazione del valore di default Combo1.ListIndex = 0 End Sub Indici che partono da 0 Accesso (dove occorre…) MsgBox Combo1.Text 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 then Else If combo1.ListIndex = 1 then If combo1.ListIndex = 2 then End If End if Ing. Stefano Cadei -- Java

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

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

108 Ing. Stefano Cadei -- Java
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 Select End 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 Ing. Stefano Cadei -- Java
VBA Introduzione Ing. Stefano Cadei -- Java

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

113 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Strumenti di controllo Nessun Form utilizzato Il foglio stesso contiene gli oggetti 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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
VBA Interazione con Excel Ing. Stefano Cadei -- Java

124 Accesso al foglio di lavoro
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” Ing. Stefano Cadei -- Java

125 Ing. Stefano Cadei -- Java
La matrice “cells” 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 Ing. Stefano Cadei -- Java

126 Esempio: inserire dati
Con la proprietà cells è possibile popolare dinamicamente le celle di un foglio Esempio: inserimento 10 numeri nella prima riga 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 Esempio: inserire dati (2)
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 Ing. Stefano Cadei -- Java

128 Grafico dinamico dei dati
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 Ing. Stefano Cadei -- Java

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

130 Ing. Stefano Cadei -- Java
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 Interazione con il SO: DoEvents e API (cenni)
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 Ing. Stefano Cadei -- Java
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 Es.: grafico in movimento
Obiettivo: simulare la traslazione continua di un onda sinusoidale Pulsanti Start/Stop Grafico con Excel (VBA) Ing. Stefano Cadei -- Java

140 Es.: grafico in movimento
‘dichiarazione di utilizzo dell’API Sleep contenuta in Kernel32.dll Private Declare Sub Sleep Lib "kernel32" (ByVal millisecs As Long) Dim ferma As Boolean Private Sub CommandButton2_Click() ferma = True End Sub ‘evento di attivazione del foglio di calcolo Private Sub Worksheet_Activate() ferma = False 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 Ing. Stefano Cadei -- Java
Visual Basic Timer e API GDI Ing. Stefano Cadei -- Java

145 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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: 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 Esempio LineTo 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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Le API principali (2) CreatePen e SelectObject vengono di solito applicate in sequenza Viene creato un nuovo tipo di cursore (pen) Viene applicato il cursore al contesto voluto Esempio ‘dichiarazione dell’ handle alla pen Dim hPen as Long ‘creazione della pen e applicazione al contesto grafico hPen = CreatePen(PS_SOLID, 15, RGB(255, 0, 0)) SelectObject hdc, hPen 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 Introduzione: una strana storia
JAVA Introduzione: una strana storia Ing. Stefano Cadei -- Java

160 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
L’idea del ByteCode (2) 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 JVM in esecuzione Programma in esecuzione JVM Loading Interpretazione ByteCode Codice Sorgente Compilazione Ing. Stefano Cadei -- Java

164 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 (Un) Ambiente di sviluppo
JAVA (Un) Ambiente di sviluppo Ing. Stefano Cadei -- Java

171 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Introduzione e primi programmi
JAVA Introduzione e primi programmi Ing. Stefano Cadei -- Java

176 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
“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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Variabili Dichiarazione di una variabile Tipo nome Tipo di una variabile Tipo semplice Istanza di un oggetto Ing. Stefano Cadei -- Java

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

188 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
Tipi di dati semplici Ing. Stefano Cadei -- Java

190 Ing. Stefano Cadei -- Java
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 stringa String stringa; //istanziazione della stringa in memoria stringa = 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 Ing. Stefano Cadei -- Java
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 Input/Output da linea di comando: cenni
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 Strutture di controllo: If/For/While/Do/Switch
JAVA Strutture di controllo: If/For/While/Do/Switch Ing. Stefano Cadei -- Java

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

209 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
For Permette di eseguire un blocco di istruzioni un numero noto di volte Utilizzabile facilmente anche per implementare cicli equivalenti a while Possibili for senza variabile contatore Sintassi For (istruzioni di inizializzazione; condizione di iterazione; incremento){ istruzioni } Ing. Stefano Cadei -- Java

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

214 Ing. Stefano Cadei -- Java
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 for for (int i=0; i<10; i++) Ing. Stefano Cadei -- Java

215 Ing. Stefano Cadei -- Java
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 Ing. Stefano Cadei -- Java
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) Esempio int a=0; If (a++ == 0) // true a =0; If (++a == 0) // false , a è uguale a 1 Ing. Stefano Cadei -- Java

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

218 Ing. Stefano Cadei -- Java
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 Do-While Do{ istruzioni }while(condizione); Sintassi While Inizializzazione variabili While (condizione){ istruzioni } punto e virgola Ing. Stefano Cadei -- Java

219 Ing. Stefano Cadei -- Java
Break Permette una USCITA ANTICIPATA dal ciclo Esce dal ciclo saltando tutto le altre istruzioni Esempio 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; } Ing. Stefano Cadei -- Java

220 Ing. Stefano Cadei -- Java
Continue Permette una ITERAZIONE ANTICIPATA del cliclo Riparte dall’inizio del ciclo saltando tutto le altre istruzioni (controllando la condizione di iterazione) Esempio 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"); } Ing. Stefano Cadei -- Java

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

222 Ing. Stefano Cadei -- Java
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 -- Java 222

223 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 Basic public void paint(Graphics g){ //…istruzioni //metodo contenenti le istruzioni del programma public void run(){ 223 Ing. Stefano Cadei -- Java 223

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 224

225 Ing. Stefano Cadei -- Java
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 225 225

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 = (int)(l*Math.sin(teta)); y = (int)(l*Math.cos(teta)); repaint(); try{ Thread.sleep(20); }catch(Exception e){} t++; } Ing. Stefano Cadei -- Java


Scaricare ppt "Ing. Stefano Cadei -- Java"

Presentazioni simili


Annunci Google