Introduzione al NetFramework
Transcript
Introduzione al NetFramework
Informatica - Classe Terza robertomana.it Introduzione al Net Framework Introduzione al Net Framework Rev. Digitale 1.0 del 01/09/2016 Introduzione al Linguaggio C# Il NET Framework ……………………..……………………………………………………….……… Le variabili ……………………………………………………………………………………….…….. Istruzioni Fondamentali ………………………………..…………………………………..…………… Introduzione ai vettori …………….…………..…………………………………..…………………… Le strutture ……………………………………..…………………………………..…………………… Introduzione alla programmazione OOP ………..…….………………………………….……………. Sintassi completa di MessageBox e InputBox ………………………………………………………... Gestione delle Eccezioni Strutturate …………..…………….……………………………..…………. Passaggio dei parametri …………..…………….…………………….……………………..…………. 3 4 5 7 7 8 11 12 13 Le classi base del NET Framework System.Math ……………………………………………………………..…………………………… Classi numeriche ………………………………..........................................………………………….. System.Convert …………………………………...........................................……………………….. System.Char ……………………………………...........................................………………………… System.Random ……………………………………..............................................…………….……. System.String …………………………………….............................................………………………. Il cast dei puntatori …….…………………………………………………………………………..…... Vettori e Matrici ………..…………………………………………………………..…………………. Files e Directories ……………………………………………………………………..…..………….. 14 14 14 15 15 16 18 19 21 La classe Form Proprietà di una Form …………………………………………………………………………………. Richiamo di una API di Windows dall‟interno di una Form .………………………………..……….. Ciclo di vita di una Form ………………………………………………………………………………. I Controlli …………………………..…………………………………………………………..…….. Principali Eventi Relativi alla Tastiera …………………………………………………………... Principali Eventi Relativi al Mouse ……………………………………………………..………. La Gestione del Fuoco ……………………………………………………………….………….. Scansione di controlli simili ………………………………………………………………..………… Creazione Dinamica dei Controlli ………………………………………………………..………….. La classe system.windows.form ………………………………………………………………………. Utilizzo degli oggetti Shapes …………………………………………………………………………. 24 24 25 25 27 28 29 30 31 33 34 I controlli Visuali Text Box, Label …………………………………………………………………………………….…… 35 Command Button, Check Box, Option Button, Panel, GroupBox …....................................................... 36 List Box, Checked List Box, Combo Box ……………………..................................................………. 37 Timer ……………………………………………………………………………………….…………… 38 DataGridView ………………………………………….................................................……………… 39 Picture Box, Scroll Bar, Link Label …………………...............................................………………… 40 Menù ………………………………………………………………….………………….…………… 41 Dialog Box …………………………………………………………………………………..………… 42 La Stampa ………………………………………………………………………………………………. 44 Status Bar e Tool Bar …………………………………...…............................................…………….. 46 ImageList …………………………………………………..............................................……….…… 47 Rich Text Box ………………………………………………..............................................………….. 47 I Controlli Provider: ToolTip, ErrorProvider, HelpProvider …...............................................……….. 48 Altri Controlli ……………………………………………….…………………………………………. 50 pag 1 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Gli oggetti non visuali L‟oggetto Application …………………………………………………………………………………. L‟oggetto Font …………………………………………………………………………………..…….. L‟oggetto Color …………………………………………………………………………..……..……. Richiamo di Applicatvi Esterni …………………………………………………………………..……. L‟oggetto.Date ………….……………….…………………………………………………….……… L‟oggetto Clipboard ………………………………………………………………………..…………. L‟oggetto Cursor ………….………………………………………………………………..…………. L‟oggetto Enum ………….……………………………………………………………………………. L‟oggetto Array ……………………………………………………………………………..…………. Gòi oggetti Collections: List, Stack, Queue, Hashtable ………..……………………………………… Trascinamento con il mouse …………………………………………………………………………… 52 52 53 53 54 56 56 57 58 60 63 pag 2 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il NET Framework Compilazione delle applicazioni tradizionali Terminato lo sviluppo dell‟applicazione, questa deve essere compilata per creare un file binario detto eseguibile. Tutte le librerie utilizzate dalla‟applicazione vengono linkate staticamente all‟applicazione al momento della creazione. Pertanto l‟eseguibile contiene al suo interno tutte le librerie necessarie alla sua esecuzione e qpuò essere eseguito su qualunque macchina senza ulteriori installazioni. Concetto di DLL (Dynamic Link Library) Col passare degli anni le funzioni utilizzate da un programma aumentano sempre di più e diventa impossibile contenerle tutte all‟interno di un unico eseguibile. Nasce il concetto di DLL. Molto funzionalità di base (ad esempio le funzioni di input / output, le funzioni di gestione delle finestre grafiche, le funzioni di accesso ai file) vengono memorizzate all‟interno di DLL esterne che devono essere distribuite insieme all‟applicazione. Una DLL può essere vista come una classe compilata. Se invece di compilare un „intero progetto dotato di main si compila una singola classe sprovvista del main, invece di un file eseguibile viene creata una libreria (detta DLL) simile all‟eseguibile ma che non può essere eseguito autonomamente. La DLL sono pertanto librerie binarie che verranno collegate dinamicamente all‟eseguibile soltanto in fase di RUN TIME. Quando si crea un progetto che intende utilizzare una DLL, è sufficiente indicare nel progetto il path del file contenente la DLL. Al momento dell‟esecuzione, quando l‟eseguibile avrà necessità di accedere ad una funzione contenuta all‟interno della DLL, provvederà autonomamente a caricare in memoria la DLL, linkarla dinamicamente al progetto ed eseguire la specifica funzione richiesta. Una stessa DLL può essere contemporaneamente utilizzata da più processi. Molte DLL utilizzate in un certo ambiente di sviluppo vengono installate sulla macchina al momento dell‟installazione dell‟ambiente di sviluppo. Quando poi l‟utente sposta l‟eseguibile su un‟altra macchina l‟eseguibile non funziona perché manca qualche DLL. Non sempre è facile recuperare le DLL mancanti, e nemmeno di può pensare di reinstallare sulla macchina del cliente finale l‟intero ambiente di sviluppo. Il NET Framework [300 MB] Tre grandi innovazioni: 1) Tutte le DLL necessarie all‟esecuzione Run Time sono raccolte all‟interno del NET Framework, in modo che, quando si distribuisce una applicazione, non ci sia più la necessità di portarsi dietro tutte le DLL ma, sul nuovo PC, sarà sufficiente installare il NET Framework, scaricabile gratuitamente dal sito Microsoft. Siccome esistono versioni differenti di Visual Studio che utilizzano NET Framework differenti, occorre fare attenzione ad installare sul PC del cliente finale la stessa versione di NET Framework utilizzato per lo sviluppo: Visual Studio 2002 Visual Studio 2003 Visual Studio 2005 Visual Studio 2008 -> Framework 1.0 -> Framework 1.1 -> Framework 2.0 -> Framework 3.0 (ad oggi Gennaio 2010 siamo alla release 3.5 di Visual Studio 2008) 2) L‟applicazione finale non comunica direttamente con il SO, ma comunica solo con il NET Framework, per cui diventa portabile su qualunque SO per i quali è disponibile la versione adeguata del NET Framework. 3) Il compilatore, a differenza dei tradizionali linguaggi di prg, non genera codice nativo binario (eseguibile direttamente dalla CPU), ma genera il cosiddetto MsIL (Miscosoft Intermediate Language). A differenza di java che è interpretato, in NET quando una applicazione viene lanciata, essa richiama direttamente una DLL (MsCorEE) (run time manager di NET) che contiene un compilatore Just in Time (compilatore JIT) il quale provvede a compilare il codice intermedio in codice nativo eseguito sulla CPU. Ogni procedura viene compilata soltanto quando viene richiamata per la prima volta, senza appesantire il tempo di lancio. Inoltre la compilazione Just in Time può ottimizzare il codice sulla base del SO su cui viene eseguita. pag 3 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Le Variabili Quelli che iniziano con la lettere Maiuscola sono i tipi nativi del NET Framework. Quelli che iniziano con lettera minuscola sono quelli appositamente ridefiniti per C# Tipo Nativo Byte Char Int16 Int32 Int64 Single Double Boolean VB Byte Char Short Integer Long Single Double Boolean C# byte char short int long float double bool 1 byte 2 byte 2 byte 4 byte 8 byte 4 byte 8 byte 2 byte Numerico 0 - 255 chr UNICODE. No valore numerico ± 32000 ± 2 Mld ± 9 Mld di Mld Object String Date Object String Date object string date 4 byte 10 byte + 8 byte Riferimento a oggetto (void *) 2 * char (1 Mld Char) Dal 1 1 0001 al 31 12 9999 True = -1, False = 0 Non esiste il concetto di unsigned int. String e Date sono degli Oggetti che, per comodità, sono istanziabili anche senza il new. Le variabili string non sono accessibili in scrittura diretta ma solo in concatenamento. Tutti i metodi che modificano la stringa in realtà istanziano e restituiscono una nuova stringa Il vecchio standard ANSI ad un byte per carattere è sostituito dallo standard UNICODE. Lo standard ANSI ad un byte prevedeva 256 simboli, di cui i primi 128 erano fissi (codici ASCII) mentre i 128 successivi dipendevano dall‟applicazione (e dalla lingua). Lo standard UNICODE prevede invece 65536 caratteri fissi, contemplando tutti i possibili caratteri (ad esempio il codice 12398 rappresenta il carattere N in giapponese). Nei 10 caratteri di intestazione viene memorizzata la lunghezza della stringa. Non sono supportate le stringhe a lunghezza fissa. Dichiarazione delle variabili Stessa sintassi dell‟ANSI C. Per i nomi delle variabili si consiglia la notazione camel Casing del tipo nomeCognomeIndirizzo, con la 1° lettera minuscola e le iniziali delle parole successive Maiuscole. Sono consentite Dichiarazioni multiple su una stessa riga: int a, b, c Variabili di blocco E‟ consentita la dichiarazione di variabili direttamente all‟interno di un blocco di istruzioni (Variabili di blocco). Se però la variabile viene inizializzata e la dichiarazione si trova all‟interno di un ciclo, allora l‟inizializzazione viene ripetuta tutti i giri. for (int i = 0; i < 100; i++) { int a=0; a = a+i; } // a = 99 Per evitare questo problema l‟inizializzazione può essere eseguita all‟interno del ciclo for: for (int a =0, i = 0; i < 100; i++) { Attenzione che non è possibile riutilizzare il nome di una variabile già esistente all‟interno della procedura (errore di compilazione). E‟ invece consentito avere una variabile di blocco con lo stesso nome di una variabile globale. Attenzione anche al fatto che il tempo di vita della variabile di blocco coincide con quello dell‟intera procedura. Se si ripassa una seconda volta nel blocco, la variabile viene reinizializzata al valore di inizializzazione ma, in assenza di inzializzazione esplicita, la variabile mantiene il valore che aveva in uscita dal blocco. pag 4 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Le costanti Non sono supportate le define, ma la costante viene dichiarata come se fosse una variabile semplicemente anteponendo la parola chiave const davanti. Anche le constanti vengono allocate in memoria. const int n = 3; const string s = "Salve mondo"; Lettura e Scrittura su Console String s; Console.writeln(s); s = Console.readln(s); Parametri opzionali in una funzione Per rendere opzionale un parametro all‟interno di una funzione è sufficiente specificare un valore di default int modifica (int paramObbligatorio , int paramOpzionale = 0) Variabili static In C# non sono supportate le variabili statiche all‟interno di un metodo. Al loro posto si usano i metodi statici. Istruzioni Fondamentali Operatori Aritmetici + * - / La divisione fra interi tronca all‟intero più basso % Resto della divisione fra interi Logici && || ! Nel caso della And, se il primo test fallisce, i test successivi non vengono eseguiti. Nel caso della ||, se il primo test è vero, i test successivi non vengono eseguiti. Confronto == != > >= < Assegnazione = += -= *= /= <= Bit a Bit & AND bit a bit | OR bit a bit ~ Negazione bit a bit (il ! è ammesso SOLO per la negazione di un boolean) L‟istruzione if if (condizione) { istruzioni; } else if (condizione) { istruzioni; } else { istruzioni; } Se all‟interno di un generico blocco compare una unica istruzione, le graffe possono essere omesse. pag 5 Informatica - Classe Terza robertomana.it Introduzione al Net Framework L‟istruzione switch int n = 2; string s = "aa"; switch (n) { case 1: case 2: MessageBox.Show("uno or due"); break; default: MessageBox.Show("other"); break; } switch (s) { case "aa": MessageBox.Show("aaa"); break; case "bb": MessageBox.Show("bbb"); break; default : MessageBox.Show("other"); break; } A differenza di ANSI C la variabile da confrontare può essere di qualunque tipo, compreso STRING. (in ANSI C erano ammessi solo int e char) A differenze di ANSI C ogni blocco case contenente delle istruzioni deve essere chiuso mediante un break, altrimenti si verifica un errore in compilazione. Anche il default deve essere chiuso da un break. Purtroppo a differenze di VB dopo ogni singolo case può essere specificato sempre solo un UNICO valore. Non è possibile fare delle OR o delle AND o impostare degli intervalli. I Cicli for (i=1; i<=10; i++) { istruzioni; istruzioni; } while (condizione) { istruzioni; istruzioni; } do { istruzioni; istruzioni; } while (condizione); L‟istruzione break usata dentro un ciclo interrompe il ciclo saltando alla prima istruzione successiva al ciclo L‟istruzione continue usata dentro un ciclo interrompe la scansione corrente ritornando in cima al ciclo Esempio for (i=1; i<=100; i++) { Leggi numero; if (numero <= 0) continue; // scarto i numeri negativi // memorizza numero in un vettore; } pag 6 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Introduzione ai Vettori Sono a base 0, cioè partono da 0 e vanno fino a N -1. Devono essere trattati come oggetti, per cui non è ammessa la tipica dichiarazione int vect[10]; „Errore di sintassi Occorre invece utilizzare la seguente sintassi : int [] vect1; // equivale all‟ANSI C int * vect1 vect1 = new int[10]; int [] vect1 = new int[10]; for (int i = 0; i < 10; i++) vect1[i] = i; In caso di inizializzazione diretta occorre omettere la dimensione int [] vect2 = new int [] { 0, 1, 2, 3, 5, 8, 13 }; In questo caso anche il new può essere omesso: int [] vect2 = { 0, 1, 2, 3, 5, 8, 13 }; E‟ ammesso l‟utilizzo di una variabile per definire la dimensione: int n = 10; int[] vect3 = new int[n]; Le Strutture Come in ANSI C, in C#, le strutture, a differenza delle classi, sono considerate variabili di tipo scalare quindi non serve il new non sono ereditabili. All‟interno di una struttura è possibile definire Variabili ma anche funzioni. I membri di una struttura possono essere Private (default) oppure Public. public struct s_Libri { public int codice; // non sono consentite le inizializzazioni public string autore; public string titolo; public string visualizza() { string s = codice.ToString() + " " + autore + " " + titolo; return s; } }; Dichiarazione di un record e inserimento dei dati s_Libri libro; // struct DEVE essere omesso libro.codice = 3; libro.autore = "Pirandello"; libro.titolo = "Uno nessuno centomila"; libro.visualizza(); Operazioni sui record Come in ANSI C non è consentito il confronto fra record, che devono essere confrontati sui singoli campi. Essendo variabili scalari, i record possono essere copiati con la semplice assegnazione: libro2 = libro1; Notare che così facendo ogni campo di libro1 viene duplicato all‟interno di libro2, comprese le stringhe, per le quali, come detto è stato ridefinito l‟operatore di assegnazione (il setter) che ogni volta istanzia una nuova stringa. pag 7 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Introduzione alla Programmazione Object Oriented Paradigma = Modello utilizzato per affrontare / risolvere un problema Paradigma Imperativo: Esprime la strategia risolutiva di un problema attraverso una successione sequenziale di comandi ed un controllo di stati (es. Continua a ciclare fino a quando non arriva un numero negativo). Paradigma della programmazione ad oggetti Nuova modalità di progettazione delle applicazioni. Non si pensa più a quale sequenza di operazioni è necessaria, ma a quali oggetti sono necessari. Risoluzione dei problemi mediante la costruzione di oggetti dedicati. OOP esprime la strategia risolutiva di un problema attraverso una generalizzazione della progettazione di oggetti riutilizzabili: Essa parte dalla costruzione di oggetti elementari per costruire via via oggetti sempre più complessi (estensibilità del codice). Introduzione agli oggetti Un oggetto può essere inizialmente visto come un contenitore che comunica con l‟esterno mediante un insieme di proprietà, metodi ed eventi. Il main (programma principale) rappresenta l‟utilizzatore della classe. Proprietà Metodi Eventi Le Proprietà sono “variabili” definite all'interno dell'oggetto. I Metodi sono “funzioni / procedure” definite all'interno dell'oggetto che operano sulle Proprietà Gli Eventi rappresentano una nuova caratteristica della programmazione ad oggetti. Sono procedure richiamate automaticamente quando si verifica una particolare situazione dovuta ad una causa interna (ad esempio allo scadere di un certo timeout) oppure in conseguenza di eventi esterni come ad esempio il click del mouse. Per accedere da codice ai membri di un oggetto di usa l‟operatore . (puntino ), esattamente come per i record Es: myLibro.titolo = “I Promesi Sposi”; Definizione di CLASSE Le classi costituiscono la base della programmazione ad oggetti. Si supponga di dover rappresentare e gestire una certa realtà (ad es la biblioteca di una scuola). Una classe è una porzione di codice (contenuta normalmente in un apposito file .cls) contenente un insieme di dati (cioè le PROPRIETA‟: Titolo del libro, Autore, Casa Editrice) più il codice di elaborazione dei dati stessi (cioè i METODI che agiscono sui dati. Ad esempio un Motodo per l‟aggiunta di un nuovo libro oppure per la gestione di un prestito). Una Classe definisce le caratteristiche (cioè Proprietà, Metodi ed Eventi) dell'oggetto, esattamente come la struttura definisce le caratteristiche dei record. Es: class clsLibri { // Le classi si scrivono con la prima lettera Maiuscola public int codice; public string Titolo; public void salvaSuFile() { // Codice per salvare su file il libro corrente (codice e titolo) } } Gli EVENTI sono particolari metodi (metodi di evento) che non devono essere richiamati dall‟utente della classe (main) ma che vengono eseguiti automaticamente in corrispondenza di situazioni interne al programma o esterne. Definizione di OGGETTO Un oggetto rappresenta una istanza della classe, cioè la sua allocazione in memoria.. Nel caso delle classi non si parla più di allocazione ma di ISTANZA. In genere si parla più frequentemente di oggetto che non di classe. La classe può essere vista semplicemente come codice di definizione dell‟oggetto. pag 8 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Per poter utilizzare la classe clsLibri, l'applicazione dovrà prima creare una istanza mediante l‟operatore new: ClsLibri mioLibro; mioLibro = new ClsLibri(); // sempre con le parentesi La prima riga crea un riferimento (puntatore) ad un oggetto clsLibri non ancora esistente in memoria. Questo riferimento contiene pertanto il valore null (che in C# significa puntatore non inizializzato). La seconda riga, mediante l‟operatore new, crea una nuova istanza della classe clsLibri e restituisce il puntatore all‟oggetto che viene copiato all‟interno della variabile mioLibro. Esattamente come in C i Riferimenti (cioè i Puntatori), pur essendo sempre indirizzi, sono TIPIZZATI. Cioè un puntatore può essere dichiarato come Puntatore generico oppure come Puntatore ad uno specifica classe: Generico Tipizzato ANSI C void * pt; ClsLibri * mioLibro; C# Object pt; ClsLibri mioLibro; E‟ anche possibile Dichiarare un Riferimento e Istanziare l‟Oggetto all'interno della stessa riga: ClsLibri mioLibro = new ClsLibri(); // sempre con le parentesi Per accedere da codice ai membri di una classe si usa il nome del puntatore seguito dall‟operatore puntino mioLibro.codice = 65 mioLibro.salvaSuFile() Riassumendo : Classe = Codice Descrittivo di un oggetto (template) Oggetto =Istanza in memoria della Classe. Visibilità I membri di una classe (Proprietà, Metodi ed Eventi) possono essere definiti come Private (default), cioè visibili solo all‟interno di una classe, oppure Public, cioè visibili anche all‟esterno della classe. Le TRE caratteristiche di una classe Incapsulamento : Una classe è l‟unica proprietaria dei suoi dati. I Dati sono memorizzati in un‟area di memoria non direttamente accessibile alle altre porzioni di programma. La classe può controllare il valore assegnato alle variabili interne prima che i valori stessi vengano memorizzati, con la possibilità di rifiutare valori non validi. L‟incapsulamento consente di modificare il funzionamento della classe senza interagire con l‟applicazione esterna Ereditarietà : Da una classe già esistente è possibile derivare una nuova classe (classe derivata) che erediti proprietà e metodi della classe base con possibilità di aggiungere nuove funzionalità. Riutilizzo del software. Polimorfismo : Più classi completamente diverse possono mostrare all‟esterno interfacce simili cioè proprietà e metodi con lo stesso nome e la stessa firma. Facilità di utilizzo e possibilità di gestire gruppi di controlli con una unica variabile di tipo Control Esempio di progetto OOP Realizzare un programma per il calcolo degli interessi che si avranno al termine di un investimento pluriennale. Utilizzando OOP cambia completamente la strategia risolutiva. I problemi si risolvono non più attraverso una analisi sequenziale, ma attraverso l‟individuazione e la realizzazione di appositi oggetti. Non si pensa più a quale sequenza di operazioni è necessaria, ma a quali oggetti sono necessari a) Approccio sequenziale :: 1. Leggere il capitale iniziale 2. Leggere il tasso di interesso annuo 3. Leggere la durata dell‟investimento espresso in anni 4. Fare un ciclo per il calcolo degli interessi annuali 5. Visualizzare il risultato pag 9 Informatica - Classe Terza robertomana.it Introduzione al Net Framework b) Approccio OOP :: 1. Creare una classe ClsInvestimenti 2. Impostare le Proprietà capitaleIniziale, interesseAnnuo, durata 3. Richiamare l‟apposito metodo eseguiCalcolo( ) 4. Leggere e Visualizzare il risultato Nella OOP il passo iniziale è individuare e costruire gli oggetti necessari alla soluzione del problema e quindi spostare tutta la logica all‟interno della classe. Nel caso precedente si avrà il seguente codice: class ClsInvestimenti { public int capitaleIniziale; public int interesseAnnuo; public int durata; private double risultato; public double eseguiCalcolo( ) { risultato = capitaleIniziale; for (int i = 0; i < durata; i++) risultato += risultato * interesseAnnuo / 100; return risultato; } int Main( ) { ClsInvestimenti investimento = new ClsInvestimenti(); investimento.capitaleIniziale = Convert.ToInt32( InputBox("Inserire capitale Iniziale")); investimento.interesseAnnuo = Convert.ToInt32(InputBox("Inserire Interesse Annuo")); investimento.durata = Convert.ToInt32(InputBox("Inserire Durata")); double ris = investimento.eseguiCalcolo( ); MessageBox.Show (ris.ToString()); } L‟approccio OOP è sicuramente più oneroso nel caso di piccole applicazioni, ma è sicuramente vantaggioso nel caso di applicazioni di dimensioni notevoli, in cui, una volta stabilite le specifiche della classe, gruppi di lavoro differenti possono contemporaneamente dedicarsi allo sviluppo di oggetti differenti ed eventualmente riutilizzabili Membri di Istanza e Membri Statici di una classe Una classe può avere : proprietà e metodi di istanza, cioè legati alle istanze della classe, e richiamati tramite il nome dell‟istanza ES: mioLibro.metodoDiIstanza( ); oppure mioLibro.salvaSuFile(); proprietà e metodi statici (o di classe), cioè che non dipendono dalla singole istanze, ma dalla classe vera e propria, e vengono richiamati non tramite il nome dell‟istanza ma direttamente tramite il nome della classe ES: ClsLibri.MetodoStatico( ); oppure int nLibri = ClsLibri.count; In corrispondenza del primo accesso ad un membro statico, la classe viene caricata in memoria e da quel momento tutti i suoi membri statici diventano accessibili (come le funzioni di libreria della programmazione sequenziale). Classi Statiche [Per definire una classe statica è sufficiente definire il costruttore come privato] a) contengono soltanto membri statici (libreria di funzioni) b) non possono essere istanziate esplicitamente. In DOT NET ogni cosa è un oggetto. Esempi : Classi statiche: Math, ControlChars. Sono le più semplici perchè possono essere utilizzate senza essere istanziate User Class Classi definite dall'utente all'interno dell'Applicazione. (es ClsLibri) Form Class. Oggetto che sta alla base della programmazione visuale . I controlli sono particolari Classi che possono essere istanziate soltanto all'interno di una Form . pag 10 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il metodo MessageBox.Show MsgBoxResult MessageBox.Show( messaggio As String, // Unico parametro obbligatorio titolo As String, // Titolo visualizzato sulla barra blu del titolo. pulsanti As MsgBoxButtons, // Pulsanti da visualizzare sulla form icon As MsgBoxIcon // Icona da visualizzare sulla form button As MsgBoxDefaultButton ) MsgBoxButtons indica eventuali pulsanti aggiuntivi che possono essere posizionati all‟interno della finestra del messaggio. Se non si specifica nulla viene automaticamente posizionato il solo pulsante di OK. 0 1 2 3 4 5 OKOnly OKCancel AbortRetryIgnore YesNoCancel YesNo vbRetryCancel Il solo pulsante OK [default] Pulsanti OK + Cancel Pulsati Abort + Retry + Ignore Pulsati Si + No + Annulla Pulsati Si + No Pulsati Riprova + Annulla MsgBoxIcon 16 32 48 64 Critical Question Exclamation Information Cerchio con x interna Nuvoletta con Punto Interrogativo Triangolo con Punto Esclamativo Nuvoletta con i interna MsgBoxDefaultButton 0 256 512 DefaultButton1 DefaultButton2 DefaultButton3 Il primo pulsante è preselezionato Il secondo pulsante è preselezionato Il terzo pulsante è preselezionato Esempio: Finestra di chiusura di Word : Il programma rimane bloccato fino a che l‟utente non chiude la finestra clickando su uno dei pulsanti. MsgBox restituisce come risultato una costante di tipo DialogResult che indica appunto quale pulsante è stato premuto.. DialogResult ris; ris = MessageBox.Show ("Salvare le modifiche al documento corrente?", "Microsoft Word", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation ); if (ris == DialogResult.Yes) …………… //Significa che l‟utente ha premuto il pulsante SI pag 11 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La funzione InputBox In C# questa funzione non esiste in quanto è definita soltanto all‟interno della libreria Visual Basic. In caso di necessità si può importare l‟intera libreria Visual Basic aggiungendo il Riferimento al progetto. using Microsoft.VisualBasic; string ris = Interaction.InputBox("Inserire un numero"); SINTASSI: String InputBox(messaggio As String, titolo As String, default As String) Titolo e Default sono facoltativi. Messaggio rappresenta il messaggio all‟interno della finestra (es “Prego inserire il vostro Nome”) Titolo rappresenta il titolo della finestra, cioè ciò che verrà scritto sulla barra blu del titolo. Default indica un eventuale valore di default che comparirà a video nella casella di Input. Se la finestra viene chiusa mediante il pulsante Cancel o la x della barra del titolo InputBox restituisce stringa vuota. Gestione delle eccezioni strutturate Una eccezione è una condizione inaspettata che si verifica durante l‟esecuzione di una applicazione e che, se non viene gestita, ne arresta bruscamente l‟esecuzione (tipico Run Time Error). Una eccezione può essere intercettata dalla procedura nella quale si è verificata. Se ciò non accade, l‟eccezione viene sollevata al chiamante, che se vorrà potrà gestire l‟eccezione, e così via fino al main. Se nessuno intercetta l‟eccezione, si verifica un Run Time Error con visualizzazione di un messaggio di errore. L‟oggetto System.Exception Quando si verifica una eccezione, viene creato un oggetto Exception che, se non gestito, viene passato al chiamante. Esistono però diversi tipi di oggetti Exception. Ad esempio: le operazioni matematiche possono sollevare oggetti Exception del tipo OverflowException o DivideByZeroException, e funzioni possono sollevare eccezioni del tipo ArgumentOutOfRangeException. Tutti i vari oggetti Exception dispongono comunque delle seguenti proprietà comuni: [Read Only] Messaggio di descrizione dell‟errore Nome dell‟oggetto in cui si è verificato l‟errore. Se l‟errore si è verificato nella applicazione corrente, Source sarà stringa vuota TargetSite Metodo che ha causato l‟errore. HelpLink URL di una pagina di Help che descrive come recuperare l‟errore. Es: “pagina15.htm#Target2” Message Source L‟istruzione Try Catch Per gestire le eccezioni occorre racchiudere le istruzioni da controllare all‟interno di un blocco Try. Se si verifica una eccezione all‟interno del blocco Try, il controllo passa al blocco Catch detto Filtro delle Eccezioni. try { n = Convert.ToSingle(txtNumero.Text); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "Numero non valido"); txtNumero.Text = "0"; } pag 12 Informatica - Classe Terza robertomana.it Introduzione al Net Framework finally { MessageBox.Show("Operazioni conclusive"); } L‟espressione Exception ex dentro il catch è opzionale e serve solo per accedere a proprietà e metodi dell‟oggetto Exception. Il codice nel blocco finally, viene eseguito comunque, ed è utile quindi per far eseguire al sistema operazioni di pulizia come la chiusura di recordset o di connessioni a database, in modo da essere sicuri che vengano eseguite. Le istruzioni contenute nel blocco finally non possono andare ulteriormente in errore. Exception specifiche Il codice potrebbe essere raffinato verificando quale oggetto Exception è stato sollevato: try { x = x / y z = 10 ^ x } catch (DivideByZeroException ex) { // Gestione della divisione per 0 } catch (OverflowException ex) { // Gestione dell‟overflow } catch (Exception ex) { // analogo al default dello switch // Gestione dei casi rimanenti // In assenza del case else, l’eccezione viene rimandata al chiamante } La sequenza di intercettazione delle eccezioni dovrebbe tenere conto della gerarchia degli oggetti Exception [*]. E‟ possibile uscire in ogni momento da una struttura Try - End Try utilizzando l‟istruzione break utilizzabile sia nel Try sia nel Catch Il blocco TRY dovrebbe sempre essere utilizzato quando si accede ad oggetti esterni all‟applicazione (ad es un file o un database), oggetti che potrebbero essere non più esistenti perché rimossi dall‟interfaccia del SO. Generazione di una nuova eccezione throw new Exception("Nome NOK"); throw new ArgumentException("Invalid Argument”); Passaggio dei parametri per Riferimento In C# i parametri ByRef vengono passati tramite gli operatori ref e out: int n = 1; modifica (ref n); void modifica (ref int n){ n=4; } La differenza è che out obbliga il chiamato a settare un valore all‟interno della variabile ricevuta. pag 13 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Le classi base del NET Framework La classe Statica System.Math Sqrt (Num) As Double Restituisce la radice quadrata di un numero. In caso di numero negativo, anziché sollevare una eccezione, restituisce il valore speciale NaN. Esempio: double ris = Math.Sqrt(a); if (double.IsNaN(ris) == true) MessageBox.Show("Not a Number"); else MessageBox.Show("OK"); Abs (Num) As Double Restituisce il valore assoluto di un numero Sign (Num) As Integer Restituisce il segno di un numero (+1 per numeri positivi, -1 per i negativi) Max(Num1, Num2) Restituisce il massimo fra due valori Min(Num1, Num2) Restituisce il minmo fra due valori Pow(Base, Esp) Elevamento a potenza : BaseEsp Round (Num, N) As Double Arrotonda il numero Num con N cifre dopo la virgola. Attenzione che, anche impostando N = 2, il numero 3,00 viene comunque restituito come 3 Ceiling(Num) Arrotondamento all‟intero superiore Floor(Num) Troncamento all‟intero inferiore Sin (Angolo) As Double Exp (Num) As Double Log (Num) As Double Log10 (Num) As Double Math.PI 3,1415 Cos (Angolo) As Double Restituisce seno / coseno di un angolo espresso in radianti Restituisce l‟esponenziale naturale di un numero ex Restituisce il logaritmo naturale di un numero Restituisce il logaritmo in base 10 di un numero Math.E 2,7182 Le classi numeriche (Integer, Short, Long, Single, Double) Proprietà / Metodi di Istanza .ToString( ) Converte in stringa. Come primo parametro è possibile passare a ToString una stringhe di formattazione. Come eventuale 2° argomento un oggetto NumberFormatInfo contenente le impostazioni da utilizzare per Separatore Decimale, Separatore Migliaia, etc. .CompareTo(N1 As Num) Analogo al CompareTo delle Stringhe. Restituisce –1 0 +1 a seconda che il numero corrente sia min, eq o magg di N1. N1 deve essere dello stesso tipo del N corrente. Proprietà / Metodi Statici .MaxValue .MinValue Max numero memorizzabile [32.767 su Short] x = Short.MaxValue Min numero negativo memorizzabile [-32.768 su Short] x = Double.MinValue Per quanto concerne le sole classi Single e Double: .IsNaN(x) Restituisce True se la variabile x contiene il valore NaN .NaN Può essere usato in assegnazione: x = Double.NaN .Epsilon Più piccolo numero positivo memorizzabile (risoluzione) Single.Epsilon = 1,4E-45 .tryParse(var, out dest) Se riesce a convertire var in int lo salva nella variabile int dest, altrimenti nulla. La classe Statica System.Convert Il cast inline (o direct cast) dell‟ANSI C può essere eseguito soltanto sui tipi base scalari e non sulle stringhe. La classe Convert, viene utilizzata per convertire un qualsiasi numero in stringa (boxing) oppure una stringa nella corrispondente variabile scalare (unboxing). Può anche essere utilizzata per conversioni scalare scalare, (ad es da int a char), per le quali però è molto più comodo il cast inline. pag 14 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Di seguito sono riportate i principali metodi di conversione contenti nella classe Convert. string s; Convert.ToInt32 (s) Convert.ToInt16 (s) Convert.ToInt64 (s) Convert.ToDouble (s) Convert.ToDouble (s) Convert.ToBoolean (s) Convert.ToChar (s) Convert.ToByte (s) Convert.ToDateTime (s) // arrotondano tutte all‟intero più vicino // 0 -> False, altrimenti True // var deve essere lunga 1 solo carattere // string s = "30/8/2011"; Convert.ToString (var) Tutti questi metodi accettano come 2° parametro un oggetto NumberFormatInfo per l‟impostazione del formato. La classe System.Char Il tipo char è analogo a quello dell‟ANSI C. L‟unica differenza è che non si può assegnare un valore numerico ma solo il carattere ASCII: char c = „a‟; La classe Char dispone inoltre dei seguenti metodi statici:che possono tutti ricevere come parametro o un carattere char oppure un singolo carattere all‟interno di una stringa. .IsDigit(char c) .IsDigit(string s, int pos) Restituisce True se il carattere è un carattere numerico. Restituisce True se il carattere alla posizione pos è numerico .IsNumber (char c) .IsLetter (char c) .IsLetterOrDigit (char c) .IsUpper (char c) .IsLower (char c) .IsWhiteSpace (char c) .IsPunctuation (char c) .IsSymbol (char c) .IsControl (char c) Uguale a IsDigit Restituisce True se il carattere è una lettera Restituisce True se il carattere è una lettera o un numero Restituisce True se il carattere è una lettera maiuscola Restituisce True se il carattere è una lettera minuscola Restituisce True se il carattere è uno spazio Restituisce True se il carattere è una punteggiatura Restituisce True se il carattere è un simbolo stampabile Restituisce True se il carattere è un carattere di controllo (Ascii < 32) Questi metodi hanno una 2° firma del tipo metodo(s, i) che esegue il controllo sul carattere i-esimo della stringa s La classe System.Random .Next(A, B) Restituisce un numero intero compreso tra A (compreso) e B (escluso) .NextDouble( ) Restituisce un numero double compreso tra 0 (compreso) e 1 (escluso) .NextBytes (vectBytes) Riempie il vettore (indipendentemente dalla sua lunghezza) con numeri tra 0 e 255 Random rnd = new Random( ); int n; n = rnd.Next(A, B+1); Se al costruttore non viene passato nessun parametro, la sequenza risulta perfettamente casuale (legata a data e ora attuali). Se invece al costruttore si passa un numero Int16, verrà generata una ben precisa sequenza ripetuta ad ogni lancio del programma (sequenza che dipende dal numero impostato). Se A == 0 può anche essere omesso. pag 15 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La classe System.String In C#, come in VB, la Stringa è un Oggetto per il quale è stato ridefinito l‟operatore di assegnazione. Cioè l‟assegnazione s2 = s1 non copia il puntatore s1 dentro s2, ma istanzia un nuovo oggetto all‟interno del quale viene copiato il contenuto di s1 e poi si assegna a s2 l‟indirizzo di questo oggetto. Per istanziare una stringa si possono utilizzare indifferentemente le seguenti sintassi string s; string s = new string(“salve mondo”); La prima sintassi richiama implicitamente un costruttore privo di parametri. La seconda sintassi, per non creare confusione, è utilizzabile soltanto con costruttori dotati di parametri. In C# come in Java l‟oggetto string è un oggetto invariante (immutable cioè non modificabile). I vari metodi di elaborazione delle stringhe (ad esempio il metodo replace) restituiscono in realtà un puntatore ad una nuova stringa. Le stringhe possono essere convertite nel vecchio vettore di caratteri dell'ANSI C e viceversa. Il vettore di caratteri presenta però l‟inconveniente che non esistono funzioni per la sua visualizzazione e deve essere pertanto sempre riconvertito in stringa. Scomodo. Per modificare una stringa si possono adottare diverse „strategie‟. Le migliori sono le prime 2: riassegnare il vecchio puntatore alla nuova stringa: s = s.Replace('v', 'x'); costruire una nuova stringa con concatenamenti successivi Es gioco dell‟impiccato convertirla in un vettore di caratteri string s = "salve mondo"; char [] v; v=s.ToCharArray(); s = new String(v); utilizzare l‟oggetto string builder StringBuilder sb = new StringBuilder(s); sb[3] = 'x'; s = sb.ToString(); Sono tutte tecniche valide però bisogna ricordare che una stringa è pur sempre un oggetto . Ad esempio: int main(){ string s = "salve mondo"; modifica (s); MessageBox.Show(s); } void modifica (string s){ s = s.Replace('v', 'x'); } // Viene passato il puntatore ! Dopo il replace il puntatore s punta ad nuova stringa istanziata da replace, ma si tratta del puntatore locale ! Il problema può essere risolto passando la stringa per riferimento (indirizzo del puntatore) modifica(ref s) Proprietà e Metodi di Istanza [i] Accede in lettura all‟i-esimo carattere della stringa .Length Proprietà contenente il numero di caratteri della stringa. pag 16 Informatica - Classe Terza robertomana.it Introduzione al Net Framework .Substring(start As Integer, [len As Integer]) Estrae una sottostringa dalla stringa corrente, partendo dalla poszione start con lunghezza len. Se len non è specificato estrae fino a fine stringa .IndexOf(s1 As String [start As Integer], [end As Integer]) Ricerca la sottostringa s1 all‟interno della stringa corrente. Restituisce l‟indice della prima corrispondenza. La ricerca può essere compresa tra un indice iniziale ed un indice finale. Restituisce –1 se fallisce. .LastIndexOf(s1 As String [start As Integer], [end As Integer]) Come la precedente, ma restituisce l‟indice dell‟ultima occorrenza. Comincia a cercare partendo da start e andando all'indietro. Se start è omesso parte dalla fine della stringa. Ad esempio LastIndexOf(“ax” 3) ricerca la sottostringa “ax” partire dalla posizione 3 andando a ritroso fino all‟inizio della stringa. Cioè confronta i caratteri 3 e 4 con “ax”. Se non fanno match decrementa la posizione e confronta i caratteri 2 e 3 con “ax” e così via. .IndexOfAny(chr As Char( ), [start As Integer], [end As Integer]) Ricerca uno qualsiasi dei caratteri contenuti nel vettore e e restituisce l‟indice della prima ricorrenza oppure –1 se fallisce. .LastIndexOfAny(chr As Char( ), [start As Integer], [end As Integer]) restituisce l‟indice dell‟ultima occorrenza. .EndsWith( ) if(s.EndsWith(“.txt”)) valido = true; .Replace(search As String, replace As String) Sostituisce tutte le ricorrenze della prima sottostringa con la seconda. Restituisce l‟intera stringa convertita che deve eventualmente essere rassegnata alla variabile. .ToUpper( ) Restituisce la stringa convertita in maiuscolo .ToLower( ) Restituisce la stringa convertita in minuscolo .Insert(pos As Integer, s1 As String) Aggiunge la sottostringa s1 davanti al carattere pos della stringa corrente, spostando automaticamente verso destra gli altri caratteri .Remove(start As Integer, len As Integer) Elimina il numero di caratteri specificato partendo dalla posiz indicata. .Clone( ) Restituisce una copia della stringa corrente. Sulle stringhe questo metodo produce lo stesso effetto dell'operatore di assegnazione. .Trim([vectChar As Char( )]) Se non si specifica nessun parametro, elimina gli spazi iniziali e finali dalla stringa corrente. In alternativa è possibile specificare un vettore di caratteri. Trim eliminerà tutti i caratteri iniziali e finali contenuti nel vettore. Es Dim cArr( ) As Char = {Cchar(“ “), ControlChars.Tab} s = s.Trim(cArr) .TrimStart e .TrimEnd analoghi a .Trim ma agiscono solo sui caratteri iniziali / finali. .StartsWith(s1 As String) As Boolean. Restituisce True se la stringa corrente inizia con la sottostringa indicata in s1 .EndsWith(s1 As String) As Boolean. Restituisce True se la stringa corrente termina con la sottostring indicata in s1 .PadRight(len As Integer, [chr As Char]) Aggiunge tanti spazi a destra fino ad un numero complessivo di len caratteri. E‟ possibile specificare come secondo parametro un carattere diverso dallo spazio. Es s = s.PadRight(16, CChar(“0”) Aggiunge tanti zeri fino ad una lunghezza complessiva di 16 .PadLeft(len As Integer, [chr As Char]) Simile alla precedente ma aggiunge a sinistra. La str viene re istanziata. .Split(vectChr As Char( )) Esegue lo split della stringa in un vettore, secondo uno qualunque dei qualificatori .CompareTo(s1 As String) Confronta la stringa corrente con s1. Restituisce –1 0 +1 a seconda che la stringa corrente sia minore, =, maggiore di s1. Solo Case Sensitive. Chiaramente è possibile confrontare le stringhe in modo diretto. Questa fn va bene nei rari casi in cui occorre fare dei test a 3 stati (< = >) fra le stringhe. validi espressi dal primo argomento. I qualificatori possono essere lunghi soltanto un singolo carattere. Il metodo di istanza .ToString(“N4”) disponibile per qualsiasi tipo di oggetto, converte l‟oggetto in questione in stringa applicando la formattazione indicata dal parametro. I caratteri di formattazione riconosciuti sono: N (Number), D(Intero), C(Currency), E(Scientifico), F(Floating Point), P(Percent), X(Esadecimale) Dopo N è possibile aggiungere un numero intero che indica il numero di cifre da utilizzare dopo la virgola Dopo D è possibile aggiungere un intero che indica il numero di cifre complessive di visualizzazione. Se il numero risulta minore di questa lunghezza, viene completato con un certo numero di zeri all‟inizio della stringa Dopo F è possibile aggiungere un numero intero che indica il numero di cifre da utilizzare dopo la virgola Il formato E mostra il numero come nnnnEeee. Dopo E è possibile specificare il numero di cifre della mantissa. Il formato P converte un numero tra 0 e 1 in una percentuale con 2 cifre fisse dopo la virgola Il formato X converte un numero intero in stringhe esadecimale. Specificando una lunghezza es :X8 verranno eventualmente inseriti degli zeri in testa. Sono inoltre consentite maschere personalizzate. Se la variabile è di tipo data / ora, viene riconosciuta una lunga lista di indicatori riportata nella tabella allegata. Scansione di un vettore con il ciclo foreach foreach (char c in s) MessageBox.Show(c.ToString()); pag 17 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Metodi Statici .Intern (s As String) consente di memorizzare la stringa s all‟interno di una cache che ne velocizza l‟accesso. Es s1 = String.Intern(s1) .IsInterned (s As String) Verifica se la stringa s si trova nella cache (nel qual caso restituisce il puntatore alla stringa stessa), oppure no (nel qual caso restituisce Nothing) .Concat (s1, s2, ….) concatena un numero arbitrario di argomenti String (o Object convertibili in String). .Compare (s1, s2, [Mode]) Confronta s1 con s2 e restituisce 0 se sono uguali, 1 se s1 > s2, -1 se s1 < s2. Mode è un boolean dove False (default) indica case sensitive, True indica invece case unsensitive .Compare (s1, pos1, s2, pos2, Qta, [Mode]) Versione Overload della precedente. Confronta Qta caratteri di s1, a partire dalla posizione pos1, con Qta caratteri di s2, a partire da pos2. Mode è lo stesso di prima. I metodi Compare utilizzano le impostazioni della lingua locale, che ne rallenta l‟esecuzione .CompareOrdinal (s1, s2, [Mode]) Identico a Compare senza però considerare la lingua locale. Più veloce. .Format Formattazione di una stringa includendo una o più variabili. msg = String.Format(“Il valore della variabile {0} è {1}”, “x”, x) Nelle parentesi graffe, dopo l‟indice dell‟argomento, è possibile aggiungere una stringa di formattazione. Le stringhe di formattazione utilizzabili sono le stesse del metodo toString( ) msg = String.Format(“Il valore della variabile {0} è {1:N4}”, “x”, x) La classe Statica System.ControlChars Elenco di costanti predefinite; Cr, Lf, CrLf, Tab, VerticalTab. Back, NullChar, Quote Classe non supportata in C# dove si continuano ad utilizzare i vecchi caratteri di escape di ANSI C: \n, \r \ t \0 Il cast dei puntatori A differenza di Visual Basic in C# non esistono le funzione CType e DirectCast, e nemmeno TryCast e TypeOf ma la conversione di puntatori può essere fatta direttamente mediante il cast inline : Object obj = new clsPerson(); clsPerson p = (clsPerson) obj; Per i puntatori si usa l‟operatore IS che verifica se un puntatore sta puntando ad un certo tipo di oggetto Object obj = new clsTmp(); if (obj is clsPerson) { clsPerson p = (clsPerson)obj; } foreach (Control ctrl in this.Controls) if (ctrl is Button) { Button btn = (Button) ctrl; btn.Text = ""; } Il metodo GetType( ) è invece presente in C#, sia sotto forma di metodo statico della classe Type : Type x = Type.GetType("System.Int32"); MessageBox.Show(x.FullName); sia come metodo di istanza: if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") Per i numeri si può usare: int n; if (int.TryParse(txt.Text, out n) ) …………… else console.writeln(“Campo non valido”); pag 18 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Approfondimenti sui Vettori Copia di vettori vect2 = vect1 NON esegue la copia dei vettori, ma copia soltanto il puntatore. In sostanza vect1 e vect2 puntano ora allo stesso vettore. int[] vect1 = new int[10]; int[] vect2 = vect1; vect1[1] = 173; MessageBox.Show(vect2[1].ToString()); // 173 Per copiare fisicamente un vettore su un altro vettore occorre utilizzare il metodo Clone( ) che esegue int[] vect2 = vect1.Clone() che esegue una nuova new e restituisce un Object, cioè un void * int[] vect1 = new int[10]; int[] vect2 = (int []) vect1.Clone(); vect1[1] = 173; MessageBox.Show(vect2[1].ToString()); // 0 In alternativa esiste il metodo statico Array.Copy( ) che copia una porzione di vect1 all‟interno di vect2. vect1 e vect2 devono essere opportunamente istanziati e dimensionati. Non viene fatta nessuna new Array.Copy(vect1, pos1, vect2, pos2, qta) Ridimensionamento e concatenamento di vettori Un vettore non può essere ridimensionato. E‟ però possibile : a) Reistanziare il vettore b) Eseguire il concatenamento di due vettori. a) int[] vect; vect = null; if (vect == null) vect = new int[10]; vect = new int[20]; // tutti i dati vengono persi b) int[] x = new int[] { 1, 2, 3 }; int[] y = new int[] { 4, 5 }; int[] z = x.Concat(y).ToArray(); Altre Proprietà e Metodi di istanza .Length Proprietà ReadOnly = Restituisce il numero complessivo di elementi contenuti nell‟array. Altre Proprietà e Metodi statici Array.Clear(vect, startPos, qta) ; Array.Sort(vect) consente di ordinare in modo crescente il vettore passato come parametro. Array.Sort(vect1, startPos, qta) consente di ordinare soltanto una porzione di vettore. Il secondo parametro indica la posizione di partenza dell‟ordinamento, il terzo indica il numero di celle da ordinare Array.Reverse(vect) consente di invertire l‟ordine degli elementi di un vettore. Può essere applicato dopo Sort per ottenere l‟ordinamento inverso. Può anche agire porzioni singole: Array.Reverse(vect, startPos, qta) „Ordina qta elementi a partire dalla posizione startPos. pag 19 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Scansione di un vettore con il ciclo foreach int[] vect = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int element in vect) { MessageBox.Show(element.ToString()); } Le Matrici int[,] mat = new int[2,3]; // Matrice di 2 righe x 3 colonne, entrambe a base 0. // Anche la matrice può essere inizializzata in fase di dichiarazione: int[,] mat = {{11, 12, 13}, {21, 22, 23}}; .Length Proprietà ReadOnly = Restituisce il numero complessivo di elementi contenuti nella matrice, conteggiando però l‟intero rettangolo .GetLength(0) Proprietà ReadOnly = Restituisce il numero di righe .GetLength(1) Proprietà ReadOnly = Restituisce il numero di colonne (2° dimensione) for (int i = 0; i < mat.GetLength(0); i++) for (int j = 0; j < mat.GetLength(1); j++) MessageBox.Show(mat[i, j].ToString()); Passaggio e Restituzione di vettori int [] vect = new int[20]; riempiVettore(vect); void riempiVettore(int[] vect) { for (int i = 0; i < vect.Length; i++) vect[i] = i; } Una funzione può anche restituire un vettore (che viene ovviamente allocato dinamicamente) int[] vect = creaVettore(100); int[] creaVettore(int N) { int[] vect2 = new int[N]; for (int i = 0; i < vect2.Length; i++) vect2[i] = i; return vect2; } pag 20 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Files e Directories Tutte le classi relative a files e directories sono contenute nel namespace System.IO. Metodi statici comuni alle classi File e Directory path as String = percorso(assoluto o relativo) e nome di un file oppure di una cartelle File.Delete (path) Elimina il file avente il percorso indicato. Directory.Delete (path, Flag As Boolean) Elimina la cartella indicata. Se il 2° parametro è False (default), la cartella deve essere vuota altrimenti viene generato un Run Time Error. Se impostato a True vengono eliminati anche tutti i files e sottocartelle contenute. Move (source, dest) Sposta il file da Source a Dest. Esempio: File.Move(“file.txt”, “tmp\file2.txt”) „Il metodo Move si presta benissimo anche per eseguire il Rename. Se Dest è già esistente genera un errore Exists (path) Restituisce True se il file esiste GetCreationTime(path) Restituisce data e ora di creazione di un file / cartella SetCreationTime(path, dateTime) Imposta data e ora di creazione su un file / cartella esistente GetLastAccessTime(path) Restituisce data e ora dell‟ultimo accesso SetLastAccessTime(path, dateTime) Imposta data e ora dell‟ultimo accesso GetLastWriteTime(path) Restituisce data e ora dell‟ultima modifica SetLastWriteTime(path, dateTime) Imposta data e ora dell‟ultima modifica Metodi statici della classe Directory GetCurrentDirectory( ) Restituisce (come string) il percorso assoluto dell‟attuale cartella di lavoro. ( normalmente la cartella bin dell‟applicazione corrente) SetCurrentDirectory(“..\..”) Imposta il percorso assoluto / relativo dell‟attuale cartella di lavoro. Nell‟esempio si assume come cartella di lavoro la cartella posizionata due livelli sopra rispetto a bin). GetDirectories(path) Restituisce un vettore di String con tutte le sottocartelle della cartella passata come param GetFiles(path, “*.txt”) Restituisce un vettore di String con tutti i files.txt contenuti nella cartella passata come parametro. Omettendo il 2° parametro viene restituito l‟elenco completo dei files. GetFileSystemEntries(path) Restituisce un vettore di String con tutte le sottocartelle ed i files della cartella passata come parametro. E‟ anche possibile applicare un filtro del tipo “*.txt” CreateDirectory(path) Crea la directory specificata e, se necessario, tutte quelle intermedie indicate nel percorso GetLogicalDrives( ) Restituisce un vettore di String contenente tutti i drive logici del sistema (es “C:\”, “D:\”) Metodi statici della classe File Copy(source, dest, [overwrite]) Copia un file in una nuova destinazione e, se necessario, sovrascrive il file di destinazione. Se overwrite = False e Dest è già esistente, si genera un errore. GetAttributes(file) Restituisce gli attributi di un file codificati come bit field. I possibili valori sono Normal (nessun attributo), Archive, ReadOnly, Hiddem, System, Directory, Compressed, Encrypted, Temporary . . . . if (cBool(File.GetAttributes(myFile) And FileAttributes.ReadOnly) then …. „ File Read Only SetAttributes(file, attributes ) Imposta gli attributi di un file Open(file, [mode, access, share]) Apre un file generico nel modo indicate restituendo un oggetto FileStream mode può essere Append, Open, Create, CreateNew, Truncate (overwrite), OpenOrCreate che è la modalità più flessibile. Append e Open falliscono se il file non esiste. Create e CreateNew falliscono se esiste già. access può essere Read, Write, ReadWrite share livello di condivisione del FileStream. Può essere None (apertura esclusiva), Read, Write, ReadWrite. OpenText(file) Apre un file di testo in lettura e restituisce un oggetto SteamReader CreateText(file) Crea un nuovo file in scrittura e restituisce un oggetto SteamWriter AppendText(file) Apre un file di testo in modalità Append e restituisce un oggetto SteamWriter OpenRead(file) Apre un file generico in lettura e restituisce un oggetto FileStream (sequenza di bytes) OpenWrite(file) Apre un file generico in scrittura e restituisce un oggetto FileStream Per lanciare un Eseguibile esterno si può utilizzare il metodo statico Start dell‟oggetto Process. Es: Process.Start("Eseguibili\Eseguibile1.exe") pag 21 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Lettura e Scrittura di un File di Testo string leggiDaFile(string filename) { StreamReader sr = new StreamReader(filename); string testo = sr.ReadToEnd(); sr.Close(); return testo; } void scriviSuFile(string testo, string filename ) { StreamWriter sw = new StreamWriter(filename, false); string[] vect = testo.Split('\n'); false = overwrite sw.Write(testo); true = append sw.Close(); se il file non esiste viene creato automat } string leggiRigheDaFile(string filename) { StreamReader sr = new StreamReader(filename); string testo = ""; while (sr.Peek() > -1) Peek restituisce il codice del carattere testo += sr.ReadLine() + "\n"; successivo nello stream senza estrarlo, sr.Close(); oppure –1 in caso di EOF return testo; } void scriviRigheSuFile(string testo, string filename ) { StreamWriter sw = new StreamWriter(filename, false); string [] vect = testo.Split ('\n'); int cnt = 0; while (cnt< vect.Length ) sw.WriteLine (vect[cnt++]); sw.Close(); } Lettura e Scrittura di un File di Dati (Archivio) Archivio = Elenco di dati aventi tutti la stessa struttura (vettore di record) public int qta; public string[] vect = new string[10]; void scriviDatiSuFile(string filename ){ FileStream fs = File.Open(filename, FileMode.OpenOrCreate, FileAccess.RW); BinaryWriter bw = new BinaryWriter (fs); bw.Write(qta); for (int i=0; i<qta; i++) bw.Write(vect[i]); bw.Close(); } void leggiDatiDaFile(string filename) { FileStream fs = File.Open(filename, FileMode.OpenOrCreate, FileAccess.RW); BinaryReader br = new BinaryReader(fs); qta = 0; if (br.PeekChar() > -1) qta = br.ReadInt32(); for (int i=0; i<qta; i++) vect[i] = br.ReadString(); br.Close(); } pag 22 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Esempio completo di classe per la gestione dei files nel NotePad Imports System.IO - System.Windows.Forms; Public Class clsFile public string filename; public bool modificato; //Percorso Assoluto del file private string leggiDaFile( ) { string testo = ""; if (this.filename != "") { StreamReader sr = new StreamReader(this.filename); testo = sr.ReadToEnd(); sr.Close(); modificato = false; } return testo; } private void scriviSuFile(string testo) { if (this.filename != "") { StreamWriter sw = new StreamWriter(this.filename); sw.Write(testo); sw.Close(); modificato = false; } } public bool salva(string testo) { bool ok = true; if (this.filename == "") ok = salvaConNome(testo); else scriviSuFile(testo); return ok; } Client private clsFile fh = new clsFile private void txtTesto_KeyPress( ) fh.Modificato = True } public bool salvaConNome(string testo) { bool ok = false; SaveFileDialog dlgSalva = new SaveFileDialog(); dlgSalva.FileName = "*.txt"; dlgSalva.Filter = "Documento di testo (*.txt)|*.txt|Tutti i Files|*.*"; DialogResult ris = dlgSalva.ShowDialog(); if (ris == DialogResult.OK && dlgSalva.FileName != "") { this.filename = dlgSalva.FileName; scriviSuFile(testo); public string getFilename( ) { ok = true; } int pos; return ok; pos = this.filename.LastIndexOf("\"); } return this.filename.Substring(pos + 1); } public bool apri(string testo ) { bool ok = false; OpenFileDialog dlgApri = new OpenFileDialog(); dlgApri.FileName = "*.txt"; dlgApri.Filter = "Documento di testo (*.txt)|*.txt|Tutti i Files|*.*"; DialogResult ris = dlgApri.ShowDialog(); if (ris == DialogResult.OK && dlgApri.FileName != "") { this.filename = dlgApri.FileName; testo = leggiDaFile( ); ok = true; } return ok; } pag 23 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La classe FORM Principali Proprietà Opacity 0 – 100. Livello di trasparenza della form. 100 = form solida (default). ClientSize proprietà simile a Size, ma riferito alla sola area client della form. StartPosition Indica la posizione di comparsa della form al lancio del programma. Può assumere i valori FormStartPosition.Manual (utilizza le impostazioni di Location), FormStartPosition.CenterScreen (centro schermo), FormStartPosition.CenterParent (centro dell‟oggetto contenitore), FormStartPosition.WindowsDefaultLocation (posizione decisa dal s.o. mediante ricerca della zona maggiormente libera). WindowState Stato della finestra. Può essere vbNormal, vbMinimized, vbMaximized ShowInTaskBar True/False. Fa sì che la form venga visualizzata oppure no nella barra delle applicazioni di Windows. Può essere utile per applicazioni multiform. Non tutte devono apparire sulla barra dei task. MinimumSize e MaximumSize Sono proprietà di tipo Size che consentono di impostare dimensioni Min e Max al ridimensionamento della Form. Esempio Me.MinimumSize = New Size(200, 150) Autoscroll = True/False Se True, quando la form viene ridimensionata fino a coprire qualche controllo, allora vengono automaticamente visualizzate le barre si scorrimento. MinimizeBox True/False Visualizza / Nasconde il 1° pulsante “Riduci ad icona” nella barra del titolo MaximizeBox True/False Visualizza / Nasconde il 2° pulsante “Full Screen” nella barra del titolo Se uno solo dei due è False, viene rappresentato grigio. Se entrambi sono False vengono eliminati dalla form ControlBox True/False Se impostata a false elimina tutti e 3 i pulsanti della form, indipendentemente dal valore delle due proprietà precedenti. Se la form ha la proprietà Text = “”, viene eliminata anche la barra del titolo. FormBorderStyle Consente di impostare in un sol colpo alcune delle proprietà precedenti. (Only Design Time) 2=Sizable Default: Tre pulsante attivi, Icona presente, Ridimensionabile, Trascinabile 1=FixedSingle Non ridimensionabile. 3=FixedDialog Non ridimensionabile. Icona Assente 4=FixedTool Non ridimensionabile. Icona Assente, Presente il solo pulsante X di chiusura 5=SizableTool come la precedente, però Ridimensionabile 0=None Barra del titolo assente, per cui finestra non ridimensionabile né trascinabile E' in pratica visibile la sola area client TopMost Se impostato a True mantiene la form sempre in primo piano finché non viene chiusa (es MsgBox) .CenterToScreen( ) centra la form rispetto allo schermo .CenterToParent( ) centra la form rispetto al contenitore AcceptButton = cmdOk Indica il pulsante predefinito della Form, attivabile automat mediante il tasto Invio CancelButton = cmdCancel Indica il pulsante predefinito della Form, attivabile automat mediante il tasto Esc Richiamo di una API di Windows dall’interno di una Form using System.Runtime.InteropServices; public partial class Form1 : Form { [DllImport("kernel32.dll")] public static extern void Sleep(UInt32 msec ); In questo modo la API Sleep (che si trova nella DLL Kernel32 e si aspetta come parametro un tempo in msec) diventa un metodo aggiunto all‟interno della classe Form1. Nota: La sleep blocca il Refresh video. Per evitare questo effetto, prima della sleep(), occorre richiamare sempre this.Refresh() pag 24 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Ciclo di vita di una Form La form di start up può essere impostata nelle proprietà del progetto oppure lanciata dal Sub Main tramite Application.Run(new frmPrincipale()); Se l‟utente chiude la form di StartUp (form principale) tutte le altre form vengono automaticamente chiuse (senza generare gli eventi FormClosing eFormClosed) e l‟applicazione termina. Apertura di una Form Evento Load( ) Evento Shown( ) L‟evento Load viene non in corrispondenza dell‟istanza della form, ma quando la form sta per essere visualizzata per la prima volta. Viene richiamato una unica volta nel ciclo di vita della form. Viene richiamato dopo che le form è comparsa a video per la prima volta. Va bene per inizializzare la grafica e ad esempio per fare il BringToFront di una form istanziata all‟avvio della form corrente. Viene richiamato una sola volta nel ciclo di vita della form Evento Activated( ) La form ha ricevuto il fuoco (anche a seguito di un message box) Evento Deactivate( ) La form, ha perso il fuoco (anche a seguito di un msgbox) oppure è stata nascosta Evento Paint( ) Viene richiamato ogni volta che la form viene ridisegnata (ad esempio in seguito ad uno spostamento di un‟altra finestra che aveva ricoperto parzialmente la form). Il metodo Refresh( ) forza il clear ed il ridisegno della Form. Chiusura di una Form Il metodo .Close( ) equivale al click sulla X e consente di chiudere la form rilasciando il puntatore senza però deallocarla dalla memoria, operazione alla quale provvederà il Garbage Collector. Il metodo.Hide( ) nasconde la form al video ma non la chiude. Equivalente a Visible = False. Eventi generati a seguito della richiesta di chiusura di una form: Evento FormClosing(FormClosingEventArgs) Evento FormClosed(FormClosedEventArgs) „La form sta per essere chiusa „La form è stata chiusa ed il puntatore sta per essere rilasciato L'evento FormClosing(Sender As Object, e As FormClosingEventArgs) riceve i seguenti due parametri: .Cancel As Boolean normalmente False. Se settata a True impedisce la chiusura .CloseReason As CloseReason Enum indica chi ha richiesto la chiusura e può assumere i seguenti valori: CloseReason.UserClosing „Chiusura mediante x o metodo Close( ) CloseReason.TaskManagerClosing CloseReason.WindowsShutDown CloseReason.FormOwnerClosing CloseReason.MDIFormClosing L‟evento FormClosed, richiamato a form ormai chiusa, dispone del solo parametro CloseReason che indica chi ha richiesto la chiusura, senza però la possibilità di annullare la chiusura stessa. I controlli I controlli sono particolari oggetti visuali che possono essere utilizzati esclusivamente all‟interno di un oggetto contenitore, tipicamente la FORM. Controllo = oggetto che vive su una form. Per istanziare un controllo è sufficiente trascinarlo dalla Tool Box sulla Form. Sulla stessa form si possono chiaramente istanziare più controlli dello stesso tipo. pag 25 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Principali Proprietà comuni a tutti i controlli Name Text TextAlign Enabled Visible BackColor ForeColor Locked Dock Anchor TabStop TabIndex Tag Font Size Location Cursor UseWaitCursor Nome dell‟oggetto. Si utilizzano prefissi standard (frm=form, lbl=label, txt=textBox, cmd=…) Contenuto dell‟oggetto. Accetta le HOT KEY di attivazione richiamabili mediante il tasto Alt Ad esempio cmdPulsante.Text = ”&Esci” => Alt E diventa equivalente al click del mouse. Allineamento del testo orizzontale e verticale (9 combinazioni grafiche. Es TopLeft BottomRight) True / False Abilita / Disabilita il controllo a rispondere agli eventi True / False. Se False => automaticamente anche Enabled = False Colore di sfondo del controllo Colore di primo piano (normalmente colore del testo) True/False Se True blocca il controllo sulla form a Design Time Allineamento del controllo al contenitore (None, Top, Left, Right, Bottom, Fill=Area Client) Ancoraggio del controllo, normalmente Top/Left (controllo ancorato in alto a sinistra). Impostando Bottom/Right, il controllo segue l‟allargamento della form verso destra o vs il basso True / False Abilitazione alla selezione mediante tasto TAB Sequenza di selezione mediante il tasto Tab Commento di tipo String Carattere. Ammette le seguenti sottoproprietà (tutte ReadOnly a Run Time) Font.Name - .Size - .Bold - .Unit (Point, Pixel) - .Italic - .Strikeout - .Underline Dimensioni del controllo con 2 sottoproprietà Width e Height che sono ReadOnly a Run Time Per modificare le dimensioni del controllo a Run Time occorre utilizzare la sintassi: Control.Size = New Size (400, 300) Le dimensioni espresse in Pixel Posizione del controllo con 2 sottoproprietà Left e Top coordinate dell‟angolo in alto a sinistra Per modificare la posizione del controllo a Run Time occorre utilizzare la sintassi: Control.Location = New Point (200, 220). Coordinate espresse in pixel Forma del cursore del mouse. Da codice obj.Cursor = System.windows.forms.Cursors.xxx True/False se True viene impostata la clessidra sul cursore del mouse. Comando più rapido rispetto al precedente Principali Metodi comuni ai vari controlli VB SetBound (Left, Top, Width, Height) imposta in un sol colpo le 4 coordinate precedenti Refresh( ) Forza il ridisegno a video del controllo corrente (ad esempio all‟interno di un ciclo) Focus( ) Sposta il fuoco sull‟oggetto corrente Ogni controllo espone inoltre: la proprietà Parent restituisce un riferimento all‟oggetto contenitore. Es object par = myControl.Parent; if (par is Form) Then MsgBox(“Il nome della mia form è “ & par.Name) il metodo FindForm restituisce un riferimento alla form genitrice anche se il controllo si trova in un altro contenitore Form frm = myControl.FindForm( ) La collection Controls Tutti gli oggetti contenitori (Form, Panel, GroupBox) dispongono della collection Controls che contiene I puntatori ai figli di primo grado (se una form contiene 2 Panel, la collection Form.Controls non vedrà i controlli figli del Panel). La proprietà Controls.Count indica il numero di elementi contenuti nella collection. Le collection sono solitamente scandite mediante un ciclo foreach foreach (Control ctrl in this.Controls) ctrl.Enabled = false; Tutti gli oggetti contenitore dispongono del metodo .Contains(objName) che restituisce True se l‟oggetto indicato è contenuto nella collection del contenitore. Es If (GroupBox1.Contains(RadioButton1)) Then … pag 26 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Eventi relativi alla Tastiera KeyPress (Sender As Object, e As KeyPressEventArgs) Sender rappresenta un riferimento all‟oggetto che ha scatenato l‟evento. L‟obj KeyPressEventArgs ha 2 parametri KeyChar di tipo Char rappresenta il tasto premuto (nella usuale codifica Ascii, ma memorizzato come CHAR) Handled di tipo Boolean vale normalmente False. Se all‟interno di KeyPress Handled viene settato a True, il carattere viene abbattuto, come se non fosse stato premuto. Molto utile per eseguire un efficace controllo dell‟input. Se in un Text Box si vogliono accettare soltanto caratteri numerici, possiamo impostare all‟interno di KeyPress il seguente controllo: if ! (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar)) e.Handled=True; che lascia passare i caratteri numeri e caratteri di controllo (codice Ascii < 32) come BackSpace, in modo che l‟utente possa correggere l‟input in fase di inserimento. CANC non è sentito da KeyPress (per cui passa sempre). Per abbattere / lasciar passare un singolo carattere si può impostare la condizione : if ! (e.KeyChar == „x‟) e.Handled = True; La routine di risposta all‟evento può anche modificare il valore di KeyChar if (e.KeyChar==‟x‟) e.KeyChar=‟y‟; if (char.IsLower(e.KeyChar)) e.KeyChar = e.KeyChar.ToString.ToUpper( ); KeyDown (Sender As Object, e As KeyEventArgs) KeyUp (Sender As Object, e As KeyEventArgs) Il parametro KeyEventArgs espone le seguenti proprietà: Alt As Boolean, stato del tasto Alt Shift As Boolean, stato del tasto Shift Control As Boolean, stato del tasto Control KeyCode As Key, tasto premuto, espresso sotto forma di valore enumerativo Keys Handled As Boolean, se True consente di abbattere il tasto KeyValue As Integer, codice VB del tasto premuto A differenza del caso precedente, e rappresenta ora un tasto fisico della tastiera. In questo caso “a” e “A” avranno la stessa rappresentazione (65 corrispondente alla A) perché provengono dallo stesso tasto. Questa codifica copre però tutti i tasti della tastiera, comprese le freccine, i tasti funzione, etc. KeyCode utilizza i seguenti simboli: Keys.A Tasto A Keys.NumPad1 Tasto 1 del tastierino numerico Keys.D1 Tasto 1 sui tasti in alto Keys.F1 Tasto F1 Keys.Left Freccina sinistra Keys.Escape Tasto Esc Ad esempio se si vuole intercettare il comando Shift + F2 si può scrivere If (e.Shift && e.KeyCode = Keys.F2) TextBox.SelectedText = Today.Date.ToString(); Notare che se si scrive in maiuscolo tenendo premuto lo shift, KeyDown se ne accorge. Se invece scrivo in maiuscolo utilizzando il blocco delle maiuscole, KeyDown non se ne accorge. Note 1) Mentre KeyDown e KeyPress “vedono” la proprietà TextBox.Text non ancora aggiornata (cioè ancora priva del carattere premuto), l‟evento KeyUp “vede” la proprietà .Text aggiornata col nuovo carattere già presente L'evento KeyUp è abbastanza simile a TextChanged, ma mentre TextChanged viene richiamato ogni volta che si modifica il contenuto del TextBox (eventualmente anche da codice), KeyUp è richiamato solo a seguito di un tasto 2) Questi tre eventi Key non vengono bufferizzati. Se KeyPress esegue un MsgBox, KeyUp non viene più generato 3) La proprietà Form.KeyPreview, se impostata a True, fa sì che i tre eventi Key vengano generati prima sulla form, e soltanto dopo sul controllo a cui il carattere è destinato. pag 27 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Eventi relativi al Mouse Click( ) Richiamato quando l‟utente fa un singolo click su un controllo DblClick( ) Richiamato quando l‟utente fa un doppio click su un controllo. Attenzione che prima del DblClick() viene richiamato per 2 volte l‟evento Click(). Click e DoubleClick sono di solito gestiti in modo alternativo.. MouseDown (sender As Object, e As MouseEventArgs) MouseUp (sender As Object, e As MouseEventArgs) MouseClick (sender As Object, e As MouseEventArgs) MouseMove (sender As Object, e As MouseEventArgs) MouseWheel (sender As Object, e As MouseEventArgs) „rotellina del mouse L‟oggetto MouseEventArgs espone le seguenti proprietà: Button è un valore codificato in bit che indica quale pulsante del mouse è stato premuto. Assume i seguenti valori Windows.Forms.MouseButtons.Left Windows.Forms.MouseButtons.Middle Windows.Forms.MouseButtons.Right X Y Rappresentano le coordinate attuali del mouse espresse in pixel rispetto all‟angolo superiore sinistro del controllo Non viene purtroppo fornita alcuna informazione sui tasti di Shift. A tal fine interviene l‟oggetto Control che dispone di alcune proprietà statiche estremamente interessanti L‟oggetto CONTROL : proprietà statiche relative a mouse e tastiera L‟oggetto Control espone alcune comodissime proprietà Statiche relative al mouse che possono interpellate in qualsiasi momento (ad esempio all‟interno degli eventi Click e DoubleClick che non hanno parametri): .MousePosition .X .Y indica le coordinate attuali del mouse rispetto all‟angolo superiore sinistro della Form .MouseButtons indica il valore codificato di un eventuale pulsante del mouse attualmente premuto (è l‟analogo di MouseEventArgs.Button .ModifiersKeys indica il codice fisico (Keys) di un eventuale tasto attualmente premuto. Ad esempio per intercettare uno Shift Click si può utilizzare il seguente codice nell‟evento Mouse_Down if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Shift) …....... In alternativa, per intercettare lo Shift Click del solo tasto sinistro del mouse, si può utilizzare il normale evento click e, al suo interno, testare Control.ModifierKeys L‟oggetto Microsoft.VisualBasic.Devices E‟ un oggetto ereditato da VB6. Al suo interno è disponibile la proprietà statica My.Computer.Keyboard che rappresenta una comoda alternativa per valutare (come Boolean) lo stato di alcuni tasti speciali come ad esempio CAPSLOCK e NUMLOCK. Es: if (My.Computer.Keyboard.CapsLock == true) MessageBox.Show("Maiuscole inserite") Sequenza degli eventi che scaturiscono in corrispondenza di un click del mouse: Mouse Down MouseUp Click (se il mouse viene spostato fuori dall‟oggetto prima dell‟Up, il Click non viene generato) MouseMove pag 28 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Nuovi Eventi relativi al mouse MouseEnter ( ) viene richiamato quando il mouse entra su un controllo MouseHover ( ) viene richiamato quando il mouse si sposta su un controllo (simile a MouseMove) MouseLeave ( ) viene richiamato quando il mouse abbandona il controllo Utili per fare in modo che il controllo reagisca al passaggio del mouse (cambiando forma su un collegamento ipertestuale oppure visualizzando un ToolTip di Help relativo al controllo) Gestione del Focus Proprietà TabStop TabIndex Z-Order True / False Abilitazione alla selezione mediante tasto TAB Sequenza di selezione mediante il tasto Tab >= 0. Piano di appartenenza del controllo. Z-Order maggiore => controllo più vicino all‟utente In realtà z-Order non è accessibile al programmatore che può però “spostare” gli oggetti mediante i metodi BringToFront e SendToBack Non è necessario che tutti i controlli abbiano un valore diverso di TabIndex. In caso di TabIndex uguali, il controllo con Z-Order più alto (quello più vicino all‟utente) ottiene il focus per primo. La proprietà CanFocus as Boolean indica se un controllo può ottenere il fuoco oppure no. La proprietà Focused as Boolean indica se il controllo attualmente possiede il fuoco. Eventi Enter ( ) indica che il controllo ha ricevuto il fuoco. Analogo al vecchio GotFocus ( ) Leave( ) indica che il controllo ha perso il fuoco. Analogo al vecchio LostFocus ( ) Metodi BringToFront( ) Porta il Controllo in Primo Piano SendToBack( ) Porta il Controllo al di sotto di tutti gli altri Focus ( ) sposta il fuoco sul controllo corrente GetNextControl (Control, Direction ) As Control Presente soltanto nei controlli di tipo contenitore (Form, Panel) Direction è un Boolean che, se True, indica Prossimo Controllo, se False indica Controllo Precedente. Richiamato da un controllo contenitore, restituisce un puntatore al controllo che, secondo Tab Index, riceverà il fuoco dopo il controllo passato come parametro. Ad esempio nel caso di una form con KeyPreview = True, dentro l‟evento KeyDown si possono intercettare le freccine per spostare il fuoco sul controllo successivo (freccia giù) oppure sul controllo precedente (freccia su). Control ctrl = Me.ActiveControl; ctrl = this.GetNextControl(ctrl, true); „ Se il controllo non è l‟ultimo e se può ricevere il fuoco if ! (ctrl == null) && ctrl.CanFocus && ctrl.TabStop) ctrl.Focus( ) Gli eventi Validating e Validated Gli eventi Validating e Validated vengono generati (dopo l'evento Leave) solo se la proprietà CausesValidation del controllo su cui sta per essere spostato il fuoco risulta = True. Dentro Validating si possono eseguire dei controlli sul valore immesso nel campo. Se il valore non risulta valido, si può impostare e.Cancel = True forzando il fuoco a rimanere posizionato sul controllo attuale. pag 29 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Scansione di controlli simili Accesso Diretto tramite il Nome Disporre sulla form 6 Text Box di lunghezza 1 in cui si vogliono generare altrettante lettere casuali . Occorre assegnare ai vari Text Box nomi simili con un indice finale, come txtConsonante1, txtConsonante2. Random rnd = new Random(); TextBox txt; string nome; for (int i = 1; i <= 6; i++) { nome = "txtConsonante" + i; txt = (TextBox) this.Controls[nome]; txt.Text = Convert.ToChar(rnd.Next(65,91)).ToString(); } Accesso Indiretto tramite ricerca (per un controllo di cui non si conosce il nome) Dato un numero generico di Option Button, fare in modo che, in corrispondenza del click su Visualizza, venga visualizzato un MsgBox contenente la voce attualmente selezionata foreach (Control ctrl in this.Controls) { if (ctrl is RadioButton) { RadioButton opt = (RadioButton)ctrl; if (opt.Checked) MsgBox.Show(opt.Text); } Attenzione che per la scansione sono ammessi anche oggetti tipizzati: foreach (RadioButton opt in this.Controls) if (opt.Checked) MsgBox.Show(opt.Text); Non da errori di compilazione però poi Run Time NON Funziona !!! o perlomeno funziona solo se la form contiene SOLO tutti controlli dello stesso tipo. Associazione dinamica di un evento ad una procedura di evento Per associare dinamicamente (da codice) un evento di un controllo ad una procedura di evento esterna (avente firma adeguata) si può utilizzare la seguente sintassi : foreach (Control ctrl in this.Controls) { if (ctrl is Button) { Button btn = (Button) ctrl; btn.Click += new EventHandler(button_Click); La procedura di evento button_Click deve avere la stessa firma dell‟evento a viene associata. Non è consentita l‟assegnazione diretta di una procedura di evento ad un evento (cioè ci vuole sempre il +). Per contro è possibile associare più procedure di evento ad uno stesso evento. EventHandler deve essere del tipo specifico. Es += new KeyPressEventHandler( ) Un evento generico come l‟evento click potrebbe essere assegnato a più controlli- Per rimuovere il collegamento tra procedura di evento e controllo è sufficiente fare: btn.Click -= button_Click; La mancata rimozione di una procedura di evento può far sì che l‟evento continui a verificarsi anche quando l‟oggetto è stato rilasciato (cioè non ci sono più riferimenti validi), ma non è ancora rimosso dalla memoria fino al passaggio del Garbage Collector. pag 30 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Procedura pratica per la scrittura di eventi comuni: Generare la procedura di evento con doppio click su uno qualunque dei controlli Eliminare l‟handle di evento dalla finestra degli eventi in basso a destra. Associare a tutti i pulsanti la stessa procedura di evento utilizzando le istruzioni di cui sopra. Individuazione del sender di evento Per individuare quale controllo ha fatto scaturire l‟evento si utilizza il parametro sender: private void btn_Click(object sender, EventArgs e) { Button btn = (Button)sender; int indice = Convert.ToInt16 (btn.Name.Substring(3)); Esercizio 14 – “Colori” Clickando su una label contenente il nome di un certo colore, accendere il Led corrispondente. I Led sono accessibili nella libreria Microsoft.VisualBasic.PowerPacks. Per quanto riguarda i PowerPacks, ci sono alcune particolarità da tener presente: Non fanno parte della collection Controls, ma fanno parte della collection ShapeContainer1, definita all‟interno del Designer Non è possibile accedere alla singola forma mediante il nome ma occorre utilizzare un indice (a base 0) definito all‟interno del Designer mediante il metodo AddRange. E‟ assolutamente indispensabile che all‟interno di AddRange le forme siano posizionate in modo consecutivo con indice crescente. private void label_Click(object sender, EventArgs e) Label lbl = (Label)sender; int indice = Convert.ToInt16 (lbl.Name.Substring(5)); { OvalShape shp = (OvalShape) this.shapeContainer1.Shapes.get_Item(indice-1); shp.FillColor = Color.Red; } La Creazione dinamica dei controlli Creare dinamicamente nuovi controlli in DOT NET è estremamente semplice, in quanto i controlli sono normalissime classi definite all‟interno di System.Windows.Forms. Per creare dinamicamente nuovi controlli occorre : Dichiarare ed Istanziare il nuovo controllo Impostare Name, Dimensioni e Posizione sulla form Aggiungere il controllo alla collections Controls della form o di un altro controllo contenitore (Panel o Group Box). Dopo essere stato aggiunto alla collection Controls, il nuovo controllo sarà visibile sulla form ed utilizzabile allo stesso modo dei controlli statici. Button btn = new Button(); btn.Name = "btnEsegui"; btn.Size = new Size(60, 60); btn.Location = new Point(30, 30); btn.Text = "Nuovo Pulsante"; this.Controls.Add(btn); // default 75 x 25 // default 0 0 // default "" pag 31 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Accesso al nuovo pulsante Il modo più semplice per accedere al nuovo pulsante da codice è al solito quello di accedere alla collection Controls tramite il nome del Controllo: this.Controls[“btnEsegui”].BackColor = Color.Red Ciclo di creazione di pulsanti simili L‟esempio seguente genera dinamicamente 10 pulsanti associando all‟evento Click( ) di ciascuno la generica procedura utente btnClick.. void crea() { Button btn; for(i=0; i<10; i++){ btn = New Button(); btn.Name = "btn" + i; btn.Size = New Size(70, 40) btn.Location = New Point(30, 40 * i) btn.Text = "btn" + i btn.Click += new EventHandler(btnClick); this.Controls.Add(btn) } } Rimozione di un controllo creato dinamicamente Il metodo Me.Controls.Remove(btn) rimuove dalla form il controllo btn statico o dinamico che sia. Il metodo Me.Controls.Clear( ) rimuove dalla form tutti i controlli della collection Controls. Individuazione del controllo all‟interno della routine di evento private void btnClick(object sender, EventArgs e) { Button btn = (Button)sender; this.Controls[btn.Name].BackColor = Color.Red int indice = Convert.ToInt16 (btn.Name.Substring(3)); vect[indice]=true; La clausola WithEvents In C# la funzionalità WithEvents non è supportata. In VB consentiva di dichiarare un oggetto comprensivo di eventi e poi di associare staticamente gli eventi a Design Time tramite Handles. pag 32 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La classe System.Windows Forms Le User Form sono classi che erediatano da Sistem.Windows.Forms.Form Supponendo di avere una form con un pulsante e due TextBox, di seguito è riportato il codice prodotto dal Visual Studio Designer. Da Solution Explorer, selezionare Form1.cs, e quindi selezionare Form1.Designer.cs Parte dichiarativa private System.Windows.Forms.Button btnEsegui; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; Procedura di inizializzazione private void InitializeComponent() { // creazione delle istanze this.btnEsegui = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // btnEsegui this.btnEsegui.Name = "btnEsegui"; this.btnEsegui.Location = new System.Drawing.Point(37, 29); this.btnEsegui.Size = new System.Drawing.Size(71, 30); this.btnEsegui.TabIndex = 0; // textBox1 this.textBox1.Name = "textBox1"; this.textBox1.Location = new System.Drawing.Point(56, 122); this.textBox1.Size = new System.Drawing.Size(63, 20); this.textBox1.TabIndex = 1; // textBox2 this.textBox2.Name = "textBox2"; this.textBox2.Location = new System.Drawing.Point(60, 161); this.textBox2.Size = new System.Drawing.Size(58, 20); this.textBox2.TabIndex = 2; // Form1 this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Controls.Add(this.btnEsegui); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); this.PerformLayout(); } Il Partial class iniziale indica al compilatore che la classe Form1 continua su un altro file. InitializeComponent è una procedura esplicitamente richiamata dal costruttore della form. I controlli sono campi private di Form1 che InitializeComponent istanzia e aggiunge alla Lista dei Controls Non aggiungere codice all‟interno di InitializeComponent, perché verrebbe sovrascritto alla prima modifica. pag 33 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Utilizzo degli oggetti Shapes Per poter utilizzare i controlli SHAPES all‟interno di una applicazione C# occorre innanzitutto includere la seguente libreria: using Microsoft.VisualBasic.PowerPacks; Gli Shapes sono gestiti in modo differente rispetto ai comuni Controls. Non possono essere aggiunti alla collezione dei controlli della Form, ma occorre creare uno ShapeContainer e aggiungere gli Shapes all‟interno di questo ShapeContainer. Creazione Dinamica degli Shapes ShapeContainer myCanvas = new ShapeContainer(); myCanvas.Name = "shContainer"; this.Controls.Add(myCanvas); OvalShape shp = new OvalShape(50, 50, 30, 30); shp.Name = "led1"; shp.BackStyle = BackStyle.Opaque; shp.BackColor = Color.Blue; shp.Click += new EventHandler(ovalShape_Click); myCanvas.Shapes.Add(shp); // x y w h Accesso da codice agli Shapes Purtroppo, pur essendo gli shapes una Collection, non è consentito accedere da codice ai vari shapes in modo diretto tramite il nome e nemmeno tramite un indice. OvalShape shp = (OvalShape) this.shContainer.Shapes[“led1”]; // ERRORE L‟unico modo per accedere agli shape è quello di eseguire un accesso indiretto tramite il ciclo foreach : ShapeContainer myCanvas = (ShapeContainer)this.Controls["sContainer"]; foreach (OvalShape shp in myCanvas.Shapes) { if (shp.Name=="led1") shp.BackColor = Color.Red; } Intercettazione del sender Per quanto concerne l‟intercettazione del sender non ci sono invece problemi e si procede al solito modo: private void ovalShape_Click(object sender, EventArgs e) OvalShape o = (OvalShape)sender; o.BackColor = Color.Yellow; } { pag 34 Informatica - Classe Terza robertomana.it Introduzione al Net Framework I Controlli Visuali Text Box txt Text String Lettura / Scrittura del contenuto del Text Box ReadOnly True/False Se True impedisce all‟utente di modificare il contenuto del Text Box, che diventa in pratica una label all‟interno della quale però l‟utente può selezionare e copiare il testo. CharacterCasing Normal/Upper/Lower Se impostato ai valori Upper o Lower fa sì che i caratteri digitati (o incollati dagli appunti o assegnati da codice) vengano automaticamente convertiti in maiuscolo / minuscolo. MaxLength Massimo numero di caratteri utilizzabili. Normalmente 32767 PasswordChar String * 1. Es. Asterisco. Tutti i caratteri inseriti verranno visualizzati come asterischi. Multiline True/False Abilita la scrittura su righe multiple Per andare a capo aggiungere vbCrLf AcceptReturns e AcceptTabs True/False consentono di utilizzare i tasti Enter e Tab all‟interno del TextBox ScrollBars 0=None/1=Horizontal/2=Vertical/3=Both Questa proprietà viene ignorata se multiline = False. Se viene inserita solo la barra verticale, il testo andrà automaticamente a capo in corrispondenza del margine destro. WordWrap True/False se False disabilita l‟a capo automatico ed il controllo si comporta come un vero editor (il testo va a capo in corrispondenza del margine destro, ma non viene inserito un carattere di new line, per cui, allargando il controllo, anche il testo verrà automaticamente espanso. Lines(i) consente di accedere alle singole righe del Text Box SelectionStart Read/Write. Consente di leggere / impostare la posizione assoluta del cursore (caret) all‟interno del Text Box (vbCrLf conta come 2 caratteri). Conta il numero di caratteri ANTECEDENTI il caret. Quando il caret è tutto a sinistra SelStart = 0, quando è tutto a destra SelStart = Len(TxtCampo.Text) SelectionLenght N° di caratteri selezionati a partire dalla posizione SelStart. 0 = Nessun carattere selezionato. Può essere impostato anche da codice, forzando la selezione di n caratteri a partire dalla posizione attuale SelStart SelectedText Restituisce, sotto forma di stringa, il testo attualmente selezionato. Utilizzato da codice andrà a sostituire il testo attualmente evidenziato. Se non c‟è testo evidenziato, la nuova stringa verrà aggiunta alla posiz corrente SelStart ed evidenziata. Modificando SelStart, le altre due vengono automaticamente azzerate. HideSelection True/False ReadOnly Se False la selezione rimane visualizzata anche quando la form perde il focus Il metodo .Select(start, length) consente di selezionare rapidamente una porzione di testo Il metodo .SelectAll( ) consente di selezionare rapidamente l‟intero contenuto del TextBox Il metodo .Copy( ) copia il testo attualmente selezionato all‟interno della Clipboard. Il metodo .Cut( ) taglia Il metodo .Paste( ) incolla il contenuto della Clipboard alla posiz attuale del cursore, eliminando il testo selezionato Il metodo .Clear( ) cancella il contenuto del Text Box Il metodo .Undo( ) esegue l‟Undo dell‟ultima modifica esattamente secondo le modalità del NotePad. Il metodo .getLineFromCharIndex(.selectionStart) +1 restituisce il n° di riga su cui è posizionato il cursore. Il metodo .getFirstCharIndexOfCurrentLine( ) restituisce l‟indice assoluto del 1° carattere della riga attuale Il metodo .getFirstCharIndexFromLine(nRiga) restituisce l‟indice assoluto del 1° carattere della riga ricevuta. Il metodo .scrollToCaret( ) esegue uno scroll del documento fino al cursore. (utile per Text Box multiline) Gli ultimi metodi possono essere utilizzati nel Note Pad per mantenere aggiornati il numero di Riga e Colonna (in corrispondenza degli eventi KeyDown e MouseDown). L'ultimo serve sempre nel Note Pad per fare il GoTo L‟evento TextChanged() viene richiamato ogni volta che viene inserito un nuovo carattere oppure quando un singolo carattere esistente viene modificato (anche in caso di modifica da codice). Label lbl Text Contenuto della label. Non modificabile a Run Time dall‟utente. BackColor impostato a Transparent consente di posizionare la lebol su altri oggetti senza coprirli Image consente di assegnare una immagine alla Label. La proprietà MinSize della Label consente di impostare le dimensioni del controllo alle dimensioni dell‟immagine (visibili espandendo la property Image) pag 35 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Command Button btn Text Testo del pulsante BackgroundImage Immagine di sfondo. Può essere caricata a Run Time mediante il metodo statico Image.FromFile(“filePath”) Image Immagine di primo piano. A differenza di BackgroundImage diventa grigia se il pulsante è disabilitato Le immagini possono anche essere caricate da una ImageList mediante la proprietà ImageIndex (ad es su MouseDown si può cambiare l‟immagine, mentre su MouseUp si può riselezionare l‟immagine iniziale) BackgroundImageLayout formato di visualizzazione dell‟immagine di sfondo. I valori disponibili sono gli stessi del PictureBox (Stretch adatta l‟immagine alle dimensioni del pulsante). Check Box chk Checked stato del controllo True / False Text Testo descrittivo del Check Box CheckAlign Allineamento del Testo rispetto al Check Box ThreeState determina se il controllo debba possedere due o tre stati. Se è false si può leggere lo stato mediante la proprietà. Checked. Se invece è true per leggere i 3 valori occorre utilizzare la proprietà CheckState. Appearance Normal / Button. L‟impostazione Button trasforma il Check Box in vero e proprio Latched Button. Questa funzionalità ha senso soltanto nel caso di utilizzo di due soli stati. Eventi: Nel caso di un cambiamento di stato del check box, vengono automaticamente generati nell‟ordine ben 3 eventi: CheckedChange, CheckStateChange e Click . Click( ) viene generato solo se il cambiamento di stato è dovuto ad un click. Ciascuno di questi eventi vede il controllo già nel nuovo stato. Option Button opt Checked True/False. Tutti gli Option Button appartenenti ad una stessa form vengono considerati appartenenti ad uno stesso gruppo, per cui uno solo alla volta potrà essere selezionato. Per poter creare più gruppi occorre raggruppare gli option button all‟interno di un Panel (che se privo di bordo non sarà nemmeno percettibile). E‟ possibile (soltanto da codice) disselezionare tutti i pulsanti di un gruppo, impostando per tutti Checked = False. Impostando invece più Checked = True, soltanto l‟ultimo risulterà selezionato. Text Testo descrittivo del Option Button CheckAlign Allineamento del Testo rispetto al Option Button Appearance Normal / Button Esattamente come nel caso precedente. Eventi: CheckedChange e Click con lo stesso significato del caso precedente. Panel pnl Contenitore per altri controlli. Non ha etichetta, dunque non ha la proprietà Text Qualunque controllo posizionato nell‟area del Panel viene considerato figlio del Panel; in qualunque momento può essere spostato fuori del Panel. BorderStyle Presenza / Assenza del bordo. Enabled Impostando Enabled = false tutti i controlli figli vengono automaticamente disabilitati. Idem per visible AutoScroll Consente di scrollare il Panel posizionando un maggior numero di controlli. A tal fine occorre impostare un Panel di grandezza max, posizionare tutti i controlli e infine stringere il Panel alle dimensioni finali. GroupBox pnl Simile al precedente, ma Ha una etichetta di intestazione (Text), non si può nascondere il bordo e non ha scroll FlatStyle Tipologia del bordo. Enabled Impostando Enabled = false tutti i controlli figli vengono automaticamente disabilitati. Idem per visibile pag 36 Informatica - Classe Terza robertomana.it Introduzione al Net Framework List Box lst Items Consente di accedere ai vari elementi della lista. Può essere impostata direttamente all‟interno delle Properties. Oggetto di tipo IList che dispone delle seguenti proprietà / metodi principali: Count ReadOnly Numero effettivo di elementi nella lista .Add(object) Aggiunge un nuovo elemento alla lista e restituisce l‟indice corrispondente (a partire da 0). Object può essere qualunque tipo di variabile, Per consentire il match di Remove occorre convertire in String .Remove(object) Elimina dalla Lista l‟oggetto indicato, che può essere un item (es selctedItem) oppure una Stringa, che però viene trovata SOLO se Add ha aggiunto oggetti di tipo String. Se esistono più oggetti uguali, viene rimosso quello di indice maggiore. In caso di oggetto inesistente non viene generato errore. Item(index) Proprietà Predefinita. Ottiene / Imposta il valore i-esimo della Collezione. .Clear( ) Elimina tutti gli elementi della lista e azzera Count .IndexOf(object) Restituisce la posizione della prima ricorrenza dell‟oggetto all‟interno della Lista. Restituisce –1 se l‟oggetto non è contenuto nella lista .Insert(index, object) Aggiunge un nuovo elemento alla posizione indicata. Se index è tale da lasciare dei buchi nella Lista, viene generato un Rime Time Error. Prioritario rispetto ad un eventuale Sorted=True. .RemoveAt(index) Elimina dalla Lista l‟oggetto che si trova alla posizione indicata .Contains(object) Restituisce True se l‟oggetto appartiene alla collezione .AddRange(vect) Consente di aggiungere in fondo alla Lista il contenuto di un intero vettore (vettore di oggetti generici) oppure il contenuto di una altra collezione (ad esempio l‟oggetto Items di un‟altra ListBox). Non restituisce nulla. .CopyTo(vect, pos) Copia l‟intera collezione dei valori in un vettore esistente, a partire dalla posizione pos .IsReadOnly Restituisce True se non è possibile modificare gli oggetti della Lista Nota: A questa collezione è possibile aggiungere qualsiasi tipo di oggetto, non solo delle stringhe. Se un oggetto viene caricato all‟interno della collection Items, il controllo ListBox invoca automaticamente il metodo ToString( ) dell‟oggetto per recuperare la stringa da visualizzare associata all‟elemento. Perciò è sufficiente ridefinire il metodo ToString della propria classe per decidere quale testo visualizzare all‟interno della Lista. E‟ possibile modificare questo comportamento predefinito impostando all‟interno della proprietà DisplayMember il nome del campo dell‟oggetto da visualizzare all‟interno della Lista. Accesso alla voce selezionata Text stringa selezionata. Non sembra molto affidabile SelectedIndex Indice della voce selezionata (base 0). Settando –1 la selezione attuale viene deselezionata. SelectedItem Oggetto selezionato. Vale Nothing quando non ci sono voci selezionate. Per leggere invece la voce selezionata (quella mostrata a video) occorre utilizzare SelectedItem.toString( ) che equivale a Text L‟evento SelectedIndexChanged richiamato ogni volta che cambia la voce selezionata, è il più adatto per gestire le azioni utente (l‟evento Click non viene generato in caso di selezione delle voci mediante le freccine). Sorted = True / False (solo in fase di progettazione) Consente di mantenere ordinati i dati della lista. Nuove voci introdotte mediante Items.Add verranno inserite in posizione ordinata. Selezioni Multiple SelectionMode 0=None, 1=Simple, 2=Extended. Il modo 1 = Simple abilita una vecchia modalità basata sulla barra spaziatrice ormai in disuso. Il modo 2=Extended abilita la modalità attuale di multiselezione mediante Shift Click e Ctrl Click. Only Design Time. Utilizzando Multiselect perdono significato SelectedIndex e SelectedItem. Gli oggetti selezionati saranno disponibili all‟interno della Collection SelectedItems di tipo IList standard che però non consente di aggiungere né rimuovere nessun Item dalla Collection. In caso di selezioni multiple, il metodo .GetSelected(index) restituisce True se l‟elemento index (nella collection principale Items) è selezionato il metodo SetSelected(index, True/False) consente di sel /disselezionare l‟elemento index all‟interno di Items Colonne Multiple MultiColumn = True abilita la visualizzazione delle voci su più colonne (con barra di scorrimento orizzontale). ColumnWidth = Larghezza in pixel di ogni colonna. Da impostare da codice nel caso di MultiColumn=True pag 37 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Altre Proprietà / Metodi .BeginUpdate( ) e .EndUpdate( ) sospendono e riattivano il refresh del controllo riducendo lo sfarfallio quando si deve eseguire un gran numero di operazioni consecutive. .FindString(str As String) consente di individuare il primo elemento che inizia con str. Restituisce l‟index .FindStringExact(str As String, index) ricerca il primo elemento uguale a str a partire dalla posizione index. Restituisce l‟index dell‟elemento oppure –1 se fallisce. TopIndex imposta/restituisce l‟indice della voce che si trova in cima all‟area di visualizzaz (utile nel caso di scroll) DrawMode consente di personalizzare la grafica del ListBox ma è decisamente complicata da utilizzare. Checked List Box lst E‟ un ListBox a selezione multipla in cui ad ogni voce della lista viene anteposto un check di selezione. .SetItemChecked(i, True/False) Consente di selezionare / disselezionare l‟i-esimo elemento della lista .SetItemCheckState (i, Valore) Simile al precedente, ma consente di impostare anche lo stato Grayed .GetItemChecked(i) As Boolean Consente di vedere se l‟i-esimo elemento è selezionato / disselezionato CheckedItems sostituisce SelectedItem e contiene gli Items selezionati. Per scandire rapidamente gli Items selezionati si può fare un ciclo da 0 a lstNomi.CheckedItems.Count - 1 SelectionMode semplicemente abilita / disabilita la selezione multipla. ThreeDCheckBoxes = True/False mostra i check box della lista con sembianza tridimensionale CheckOnClick = True/False consente la selezione dei check box mediante singolo click Combo Box cmb/cbo E‟ in pratica costituito da un Text Box single line (con le sue proprietà, metodi ed eventi) più un List Box sottostante, con le sue proprietà, metodi ed eventi. Non supporta colonne multiple né selezioni multiple. Al termine di un ciclo di caricamento in un combo, conviene sempre fare cboElenco.Text = cboElenco.Items(0) Text Contenuto della casella di testo (che può essere scritto in modo diretto oppure selezionato dalla lista) MaxLength, SelectionStart, SelectionLenght, SelectedText come per il Text Box DropDownStyle presenta 3 valori: 0=DropDownCombo è il classico Combo Box con menù a discesa più possibilità di inserimento diretto all‟interno del Text Box. 1=Simple è simile al precedente ma con la lista delle voci visibili (senza dover clickare sul DropDown), scrivendo una nuova voce nel TextBox la lista scorre automaticamente in modo che la prima voce visibile faccia match con quanto inserito. 2=DropDownList impedisce di inserire nuovi valori all‟interno del TextBox. MaxDropDownItems Numero massimo di elementi da mostrare all‟interno della lista DropDownWidth Larghezza in pixel della lista DroppedDown True/False può essere impostata da codice per aprire / chiudere la lista _DropDown() nelle modalità 0 e 2, viene richiamato ogni volta che l‟utente apre il menù a discesa _TextChanged( ) viene richiamato ogni volta che viene inserito un nuovo carattere nella casella di testo. _SelectedIndexChanged( ) Viene richiamato quando l‟utente seleziona una nuova voce all‟interno della lista. Attenzione che viene però richiamato anche in fase di inizializzazione del ComboBox _Click( ) è riferito esclusivamente all‟elenco a discesa, però, a differenza del precedente, viene richiamato soltanto il corrispondenza del click. Timer tmr Enabled True/False Abilita / Disabilita il Timer al conteggio Interval Intervallo di generazione dell‟evento, espresso in millisecondi _Tick( ) evento generato ad ogni Intervallo di tempo I metodi Start( ) e Stop( ) sono una alternativa alla proprietà Enabled. In alternativa in certi casi può essere più comodo utilizzare la seguente API: Private Declare Sub Sleep Lib "kernel32" (ByVal milliSeconds As Long) pag 38 Informatica - Classe Terza robertomana.it Introduzione al Net Framework DataGridView grid CurrentCell.Value Cella corrente ReadOnly = True/False Se impostato a True Impedisce l'editazione delle celle RowIndex Indice della riga corrente ColumnIndex Indice della colonna corrente .EndEdit termina eventuali editazioni in corso AllowUserToOrderColumns Consente l'ordinamento automatico in corriposndenza del click sull'intestazione Evento CurrentCellChanged( ) richiamato dopo che una nuova cella è diventata cella corrente Columns .Count Numero di colonne presenti nella griglia .Add (“columnName”, “HeaderName”) Crea in coda una colonna avente il nome indicato [i] accesso alla i-esima colonna (a base 0) .Name nome della colonna i-esima .Width larghezza della colonna i-esima .MinimumWidth larghezza minima della colonna .HeaderText intestazione .ColumnType può assumere i valori TextBox, CheckBox, Image, ComboBox .Rows .Count runtime only. Numero di righe presenti nella griglia. Attenzione che in fondo alla griglia c'è sempre una riga finale vuota, per cui le scansioni dovrebbero fermarsi a count – 2. Questa riga viene eliminata impostando AllowUserToAddRow = False. In tal caso i record potranno essere aggiunti soltanto da codice. .Add( ) aggiunge una riga alla tabella, che diventa riga corrente. Restituisce l‟indice della nuova riga La tabella contiene già inizialmente una riga per l‟aggiunta visuale di nuovi record, riga che sarà sempre l‟ultima della tabella. Add aggiunge nuove righe al di sopra di questa riga dunque con indice .count – 2 [i] accesso alla i-esima riga (a base 0) Es: Grid.Rows[i].Cells[j].Value Accesso alla cella j-esima della riga i-esima .Clear( ) Elimina tutte le righe dalla tabella, tranne la riga finale di default. .RemoveAt (n) Elimina la riga di indice n Es grid.Rows.RemoveAt(grid.CurrentRow.Index) .Remove (row) Elimina la riga passata come parametro. Es grid.Rows.Remove(grid.CurrentRow) Aggiunta di nuove righe. Tre possibilità : Grid.Rows.Add(); Grid.Rows.Add(n); Grid.Rows.Count = n; // Aggiunge una singola riga // Aggiunge n righe // Aggiunge n righe E‟ anche possibile creare un vettore di stringhe (una stringa per ogni campo) e poi fare semplicemente grid.rows.add(vect) Leggere e scrivere il contenuto di una cella: grid.Rows[i].Cells[j].Value = “salve”; grid.EndEdit(); // sembra non più indispensabile Caricamento di una immagine in una griglia Impostare la colonna interessata come DataViewImageColumn Impostare la proprietà grid.RowTemplate.Height = 100 (o al valore desiderato) Grid.Rows..Item(pos).Cells(“columnFotografia”).Value = Image.FromFile(“immagine.jpg”) Nota: Controllo della larghezza dei campi Private Sub Frm_Principale_Resize( ) Handles Me.Resize Const wColonna0 = 150 : Const wColonna1 = 80 : Const wColonna2 = 70 Const wGrid = 341 „Occorre tenere conto del RowHeadersWidth = 41 da sommare ai valori precedenti grid.Columns(0).Width = grid.Width * wColonna0 / wGrid grid.Columns(1).Width = grid.Width * wColonna1 / wGrid grid.Columns(2).Width = grid.Width * wColonna2 / wGrid pag 39 Informatica - Classe Terza robertomana.it Introduzione al Net Framework PictureBox img Consente di caricare immagini di tipo BMP, ICO, CUR, GIF, JPG, PNG, metafile WMF, enhanced metafile EMF Image = Immagine da caricare, fra quelle disponibili all‟interno del file FRX. Qualunque immagine esterna può essere copiata nel file FRX, però il Beta sembra avere dei problemi. SizeMode Normal = Immagine allineata in alto a sinistra indipendentemente dalle dimensioni del Picture Box CenterImage = Immagine al centro del PictureBox, indipendentemente dalle dimensioni del Picture Box AutoSize = Ridimensiona il PictureBox in modo da adattarlo alle reali dimensioni dell‟immagine (che equivale ad impostare la proprietà Autosize = True). Zoom = Ingrandisce l‟immagine fino a quando una delle 2 dimens non raggiunge le dimensioni del PictureBox StretchImage = Deforma l‟immagine adattandola alle dimensioni del PictureBox BackgroundImage Immagine di sfondo (fra quelle disponibile nel file FRX), che viene duplicata in verticale e orizzontale in modo da ricoprire l‟intera area del controllo. Va bene nel caso in cui l‟immagine principale non riempia l‟intero controllo, nel qual caso si vedrà ai lati l‟immagine di sfondo. .Load(path As String) Consente di caricare a Run Time una immagine esterna (cioè non memorizzata nel file FRX). Ovviamente questa immagine NON verrà copiata nel file FRX e andrà persa al termine dell‟applicazione. Per caricare immagini da file esiste anche un comodo metodo statico Image.FromFile(path As String) Per eliminare un‟immagine dal controllo si può impostare da codice .Load( “”) „oppure .Image = Nothing E‟ possibile copiare una immagine da un pictureBox ad un altro: img1.Image = img2.Image E‟ possibile caricare una immagine da una ImageList: img1.Image = imgList.Images(0) In questo caso le immagini vengono precaricate in memoria all'avvio,ma attenzione che l'imageList provoca delle deformazioni. Scroll Bar sbr Minimum - Maximum Integer Valor minimo e valor massimo della barra. Attenzione che nella Vertical Scroll Bar il Min e Max sono invertiti (Min è in alto, Max è in basso) e deve essere necessariamente Max > Min Value Integer Valore relativo alla posizione attuale della barra rispetto a Min e Max. Solo integer. Se occorrono dei decimali si moltiplica tutto (min, max e value) per 10 o per quello che serve. SmallChange Integer Spostamento della barra in corrispondenza del click sulle frecce esterne LargeChange Integer Spostamento della barra in corrispondenza del click sull‟area bianca interna alla barra Notare che il massimo valore raggiungibile non è Maximum, ma Maximum + 1 - LargeChange Gli eventi Scroll() e ValueChange() vengono richiamati ogni volta che la proprietà Value cambia di valore. [In VB6 ValueChange() veniva richiamato soltanto in corrispondenza del rilascio del mouse] LinkLabel lkl Label in cui può essere inserito un collegamento ipertestuale che aprirà automaticamente il browser predefinito. Private Sub Form1_Load lklVai.Text = "Visitate il nostro Sito" lklVai.LinkArea = New LinkArea(19, 23) „I caratteri dal 19 al 23 (Sito) saranno sottolineati e fungeranno da link lklVai.LinkBehavior = LinkBehavior.HoverUnderline „La sottolineatura viene mostrata soltanto sul Mouse Over Private Sub lklVai_LinkClicked „ Una linkLabel può ospitare contemporaneamente più collegamenti Process.Start("http://www.google.it") ipertestuali. In tal caso anziché LinikArea occorre utilizzare Links.Add. e.Link.Visited = True Ogni collegamento avrà un Name passato all‟evento LinkClicked pag 40 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Menù mnu Trascinare sulla form un oggetto MenùStrip. Essendo un componente non visuale, verrà automaticamente posizionato nella barra inferiore del Designer, relativa alle componenti non visuali. Il menù verrà disegnato nella parte alta della form (con la Proprietà già impostata Dock = Top). A questo punto occorre semplicemente digitare le etichette (es File) per i vari menù. Per ogni elemento, prima di iniziare a scrivere il testo, si può selezionare, mediante l‟apposita freccina a discesa, il tipo di menù che si intende costruire : ToolStripMenuItem ToolStripComboBox ToolStripSeparator TextBox „Normale voce di menù (sempre per le voci principali) „Con apertura di un sottomenù „Separatore : tutte le altre proprietà vengono ignorate „provare Il tipo di un menù può essere modificato anche in un secondo tempo mediante tasto destro / Convert To Selezionata una voce di menù, nelle Properties compare l‟elenco completo delle proprietà di quel menù. Es Name = Nome sia per la voce principale, sia per le voci secondarie. Ad esempio mnuFile, mnuNew, Text = File „ciò che viene visualizzato come voce di menù Image = Icona antecedente la voce del menù Enabled = True/False Menù Abilitato Ckecked = True/False Se True viene anteposto un segno di spunta davanti alla voce del menù ShowShortcutKeys = True/False Mostra la ShortCut (il tasto è impostabile nella Property ShortCutKey) ChekOnClick = True/False Fa sì che la proprietà Checked ed il segno di spunta vengano aggiornati automaticamente in corrispondenza di ogni click Visible [True]. Se False la voce corrispondente non viene visualizzata Shortcut Tasto scorciatoia ad esecuzione diretta (senza passare attraverso il menù). Ad esempio Ctrl C All‟interno del Text possono essere utilizzate le Hot Key (esempio &File E&xit). Consentono di aprire i vari menù ed eseguire i relativi comandi senza dover utilizzare il mouse. Per poter però utilizzare un menù interno occorre prima passare dal menù principale. Ad e per Exit occorre digitare Alt+F (menù file) +X (menù Exit). Notare che l'underscore delle hot key viene automaticamente visualizzato solo in corrispondenza del tasto ALT La proprietà RenderMode = System impostato sul contenitore MenuStrip elimina lo sfondo azzurro di sinistra. La proprietà LayoutStyle = Flow (contenitore MenuStrip) consente al menù di andare a capo sul restringimento Facendo doppio click su una voce di menù si apre il gestore dell‟evento Click( ) in cui si può scrivere il codice relativo a tale evento. L‟evento Click del menù principale può essere utilizzato per abilitare / disabilitare le singole voci del menù che verrà visualizzato. Es se non c‟è testo selezionato, Copie e Taglia saranno disabilitati. In una form possono essere posizionati più oggetti MenuStrip differenti, ma in ogni momento uno solo sarà attivo, cioè quello impostato nella proprietà Me.MainMenuStrip = MenuStrip1. Ciò consente di modificare il menù a seconda delle situazioni. L‟oggetto Form espone due eventi legati ai menù: MenuStart e MenuCompelte richiamati rispettivament non appena l‟utente attiva il sistema dei menù, e quando l‟utente termina l‟utilizzo del menù (MenuComplete viene richiamato prima di Click) Creazione di un menù da codice [menù personalizzati sulla base di un file XML] [*] Per creare un menù da codice è sufficiente copiare ciò che il designer scrive nella classe form quando si crea un menù graficamente. Le voci principali di menù e le voci secondarie sono tutti oggetti ToolStripMenuItem trattati allo stesso modo. Occorre però copiare in menuStrip i menù principali, e nei menù principali i menù secondari. Public WithEvents menuStrip1 As MenuStrip Dim mnuFile As ToolStripMenuItem Dim mnuApri As ToolStripMenuItem „Oggetto Menu „Voce principale di menù „Voce secondaria di menù Private Sub CreateMenu Me.menuStrip1 = New MenuStrip Me.mnuFile = New ToolStripMenuItem Me.mnuApri = New ToolStripMenuItem Me.mnuFile.Text = “&File” „+ eventuali altre proprietà Me.mnuApri.Text = “&Apri” „+ eventuali altre proprietà Me.mnuStrip1.Items.AddRange(New ToolStripItem() {Me.mnuFile, Me.mnuView}) Me.mnuFile.DropDownItems.AddRange(New ToolStripItem() {Me.mnuApri, Me.mnuChiudi}) pag 41 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Context Menù Trascinare sulla form un oggetto ContextMenuStrip. Essendo un componente non visuale, verrà automaticamente posizionato nella barra inferiore del Designer, relativa alle componenti non visuali. Nella parte alta della form verrà di volta in volta visualizzato il menù attualmente selezionato nella barra inferiore del Designer (il Main Menù oppure un Context Menù). Il Context Menù può essere editato allo stesso identico modo di quanto si fa per il Main Menù (non è dotato di menù principali, ma soltanto di menù secondari espandibili verso il basso). Parlare di menù principali o menù secondari è soltanto questione di terminologia, trattandosi sempre di oggetti ToolStripMenuItem. Creare ad esempio un menù ContextMenuColori avente i menù secondari Rosso, Verde, Blu. Sia la form sia quasi tutti i controlli espongono la proprietà ContextMenuStrip che consente di associare, al Controllo in questione il Context Menù che dovrà essere aperto quando l‟utente utilizzerà il tasto destro del mouse su quel controllo. Si assegni il menù ContextMenuColori alla proprietà ContextMenuStrip della form. Quando l‟utente farà click destro sulla form si aprirà il menu dei colori. Per fare in modo che il colore selezionato venga applicato come colore di background della form è sufficiente scrivere nell‟evento Click di ciascuna voce la seguente istruzione Me.BackColor = Color.NomeColore Il Context Menu scatena un evento Opened quando diventa visibile. Più controlli possono usare lo stesso Menù. Common Dialog Box dlg Sono otto : OpenFileDialog SaveFileDialog FontDialog ColorDialog PrintDialog (stampa) PageSetUpDialog (imposta pagina) FolderBrowserDialog PrintPreviewDialog (Anteprima stampa) Tutte dispongono del metodo .ShowDialog( ) che apre la finestra di dialogo e restituisce DialogResult.Ok se l‟utente chiude la finestra mediante il tasto Ok DialogResult.Cancel se l‟utente chiude la finestra mediante il tasto Annulla Il programma chiamante rimane „fermo‟ sulla riga ShowDialog fino a quando la finestra di dialogo viene chiusa. .Title Titolo della finestra di dialogo. Se vuoto viene utilizzato il default nella lingua del sistema operativo. . ShowHelp = True visualizza un pulsante di help che scatena l‟evento HelpRequest che verrà automaticamente richiamato anche in corrispondenza del tasto F1. OpenFileDialog InitialDirectory Specifica il percorso su cui deve aprirsi la finestra di dialogo. Ad esempio: Application.StartupPath o Directory.GetCurrentDirectory() inizialmente entrambi = bin / debug Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); Se non si specifica nessun percorso, viene utilizzato il percorso impostato nell‟ultimo accesso ad una qualsiasi finestra di dialogo, indipendentemente dall‟istanza o dal tipo di finestra. Per salvare il percorso impostato nella finestra di dialogo come CartellaCorrente occorre fare: int pos = dlg.FileName.LastIndexOf ('\\'); Directory.SetCurrentDirectory(dlg.FileName.Substring(0, pos)); .FileName All‟apertura viene visualizzato all‟interno della finestra di dialogo. Alla chiusura restituisce il nome „assoluto‟ del file selezionato. Attenzione se l‟utente chiude la finestra mediante Annulla, l‟eventuale filename selezionato viene restituito comunque. .Filter = “Descrizione1 | Filtro1 | Descrizione2 | Filtro2” „Attenzione a non lasciare spazi nella parte dei Filtri .Filter = “Documenti word .doc | *.doc | Documenti excel .xls | *.xls; *.csv” int .FilterIndex. Legata a Filter consente di impostare come voce di default all‟apertura la voce N diversa dalla 1° .CheckFileExists = True/False Impedisce l‟OK se l‟utente non ha selezionato un file valido. Molto comodo .AddExtension = True/False fa sì che il nome del file venga restituito completo anche dell‟estensione. .OpenFile Apre il file selezionato restituendo un oggetto Stream. Poco Utilizzato. pag 42 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Multiselect = True / False Consente di selezionare contemporaneamente più files, nel qual caso Filename restituisce solo il primo dei files selezionati. Viceversa l‟elenco dei files selezionati viene restituito nel vettore di stringhe Filenames( ) che dispone di tutte le proprietà e metodi dei vettori. L‟evento FileOk richiamato in corrispondenza del pulsante Ok, consente di abbattere la chiusura della finestra di dialogo (mantenendola dunque aperta) nel caso in cui si imposti e.Cancel = True. SaveFileDialog Quasi identico al precedente. Oltre a proprietà / metodi già visti nel caso di OpenFileDialog presenta : .CreatePrompt = True / False genera un warning se l‟utente genera un nuovo file .OverwritePrompt = True / False genera un warning se l‟utente sovra scrive un file esistente .AddExtension = True/False Se l'utente non specifica nessuna estensione, questa viene aggiunta automaticamente .DefaultExt = Estensione automaticamente aggiunta in coda al file in assenza di altre specifiche Se l'utente scrive un nome di file con l‟estensione, viene utilizzata solo l'estensione utente. Se l'utente non scrive nessuna estensione ed il SaveDialogBox contiene dei filtri, se AddExtension = True viene automaticamente aggiunta l'estensione relativa al filtro attualmente selezionato. Se nessun filtro è presente oppure se è selezionato il filtro *.*, in presenza di AddExtension viene aggiunta l'estensione contenuta in DefaultExt. FolderBrowserDialog Simile ai precedenti. Consente di selezionare una cartella anziché un file. Non vede però computer di rete. SelectedPath specifica il percorso su cui deve aprirsi la finestra di dialogo e, alla chiusura, contiene il percorso assoluto della cartella selezionata. RootFolder specifica la cartella radice del dialogo (default = Environment.SpecialFolder.Desktop) Description consente di specificare un messaggio interno alla finestra ShowNewFolderButton = True / False Visualizza il pulsante per la creazione di nuove cartelle ColorDialog .Color Imposta / Restituisce l‟oggetto Color selezionato .CostomColor vettore di oggetti Color contenente i colori personalizzati definiti dall‟utente nella finestra Color. FullOpen True / False Apre la finestra di dialogo con la sezione relativa ai colori personalizzati già aperta FontDialog .Font Imposta / Restituisce l‟oggetto Font selezionato ShowEffects True / False Possibilità di impostare gli effetti sottolineato e barrato ShowColor True / False Possibilità di impostare il colore al carattere selezionato .Color Imposta / Restituisce l‟oggetto Color selezionato (che dovrà poi essere applicato manualmente al carattere) MinSize Dimensione minima del carattere (default 8) MaxSize Dimensione massima del carattere (default 72) With FontDialog1 .Font = TextBox1.Font „preimpostazione del Font attuale If (.ShowDialog( ) = DialogResult.Ok) Then TextBox1.Font = .Font TextBox1.ForeColor = .Color End If End With ShowApply = True / False visualizza un pulsante Applica che consente di applicare le proprietà del Font senza chiudere la finestra di dialogo. Il click sul pulsante Applica genera l‟evento Apply all‟interno del quale si possono eseguire le azioni precedenti. pag 43 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La stampa L'oggetto base della stampa è l'oggetto PrintDocument sul quale, una volta impostati tutti i parametri di stampa, è sufficiente richiamare il metodo print( ) per avviare la stampa. Per configurare i vari parametri di stampa è possibile linkare a PrintDocument 3 comodissime finestre di dialogo che consentono di configurare tramite interfaccia grafica tutti i principali parametri di stampa direttamente all‟interno di PrintDocument stesso. L‟oggetto PrintDocument prn E‟ l‟oggetto che funge da Printer Handler, cioè quello che si occupa della preparazione dello Stream di Stampa.. DefaultPageSettings Consente di impostare i parametri relativi alla pagina di stampa (margini, orientamento). L‟impostazione può essere eseguita tramite l‟interfaccia grafica PageSetupDialog PrinterSettings Consente di impostare i parametri relativi alla stampa vera e propria (quali pagine, n° di copie) L‟impostazione può essere eseguita tramite l‟interfaccia grafica PrinterDialog .Print( ) E‟ il metodo che lancia fisicamente la stampa. In realtà Print( ) scatena l‟evento PrintDocument_PrintPage ed invia alla stampante lo stream costruito al suo interno. PageSetUpDialog dlgImpostaPagina Tipica finestra IMPOSTA PAGINA delle applicazioni Windows. In corrispondenza dell‟OK tutte le impostazioni vengono automaticamente copiate all‟interno della proprietà DefaultPageSettings dell‟oggetto PrintDocument. PrintDialog dlgStampa Tipica finestra STAMPA delle applicazioni Windows. In corrispondenza dell‟OK tutte le impostazioni vengono automaticamente copiate all‟interno della proprietà PrinterSettings dell‟oggetto PrintDocument Nota: Stampa su File: Se all‟interno della finestra di dialogo viene settato il check di stampa su file, viene automaticamente aperta una piccola finestra di dialogo che richiede il nome del file su cui salvare. Attenzione che su questo file viene salvato lo stream che verrebbe inviato alla stampante, incomprensibile ad un editor di testi. Volendo “stampare su file” occorre NON selezionar questo check, ma selezionare come stampante “Adobe PDF” oppure “Office Image Writer” che crea i file .MDI. PrintPreviewDialog dlgAnteprima Tipica finestra ANTEPRIMA DI STAMPA delle applicazioni Windows. In corrispondenza dello ShowDialog( ) viene automaticamente richiamato l‟evento PrintPage dell‟oggetto PrintDocument associato, inviando però lo stream a video invece che alla stampante vera e propria. pag 44 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Nota: Le varie dimensioni grafiche in net sono sempre espresse in UNIT, dove 1 Unit = 1 / 100 pollice. Le dimensioni di un foglio A4 sono 297 x 210 mm pari a 1169 x 827 unit. 100 Unit 25,4 mm 1 mm = 3,937 Unit Esempio completo di classe di stampa per Note Pad Imports system.Drawing.printing Public Class clsStampa Private Private Private Private Private Private WithEvents prn As New PrintDocument dlgImpostaPagina As New PageSetupDialog dlgStampa As New PrintDialog dlgAnteprima As New PrintPreviewDialog userTesto As String userFont As Font Public Sub New() 'parametri relativi a Imposta Pagina prn.DefaultPageSettings.Margins.Left = 79 ' 79 UNIT = 2.00 cm prn.DefaultPageSettings.Margins.Top = 100 '100 UNIT = 2.54 cm prn.DefaultPageSettings.Margins.Right = 79 prn.DefaultPageSettings.Margins.Bottom = 100 prn.DefaultPageSettings.Landscape = False 'verticale 'parametri relativi alla stampa prn.PrinterSettings.Copies = 1 'link delle finestre di dialogo dlgImpostaPagina.Document = prn dlgStampa.Document = prn dlgAnteprima.Document = prn 'Le dimensioni di prn sono espresse in Unit. Le dimensioni di dlgImpostaPagina sono invece nella Culture della macchina (in Italia sono espresse in mm). Abilitando EnableMetric la conversione viene eseguita automaticamente dlgImpostaPagina.EnableMetric = True End Sub Public Sub impostaPagina() dlgImpostaPagina.ShowDialog() 'I valori impostati in dlgImpostaPagina vengono 'automaticamente copiati in prn che è linkato a dlgImpostaPagina End Sub Public Sub stampa(ByVal xTesto As String, ByVal xFont As Font) Me.userTesto = xTesto : Me.userFont = xFont If (dlgStampa.ShowDialog() = DialogResult.OK) Then prn.Print() End If End Sub Public Sub anteprima(ByVal xTesto As String, ByVal xFont As Font) Me.userTesto = xTesto : Me.userFont = xFont dlgAnteprima.ShowDialog() End Sub Private Sub prn_PrintPage( ) Handles prn.PrintPage Dim b As New SolidBrush (Me.userColor) With prn.DefaultPageSettings Dim x As Single = .Margins.Left Dim y As Single = .Margins.Top Dim w As Single = .PaperSize.Width - .Margins.Left - .Margins.Right Dim h As Single = .PaperSize.Height - .Margins.Top - .Margins.Bottom Dim rect As New RectangleF(x, y, w, h) e.Graphics.DrawString(userTesto, userFont, b, rect) End With „ Brushes.Black per stampare sempre in nero End Sub End Class pag 45 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il controllo StatusStrip Barra di stato inferiore. Molto simile al controllo Menù. In questo caso ogni item è un Panel con nome ad esempio pnlQta Consente di trattare ogni item come immagine, testo, testo + immagine oppure anche di tipo ProgressBar (di cui si imposteranno MIN e MAX e VALUE) .RightToLef = Yes/No Inverte l‟intera Status Bar portando i tre puntini a sinistra I vari controlli della Status Bar sono accessibili da codice in modo diretto esattamente come per i menù. StatusLabel1.Text = “xxxx2; Per quanto riguarda i singoli pannelli sono disponibili le seguenti proprietà: .Spring = True/False Espande il pannello verso destra coprendo l‟intera area disponibile. Se due pannelli consecutivi hanno entrambi spring=true coprono ciascuno metà della Status Bar. .AutoSize = Se impostato a FALSE diventa possibile assegnare al controllo dimansioni (Widht e Height) assolute. .TextAlign = Left/Center/Right Allineamento del testo rispetto al pannello .BorderSides = Disegna uno o più bordi sul pannello Nel caso del Note Pad, si inseriscono due pannelli entrambi di tipo StatusLabel. Il primo, privo di testo, avrà .AutoSize=false (in modo da allargarsi per una lunghezza pari a ¾ della larghezza della form), mentre il secondo avrà .Spring=true, con BorderSide = Left. Sempre per quanto concerne il Note Pad, la procedura di aggiornamento della Status Bar deve essere richiamata tre volte: 1) Key Up (spostamento del cursore mediante le freccine) 2) Text Changed (copia / incolla) 3) Click (click del mouse in un punto differente). Il controllo ToolStrip Molto simile al MenùStrip, cioè è costituito da una sequenza di Items (in questo caso solo orizzontali). Le icone delle ToolBar hanno di solito dimensione 16 x 16. Per crearle è sufficiente catturare la schermata di un applicativo windows e ritagliare le icone salvandole come bmp 16x16. In Visual Studio 2005 un Elenco di Immagini abbastanza completo è disponibile nel percorso C:\Programmi\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\bitmaps\commands. Le immagini possono essere : 1. Importate direttamente dal disco 2. Caricate all‟interno di un file resx in cui è possibile vedere l‟elenco completo delle icone disponibili. 3. Caricate all‟interno di un oggetto Image List e poi collegate dinamicamente al Form Load. Consente di modificare dinamicamente le icone al variare del contesto del Run Time Tipi di pulsanti Clickando sul pulsantino dellla ToolBar (oppure sulla proprietà Items della Tool Bar) si apre un elenco delle tipologie di item utilizzabili. Le più comuni sono: ToolStripButton = Tipico pulsante Tool Bar ToolStripSeparator = Linea verticale di separazione dei pulsanti ToolStripDropDownButton Pulsante a discesa che, quando selezionato, consente di visualizzare un sottomenù, costruito all‟interno di un apposto controllo MenùStrip. Ogni voce è equivalente ad un comando di menù Facendo sul pulsante Tasto Destro / Convert to è possibile modificare la tipologia del pulsante Facendo sul pulsante Tasto Destro / Set Image è possibile impostare direttamente l'immagine Principali Proprietà dei pulsanti Selezionando un singolo pulsante le sue proprietà vengono mostrate all'interno delle Properties. Name = esempio btnSalva Image = Path dell'immagine associata (solo per caricamento statico e non da Image List). Enabled = True / False Abilita / Disabilita il pulsante CheckOnClick True / False Se true trasforma il pulsante in un lached button che rimane premuto Checked True / False Se true il pulsante sarà già premuto all‟avvio dell‟applicazione ToolTipText = Messaggio di aiuto pag 46 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Text = testo da aggiungere al pulsante Ogni Item è caratterizzato da una icona più un testo che può essere visibile o nascosto, nel qual caso viene mostrato solo come Tool Tip. Se visibile viene scritto per default a destra del pulsante con notevole allargamento tra un pulsante e l‟altro. Di solito i pulsanti sono vicini senza scritte. Dispaly Style = Modalità di utilizzo del testo. Può essere Image And Text, Image, Text. E‟ preferibile Image TextImageRelation = Posizione del testo rispetto all‟immagine (a destra, a sinistra, …) L‟evento fondamentale è l‟evento Click disponibile per ogni singolo pulsante (in VB6 era unico per tutta la barra) Il controllo ImageList [imgList ] Contenitore di Immagini, che possono essere associate dinamicamente (a Run Time) a qualsiasi controllo che possieda la proprietà Image (quindi non solo la ToolBar, ma anche Button, TreeView, ListView, etc). ImageSize oggetto Size, Dimensione delle immagini caricate (che vengono tutte automaticamente ridimensionate al valore specificato). I pulsanti utilizzati nelle Tool Bar hanno normalmente dimensione fissa 16x16 pixel. ColorDeph specifica il numero di colori da utilizzare per riprodurre le immagini (default 8 bit). Deve essere compatibile con la profondità di colore delle immagini utilizzate La proprietà Images apre una finestra di caricamento della Image List,. Ogni icona è caratterizzata da un Index numerico (a partire da 0 e da un Key alfanumerica a cui viene inizialmente assegnato il nome del file ma che può essere modificato a piacere. Per eseguire il caricamento dinamico dell‟immagine al pulsante si può utilizzare indifferentemente l‟Index oppure la Key. btnStampa.Image = imgList.Images(1) Nota: E‟ anche possibile caricare dinamicamente immagini da file sia all‟interno del pulsante sia nell‟ImageList btnStampa.Image = Image.FromFile(“c:\icona.bmp”)) ImgList.Images.Add(Image.FromFile(“c:\icona.bmp”)) Il controllo Rich Text Box Rispetto al Text Box presenta i seguenti vantaggi: Consente di applicare la formattazione RTF (Rich Text Format, cioè testo formattato come utilizzato in Word, ad esempio bold + italic) a singole porzioni di testo Gestisce automaticamente la lettura / scrittura su file di testo e/o RTF (il formato RTF è il formato di default utilizzato da WordPad). Gestisce file di dimensioni maggiori rispetto ai 32000 bytes del text Box .LoadFile(“dati.rtf”, RichTextBoxStreamType.RichText) Legge un file rtf caricandolo nel Rich Text Box .LoadFile(“dati.txt”, RichTextBoxStreamType.PlainText) Legge un file txt caricandolo nel Rich Text Box Il secondo parametro è facoltativo. Omettendolo si assume come default RichTextBoxStreamType.RichText Aprendo come txt un file rtf vediamo tutti i caratteri di formattazione come aprendo un .doc con NotePad. Aprendo come rtf un file txt prendiamo Run Time Error perché mancano i caratteri di formattazione attesi .SaveFile(“dati.rtf”, RichTextBoxStreamType.RichText) Salva il Rich Text Box su un file rtf .SaveFile(“dati.txt”, RichTextBoxStreamType.PlainText) Salva su un file txt (perdendo le formattazioni) Per sapere in che formato salvare, occorre interrogare il FilterIndex della finestra di dialogo per sapere quale formato l‟utente ha deciso di salvare. RichTextScrollBars = Both visualizza le scroll bars Text = Intero Testo senza codici di formattazione SelectedText = Testo selezionato senza codici di formattazione SelectedRtf = Testo selezionato compresi i codici di formattazione rtf (per copiarlo ad esempio verso Word) SelectionFont = Font del testo selezionato. Per modificare il font del testo selezionato è sufficiente scrivere .SelectionFont = FontDialog1.Font sulla chiusura della finestra di dialogo pag 47 Informatica - Classe Terza robertomana.it Introduzione al Net Framework SelectionColor = Colore del testo selezionato. Per modificare il coloreal testo selezionato è sufficiente scrivere .SelectionColor = FontDialog1.Color sulla chiusura della finestra di dialogo ZoomFactor Single= 1 Consente di applicare un fattore di zoom da 0.64 a 64 AutoWordSelection True / False consente di selezionare una intera parola con un click del mouse su di essa DetectURLs True / False riconosce automaticamente gli URL nel testo (come Word) Il controllo NotifyIcon Controllo non visuale. Consente di inserire una icona nella tray area (tray=vassoio) di Windows (in basso a destra) Molte icone sono disponibili nelle cartelle activeds e wmi di dot net Icon = Icona che viene visualizzata. Sono accettati solo files.ico Esempio: ntfIcon.Icon = New Icon (“file path”) Text = ToolTip per il mouse Visible = True / False per nascondere l‟icona ContextMenu = il menù che appare quando l‟utente seleziona l‟icona Gli eventi Click e DoubleClick possono essere utilizzati alternativamente al ContextMenu Sono disponi bili anche i rimanenti eventi relativi al mouse: mouseDown, MouseMove, MouseUp Il NotifyIcon è comodo soprattutto quando si realizzano applicazioni batch (demoni) che non hanno una form principale di foreground ma che lavorano in background come supporto ad altre applicazioni. Queste applicazioni si avviano in genere con un Sub Main che istanzia e rende visibile una NotifyIcon e poi richiama Application.Run() I Controlli Provider Servono per estendere le funzionalità di altri controlli a cui vengono aggregati. Provider = fornitore di servizi (per altri controlli). Sono tutti controlli non visuali posizionati nella barra inferiore sotto la form. In genere, per ogni form, si utilizza un unico controllo provider di ciascun tipo, ma sono consentiti anche più controlli dello steso tipo Il controllo ToolTip Fa sì che ogni controllo della form possa mostrare un ToolTip (Aiuto) quando il cursore del mouse vi si sofferma. Utile soprattutto per spiegare le azioni dei pulsanti. InitialDelay Esprime il tempo (in msec) per cui il mouse deve rimanere sul controllo prima che il ToolTip appaia. AutoPopDelay Indica per quanto tempo (in msec) il ToolTip rimane visualizzato col mouse fermo sul controllo ReshowDelay Tempo minimo di visualizzaz del ToolTip su un controllo differente prima della rivisualizzazione AutomaticDelay Consente di impostare automaticamente i 3 valori precedenti (il 2° uguale a 10 volte il 1°) Posizionando sulla form un controllo ToolTip, tutti gli altri controlli presenti sulla form presenteranno una nuova proprietà ToolTip on ToolTip1 in cui il programmatore può inserire il piccolo aiuto relativo a quel controllo. Se i controlli ToolTip sono più di uno avremo tante proprietà aggiuntive una per ogni controllo, però in ogni caso verrà sempre solo visualizzato il TooTip1, per cui gli ulteriori controlli ToolTip sono del tutto inutili. Per aggiungere un ToolTip da codice occorre utilizzare la seguente sintassi: ToolTip1.SetTolTip(TextBox1, “Questo è l‟aiuto”) s = ToolTip1.GetTolTip(TextBox1) All‟interno del testo del ToolTip sono riconosciuti i caratteri speciali come .CrLf, utilizzabili però solo da codice. Il controllo ErrorProvider Il controllo ErrorProvider consente un controllo dell‟input simile a quello delle applicaz Internet. In corrispondenza del pulsante OK mostrano una icona rossa a fianco dei controlli con input non valido. Questa metodologia ha il vantaggio di consentire all‟utente di spostarsi liberamente fra i controlli e riempirli nell‟ordine che preferisce. Icon Icona uguale per tutti i controlli legati a questo provider BlinkStyle True /False indica se l‟icona è lampeggiante BlinkRate Frequenza di lampeggio in msec [250] pag 48 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Posizionando sulla form un controllo ErrorProvider, tutti gli altri controlli presenti sulla form presenteranno due nuove proprietà IconAlignment on ErrorProvider1 (allineamento dell‟icona rispetto al controllo) e IconPadding on ErrorProvider1 (distanza dell‟icona dal bordo del controllo). (Proprietà ripetute nel caso di più ErrorProvider). All‟interno dell‟onClick del pulsante Ok occorerà gestire manualmente il controllo dell‟input, ed utilizzare il metodo ErrorProvider1.SetError(NomeControllo, “msg di errore”) per visualizzare l‟icona di errore in caso di input non valido. (eventualmente è possibile anche visualizzare 2 icone di errore mediante due controlli Error Provider separati). Il “msg di errore” verrà visualizzato come ToolTip in corrispondenza dello spostamento del mouse sull‟icona di errore. Se il “msg di errore” è stringa vuota, l‟icona viene rimossa dalla form (reset dell‟errore). All‟interno del msg di errore si possono utilizzare i caratteri speciali come .CrLf. Private Sub cmdOk_Click( . . . ) Dim qta As Integer ErrorProvider1.SetError(txtQta, "") 'reset errore Try qta = CInt(txtQta.Text) If qta > 100 Then Throw New Exception Me.DialogResult = DialogResult.OK : Me.Close() Catch ex As Exception 'in entrambi i casi si visualizza lo steso errore ErrorProvider1.SetError(txtQta, "Inserire un numero valido < 100") End Try End Sub Il controllo HelpProvider Il controllo HelpProvider funge da ponte tra la form e le pagine .chm relative ad un HTML HELP da richiamare in corrispondenza del tasto F1 o di un comando esplicito (ad esempio un click su un button). Presenta come unica proprietà interessante la seguente: .HelpNamespace nome del file HTML HELP .chm associato al controllo HelpProvider Posizionando sulla form un controllo HelpProvider, tutti gli altri controlli presenteranno le seguenti nuove proprietà: ShowHelp False / True apre automaticamente il file.CHM in corrispondenza del F1 sul controllo attivo. HelpString breve messaggio di aiuto che verrà mostrato come ToolTip in corrispondenza dell‟F1. Attivo solo quando alla HelpKeyword non viene attribuito alcun valore. HelpKeyword specifica la stringa da passare all‟HTML HELP. HelpNavigation specifica il tipo di azione da eseguire all‟apertura dell‟HTML HELP. Può assumere i valori: - TableOfContents = HTML HELP viene aperto sulla pagina “Sommario” (la HelpKeyword è irrilevante) - Index, AssociateIndex,. KeywordIndex, HTML HELP viene aperto sulla pagina “Index” con visualizzazione della HelpKeyword impostata - Find HTML HELP viene aperto sulla pagina “Cerca” con visualizzazione della HelpKeyword impostata - Topic HTML HELP viene aperto sulla pagina “Cerca” con visualizzazione automatica della pagina html memorizzata all‟interno della HelpKeyword. Nella HelpString si possono utilizzare i CrLf ma solo da codice (ad esempio nel FormLoad) mediante il metodo SetHelpString. Sono disponibili anche i metodi SetHelpKeyword e SetHelpNavigation per le altre due proprietà. L‟Oggetto HELP Questo oggetto statico serve per aprire la guida HTML HELP senza passare attraverso il pulsante F1 (ad esempio mediante un Button personalizzato). Dispone dei seguenti metodi: Help.ShowHelp(me, “guida.chm”) Apre la guida sulla pagina “Sommario”. Il primo parametro è un oggetto Control che funge da padre per la finestra di dialogo dell‟help. Presenta alcune forme di overloading che consentono di passare ad HTML HELP una apposita Keyword. Help.ShowHelpIndex(me, “guida.chm”) Apre la guida sulla pagina “Index”. pag 49 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il controllo ProgressBar Barra progressiva che informa l‟utente sullo stato di avanzamento di una operazione lunga Orientation Orizzontale / Verticale Style Avanzamento a barre oppure avanzamento continuo. Min e .Max Valori associati agli estremi della barra. Nel Verticale Min è quello di sopra Value Valore attuale della barra (necessariamente compreso tra Min e Max, altrimenti Run Time Error). .PerformStep( ) incrementa la proprietà Value della qta definita nella proprietà Step .Increment(valore) incrementa la proprietà Value del valore indicato Il controllo TrackBar (Slider in VB6) Consente all‟utente di selezionare graficamente un valore numerico all‟interno di un certo intervallo.Simile alle Scroll Bar (la progress bar non può essere maneggiata dall‟utente). Mentre l‟utente trascina la barra, il tool tip indica istantaneamente il valore della posizione attuale. Sono ammessi soltanto valori interi compresi tra Min e Max. Non è male posizionare a fianco una label indicante il valore attuale. .Min Max Value SmallChange LargeChange hanno lo stesso significato visto per le Scroll Bar. .Orientation Orizzontale / Verticale. Nel Verticale Min è quello di sopra .TickStyle Indica la posizione delle tacchette rispetto alla barra (sotto/sopra la barra, a destra / sinistra) .TickFrequency Integer. Intervallo tra una tacchetta e l‟altra. Indica indirettamente quante tacchette disegnare .TextPosition Indica la posizione (sopra/sotto, destra/sinistra) in cui verrà visualizzato il Tool Tip. Gli eventi Change() e Scroll() sono identici rispetto alle Scroll Bar. Il nuovo evento ValueChanged viene scatenato quando si modifica la proprietà Value (anche da codice). Il controllo NumericUpDown Mostra un valore numerico che l‟utente può incrementare / decrementare utilizzando gli appositi tasti UpDownAlign posizione dei pulsantino rispetto al testo (destra o sinistra) InterceptArrowKeys True Fa si che il clik sui pulsantini venga gestito automaticamente Minimum, Maximum, Value Increment valore di incremento / decremento. Può anche essere decimale DecimalPlaces Numero di cifre decimali da visualizzare L‟ evento ValueChanged viene scatenato quando si modifica la proprietà Value. Il controllo DomainUpDown E‟ un List Box con una sola riga visibile. Mediante i pulsantino si può scorrere la lista. Alcune proprietà sono le stesse del controllo precedente. Items vettore delle voci Wrap True / False Consente di ciclare sulla lista (dopo l‟ultimo viene di nuovo mostrato il primo elemento). L‟ evento SelectedIndexChanged viene scatenato quando l‟utente seleziona una nuova voce. Il controllo SplitContainer Consente di suddividere la form in due frames indipendenti verticali o orizzontali. Tali frames possono essere ridimensionati run time dall‟utente. Ciascuno dei due frame contiene un Panel all‟interno del quale possono essere posizionati uno o più controlli. All‟interno del Panel è possibile posizionare un ulteriore SplitContainer in modo da suddividere il Panel in altri due frames e così via. Orientation Vertical / Horizontal indica la direzione dello Split (in verticale o in orizzontale) Dock normalmente = Fill, cioè lo SplitContainer si estende sull‟intera area contenitore SplitterWidth Larghezza in pixel dell‟area di Split (4 pixel) SplitterDistance Dimensione attuale del primo dei due Panel (in pratica posizione della barra di divisione). L‟evento Move è richiamato quando la barra di divisione viene spostata pag 50 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il controllo TabControl (TabStrip e SSTab in VB6) Finestra a schede. Molto più semplice rispetto al TabStrip di vb6. Ogni scheda è una istanza della classe TabPage con un proprio nome identificativo. La proprietà RunTime SelectedIndex consente di individuare la scheda attiva (partendo da 0) L‟evento SelectedIndexChanged viene richiamato ogni volta che l‟utente attiva una nuova scheda. Proprietà caratteristiche delle singole schede sono: Name = Nome identificativo della scheda (da codice è preferibile utilizzare l‟indice) Text Descrizione posta sulla linguetta della scheda ToolTipText Piccolo Aiuto ImageIndex e ImageKey Identificano una immagine all‟interno della Image List associata (unica per l‟intero TabControl). L‟immagine verrà posizionata sulla linguetta davanti al testo identificativo. Il controllo DateTimePicker (come VB6) E‟ un campo di tipo TextBox specializzato per l‟inserimento di date e ore, date che l‟utente può selezionare da un comodo calendario a discesa. Value Restituisce (in formato DateTime) la data selezionata. Format e CustomFormat consentono di impostare il formato della data visualizzata Il controllo MonthCalendar (MonthView di VB6) Simile al precedente consente di selezionare date direttamente dal calendario visualizzato. SelectionRange Restituisce l‟insieme di date (in formato DateTime) che l‟utente ha selezionato. CalendarDimensions Quanti mesi visualizzare sul calendario. BoldedDates Consente di impostare alcune date precise da visualizzare in grassetto sul calendario. Il controllo TreeView Consente di visualizzare un insieme di dati con struttura ad albero. Es. La finestra sinistra di Esplora Risorse di Windows è fatto in questo modo. Clickando su una cartella vedo quello che c‟è dentro, con possibilità di aprire a loro volta le sottocartelle nella tipica struttura ad albero. Ogni elemento dell‟albero è detto nodo (NODE). Si parte da uno o più nodi radice (es c: a: z:) ciascuno dei quali può contenere più nodi figli. L‟insieme dei nodi costituisce la collection Nodes. Il controllo ListView E‟ in pratica una List Box molto più potente, che consente di suddividere le informazioni di ogni riga in più colonne (in pratica come una griglia che sostituisce la FlexGrid di VB6). La parte destra di Esplora Risorse, l‟intero “Risorse del Computer” ed anche il Desktop di Windows sono controlli ListView. Le voci della lista possono essere inserite solo ed esclusivamente in fase di esecuzione mediante il metodo ListItems.ADD Il controllo PropertyGrid E‟ il controllo utilizzato dalla finestra Properties di Dot Net. Si può utilizzare questo controllo per consentire all‟utente di modificare dinamicamente le proprietà di qualsiasi oggetto definito nell‟applicazione (ad esempio colori, font e dimensioni della form). La funzione Shell e il metodo Process.Start() consentono di lanciare programmi esterni all‟applicazione Es: Shell(“c:\Calc.exe”, AppWinStyle.NormalFocus) L‟oggetto SendKeys dispone del metodo SendKeys.Send(“xx”) che consente l‟invio dei caratteri xx al SO come se fossero stati digitati da tastiera. Questi caratteri possono essere gestiti dal SO (ad esempio il tasto PRTSC che provoca la copia della videata attuale all‟interno della clipboard) oppure inviati all‟applicazione se sono inerenti all‟applicazione. Sono accettati tutti i tasti speciali racchiusi tra parentesi graffe. Esempi: SendKeys.Send(“{F1}”) „Apre la finestra di Help dell‟applicazione corrente SendKeys.Send(“{PRTSC}”) „PrintScreen Salva nella Clipboard l‟intera videata attuale SendKeys.Send(“ALT{PRTSC}”) „Salva nella Clipboard soltanto l‟immag relativa alla finestra corrente SendKeys.Send(“SHIFT{END}”) „Settato il cursore di un TextBox sul 1 chr, evidenzia l‟intero TextBox pag 51 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Gli oggetti non visuali L‟oggetto Application Oggetto statico System.Windows.Forms.Application. Tutte le proprietà sono read only. .StartupPath Percorso assoluto del file eseguibile senza però il nome del file .ExecutablePath Percorso assoluto del file eseguibile (comprensivo del nome del file eseguibile) .Run (New Form1) serve per avviare la form principale dal Sub Main .ProductName Nome del progetto (nome che si assegna inizialmente quando si fa New Project e modificabile da MyProject / RootNamespace) .ProductVersione Versione dell‟applicazione (che si assegna da MyProject / Assembly Information) .CurrentCulture.toString() Lingua impostata sul sistema operativo corrente: it-IT .Exit ( ) Termina l‟intera applicazione corrente . Immediatamente prima dell‟uscita viene generato l‟evento ApplicationExit che comunque non consente l‟abbattimento dell‟uscita .DoEvents( ) cede il controllo al sistema operativo che lo restituisce quando tutti i messaggi pendenti sono stati processati. Utile ad esempio dentro un lungo ciclo per consentire all‟utente di premere sulla form un apposito pulsante di interruzione del ciclo. Per accedere rapidamente al Desktop : string path = = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); La classe System.Drawing.Font La classe Font espone le seguenti proprietà fondamentali tutte di sola lettura: Name, GraphicsUnit, Size, Bold, Italic, Underline, Strikeout Queste ultime quattro sono disponibili anche come sotto proprietà della proprietà Style. Per modificare una caratteristica del Font occorre necessariamente creare un nuovo oggetto Font. Per creare un nuovo oggetto Font sono disponibili 13 diverse forme di Overloading del costruttore. Una prima firma a tre parametri spesso utilizzata è la seguente: TextBox1.Font = New Font(Nome As String, Size As Integer, Stile As FontStyle) TextBox1.Font = New Font(“Arial”, 12, FontStyle.Bold OR FontStyle.Italic) Volendo invece applicare solo piccole variazioni ad un Font esistente (ad esempio aggiungere o eliminare il sottolineato) si possono leggere i valori di Nome Size e Stile dal Font corrente e applicare le modifiche desiderate: txtBox.Font = New Font(txtBox.Font.Name, txtBox.Font.Size + 2, txtBox.Font.Style) Una seconda firma di overload, utile per modificare rapidamente un Font esistente, richiede due soli parametri, 1) l‟oggetto Font da cui si intende partire, 2) il nuovo Style da applicare al Font. Questa firma non consente di modificare Nome e Size, ma solo lo stile, consentendo di aggiungere / eliminare Bold, Italic, Underline, Strikeout. txtBox.Font = New Font(txtBox.Font, txtBox.Font.Style OR FontStyle.Italic) txtBox.Font = New Font(txtBox.Font, txtBox.Font.Style AND NOT FontStyle.Italic) E‟ anche possibile copiare un Font da un controllo ad un altro, però viene copiato soltanto il puntatore (ShallowCopy). Esempio: TextBox2.Font = TextBox1.Font I due Text Box punteranno però allo stesso oggetto Font. Per creare due oggetti Font indipendenti occorre utilizzare il metodo Clone( ): TextBox2.Font = TextBox1.Font.Clone( ) Tutti i controlli ereditano inizialmente il font dalla form padre mediante Shallow Copy per cui, se si modifica il font della form (sia at Design Time, sia Run Time) tutti i controlli modificheranno il proprio font di conseguenza. pag 52 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La classe System.Drawing.Color Color è in net una struttura costituita da quattro campi A R G B, tutte di tipo Byte, che rappresentano rispettivamente le componenti Alpha, R, G, B. Alpha = 255 opacità massima. Proprietà e Metodi statici Color.NomeColore Color espone numerose costanti enumerative che restituiscono una structure Color relativa ai principali colori “KnownColor” comuni. Es: frmPrincipale.BackColor = Color.Acquamarina I tipici colori di Windows sono: LightGray = Tipico colore della form e WhiteSmoke = tipico colore dei pulsanti abilitati e disabilitati (quelli sidabilitati non hanno il bordo) Color.FromName(nome As String) Restituisce un oggetto Color corrispondente al KnownColor direttamente passato come parametro. Va bene nei casi in cui il nome del colore è contenuto all‟interno di una variabile Es: dim colore As String = “red” frmPrincipale.BackColor = Color.FromName(colore) frmPrincipale.BackColor = Color.FromName(ListBox1.Text) Color.FromArgb(A,R,G,B) Restituisce un oggetto Color a partire dai valori Alpha, R, G, B. Esiste una versione overload con i soli 3 parametri R G B (3 parametri anziché 4) Es: frmPrincipale.BackColor = Color.FromArgb(0,255,0) „verde Membri di Istanza R G B A restituiscono R G B A relativamente all‟istanza corrente (Read Only) .Name restituisce come string (es Red) il nome del colore attuale (se esiste, altrimenti restituisce il codice esadec) .ToKnownColor ( ) restituisce come oggetto Color il valore del colore attuale, che potrà poi essere convertito in string, ottenendo lo stesso risultato ottenibile con la proprietà Name. .ToARGB( ) Restituisce il numero Integer relativo ai 32 bytes dell‟istanza corrente. Se la trasparenza è solida (byte alto = 255), tale numero risulterà negativo. Es: dim codDecimale As Integer = panel1.BackColor.ToArgb Es: dim codEsaDec As String = panel1.BackColor.ToArgb.ToString(“X”) Caricamento dei colori predefiniti all‟interno di un List box Tutti i colori predefiniti della struttura Color sono raggruppati dentro l‟Enum System.Drawing.KnownColor dove ad ogni colore è associato un valore numerico puramente enumerativo (ad esempio il Green è 79). ListBox1.Items.AddRange(Enum.GetNames(GetType(Drawing.KnownColor))) dove GetNames è un metodo Statico della classe base Enum GetType è una funzione nativa VB che, nel caso degli Enum, restituisce la lista delle voci nel formato nome / val Lettura valore impostato: TextBox1.BackColor = Color.FromName(ListBox1.Text) L‟oggetto Process (Lancio di eseguibili esterni) using System.Diagnostics; Process process = new Process (); process.StartInfo.FileName = "D:\\Program Files\\Metin2Mod\\myexefile.exe"; process.Start (); Il percorso DEVE essere assoluto. Per separare le cartelle occorre utilizzare \\. pag 53 Informatica - Classe Terza robertomana.it Introduzione al Net Framework L‟oggetto DateTime Classe per la gestione di date e ore. DateTime è una classe con un suo costruttore disponibile in svariati overload Dim var As New DateTime (2004, 12, 31) Dim var As New DateTime (2004, 12, 31, 23, 59, 0) Dim var As New DateTime (2004, 12, 31, 23, 59, 59, 500) „Anno Mese Giorno „Anno Mese Giorno, Ora Minuti Secondi „500 msec, ½ sec a mezzanotte Anziché istanziare una variabile DateTime mediante il costruttore, è possibile assegnare direttamente al riferimento l‟indirizzo degli oggetti statici Now o Today oppure il riferimento restituito da CDate(). Ad esempio : Dim var As DateTime = DateTime.Now „Data e Ora del sistema Dim var As DateTime = DateTime.Today „Contiene soltanto la data Dim var As DateTime = Convert.DateTime(“01/01/1009”) Dim var As DateTime = DateTime.MinValue „ non è consentita l‟inizializzazione a null / nothing Una volta istanziato ed inizializzato l‟oggetto DateTime, è possibile estrarre le singole informazioni utilizzando una delle relative proprietà, tutte di sola lettura, disponibili sia come proprietà di istanza di qualsiasi variabile date, sia ovviamente come proprietà degli oggetti statici Now (per quanto riguarda le informazioni relative all‟ora) oppure Today (per quanto riguarda le sole informazioni relative alla data),. Ad esempio Dim Dim N = N = var as DateTime = DateTime.Now N As Integer var.Day DateTime.Today.Day „supponiamo 18/11/04 „18 „18 Le principali proprietà di istanza disponibili sono: .Day As Integer .Month As Integer .Year As Integer .Hour As Integer .Minute As Integer .Second As Integer .DayOfWeek As Integer .DayOfYear As Integer .Millisecond As Integer .Date As DateTime .TimeOfDay As TimeSpan (Today) (Today) (Today) (Now) (Now) (Now) (Today) (Today) (Now) „1=lunedì „millisecondi correnti 1 – 999 (Today) restituisce un oggetto Date contenente la sola data (Now) restituisce un ogg TimeSpan contenente la sola ora Operazioni sulle date I seguenti metodi di istanza, disponibili sia sulle variabile date, sia sulle proprietà shared Today e Now, TUTTI Restituiscono tutti il puntatore ad un nuovo oggetto DateTime. Dim dt As DateTime dt = var.AddYears(1) dt = DateTime.Today.AddYears(1) „var = 2004, „var = 2004, dt = 2005 dt = 2005 I principali metodi di istanza disponibili sono: .AddYears(N As Integer) (Today) .AddMonths(N As Integer) (Today) .AddDays(N As Integer) (Today) .AddHours(N As Single) (Now) .AddMinutes(N As Single) (Now) .AddSeconds(N As Single) (Now) Invece di aggiungere un valore, è sempre possibile passare un argomento negativo da sottrarre pag 54 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Un altro metodo di istanza, disponibile sulle variabile date e sulle proprietà shared Today e Now, è .CompareTo(dt As DateTime) (Today) Restituisce –1 0 +1 a seconda che la data corrente sia minore, uguale o maggiore della data dt Come per le stringhe, è possibile confrontare le date in modo diretto. Questa funzione può andare bene nei rari casi in cui occorre fare dei test a 3 stati (< = >) fra le due date Vi sono infine i seguenti metodi Shared, disponibili soltanto sull‟oggetto DateTime DateTime.IsLeapYear(anno As Integer) As Boolean „True se è bisestile DateTime.DaysInMonth(anno As Integer, mese As Integer) As Integer „giorni nel mese DateTime.DateDiff(DateInternal.IntervalloDesiderato, dataIniziale As DateTime, dataFinale As DateTime Ad esempio la seguente riga restituisce il numero di giorni trascorsi fra la dataFinale e la DataIniziale : Dim giorni As Integer = CInt(DateDiff(DateInterval.Day, dataIniziale, dataFinale)) Il vecchio metodo Subtract e l‟oggetto TimeSpan Il metodo istanza Subtract (disponibile anche sull‟istanza Now), esegue la differenza fra la data attuale e la data ricevuta come parametro, restituendo come risultato il numero di ore, minuti, secondi, millisecondi, intercorsi. Il risultato viene restituito come oggetto TimeSpan. Attenzione che MsgBox non converte automaticamente il tipo TimeSpan in String, per cui occorre eventualmente eseguire manualmente la conversione mediante il metodo .ToString( ) ereditato da object. Dim startTime As DateTime = DateTime.Now( ) . . . . . . . . . . . . Dim deltaTime As TimeSpan = DateTime.Now.Subtract(startTime) MsgBox(deltaTime.ToString) Principali proprietà dell‟oggetto TimeSpan .Hours As Integer .Minutes As Integer .Seconds As Integer .Milliseconds As Integer .Days As Integer „tempo „tempo „tempo „tempo complessivo complessivo complessivo complessivo espresso espresso espresso espresso in in in in ore minuti secondi msec .TotalHours As Long .TotalMinutes As Long .TotalSeconds As Long .TotalMilliseconds As Long „tempo „tempo „tempo „tempo complessivo complessivo complessivo complessivo espresso espresso espresso espresso in in in in ore e frazioni di ora minuti e frazioni secondi e frazioni msec e frazioni Formattare le date Oltre al metodo ToString, è possibile formattare per l‟output una variabile date utilizzando alcuni metodi particolari esposti solamente dall‟oggetto DateTime: .ToShortDateString .ToLongDateString .ToShortTimeString .ToLongTimeString .ToOADate .ToUniversalTime .ToLocalTime 31/12/2004 Venerdì, 31 Dicembre 2004 6:30 PM 6:30:20 PM Trasforma la data in un double Ole Automation (usato da VB6) Considera la data come locale e restituisce il corrispond UTC Considera la data come UTC e restituisce il valore locale UTC = Coordinated Universal Time. Data / Ora del meridiano di Greenwich La Tabella seguente riporta gli indicatori riconosciuti dal metodo ToString( ). Esempio Dim var As DateTime = DateTime.Now( ) Dim s As String = var.ToString(“d”) „Solo Data senza Ora pag 55 Informatica - Classe Terza robertomana.it Introduzione al Net Framework L‟oggetto Clipboard Oggetto statico che funge da Memoria di appoggio per testo / immagini Il metodo .SetDataObject(obj, flag) copia l‟oggetto obj all‟interno degli appunti. Il secondo parametro True / False fa sì che i dati copiati nella clipboard siano disponibili anche oltre la terminazione del programma. L‟oggetto obj da copiare nella clipboard può essere di qualunque tipo: stringa, RTF, html, immagini in diversi formati. Il formato dovrebbe essere riconosciuto automaticamente, con la possibilità di salvare contemporaneamente nella clipboard più informazioni di tipo diverso. Ad esempio, nel caso del Rich Text Box , in corrispondenza del copia, dovrebbe salvare sia il SelectedText (che potrà essere incollato su NotePad o su un Text Box) sia il SelectedRtf (che potrà essere incollato su Word o su altro RichText). Il riconoscimento automatico tra text e rtf non funziona molto bene, per cui, in ogni caso, la seconda copia sovra scrive la prima. Per aggirare questo problema occorre salvare in una variabile DataObject sia i dati da copiare, sia il tipo di tali dati. Private Sub cmdCopia_Click(......) Dim data As New DataObject data.SetData(DataFormats.Text, richText1.SelectedText) Clipboard.SetDataObject(data, True) data.SetData(DataFormats.Rtf, richText1.SelectedRtf) Clipboard.SetDataObject(data, True) End Sub Allo stesso modo, per leggere i dati dalla clipboard occorre prima estrarli in un oggetto IdataObject, quindi verificare che fra i dati estratti vi siano dati in uno dei formati che si ha intenzione di elaborare: Private Sub cmdIncolla_Click(.....) Dim data As IDataObject = Clipboard.GetDataObject 'Copia del solo testo in un Text Box If (data.GetDataPresent(DataFormats.Text)) Then Text1.SelectedText = data.GetData(DataFormats.Text) End If ' Copia del testo formattato (o del solo testo) in un Rich Text If (data.GetDataPresent(DataFormats.Rtf)) Then RichText2.SelectedRtf = data.GetData(DataFormats.Rtf) ElseIf (data.GetDataPresent(DataFormats.Text)) Then RichText2.SelectedText = data.GetData(DataFormats.Text) End If End Sub GetDataPresent restituisce True o False a seconda che il tipo di dati indicato sia presente nella clipboard. Clipboard.Clear() Ripulisce il contenuto della clipboard L‟oggetto Cursor Oggetto statico System.Windows.Forms.Cursor. Consente di istanziare nuovi cursori da file esterni Esempio Dim cur As New Cursor(“Mycursor.cur”) Me.Cursor = cur . . . . . . . . . Me.Cursor = System.windows.Forms.Cursors.Default Cur.Dispose( ) pag 56 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il Tipo di Dati ENUMETIVO La parola chiave enum consente di definire un nuovo tipo di dati di tipo Enumerativo, cioè un insieme di dati costituiti da un insieme di coppie Nome – Valore, Public enum Generi [int] { // Omettendo il tipo, viene automaticamente assunto int tutti = 0, //default 0 pop = 2, //default 1 rock = 4, //default 2 blues = 6, //default 3 jazz = 8, //default 4 country = 10, //default 5 // virgola anche sull‟ultimo !! } Poiché le variabili Enum vengono inizializzate a 0, è bene definire sempre all‟interno dell‟Enum il valore 0, associato ad esempio alla voce “unknown” oppure “tutti”, onde evitare errori run time di valore inesistente. Assegnazione Generi genere = (Generi) 4; Generi genere = Generi.rock; Conversione fra enum e int int n = (int) genere; Generi genere = (Generi) 4; Conversione fra enum e string string s = genere.ToString(); // ok : rock string s = (string) genere; // nok : 4 Generi genere = (Generi)Enum.Parse(typeof(Generi), s); Notare la differenza fra i due cast a string. (string) trasforma il valore numerico del genere in stringa (restituisce 4 sotto forma di stringa) ToString( ) esegue una conversione formattata del genere, restituendo di fatto la stringa corrispondente. La scansione di un enum Enum, non essendo una Collection, non implementa l‟Interfcia IEnumerable e non può essere scandito mediante un normale ciclo For Each. Occorre utilizzare la funzione di libreria TYPEOF che, nel caso degli oggetti Enumerativi, restituisce sotto forma di vettore l‟elenco di tutte le coppie Nome-Valore contenute nell‟Enum. Generi[] vect = (Generi [])Enum.GetValues(typeof(Generi)); foreach (Generi gen in vect) cmb.Items.Add(gen.ToString()); Molto spesso in DOT NET gli enum sono costituiti da un prefisso (es wUnderline) seguito dal nome vero proprio. Per estrarre il solo nome dall‟enumerativo si può semplicemente scrivere: cmb.Items.Add(gen.ToString().Substring(initPos)); Nota: Passando a TypeOf (Type) un tipo come INT, restituisce un oggetto Type descrittivo dell‟oggetto: Type tipo = TypeOf(int); MsgBox.Show(tipo.FullName) „Restitisce System.Int32 In VB al posto di TypeOf si usa la funzione di libreria GetType( ) che è assolutamente identica a TypeOf. pag 57 Informatica - Classe Terza robertomana.it Introduzione al Net Framework L‟oggetto Array La classe Array è una classe astratta, dunque non può essere istanziata direttamente Gli indici dei vettori sono sempre a base zero. Viene sempre allocato un elemento in più. Dim Dim Dim Dim Vect1( ) Vect1 As Vect2(5) Vect3( ) As Integer = {1, 2, 4, 8, 16} Integer( ) = {1, 2, 4, 8, 16} As Integer As Integer „Vettore dim 5 inizializzato „Identico con diversa sintassi „Vettore dim 5 non inizializzato „Semplice puntatore Per assegnare effettivamente un vettore ad un puntatore già dichiarato (ad esempio vect3), occorre utilizzare la seguente sintassi, abbastanza poco intuitiva Vect3 = New Integer( ) {1, 2, 4, 8, 16} oppure If (Vect3 Is Nothing) then ReDim vect(80) „Dopo di che Vect può essere utilizzato normalmente Proprietà e Metodi di istanza Dim Mat(10, 20) As Integer Rank Proprietà ReadOnly = Rango (dimensionalità) del vettore. Mat.Rank = 2 Length Proprietà ReadOnly = Numero complessivo di elementi allocati. Mat.Length = 11 * 21 = 231 .GetLength(pos) Restituisce il n° di elementi allocati sulla dimensione specificata. Mat.GetLength(0) = 11 .GetLowerBound(pos) Restituisce l‟indice minimo sulla dimensione specificata. Mat.GetLowerBound(1) = 0 .GetUpperBound(pos) Restituisce l‟indice max sulla dimensione specificata. Mat.GetLowerBound(1) = 20 Questi metodi sostituiscono le vecchie funzioni di libreria LBound e UBound .GetLength(pos) Restituisce il n° di elementi allocati sulla dimensione specificata. Mat.GetLength(0) = 11 .GetValue(index) As Object e .SetValue(newValue As Object, index) consentono di leggere / scrivere singoli elementi di un vettore generico trattato come vettore di object. (Vanno bene per routine generiche che possono operare su più vettori di tipo diverso, ricevuti come parametro). L‟Interfaccia IEnumerable e il ciclo For Each La classe Array implementa l‟interfaccia IEnumerable che rappresenta l‟interfaccia interrogata implicitamente durante un ciclo For Each. Dire che una classe supporta l‟Interfaccia IEnumerable significa in pratica dire che supporta il ciclo For Each. Dim N As Integer For Each N In Mat „Elenco dell‟intera matrice. Console.Write(s & “,”) Next Si vedranno prima i dati della 1° riga, poi quelli della 2° … L‟Interfaccia ICloneable e il metodo di istanza Clone( ) La classe Array implementa l‟interfaccia ICloneable che consente una Shallow Copy di un oggetto mediante il metodo di istanza .Clone( ). Se Option Strict = On occorre eventualmente utilizzare la 2° sintassi : Dim AnotherMat( , ) As Integer = Mat.Clone( ) „restituisce un obj * generico Dim AnotherMat( , ) As Integer = DirectCast(Mat.Clone, Integer( )) Il metodo di istanza .CopyTo(dest, pos), derivato dall‟Interfaccia ICollection, consente di copiare l‟intero vettore attuale dentro il vettore dest alla posizione indicata. Nell‟esempio i 5 numeri di Vect1 vengono copiati dentro Vect4 a partire dalla posizione 3 Dim Vect4(10) As Integer Vect1.CopyTo(Vect4, 3) pag 58 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Il metodo Shared Array.Sort e l‟Interfaccia IComparable Il metodo Shared Array.Sort(vect) consente di ordinare in modo crescente il vettore vect. Ordina anche i vettori di oggetti, ammesso che tali oggetti espongano l‟interfaccia IComparable. Una seconda versione Overload di .Sort consente di ordinare soltanto una porzione di vettore. In tal caso il secondo parametro indica la posizione di partenza dell‟ordinamento, il terzo indica il numero di celle da ordinare Array.Sort(vect1, 10, 12) „Ordina 12 elementi a partire dalla posizione 10 Una terza versione Overload di .Sort consente di ordinare un vettore sulla base di un vettore di chiavi [*], passato come secondo parametro. Tutte le precedenti versioni di overload, nel caso di vettore di oggetti, accettano, come parametro aggiuntivo opzionale, un oggetto di tipo IComparer che consente di specificare quale metodo della classe debba essere utilizzato per eseguire l‟ordinamento (per oggetti che dispongono di più criteri di ordinamento differenti). Altri metodi Shared Array.Reverse(vect) consente di invertire l‟ordine degli elementi di un vettore. Può essere applicato dopo Sort per ottenere l‟ordinamento inverso. Può anche agire su una singola porzione del vettore: Array.Reverse(vect, 0, 5) „Ordina 5 elem a partire dalla pos 0 Utile anche per scambiare di posto 2 elementi consecutivi: Array.Reverse(vect, 7, 2) „Inverte 7° e 8° elemento x Array.Clear(vect, startPos, qta) consente di azzerare un vettore o una porzione di esso. Es Array.Clear(vect, 0, 5) „clear dei primi 5 elementi x Array.Copy( ) consente di copiare una porzione di vect1 all‟interno di vect2 Array.Copy(vect1, pos1, vect2, pos2, qta) Vect2 deve essere grande a sufficienza da contenere tutti gli elementi copiati, altrimenti si genera un errore. Vect1 e Vect2 possono anche essere di tipo diverso. In caso però di conversione restrittiva (es da Double a Single) viene generato un errore. Copy può anche copiare una porzione di vettore nel vettore stesso. Array.Copy(vect, 1, vect, 0, qta) „Sposta gli elementi di 1 posizione verso l‟alto Array.Clear(vect, vect.GetUpperBound(0), 1) „Azzera l‟ultimo elemento Il metodo Copy funziona anche per vettori pluridimensionali, che vengono trattati come monodimensionali, con tutte le righe memorizzate in sequenza. Array.IndexOf(vect, val) ricerca un valore all‟interno di una matrice e restituisce l‟indice del primo elemento corrispondente oppure –1 nel caso l‟operazione non sia andata a buon fine. La ricerca è Case Sensitive. Si possono eventualmente specificare una posizione iniziale ed una posizione finale facoltativa. int index = Array.IndexOf(vect, “Joe”); while (index >= 0) index = Array.IndexOf(vect, “Joe”, index +1); Array.LastIndexOf(vect, val) effettua la ricerca partendo dal fondo. E‟ pertanto necessario passare un indice di partenza maggiore di quello finale. Se l‟indice finale è assente la ricerca prosegue fino alla testa del vettore. BinarySearch(vect, val) effettua una ricerca dicotomica su un vettore già ordinato in precedenza. Restituisce l‟indice della prima corrispondenza. Se la ricerca non ha successo restituisce un valore negativo indicante comunque la posizione del primo elemento il cui valore risulta maggiore di quello cercato. Facendo index = Not index si ottiene la posizione in cui dovrebbe essere inserito il nuovo valore. Anche BinarySearch accetta, come 3° parametro, la posizione iniziale della ricerca e, come 4°, la lunghezza. Un ultimo parametro IComparer consente di impostare il criterio di confronto da utilizzare per la ricerca, nel caso di vettori di oggetti che supportano l‟interfaccia IComparer. Jagged Arrays Sono degli array multidimensionali con dimensioni irregolari. Es array con due righe: la prima con 4 elementi e la seconda con 6. int[][] jagArr = new int[2][]; jagArr[0] = new int[4]; jagArr[1] = new int[6]; pag 59 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Gli oggetti Collections Il namespace System.Collections contiene diverse Collection con proprietà e metodi simili Tutte le varie classi System.Collection possono contenere al loro interno Objects di qualunque tipo. Le Interfacce IEnumerable e ICollection Tutte le classi Collections implementano le Interfacce IEnumerable che consente la gestione del ciclo For Each e ICollection (derivata dalla precedente) che consente l‟indicizzazione dei singoli elementi. Anche la classe Array implementa queste due interfacce, oltre a ICloneable e IComparable. ICollection espone essenzialmente i seguenti 2 membri aggiuntivi: Count ReadOnly Numero effettivo di elementi nella collezione .CopyTo(vect, pos) Copia l‟intera collezione in un vettore esistente, a partire dalla posizione pos La classe System.Collections.List (Interfaccia IList) List <clsLibri> lista = new List <clsLibri>(); 'Lista di oggetti Implementa IEnumerable, ICollection e IList che presenta i seguenti membri aggiuntivi: .Item[index] Proprietà Predefinita. Ottiene / Imposta uno specifico elemento della Collezione (a base 0) .Add(object) Aggiunge un nuovo elemento (record completo) in fondo alla collection (addOnTail) e restituisce l‟indice. Attenzione che ADD non duplica il record ricevuto ma crea soltanto un puntatore. Se il Client modifica il record, questo viene modificato anche all‟interno della lista ! .Remove(object) Elimina un determinato oggetto (record completo) dalla Collection .Clear( ) Elimina tutti gli elementi della collection e azzera Count .IndexOf(object) Restituisce la posizione dell‟oggetto all‟interno della Collection, oppure –1 se non lo trova .Insert(index, object) Aggiunge un nuovo elemento alla collection alla posizione indicata .RemoveAt(index) Elimina dalla Collection l‟oggetto che si trova alla posizione indicata .Contains(object) Restituisce True se l‟oggetto appartiene alla collezione .IsFixedSize Restituisce True se non è possibile aggiungere elementi alla collezione .IsReadOnly Restituisce True se non è possibile modificare gli oggetti della collezione La classe System.Collections.Dictionary (Interfaccia IDictionary) Simile alla classe List, ma definisce una collezione di coppie chiave – valore (hashtable). L'integer rappresenta in ratica il codice di accesso a libro Dictionary <int, clsLibri> lista = new Dictionary <int, clsLibri>(); Implementa IEnumerable, ICollection e IDictionary .Item[key] Proprietà Predefinita. Ottiene / Imposta l‟elemento associato alla chiave indicata .Add(key, value) Aggiunge una coppia chiave-valore al Dizionario. Chiave non può essere Nothing .Remove(key) Elimina dal Dizionario l‟elemento associato alla chiave indicata .Clear( ) Elimina tutti gli elementi dal Dizionario e azzera Count .Contains(key) Restituisce True se esiste un elemento con la chiave indicata .Keys Restituisce un oggetto ICollection che contiene tutte le chiavi [For Each string s in xxx.Keys] .Values Restituisce un oggetto ICollection che contiene tutti i valori [For Each string s in xxx.Values] .IsFixedSize Restituisce True se non è possibile aggiungere elementi alla collezione .IsReadOnly Restituisce True se non è possibile modificare gli oggetti della collezione La classe System.Collections.BitArray Questa classe è in grado di memorizzare valori booleani in formato compresso, utilizzando un singolo bit per ogni elemento. Implementa le Interfacce IEnumerable, ICollection e ICloneable (metodo Clone). Dim lista As New BitArray(1024) „1024 bit inizializzati a False Dim lista As New BitArray(1024, True) „1024 bit inizializzati a True Dim lista As New BitArray(Vect) „Vect è un vettore esistente di Boolean o Integre pag 60 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Proprietà e Metodi Length ReadOnly Numero effettivo di elementi nella Collezione (da IEnumerable) Count ReadOnly Numero effettivo di elementi nella Collezione (da ICollection) .Set(index, val) Imposta l‟elemento puntato da index al valore booleano val .Get(index) Restituisce il valore booleano dell‟elemento puntato da index .SetAll(val) Imposta tutti i bit del BitArray al valore booleano val .Not( ) Inverte tutti i bit del BitArray .CopyTo(vect, pos) Copia l‟intera collezione in un vettore esistente di booleani o Integer. Attenzione che se il vettore è un vettore di Integer, la copia viene comunque eseguita bit a bit, per cui i primi 32 bit del BitArray vengono tutti copiati nel primo Integer. .And(bitArray) Esegue l‟And bit a bit tra l‟Array corrente e l‟Array passato come parametro. Idem .Or e .Xor La classe System.Collections.Specialized.BitArray32 Simile alla precedente ma limitata a 32 elementi. I 32 elementi possono essere gestiti sia come singoli bit sia come Integer. Utile per memorizzare numeri interi codificati a bit normalmente utilizzati per i driver di comunicazione. La classe System.Collections Stack Struttura a pila LIFO (Last-In-First-Out). Basata su IList, della quale ovviamente non supporta Add, Insert, Remove, RemoveAt, IndexOf, Item, sostituiti dai metodi specialistici Push, Pop e Peek. stack <string> pila = new stack <string>(50); Pila con 50 elementi iniziali automaticamente raddoppiata in caso di necessità. 32 è il valore di default Count Numero di elementi presenti nella collezione .Clear( ) Rimuove tutti gli elementi dalla collezione .Contains(object) Restituisce True se l‟oggetto appartiene alla collezione .Push(s) Accoda un nuovo elemento nello stack. Il parametro è un obj ma si può passare anche una String .Pop( ) Restituisce l'ultimo elemento immesso nello stack eliminandolo dallo stack .Peek( ) Consente di vedere qual è il prossimo elemento nello stack, senza tuttavia eliminarlo. La classe System.Collections.Queue Struttura a coda FIFO (First-In-First-Out) Utilizzata ad esempio quando un programma invia dei messaggi ad un altro programma. I messaggi vengono memorizzati in una struttura a coda del ricevente, che potrà dunque leggere i messaggi nell‟ordine in cui li ha ricevuti. Basata su IList presenta anch‟essa alcuni metodi specialistici. queue <string> coda = new queue <string>(50); Coda con 50 elementi iniziali automaticamente raddoppiata in caso di necessità. 32 è il valore di default Count Numero di elementi presenti nella collezione .Clear( ) Rimuove tutti gli elementi dalla collezione .Contains(object) Restituisce True se l‟oggetto appartiene alla collezione .Enqueue(s ) Accoda un nuovo elemento. Il parametro è un obj ma si può passare anche una String .Dequeue( ) Restituisce il primo elemento della coda eliminandolo dalla coda stessa .Peek( ) Consente di vedere qual è il prossimo elemento della coda, senza tuttavia eliminarlo dalla coda. La classe System.Collections.Hashtable Realizza una hash table chiave – valore implementando perfettamente l‟Interfaccia IDictionary. Items(chiave) Proprietà Predefinita Ottiene / Imposta un valore data la sua chiave Add(chiave, valore) Aggiunge un elemento alla lista Remove(chiave) Rimuove l‟elemento selezionato For Each s As String in xxx.Keys MsgBox( s & xxx(s).toString ) „Si usa la proprietà predefinita Item Next pag 61 Informatica - Classe Terza robertomana.it Introduzione al Net Framework La classe System.Collections.ArrayList Ibrido tra un Array e una Collection. Si tratta in pratica di vettori dinamici in cui, in qualunque momento, è possibile aggiungere dinamicamente / rimuovere un elemento Object, cioè in pratica qualsiasi tipo di dato. Dim arrList As New ArrayList(20) Crea un Array List contenente inizialmente 20 elementi. Se non si specifica la dimensione, il default è 16 Capacity Dimensione attuale della collection Di default viene impostata a 16 elementi. Consente in qualsiasi momento di modificare la capacità dell‟ArrayList. Non può essere impostata ad un valore inferiore a Count. Count (IList) Numero effettivo di elementi nella Collection Item(index) (IList) Proprietà Predefinita. Ottiene / Imposta uno specifico elemento della Collezione (a base 0). Attenzione che non è possibile referenziare un oggetto con indice >= Count .Add(object) (IList) Aggiunge un nuovo elemento in fondo alla collection e restituisce l‟indice corrispondente. Se ciò comporta un aumento di count oltre il valore di capacity, capacity viene automaticamente raddoppiata. E‟ bene controllare Capacity in modo da evitare troppa memoria inutilizzata. .Insert(index, object) (IList) Aggiunge un nuovo elemento alla collection alla posizione indicata .Clear( ) (IList) Elimina tutti gli elementi della collection. Count viene azzerata, Capacity rimane invariata .Remove(object) (IList) Elimina un determinato oggetto dalla Collection .RemoveAt(index) (IList) Elimina dalla Collection l‟oggetto che si trova nella posizione richiesta .IndexOf(object) (IList) Restituisce la posizione di un dato oggetto all‟interno della Collection .Contains(object) (IList) Restituisce True se l‟oggetto appartiene alla collezione .CopyTo(vect, pos) (ICollection) Copia l‟intera collezione in un vettore esistente, a partire dalla posizione pos .CopyTo(collectionPos, vect, vectPos, Qta) (ICollection) Overload della precedente .ToArray( ) Copia l‟intera collection all‟interno di un Array. Dim vect( ) As Integer = arrList.ToArray( ) .TrimToSize( ) Riduce la dimensione della collection (Capacity) al numero effettivo di elementi presenti (Count) .AddRange(collectionObj) Aggiunge alla collezione attuale tutti gli elementi contenuti nell‟oggetto passato come parametro. E‟ ammesso qualunque oggetto che implementi l‟interfaccia ICollection. Spesso usato per caricare in una lista tutti le voci di un oggetto Enum (leggibili mediante GetNames). ArrayList espone anche gran parte dei metodi relativi alla classe Array .Sort( ) Ordina il contenuto della collection .BinarySearch( ) Ricerca Dicotomica .Reverse( ) Inverte l‟array IndexOf( ) e LastIndexOf( ) Restituisce l‟indice relativo all‟oggetto passato come parametro Esempio di eliminazione di un oggetto avente più ricorrenze Do While (arrList.Contains(“xxx”) ) ArrList.Remove(“xxx”) Loop La classe System.Collections.SortedList Lista ordinata mediante l‟Interfaccia IDictionary. Max versatilità a scapito però delle prestazioni. Unione di HashTable + ArrayList. La SortedList realizza le stesse funzionalità della HashTable, ma viene mostrata all‟utente come un Array. Ciascun elemento è identificato da un nome aggiuntivo (chiave), sulla base del quale la lista è sempre mantenuta ordinata. La sortedList gestisce in realtà 2 vettori interni, uno per i valori e l‟altro per le chiavi corrispondenti. Quando si aggiungono nuovi elementi alla lista, questi vengono immediatamente ordinati sulla base delle rispettive chiavi. L‟ordinamento viene eseguito in modo ascendente sulla base dell‟Interfaccia IComparable E‟ possibile passare al costruttore un oggetto IComparer personalizzato[*] Dim Lista As New SortedList(20) „default = 16 I singoli elementi della SortedList sono gestiti come oggetti DictionaryEntry For Each element As DictionaryEntry In Lista s = s & element.Key & “ “ element.Value Next Proprietà e Metodi sono l‟unione di HashTable + ArrayList. Elenco Completo Pag 279 pag 62 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Trascinamento con il mouse Net non gestisce il Drag And Drop automatico come VB6, ma soltanto il Drag And Drop manuale. I controlli che possono fungere da destinazione ad un Drag And Drop dispongono della proprietà .AllowDrop True/False che fa sì che il controllo possa essere attivo come destinazione per il Drag And Drop. Il Drag dovrebbe essere iniziato quando il mouse lascia il controllo con il pulsante di sinistra premuto. In tal caso occorre creare una nuova istanza di DataObject (lo stesso utilizzato nel caso della Clipboard) in cui memorizzare i dati del controllo sorgente che potrebbero poi essere incollati altrove. Invece dell‟evento MouseLeave si utilizza l‟evento MouseMove che dispone del parametro MouseEventArgs per vedere se il tasto sinistro del mouse è premuto. Private Sub Text1_MouseMove(....) Dim data As New DataObject 'Per semplicità il trascinamento viene fatto col tasto destro del mouse If (e.Button <> Windows.Forms.MouseButtons.Right) Then Exit Sub If (Text1.TextLength = 0) Then Exit Sub 'il Drag non viene avviato finchè il mouse non lascia il control attuale If (e.X = Text1.Width Or e.X = 0 Or e.Y = Text1.Height Or e.Y = 0) Then If (Text1.SelectionLength > 0) Then data.SetData(DataFormats.Text, Text1.SelectedText) Else data.SetData(DataFormats.Text, Text1.Text) End If Dim effect As DragDropEffects = DragDropEffects.Copy Or .Move effect = Text1.DoDragDrop(data, effect) If (effect = DragDropEffects.Move) Then If (Text1.SelectionLength > 0) Then Text1.SelectedText = "" Else Text1.Text = "" End If End If End If End Sub Il metodo .DoDragDrop avvia la vera e propria operazione di trascinamento. Esso è sincrono, cioè bloccante per il codice fino a quando l‟operazione non giunge al termine oppure viene annullata. Effect è un integer che viene impostato all‟inizio del drop e che può assumere i seguenti valori: Costante vbDropEffectNone vbDropEffectCopy Valore 0 1 vbDropEffectMove 2 vbDropEffectScroll &H80000000 Significato Rilascio non ammesso Il rilascio comporta una copia: i dati originali non vengono modificati Il rilascio comporta la cancellazione dei dati originali Nella destinazione sta per partire o è in corso lo scorrimento pag 63 Informatica - Classe Terza robertomana.it Introduzione al Net Framework Al termine del drop DoDragDrop restituirà l‟effetto impostato nell‟evento DragEnter del controllo di destinazione. (Copy o Move). In realtà l‟effetto potrebbe già essere deciso subito in corrispondenza dello Start DRAG. In genere nei programmi Windows se l‟utente contemporaneamente al mouse preme il tasto CTRL significa che vuole fare una copia, altrimenti l‟azione predefinita è lo spostamento (Move). A questo punto occorre gestire il drop sul controllo destinaz che, con AllowDrop=True, sarà sensibile agli eventi: DragEnter Il mouse entra nell‟area client del controllo DragOver Il mouse si sposta all‟interno del controllo DragLeave Il mouse esce dal controllo DragDrop Il pulsante del mouse viene rilasciato quando il cursore si trova sopra il controllo Tutti questi eventi dispongono dei seguenti parametri: AllowedEffect integer codificato in bit che indica le azioni disponibili Effect = None, alla quale occorre assegnare il tipo di operazione accettato dal controllo di destinazione Data istanza della classe DataObject in cui sono stati copiati i dati in corso di trascinamento KeyState Stato dei pulsanti del mouse (1=pulsante sinistro, 2=pulsante destro) e dei tasti di shift (8=CTRL) X e Y posizione del cursore sull‟area client della destinazione All‟interno dell‟evento DragEnter occorre modificare il valore di Effect, sulla base del quale verrà automaticamente aggiornata la forma del cursore del mouse per far capire all‟utente che il controllo è in grado di supportare il Drop. Private Sub Text2_DragEnter(....) If (e.Data.GetDataPresent(DataFormats.Text)) Then 'se è stato premuto il tasto CTRL significa che si vuole fare una copia If CBool(e.KeyState And 8) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.Move End If End If End Sub Infine all‟interno dell‟evento DragDrop verrà eseguito il vero e proprio Drog dei dati Private Sub Text2_DragDrop(....) If (e.Data.GetDataPresent(DataFormats.Text)) Then Text2.SelectedText = e.Data.GetData(DataFormats.Text) End If End Sub Trascinamento di un file Nel caso del trascinamento di un intero file all‟interno di un Text Box, lo start DRAG verrà fatto automaticamente da Windows ed i dati memorizzati in DataObject avranno formato FileDrop. Occorre scoprire come fare, all‟interno dell‟evento DragDrop, ad accedere al file vero e proprio (in VB6 era semplicemente Data.Files(1) ). Il file dovrà poi essere aperto e letto con i soliti oggetti di accesso ai files di testo. pag 64