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