domenica 11 gennaio 2009

corso programmazione mobile - Capitolo 3 – Le form ed i vari oggetti.

In questo capitolo ci si addentra alla programmazione vera e propria dei dispositivi mobile, vedremo l’aspetto della creazione delle varie interfacce nonché le varie classi messe a disposizione dal compact framework e la gestione degli errori.




Come visto nel primo capitolo, quello introduttivo, quando si avvia l’ambiente di sviluppo Visual Studio 2005 è possibile scegliere quale applicazione (mobile, windows, web) creare e quale modello (windows application, console, componente ecc). In questo capitolo vedremo modelli di tipo application, ossia con un interfaccia grafica.



3.0 La Form.


Le form in ambiente mobile a differenza dello sviluppo per windows application, presentano delle limitazioni in fatto di eventi, proprietà e metodi, In effetti le form presentano meno eventi, qualche proprietà e metodo in meno di quelle in ambiente Windows. Oltre alla form, anche i controlli e le classi in ambiente mobile risultano con molte limitazioni, in effetti in ambiente mobile abbiamo meno controlli rispetto all’ambiente Windows. L’ambiente mobile riguardante dispositivi mobile, quali smartphone, a loro volta hanno controlli, classi minori di quelli in ambiente mobile per pocketpc.



Quando si crea un progetto di tipo applicazione dispositivo, in C# viene inserita una procedura denominata Main(), tale procedura è il punto di ingresso dell’applicazione, ossia il momento in cui vengono creati gli oggetti e richiamati altri metodi, è l’avvio del programma. In VB.Net l’oggetto d’avvio è impostato sulla prima form (form1), nelle proprietà del progetto è possibile specificare un'altra form o un sub main, dopo averla creata. Per impostare l’oggetto d’avvio, nelle proprietà del progetto (menu progetto->proprietà di..->) nella linguetta applicazione, impostare la casella combinata “oggetto d’avvio” con il valore desiderato.




Figura 3.1 – La finestra delle proprietà del progetto VB.Net




3.1 Le proprietà della form.


Ci sono delle proprietà della form molto importanti, per esempio la proprietà minimizebox, impostata sul valore False, fa si che la form, quando viene chiusa tramite il pulsante “ok”, viene effettivamente chiusa , in modo che la sua apertura, può essere più veloce. Questa proprietà per default è impostata a true, tale valore fa si che il pulsante di chiusura è contraddistinto dal simbolo della X, in questo modo la form non viene chiusa ma nascosto, in questo modo, se viene richiamata l’apertura risulta più veloce. Mentre ciò non accade se utilizziamo il metodo close dell’oggetto form.


Altra proprietà interessante è la possibilità di visualizzare la scrollbar tramite la proprietà AutoScroll impostata a true, da notare che nella versione precedente del compact framework non c’è questa possibilità.



Figura 3.2 - emulatore per smartphone



Figura 3.3 - Emulatore per pocketpc




3.2 Gli eventi


Altro parte importante di sapere delle form in ambiente mobile, sono gli eventi, funzioni che si verificano al determinarsi di una determinata azione.


Gli eventi delle form per pocket pc sono maggiori di quelle per gli smartphone, di seguito si ricordano alcuni eventi comuni.


L’evento load, si verifica quando viene avviata la form in questione, e preceduto dall’evento activated, di solito l’evento load, si usa nel momento in cui occorre eseguire particolari azioni nei controlli (per esempio il caricamento dei dati in un controllo datagrid o combo box) o esecuzione di alcune funzioni. L’evento closing e closed, nel momento in cui si sta chiudendo (rilasciando) la form. Mentre l’evento resize, quando viene ridimensionata la finestra, ma l’evento più usato è il load.



3.3 I menu


I menu, permettono di dotare le nostre applicazioni mobile, con delle scorciatoie. Quando si crea una form, di norma, nella parte inferiore in cui si trova l’emulatore, compare un controllo denominato “mainmenu1”. Selezionandolo, con il mouse, viene evidenziato il menu, nell’emulatore, a questo punto possiamo aggiungere eliminare o modificare le varie voci di tale menu.


Per creare nuove voci, in modalità design, ossia tramite il mouse,si seleziona il menu situato nell’emulatore e si aggiungano le varie voci desiderate. Un altro modo per creare i menu è in modalità run time, ossia quando il codice e in esecuzione.


Di seguito si riporta un esempio di codice.


VB.Net


'classe dei menu


Dim menu2 As New MainMenu()


'creo due voci


Dim VoceMenu As New MenuItem()


VoceMenu.Text = "Home"


Dim sottoVoce As New MenuItem()


sottoVoce.Text = "Voce A"


' imposto un gestore di evento, per la voce


AddHandler sottoVoce.Click, AddressOf Me. sottoVoce_Click


'aggiungo alla voce di menu


VoceMenu.MenuItems.Add(sottoVoce)


'aggiungo la voce di menu al menu


menu2.MenuItems.Add(VoceMenu)


'altro menu


Dim voce2 As New MenuItem


voce2.Text = "Voce B"


menu2.MenuItems.Add(voce2)


'assegno alla form, l'oggetto menu appena creato


Me.Menu = menu2



'funzione di evento per il menu (Voce A) creato a run time


Private Sub sottoVoce_Click (ByVal sender As System.Object, ByVal e As System.EventArgs)


MessageBox.Show("Voce A")


End Sub


C#



//classe dei menu


MainMenu menu2 = new MainMenu();


//creo due voci


MenuItem VoceMenu = new MenuItem();


VoceMenu.Text = "Home";


MenuItem sottoVoce = new MenuItem();


sottoVoce.Text = "Voce A";


//imposto un gestore di evento, per la voce


sottoVoce.Click +=new EventHandler(sottoVoce_Click);



//aggiungo alla voce di menu


VoceMenu.MenuItems.Add(sottoVoce);


//aggiungo la voce di menu al menu


menu2.MenuItems.Add(VoceMenu);


//altro menu


MenuItem voce2 = new MenuItem();


voce2.Text = "Voce B";


menu2.MenuItems.Add(voce2);


//assegno alla form, l'oggetto menu appena creato


this.Menu = menu2;



}



void sottoVoce_Click(object sender, EventArgs e)


{


MessageBox.Show("Voce A");


}



Il controllo contexmenu


In ambiente pocketpc si ha la possibilità di utilizzare nei progetti un menu di scelta rapida, questo avviene tramite la classe contexmenu, il menu di scelta rapida, si attiva tenendo premuto lo stelo sullo schermo del palmare.


Qui di seguito si riporta un esempio di codice, per la creazione di un menu contestuale, per la form.


VB.Net



'creo un menu contestuale


Dim mnuContestuale As New ContextMenu()


'un elemento di menu


Dim voceMenu As New MenuItem()


voceMenu.Text = "Voce a"


'evento per la singola voce


AddHandler voceMenu.Click, AddressOf Me.voceMenu_Click




'aggiungo il sotto menu


mnuContestuale.MenuItems.Add(voceMenu)


'aggiungo un altro elemento al menu


Dim voceMenu2 As New MenuItem()


voceMenu2.Text = "Voce B"


'aggiungo il sottomenu


mnuContestuale.MenuItems.Add(voceMenu2)


Me.ContextMenu = mnuContestuale



'Gestore dell'evento clici della voce del menu contestuale


Private Sub voceMenu_Click(ByVal sender As Object, ByVal e As EventArgs)


MessageBox.Show("Voce contestuale")


End Sub




C#


//creo un menu contestuale


ContextMenu mnuContestuale = new ContextMenu();


//un elemento di menu


MenuItem voceMenu = new MenuItem();


voceMenu.Text = "Voce a";


//evento per la singola voce


voceMenu.Click += new EventHandler(voceMenu_Click);


//aggiungo il sotto menu


mnuContestuale.MenuItems.Add(voceMenu);


//aggiungo un altro elemento al menu


MenuItem voceMenu2 = new MenuItem();


voceMenu2.Text = "Voce B";


//aggiungo il sottomenu


mnuContestuale.MenuItems.Add(voceMenu2);


this.ContextMenu = mnuContestuale;



//Gestore dell'evento clici della voce del menu contestuale


void voceMenu_Click(object sender, EventArgs e)


{


MessageBox.Show("Voce contestuale");


}




3.4 - La gestione degli errori:


Quando si scrive del codice e buona norma gestire anche l’eventuali eccezioni ossia errori che si possono verificare durante l’esecuzione del codice, nella fase di esecuzione del programma si dicono errori di run-time.


Tramite le parole chiavi try catch e finally (facoltativo) possiamo gestire i vari errori, e qualora se ne verifichi uno gestire il programma nelle varie fasi. Le variabili dichiarate all’interno del blocco try non sono visibili nel blocco catch in quanto sono blocchi separati. Il blocco Try contiene il codice in cui potrebbe verificarsi un errore, mentre il blocco Catch contiene il codice per la gestione di ogni errore che si verifica. In caso di errore nel blocco Try, il controllo del programma viene passato all'istruzione Catch appropriata per l'elaborazione. L'argomento exception è un'istanza della classe Exception o di una classe derivata dalla classe Exception corrispondente all'errore verificatosi nel blocco Try. Nell'istanza della classe Exception sono presenti informazioni sull'errore, ad esempio messaggio, ossia il testo dell’errore, tramite la proprietà message. Nel blocco finally viene eseguito sempre il codice, sia nel caso che si verifica o non un errore.


La parte cach può essere ripetute diverse volte in base alla classe per la gestione degli errori, ossia possiamo avere più classi per diversi errori, per esempio la classe per gli errori dei file, dei calcoli matematici, per il database, ecc.


Di seguito si riportano degli esempi di codice.




VB.Net


Sintassi:


try


.----codice


Catch oggetto as classe Exception


-----codice


[finally]


-----codice


'dichiaro le variabili in questo modo sono visibili in tutto il blocco


Dim IntNumero As Integer = 10


Dim IntDivisione As Integer = 0


Try


'genero un errore divido il numero per 0


IntNumero /= IntDivisione


Catch ex As Exception


'visualizzo il testo dell'errore


MessageBox.Show(ex.Message)



End Try



C#


Sintassi


Try


{


---codice


}


Catch (Classe Exception oggetto)


{


----codice


}


[Finally]


{


---codice



}


//dichiaro le variabili in questo modo sono visibili in tutto il blocco


int IntNumero = 10;


int IntDivisione = 0;


try


{


//genero un errore divido il numero per 0


IntNumero /= IntDivisione;




}


catch (Exception ex)


{


//visualizzo il testo dell'errore


MessageBox.Show(ex.Message);



}



Nel gestire gli errori, si deve considerare l’utilizzo delle apposite classi per gli errori, per esempio, il framework, mette a disposizioni opportune classi per le diverse eccezioni, in modo da evitare errori generici.


Per esempio, c’è una classe per la gestione degli errori sui calcoli matematici, chiamata ArithmeticException una classe per la gestione degli errori riguardante l’accesso ai file FileNotFoundException e così via.


La classe per la gestione degli errori generici, va inserita all’ultimo blocco dei catch, in questo modo, l’ordine di assegnazione dell’eccezione, viene valutata da blocco a blocco, se l’errore viene individuato in un blocco, verrà eseguito il codice di tale blocco, altrimenti, proseguirà fino a quando non arriva all’opportuno blocco o all’eccezione generica.


Di seguito si riporta un esempio di codice, con due blocchi catch, uno relativo agli errori matematici e l’altro per gli errori generici.



VB.Net


'dichiaro le variabili in questo modo sono visibili in tutto il blocco


Dim IntNumero As Integer = 10


Dim IntDivisione As Integer = 0


Try


'genero un errore divido il numero per 0


Dim intRisultato As Integer = IntNumero / IntDivisione



'eccezione matematica


Catch ex As ArithmeticException


MessageBox.Show("Errore, impossibile dividere per zero")


'eccezione generica


Catch ex2 As Exception


'visualizzo il testo dell'errore


MessageBox.Show(ex2.Message)



End Try


C#


//dichiaro le variabili in questo modo sono visibili in tutto il blocco


int IntNumero = 10;


int IntDivisione = 0;


//esempio di gestione degli errrori con il finally


try


{


//genero un errore divido il numero per 0


int IntRisultato = IntNumero / IntDivisione;


}


//eccezione matematica


catch (ArithmeticException ex)


{


MessageBox.Show("Errore, , impossibile dividere per zero");


}


//eccezione generica


catch (Exception ex2)


{


//visualizzo il testo dell'errore


MessageBox.Show(ex2.Message);



}


Nella gestione degli errori è buona norma utilizzare il blocco finally, esso è utile per la pulizia di tutte le risorse allocate nel blocco e per l'esecuzione di qualsiasi codice che è necessario eseguire anche in presenza di un'eccezione. Un esempio in cui si utilizza spesso il blocco finally, è quello relativo alla chiusura di una connessione al database, in questo caso, sia se il codice è andato a buon fine e sia che si sono verificati degli errori, nella fase finally, si può verificare che la connessione ad un database sia chiusa, perché il blocco finally, indipendentemente dalla modalità di uscita dal blocco try, viene sempre eseguito. Va ricordato che nel blocco finally si dovesse verificare un errore, si esce immediatamente dal blocco e l’eccezione viene notificata al chiamante.


In questo caso, l'ordine delle clausole catch è importante poiché le clausole catch vengono esaminate nell'ordine specificato. Vengono intercettate prima le eccezioni più specifiche, e poi man mano quelle meno specifiche .


Riprendendo l’esempio precedente, se la variabile intNumero ha un valore uguale a 10, nel blocco finally effettueremo una divisione per due.




VB.Net


'dichiaro le variabili in questo modo sono visibili in tutto il blocco


Dim IntNumero As Integer = 10


Dim IntDivisione As Integer = 0


Dim intRisultato As Integer


Try


'genero un errore divido il numero per 0


intRisultato = IntNumero / IntDivisione


Exit Try


'eccezione matematica


Catch ex As ArithmeticException


MessageBox.Show("Errore, impossibile dividere per zero")


'eccezione generica


Catch ex2 As Exception


'visualizzo il testo dell'errore


MessageBox.Show(ex2.Message)


Finally


If IntNumero = 10 Then


intRisultato = IntNumero / 2


MessageBox.Show("Il risultato è: " & intRisultato.ToString())


End If



End Try



C#


//dichiaro le variabili in questo modo sono visibili in tutto il blocco


int IntNumero = 10;


int IntDivisione = 0;


int IntRisultato;


//esempio di gestione degli errrori con il finally


try


{



//genero un errore divido il numero per 0


IntRisultato = IntNumero / IntDivisione;


}


//eccezione matematica


catch (ArithmeticException ex)


{


MessageBox.Show("Errore, , impossibile dividere per zero");


}


//eccezione generica


catch (Exception ex2)


{


//visualizzo il testo dell'errore


MessageBox.Show(ex2.Message);



}



finally


{


if (IntNumero == 10)


{


IntRisultato = IntNumero / 2;


MessageBox.Show("Il risultato è: " + IntRisultato.ToString());



}


}



A volte può capire di dover sollevare dell’eccezioni, tramite la parola chiave throw, possiamo generare in modo esplicito un errore, il quale accetta un solo argomento che corrisponde al testo dell’errore, in questo modo possiamo impostare il testo ed eseguire un determinato blocco catch che desideriamo.


Nell’esempio successivo, viene verificata la presenza di un file, se non esiste, solleviamo un eccezione, con un nostro messaggio


VB.Net


La sintassi


Throw espressione


Try


'verifico che il file esiste altrimenti avvio un eccezione.


If File.Exists("\miofile.txt") = False Then


Throw New FileNotFoundException("Il file non esiste")


End If


'Apro un file


Dim Sr As New StreamReader("\MioFile.txt")


Dim StrTesto As String


'leggo il testo nel file


StrTesto = Sr.ReadLine()


MessageBox.Show(StrTesto)


'eccezione dei file


Catch ex As FileNotFoundException


MessageBox.Show(ex.Message)


eccezione generica


Catch ex2 As Exception


MessageBox.Show(ex2.Message)


End Try



C#


La sintassi


Throw espressione;


try


{



if (File.Exists("\\MioFile.txt") == false)


{



throw new FileNotFoundException("Il file non esiste");


}


StreamReader sr = new StreamReader("\\MioFile.txt");


string StrTesto ;


StrTesto = sr.ReadLine();


MessageBox.Show(StrTesto);


}



//eccezione dei file


catch (FileNotFoundException ex)


{


MessageBox.Show(ex.Message);



}


//eccezione generica


catch (Exception ex2)


{



//visualizzo il testo dell'errore


MessageBox.Show(ex2.Message);



}




Se qualora si vuole uscire dal blocco try catch, possiamo utilizzare la parola chiave exit try (VB.Net ) o goto (C#). Di seguito si riporta un esempio di codice:



VB.Net


Try



'esco dal blocco try


Exit Try


'verifico che il file esiste altrimenti avvio un eccezione.


If File.Exists("\miofile.txt") = False Then


Throw New FileNotFoundException("Il file non esiste")


End If


'Apro un file


Dim Sr As New StreamReader("\MioFile.txt")


Dim StrTesto As String


'leggo il testo nel file


StrTesto = Sr.ReadLine()


MessageBox.Show(StrTesto)


'eccezione dei file


Catch ex As FileNotFoundException


MessageBox.Show(ex.Message)


'eccezione generica


Catch ex As Exception


MessageBox.Show(ex.Message)



End Try


C#



try


{


goto uscita;


if (File.Exists("\\MioFile.txt") == false)


{



throw new FileNotFoundException("Il file non esiste");


}


StreamReader sr = new StreamReader("\\Miofile.txt");


string StrTesto;


StrTesto = sr.ReadLine();


MessageBox.Show(StrTesto);



}



//eccezione per i file


catch (FileNotFoundException ex)


{


MessageBox.Show(ex.Message);


}


//eccezione generica


catch (Exception ex2)


{



//visualizzo il testo dell'errore


MessageBox.Show(ex2.Message);



}


//etichetta per uscire dal codice


uscita: ;


MessageBox.Show("Uscita");



3.5 L’oggetto Enviroment


La classe environment, contiene metodi e proprietà per rilevare informazioni riguardante l’ambiente e la piattaforma in cui è avviato l’applicativo, anche questa classe ha il numero degli elementi (proprietà e metodi) inferiori a quelli dell’ambiente Windows.


Di seguito si riportano alcuni esempi sul suo utilizzo.


VB.Net


'Verifico la versione del so di Windows Mobile


If Environment.OSVersion.Version.Major < 5 Then


MessageBox.Show("Versione 2003")


Else


MessageBox.Show("Versione 5.0")


End If



C#


//verifico la versione del so


if ( Environment.OSVersion.Version.Major < 5)


{


MessageBox.Show("Versione 2003");


}


else


{


MessageBox.Show("Versione 5.0");


}



3.6 gli oggetti Me e This


Con gli oggetti Me (VB.Net ) e This (C#) si accede alla classe della form in cui ci si trova. In pratica possiamo ottenere i metodi, proprietà ed eventi, della form, in cui vengono richiamati.


Per esempio, per cambiare il titolo della barra della form, utilizzanto la proprietà text, possiamo ottenere o modificare tale valore.


Un esempio qui di seguito.


VB.Net


Me.Text =”Mio Testo”


C#


Me.Text = “Mio Testo”;



3.10 Le proprietà del progetto.


Le proprietà di un progetto, presentano le stesse funzionalità di quelli per l’ambiente Windows, sempre con qualche limitazione.


Per esempio possiamo impostare un icona al programma, imposto l’oggetto di avvio, impostare il dispositivo e via continuando.



3.7 Procedure e Funzioni (Accenno si riparlerà nel quarto capitolo)



Le funzioni e procedure (parlare anche di c#)


Le funzioni permettono di eseguire una serie di istruzioni, e nelle classi possono essere utilizzati come metodi. La differenza tra una funzione ed una procedura, sta nel fatto che la funzione può restituire un valore (tramite la parola chiave return) mentre le sub no. Entrambi possono accettare degli argomenti, il quale può essere per valore o riferimento. Byval (in vb.net) di default, fa si che il valore che viene passato non può essere modificato, mentre byref(VB.Net) ref (C#), il valore che viene passato può cambiare. Le procedure di tipo sub (vb.net) o void (c#) sono dei metodi che non restituiscono nessun valore, mentre le funzioni tramite la parola chiave return, possono restituire un valore. Le funzioni possono essere pubbliche private o protected.



La sintassi per la procedura è quella di utilizzare la parola chiave sub seguita dal nome della procedura, il codice dovrà essere inserito tra la dichiarazione del nome funzione e la parola end sub, per quanto concerne il linguaggio VB.Net, mentre per il C#, la procedura si dichiara tramite la parola chiave void seguita dal nome ed il codice racchiuso tra le parentesi graffe. Di seguito si riporta tale dichiarazione.


VB.Net


Sub NomeProcedura()


'codice



End Sub


C#


void NomeProcedura()


{


//codice


MessageBox.Show("Ciao");


}



Mentre per richiamarla occorre digitare il nome della procedura seguita dalla parentesi tonde, ed eventualmente passandogli i valori.


VB.Net


NomeProcedura()


C#


NomeProcedura();



Se qualora si vuole uscire da una procedura prima della conclusione di essa occorre utilizzare la parola chiave exit sub o return per vb.net e return per c#.


VB.Net


Sub NomeProcedura()


'esco dalla procedura


Return


' questo codice non verrà mai eseguito


MessageBox.Show("Ciao a tutti")



End Sub


C#


void NomeProcedura()


{


//esco dalla procedura


return;


//questo codice non verrà mai eseguito


MessageBox.Show("Ciao a tutti");


}



Le procedure o funzioni, permettono il passaggio di argomenti, ossia oltre a richiamare la funzione, possiamo richiamarla con determinati valori. Quando si passa un valore ad una procedura o funzione, ci sono due modalità, per valore, ossia il valore che gli viene passato non viene modificato all’interno della routine oppure per riferimento, in questa modalità il valore può subire cambiamenti. La modalità predefinita è per valore, ossia il valore che viene passato non si può modificare. In VB.Net si utilizza la parola chiave byval (per valore ) o byref (per riferimento) mentre in C# si utilizza la parola chiave ref o out per passare un valore per riferimento. La differenza tra i due, sta nel fatto che nel momento in cui vengono passati i valori nel caso è di tipo ref, il tipo parametro dev’essere inizializzato, mentre per quanto riguarda il passaggio tramite out, non è obbligatorio che il valore sia inizializzato. Si possono passare un argomento come un certo numero di argomenti e questi possono essere misti, ossia per valore e per riferimento. Il valore che si passa verrà modificato nella procedura ma poi, al termine di tali operazione il suo valore non sarà modificato. Vediamo un esempio.


Procedura con argomenti byval


VB.Net


Dim StrTesto As String = "Testo"


NomeProcedura(StrTesto)


'visualizzo il valore che non è stato modificato


MessageBox.Show(StrTesto)



'procedura


Sub NomeProcedura(ByVal StrTestoValore As String)


'essendo byval non modifica il valore


StrTesto = "altro testo"



End Sub



C#


string testo = "testo";


//eseguo la procedura


NomeProcedura(testo);


//visualizzo il valore che non è stato modificato


MessageBox.Show(testo);



//Procedura


void NomeProcedura( string StrTesto )


{


//essendo byval non modifica il valore


StrTesto = "altro testo";



}


Se invece vogliamo includere nella procedura o funzione, degli argomenti che si possono modificare, dobbiamo passare i valori per riferimento, di seguito si riporta un esempio.



VB.Net


Dim StrTesto As String = "Testo"


Dim Strtesto2 As String = "secondo testo"


Dim IntValore As Integer


NomeProcedura(StrTesto, Strtesto2, IntValore)


' il valore della variabile stresto non viene modificata


'il valore delle variabile strtesto2 viene modificata


'il valore della variabile intvalore viene modificata



'procedura


Sub NomeProcedura(ByVal StrTesto As String, ByRef StrValore1 As String, ByRef intvalore2 As Integer)


'esstendo byval non modifica il valore


StrTesto = "altro testo"


'questa variabile viene modificata perchè è impostato come riferimento


StrValore1 = "altro valore "


'quesa variabile viene modificata in quanto è ti dipo byref.


intvalore2 = 22




End Sub



C#


string testo = "testo";


string testo2 ="testo 2" ; // sono obbligato ad impostare un valore altrimenti genera un errore


int valore;


//eseguo la procedura


NomeProcedura(testo, ref testo2, out valore );


//la variabile testo non è cambiata il valore


//testo2 è cambiato in "altro valore"


//valore è cambiato in 22



//Nome procedura


void NomeProcedura( string StrTesto, ref string StrValore1, out int intValore2 )


{


//essendo byval non modifica il valore


StrTesto = "Ciao";


//il valore strValore1 viene modificato in quanto è di tipo ref


StrValore1 = "altro valore";


//il valore intvalore2 viene modificato in quanto è di tipo out


intValore2 = 22;




}



In Visual Basic .Net ,per le funzioni o procedura è possibile definire argomenti facoltativi, tramite la parola chiave Optional essa fa si che l’argomento che si vuole passare non sia obbligatorio e quindi omettere un valore nel richiamare tale funzione o procedura. Da notare che questa possibilità va applicata come ultimo argomento oppure seguito da altri argomenti facoltativi, non è possibile utilizzarlo in altre parti senza che sia seguito da argomenti opzionali.


Di seguito si riporta un esempio.


VB.Net


'procedura


Sub NomeProcedura(ByVal StrTesto As String, ByRef StrValore1 As String, ByRef intvalore2 As Integer, Optional ByVal valore As String = "")


'esstendo byval non modifica il valore


StrTesto = "altro testo"


'questa variabile viene modificata perchè è impostato come riferimento


StrValore1 = "altro valore "


'quesa variabile viene modificata in quanto è ti dipo byref.


intvalore2 = 22


'nel codice posso utilizzare anche la variabile facoltativa.


End Sub


Richiamo la funzione con un argomento in meno, senza quello opzionale


Esempio:


NomeProcedura(StrTesto, Strtesto2, IntValore)



Possiamo passare come argomenti anche matrici, va ricordato che il valore di tale matrici verrà modificato se non viene utilizzato la parola chiave redim preserve, in quest’ultimo caso l’argomento di tipo matrice passato come byval, non subirà le modifiche.


Di seguito si riporta un esempio.




VB.Net


'Procedura


Sub NomeProcedura(ByVal Strvalore As String, ByVal Strvalore2() As String, ByVal Intvalore As Integer)


'il valore della matrice viene modificato


Strvalore2(0) = "mio testo"


Strvalore2(1) = "altro testo mio"


End Sub


'richiamo la procedura ma il valore della matrice è cambiato


Dim IntValore as Integer


'Questa variabile non subirà nessuna modifica


Dim StrTesto As String = "Testo"


'la matrice verrà modificata nonostante è passata come argomento per valore (byval)


Dim StrValore() As String = {"valore ", "secondo valore", "terzo valore"}


NomeProcedura(StrTesto, StrValore, IntValore)



C#



//procedura


void NomeProcedura(string StrPrimoValore, string[] StrValore, int IntValore)


{


StrValore[0] = "mio testo";


StrValore[1] = "altro testo ";



}



//Richiamo la procedura


string testo = "Mio testo";


int valore = 10;


string[] StrValore = { "valore", "secondo valore", "terzo valore" };


//la matrice verrà modificata nonostante è passata come argomento per valore


NomeProcedura(testo, StrValore, valore);




Nell’esempio successivo viene mostrato come tramite la parola redim preserve per il linguaggio di programmazione VB.Net e ridimensionale la variabile, mentre in C#, tale matrice non viene modificato il valore, a differenza dell’esempio prececdente, nonostante l’argomento sia passato per valore e non come riferimento.



VB.Net


'Procedura


Sub NomeProcedura(ByVal Strvalore As String, ByVal Strvalore2() As String, ByVal Intvalore As Integer)


ReDim Preserve Strvalore2(2)


Strvalore2(0) = "mio testo"


Strvalore2(1) = "altro testo mio"


End Sub


'richiamo la procedura ma il valore della matrice non viene cambiato


Dim IntValore as Integer


'Questa variabile non subirà nessuna modifica


Dim StrTesto As String = "Testo"


'la matrice non verrà modificata è passata come argomento per valore (byval) e si utilizza la parola chiave redim preserve


Dim StrValore() As String = {"valore ", "secondo valore", "terzo valore"}


NomeProcedura(StrTesto, StrValore, IntValore)




C#


//procedura


void NomeProcedura2(string StrPrimoValore, string[] StrValore, int IntValore)


{


StrValore = new string[2];


StrValore[0] = " mio testo ";


StrValore[1] = " altro testo ";


}


//Richiamo la procedura


string testo = "Mio testo";


int valore = 10;


string[] StrValore = { "valore", "secondo valore", "terzo valore" };


//la matrice non verrà modificata è passata come argomento per valore


NomeProcedura(testo, StrValore, valore);




Possiamo dichiarare una funzione o procedura che accetta un numero qualsiasi di argomenti e che questi argomenti siano anche facoltativi. Tramite la parola chiave ParamArray per vb.net e params per C#, possiamo passare ad una funzione o procedura una serie di argomenti. Occorre seguire alcuni accorgimenti, l’argomento non può essere passato per riferimento (byref per vb.net o ref per c#) ma solo per valore. Si può utilizzare una sola volta nella procedura e deve rappresentare l'ultimo parametro della procedura o funzione. Inoltre tutti gli argomenti che precedono la matrice di parametri siano obbligatori e no facoltativi.


Di seguito si riporta un esempio di codice:




VB.Net


'Procedura con l'ultimo un numero qualsiasi di argomenti


Sub NomeProcedura(ByRef StrTesto As String, ByVal ParamArray StrValori() As String)


StrTesto = "Modifico il valore"


'verifico che sia stato passato almeno un elemento


If StrValori.Length > 0 Then


StrValori(0) = " Testo modificato"


StrValori(1) = " altra modifica"


End If


End Sub



Dim StrValore() As String = {"Primo valore ", " Secondo valore ", " Terzo valore"}


'Vari modi per richiamare tale procedura


'Posso richiamare la procedura senza passare l'ultimo valore, ossia quello matrice di argomenti


NomeProcedura(StrTesto)


'passo tre argomenti, di cui due al quello di tipo matrice che però non subiranno modifiche


NomeProcedura(StrTesto, StrValore(0), StrValore(1))


'passo diversi argomenti


NomeProcedura(StrTesto, "testo", "altro Testo", " altro valore")


C#


//procedura con l'ultimo un numero qualsiasi di argomenti


void NomeProcedura( ref string StrTesto, params string[] StrValori )


{


//essendo byref modifico il valore


StrTesto = "Modifico il valore";


if (StrValori.Length > 0)


{


StrValori[0] = "Testo modificato";


StrValori[1] = "altra modifica";



}



}



//Vari modi per richiamare tale procedura


//Posso richiamare la procedura senza passare l'ultimo valore, ossia quello matrice di argomenti


NomeProcedura(ref testo);


string[] StrValore = { "Primo valore", "Secondo valore", "Terzo valore" };


//passo tre argomenti, di cui due al quello di tipo matrice che però non subiranno modifiche


NomeProcedura(ref testo, StrValore[0], StrValore[1]);


//passo diversi argomenti


NomeProcedura(ref testo, "testo", "altro Testo", " altro valore");




Funzioni


Le funzioni sono simili alle procedura, solo con la differenza che possono restituire un valore tramite la parola chiave return seguita dal valore da restituire. Va ricordato che in Visual Basic .Net tramite la parola chiave exit function, permette di interrompere il codice della funzione nel punto in cui viene inserita tale dicidura, mentre in Visual C# occorre utilizzare la parola chiave return senza il valore da restituire.


Tutte le varie opzioni viste per le procedure si possono applicare nelle funzioni, la dichiarazione di funzione in Visual Basic .Net avviene tramite la parola chiave function seguita dal nome della funzione, gli eventuali argomenti ed il tipo. Mentre in C# il nome della funzione è preceduto dal tipo della funzione.


Di seguito si riporta degli esempi di codice:


VB.Net


'Funzione che restituisce un intero, la somma di due numeri.


Function somma(ByVal primo As Integer, ByVal secondo As Integer) As Integer


Dim Totale As Integer = primo + secondo


Return Totale


End Function


'richiamo la funzione.


Dim intTotale As Integer = somma(10, 20)



'In questo esempio si noti la parola chiave exit function in questo modo il codice sottostante non viene eseguito


Function somma(ByVal primo As Integer, ByVal secondo As Integer) As Integer


'non esegue il codice


Exit Function


Dim Totale As Integer = primo + secondo


Return Totale


End Function



C#


//Funzione che restituisce un intero, la somma di due numeri.


int somma(int primo, int secondo)


{


int totale;


totale = primo + secondo;


return totale;


}



//richiamo la funzione.


int valore = somma(10, 20);




3.7 Gli eventi della form



Le form, come in ambiente Windows, hanno degli eventi, va ricordato che in ambiente mobile questi eventi sono in numero minore, inoltre gli eventi tra ambiente pocket pc e smartphone sono diversi.


Di seguito si riporta uno schema degli eventi sia per l’ambiente Pocketpc e sia per l’ambiente smartphone
































































































































Nome Evento


Pocketpc


Smartphone


Descrizione


Activated


Si


Si


Si scatena quando il form viene attivato


Click


Si


No


Si scatena quando si fa click sul controllo


Closed


Si


Si


si scatena dopo che l’utente ha chiuso il form


Closing


Si


Si


si scatena quando l’utente sta per chiudere il form


Deactived


Si


Si


Si scatena quando il form viene disattivato


DoubleClick


Si


No


Si scatena quando si fa doppio click sul controllo


EnabledChanged


Si


Si


scatena quando lo stato di attivazione del controllo viene modificato


GotFocus


Si


Si


Si scatena quando il controllo ha lo stato attivo


HelpRequested


Si


No


Si scatena quando si richiama la guida per il controllo


KeyDown


Si


Si


Si scatena quando si preme un pulsante


Keypress


Si


Si


Si scatena viene generato quando dopo la pressione di un tasto finchè il tasto resta premuto


KeyUp


Si


Si


Si scatena quando si rilascia il tasto


Load


Si


Si


Si scatena quando viene caricato il form


LostFocus


Si


Si


si scatena quando il controllo perde lo stato attivo


MouseDown


Si


No


Si scatena quando si preme un tasto del mouse (pennino


MouseMove


Si


No


Si scatena quando si sposta il mouse


MouseUp


Si


No


Si scatena quando si rilasca il pulsante del mouse


Paint


Si


Si


Si scatena Quando occorre generare il controllo


ParentChanged


Si


Si


Si scatena quando viene modififcato la proprietà parent di control


Resize


Si


Si


Si scatena quando si ridimensiona la form


TextChanged


Si


Si


Si scatena quando viene modificato il valore della proprietà text del control


Validated


Si


Si


Si scatena quando un controllo viene correttamente validato


Validating


Si


Si


Si scatena alla convalida del controllo, per annullare la convalida, impostare a true la proprietà cancel del parametro dell’evento



Vediamo un esempio di un evento per la form



L’evento keypress, determina il tasto che è stato digitato tramite tastiera virtuale o quella fisica (qualora se ne dispone una), si ricorda di impostare la proprietà keypreview a true per intercettare i tasti da form.



Ambiente PocketPc - Ambiente Smartphone


VB.Net


Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress


MessageBox.Show(e.KeyChar)


End Sub



C#


private void Form1_KeyPress(object sender, KeyPressEventArgs e)


{


MessageBox.Show(e.KeyChar.ToString());


}


3.8 I controlli Standard


I controlli in ambiente mobile, permettono di accrescere le nostre applicazioni con interfaccia più amichevole. Di seguito verranno illustrati in grandi linee i controlli più frequenti sia in ambiente pocket pc e sia in ambiente smartphone. Nei prossimi capitoli, verranno illustrate gli altri controlli, quelli di maggiore interesse. In questo capitolo verrà fatta una breve panoramica.



Il controllo button:


La classe button, rappresenta un pulsante in ambito pocketpc, questa classe non esiste in ambiente smartphone.


Le caratteristiche più usate di questo controllo, sono la proprietà text, che permette di impostare il testo, la proprietà size, che imposta le dimensioni del controllo, la proprietà location, che imposta la posizione del controllo nella form, e la proprietà forecolor, che imposta il colore del testo.


L’evento click è quello più usato e permette di eseguire un azione nella fase in cui viene fatto digitato e rilasciato tale pulsante.


Di seguito si riporta un esempio di codice:


VB.Net


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


'visualizzo a video un messaggio


MessageBox.Show("Messaggio a video")


End Sub



C#


{


//Visualizzo a video un messaggio


MessageBox.Show("Messaggio a video");


}




Il controllo Textbox:


Questo controllo rappresenta una casella di testo, una parte in cui è possibile digitare dei caratteri, tale controllo si può utilizzare sia in ambiente PocketpC e sia in ambiente Smartphone.


La casella di testo, dispone di diverse proprietà, le più usate, sono le seguenti.


Con la proprietà Text, possiamo impostare o farci restituire il testo contenuto nel casella di testo, mentre la proprietà maxlengh permette di impostare il numero massimo dei caratteri che la casella può contenere.


La proprietà multiline, permette di avere una casella di testo su più righe, mentre la proprietà forecolor, imposta il colore del testo, sempre riguardante il testo, possiamo utilizzare la proprietà Font, per impostare le dimensioni, il corsivo, il grassetto o altre formattazioni al testo.


Gli eventi, più utilizzati in un controllo TextBox sono l’evento gotfocus, ossia quando riceve lo stato attivo, lostfocus, quando perde lo stato attivo, keypress, quando viene digitato del testo e textChanged.


Di seguito si riporta un esempio di codice sull’utilizzo casella di testo.


Il primo esempio riguarda l’evento GotFocus, in particolare viene visualizzata la tastiera virtuale (si ricorda di inserire il controllo inputpanel)


Nel secondo esempio, riguarda l’evento LostFocus, quando il controllo perde lo stato attivo, viene nascosta la tastiera virtuale.


Nel terzo esempio utilizzo dell’evento keypress per verificare che il carattere digitato è una lettera


Nell’ultimo esempio, l’evento keychanged, quando cambia il testo nella casella viene visualizzato a video il testo della casella di testo.


Ambiente PocketPc


VB.Net


'utilizzo dell'evento gotfocus avvia la tastiera virtuale


Private Sub TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus


InputPanel1.Enabled = True


End Sub


'utilizzo dell'evento lostfocus nasconde la tastiera virtuale


Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus


InputPanel1.Enabled = False


End Sub


'Esempio dell'evento keypress verifica che il testo inserito è una lettera altrimenti non inserisce il carattere digitato


Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress


'verifico che il carattere inserito è una lettera


If Char.IsLetter(e.KeyChar) = False Then


MessageBox.Show("Solo lettere")


'non inserisce il carattere inserito


e.Handled = True


End If



End Sub


'Esempio quando cambia il testo nella casella visualizza il testo nella casella di testo


Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged


MessageBox.Show(TextBox1.Text)



End Sub



C#


//utilizzo dell'evento gotfocus avvia la tastiera virtuale


private void textBox1_GotFocus(object sender, EventArgs e)


{


inputPanel1.Enabled = true;


}


//utilizzo dell'evento lostfocus nasconde la tastiera virtuale


private void textBox1_LostFocus(object sender, EventArgs e)


{


inputPanel1.Enabled = false;


}


//Esempio dell'evento keypress verifica che il testo inserito è una lettera altrimenti non inserisce il carattere digitato


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)


{ //verifico che il carattere inserito è una lettera


if (Char.IsLetter(e.KeyChar) == false )


{


MessageBox.Show("Solo lettere");


//non inserisce il carattere inserito


e.Handled = true;


}


}



//Esempio quando cambia il testo nella casella visualizza il testo nella casella di testo


private void textBox1_TextChanged(object sender, EventArgs e)


{


MessageBox.Show(textBox1.Text);


}



Smarphone:


Da notare che in ambiente smartphone, nell’evento GotFocus e LostFocus, la riga di codice riguardante inputpuanel va tolta e sostituita con altro codice. Perché in ambiente Smartphone non esiste la classe inputPanel.



Il controllo Label:


Questo controllo rappresenta un’etichetta, utilizzata per dare dei titoli ed informazioni all’utente durante l’utilizzo del programma tale controllo si può utilizzare sia in ambiente PocketpC e sia in ambiente Smartphone.


Di solti per questo controllo, si usa solo la proprietà text e font, è molto raro che si utilizza un evento di questo controllo, di seguito vediamo un esempio di codice di come impostare del testo in una label.


VB.Net


Label1.Text = "Prova testo"


C#


label1.Text = "Prova testo";



Il controllo Checkbox


Con il controllo checkbox è possibile creare delle finestre, in cui è possibile selezionare più scelte di una determinata lista, supponendo di avere una serie di opzioni da una lista, con il controllo checkbox possiamo rappresentare a video la scelta delle voci. Mentre con il controllo Radiobutton , il quale permette una singola selezione, escludendo tutte le altre.


In questo esempio di codice, nell’evento CheckStateChanged di due controlli checkbox, viene imposta una variabile con del testo, se il controllo è spuntato, (tramite la proprietà (Checked a true) allora imposta del testo, altrimenti imposta un valore vuoto. Si fa presente che il controllo checkbox, dispone di una proprietà importante che è denominata checkedstate, la quale permette di rilevare lo stato della checkbox ossia spuntato (checked), non spuntato (unckeched) oppure indefinito (indeterminate), quando ha l’ombreggiatura.



VB.Net


Private Sub chbprimo_CheckStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chbprimo.CheckStateChanged


'verifico che il controllo è spuntato


If chbprimo.Checked = True Then


StrPrimo = "Primo"


Else


StrPrimo = ""


End If



End Sub


C#


private void chbprimo_CheckStateChanged(object sender, EventArgs e)


{


//verifico che il controllo è spuntato


if (chbprimo.Checked == true) {


StrPrimo = "Primo";


}


else


{


StrPrimo = "";


}


}



Il controllo ComboBox:


Il controllo combobox, detto anche casella di riepilogo, permette di visualizzare in un menu a discesa dei valori, messi in uno sotto l’altro. Dal menu è possibile selezionare una singola voce, questo controllo si può utilizzare sia in ambiente Pocketpc e sia in ambiente Smartphone.


Si possono inserire i valori sai a design time, tramite la finestra delle proprietà in particolare con la proprietà items, oppure da codice. Nel primo caso una volta fatto click sulla voce della proprietà verrà visualizzata una finestra in cui sarà possibile inserire i valori. Da codice invece occorre utilizzare il metodo add della proprietà items. Le proprietà maggiormente usate sono datasource, in cui è possibile impostare una fonte dati, displaymember, proprietà che permette di impostare il nome del campo della fonte dati associato, che visualizzerà il dato nella casella di testo. La proprietà Items, il quale permette di gestire i vari valori della combobox, SelectedIndex permette di impostare o rilevare l’indice selezionato. La proprietà SelectedItem ottiene o imposta l’elemento selezionato di un oggetto combobox, la proprietà SelectedValue ottiene o imposta il valore di elemento selezionato, si fa presente che a volte il valore di questa proprietà non corrisponde a quello visualizzato nella casella combinato, molto utilizzato nei casi in cu si deve tenere nascosto un valore chiave. Infine la proprietà ValueMember, imposta o restituisce il nome del campo che dovrà essere utilizzato come valore. Queste sono alcune proprietà che spesso vengono usate, mentre per gli eventi, molto spesso si utilizza l’evento SelectedIndexChanged.


Di seguito si riporta un esempio di codice.


VB.Net


'Inserisco i vari valori nella combobox


ComboBox1.Items.Add("Prima voce")


ComboBox1.Items.Add("Seconda voce")


ComboBox1.Items.Add("Terza voce")


'Altro metodo tramite datasource


Dim StrTesto(2) As String


StrTesto(0) = "Prima voce"


StrTesto(1) = "Seconda voce"


StrTesto(2) = "Terza voce"


'imposto il valore dell'array alla combobox


ComboBox1.DataSource = StrTesto


'al cambiamento del valore nella casella visualizza il valore selezionato


Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged


MessageBox.Show(ComboBox1.SelectedItem.ToString())


End Sub




C#


//Inserisco i vari valori nella combobox



comboBox1.Items.Add("Prima voce");


comboBox1.Items.Add("Seconda voce");


comboBox1.Items.Add("Terza voce");


//Altro modo per inserire i dati tramite datasource


string[] StrTesto = new string[3];


StrTesto[0] = "Prima voce";


StrTesto[1] = "Seconda voce";


StrTesto[2] = "Terza voce";


//imposto il valore dell'array alla combobox


comboBox1.DataSource = StrTesto;



//al cambiamento del valore nella casella visualizza il valore selezionato


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)


{


MessageBox.Show(comboBox1.SelectedItem.ToString());


}



Conclusioni:


Si è visto in questo capitolo, come muovere i primi passi dello sviluppo di applicazioni mobili, si è fatta una grande panoramica, di tutto ciò che occorre per sviluppare una semplice applicazione mobile.



Nessun commento: