- prerequisiti
- come procurarsi l'IDE Visual Studio 2005 - C# (free dal sito Microsoft,
nessuna scadenza)
- creare la prima applicazione WinForms
- cenni sull'uso del debugger integrato
- controllare i principali pannelli nell'IDE
- Soluzioni e progetti
- Struttura della cartella di progetto
- Eseguire l'applicazione fuori dall'IDE
- Alcuni (brevi) richiami teorici in tema di OOP: modularità, information hiding;
il salto di qualità richiesto alla OOP (cenni all'incapsulamento ed
all'ereditarietà come filosofie di sviluppo)
- confronto tra le tecniche tradizionali (con una breve parentesi sull'uso delle struct) e OOP per la rappresentazione di un oggetto del mondo reale;
criticità dell'approccio non OOP
- l'incapsulamento con C#: classi ed istanze (oggetti), stato interno e metodi
- un esempio concreto: inizio di un progetto 'MiniCAD'; definizione di una
classe per rappresentare punti sullo schermo, come riferirsi ai colori (struct Color di system.drawing); namespace e using (comprimere ed espandere regioni di codice), livello di visibilità public e private, creazione di un oggetto, comando new , il costruttore e
la sua importanza, ridefinire il costruttore base, significato del reference ad un oggetto prima e dopo il comando new;
- creare oggetti dal codice di gestione di un evento: cenni al significato del
parametro sender e del parametro eventargs dei gestori degli
eventi.
- aggiungere un metodo 'disegna' alla classe dei punti per 'accendere' punti
sulla superficie grafica dei controlli
- il metodo CreateGraphics dei controlli e le primitive grafiche richiamabili
dall'oggetto restituito
- metodo DrawRectangle ed esame delle sue versioni overloaded
- l'oggetto grafico Pen; utilizzo delle 'penne' predefinite
- programmare il gestore dell'evento click di un bottone: casting del
parametro EventArgs di quest'ultimo verso un evento di tipo MouseEventArgs
- aggiungere altri costruttori ad una classe
- Utilizzo dell'oggetto Random per estrarre numeri casuali (metodo NextDouble())
- Utilizzo della classe Math (metodo Ceiling() per arrotondare un numero)
- Membri statici di una classe
- Programmare in modo differenziato il click destro/sinistro (accedendo alle
proprietà dell'evento MouseEventArgs): con il mouse destro si seleziona un
colore con il dialog box standard di Windows e con il sinistro si disegnano
punti sulla form;
- breve parentesi sull'uso delle enumerazioni (enum) per comprendere come
il framework rappresenti certi valori associati, ad esempio, allo stato del
mouse o alla risposta data dall'utente all'apertura di un certo dialog box;
- differenza tra l'evento Click e MouseClick;
- introduzione teorica (breve) all'ereditarietà
- progetto delle classi per il miniCAD (figure, linee, rettangoli, quadrati,
cerchi ecc.)
- cosa mettere a fattor comune nella classe base (figure): vantaggi
- relazioni di composizione (una linea usa due punti come estremi)
contrapposte a quelle di ereditarietà (relazioni is-a)
- qualche definizione: cllassi base, superclassi, antenate, madri, derivate,
discendenti, figlie ecc.
- riorganizzazione e pulizia nel vecchio progetto di esempio per sfruttare
l'ereditarietà
- implementazione della classe delle figure
- uso della keyword this per accedere alle variabili dello stato interno
in caso di ambiguità con gli identificatori dei parametri di un metodo
- derivare la classe dei punti da quella delle figure
- inizializzare lo stato interno ereditato: accesso diretto ai membri tramite il
livello di accessibilità protected; accesso tramite l'uso di metodi 'get'
e 'set' (non si tratta delle properties, affrontate più avanti)
- costruttori della classe figlia che richiamano quelli della classe madre:
keyword base come inizializzatore;
-utilizzo di this per richiamare da un costruttore un altro della stessa
classe
- problema della non persistenza dei disegni su una form (verrà risolto più
avanti)
- la classe delle linee
- aggiungere alla form una ToolStripBar (barra bottoni) per la scelta della
figura da far disegnare (uso di Paint per realizzare velocemente delle icone
32x32 da usare come immagini per i bottoni sulla toolbar)
- scrivere un gestore di evento da associare a tutti i bottoni della toolbar per
centralizzare la gestione dell'evento e scrivere meno codice e più facilmente
manutenibile;
- gestire la proprietà checked per evidenziare di volta in volta il
bottone in uso: uso del costrutto foreach per iterare su tutti i bottoni
della toolbar e casting del parametro sender; uso del costrutto switch
con le stringhe
- aggiungere al miniCad la possibilità di tracciare linee usando il mouse
- gestione dell'evento MouseDown e MouseUp per identificare gli
estremi della linea da tracciare
- distinguere qual'è il bottone del mouse premuto in un certo momento
- aggiungere il disegno di rettangoli (con metodi per il calcolo del perimetro e
dell'area: servono per esemplificare il meccanismo del late/dynamic binding più
avanti)
- i quadrati come classe specializzata dei rettangoli: ridefinizione di un
metodo per il calcolo del perimetro più efficiente
- conformità di tipo e static/early binding: esemplificazione con rettangoli e
quadrati
- uso della keyword new per metodi nella classe figlia che devono
oscurare quelli della classe madre
- aggiungere il disegno di ellissi
- gestione degli eventi keyDown e keyUp per far tracciare dei
cerchi scegliendo come figura l'ellisse e tenendo premuto il tasto CTRL durante
il disegno
- gestione dell'evento mouseMove per tracciare/cancellare in tempo reale
la sagoma delle figure durante lo spostamento del mouse
- aggiungere il disegno a mano libera
- memorizzare le figure che vengono via via disegnate in una lista
dinamica (ArrayList)
- attivare il late/dynamic binding (keyword virtual e override)
sul metodo 'disegna'; breve confronto con le tecniche non OOP per capire le
potenzialità di questo meccanismo
- gestione dell'evento paint per ridisegnare le figure quando la finestra
viene spostata oltre i limiti dello schermo o viene nascosta dietro un'altra
finestra: uso del foreach con la collezione ArrayList di figure
- Aggiunta di un ToolstripContainer in modo da poter agganciare ai lati della
finestra le barre dei bottoni
- Aggiungere un menu all'applicazione: menu su più livelli, associare shortcut
key (combinazioni di tasti per richiamare le voci del menu), associare
un'immagine ad ogni voce del menu
- Dirottare gli eventi da un controllo ad un altro (oppure richiamare dal
gestore di un evento di un controllo il gestore di un evento di un altro
controllo)
- Richiamare da menu il dialog box standard di Windows per scegliere un file
- Aggiungere una seconda form all'applicazione e sua apertura da menu
istanziando un nuovo oggetto tipo Form; differenza tra apertura normale e
modale;
- Chiudere una form: differenza tra Close() e Hide() per il recupero di
informazioni da una form
- Aggiunta di checkbox, radiobutton, e textbox e principali proprietà /
evento principale
- Interrogare lo stato dei controlli di una form dopo che è stata nascosta
- duplicare gli oggetti (ottenere una fila di checkbox)
- Programmare l'evento Load di una form per aggiungere tante righe ad una combo
quanti sono i bottoni di una toolbar presente su un altra form; ogni riga viene
costruita con informazioni specifiche estratte dalle proprietà di ogni bottone
- Generare controlli a run time su una form (un ArrayList di checkbox)
- Aggiungere gestori di eventi ai controlli creati a run time
- le properties, metodi get e set; separazione dell'implementazione interna
dall'accesso esterno (trasformare la proprietà 'colore' delle figure nella
property corrispondente; un assegnamento alla proprietà ridisegna la figura con
il nuovo colore)
- cenni alla modifica dell'implementazione interna (cambio di tipo) della
property colore per evidenziare come se si adattano i metodi get e set affinchè
continuino a restituire i tipi di valori precedenti: per tutto il codice che
usava la classe prima della modifica è come se non fosse cambiato niente
- file di testo: struttura, vantaggi e svantaggi;
- stream, streamreader e streamwriter;
- aggiungere righe ad un file di testo nuovo con il metodo writeline;
- gestione asincrona dell'I/O: il problema del buffer e l'importanza di chiamare
il metodo Close
- aggiungere righe ad un file esistente senza perdere il vecchio contenuto
- gestione degli errori di Input/Output: le eccezioni; il costrutto try ...
catch ... finally; throw
- aggiungere al 'MiniCAD' il salvataggio su un file di testo di tutte le
figure
- rileggere da disco i dati sulle figure da disegnare precedentemente salvati su
un file di testo
- uso dell'oggetto streamReader
- gestione dell'eccezione sollevata quando non viene trovato un certo file
- metodo Peek per rilevare la fine di un file di testo
- metodo readLine, conversione da stringa a intero (argb) a colore
- leggere dati da un file binario (riconoscere l'header di una immagine
PNG)
- uso del BinaryReader e metodo read
- uso elementare degli strumenti di refactoring (solo rinomina di un
identificatore)
- esemplificazione si strutture try ... catch annidate
- esemplificazione di una scansione completa dei byte di un file binario (perchè
è meglio non usare PeekChar per rilevare la fine di un file binario
che si sa non contenere solo testo)
- salvataggio dei dati relativi alle figure su un file binario
- oggetti BinaryWriter e saveDialogBox
- creazione di un file binario
- aggiunta alle classi di tutte le figure di un metodo per salvare i dati sul
file binario
- metodo write
- uso di Pad o PadRigth delle stringhe per ottenere più facilmente record a
lunghezza fissa
- uso di un editor binario freeware (witched) per controllare cosa è stato
effettivamente scritto sul file
- lettura dei dati delle figure dal file binario e ricostruzione del disegno a
video; uso del metodo trim per togliere gli spazi inutili da una stringa,
uso del metodo ReadInt32
- navigare in un file binario con il metodo seek
- modifica di una porzione arbitraria di un file binario
|