Posts
166
Comments
253
Trackbacks
1
febbraio 2008 Entries
Variabili d'ambiente

Per la serie "Non si finisce mai d'imparare", mi segno questo comando, set, che una volta digitato senza parametri nel command prompt  ci fornisce l'elenco delle variabili (con relativo valore) d'ambiente del sistema. Per ulteriori informazioni è sufficiente digitare set /?

posted @ giovedì 28 febbraio 2008 9.09 | Feedback (2)
Adobe Air

Leggevo di questa nuova tecnologia proposta da Adobe, da quanto è scritto, l'idea è nata nel 2001 e permetterebbe di lavorare anche offline. Notizia completa qui

posted @ martedì 26 febbraio 2008 15.01 | Feedback (0)
GetOleDbSchemaTable e fogli di lavoro di un file Excel

Post nato da una discussione su forum. Per recuperare i nomi degi fogli di lavoro di un file excel, al fine di popolare ( ad esempio) un controllo ComboBox, possiamo sfruttare la funzione GetOleDbSchemaTable della classe OleDbConnection, la quale, restituisce un istanza di oggetto DataTable con le informazioni a noi necessarie. Il codice per popolare il ComboBox è il seguente:

1 DataTable dt = GetWorksheetList(@"C:\Test.xls");
2 if (dt != null)
3 {
4 comboBox1.DisplayMember = "TABLE_NAME";
5 comboBox1.DataSource = dt;
6 }

mentre la funzione GetWorksheetList è la seguente:

1 private DataTable GetWorksheetList(string pathAndFileName)
2 {
3 DataTable workSheetsDataTable = null ;
4 5 using (OleDbConnection connection = new OleDbConnection())
6 {
7 string connectionString = string.Format(
8 @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;",
9 pathAndFileName );
10 11 connection.ConnectionString = connectionString;
12 13 try 14 {
15 connection.Open();
16 17 workSheetsDataTable= connection.GetOleDbSchemaTable(
18 System.Data.OleDb.OleDbSchemaGuid.Tables ,
19 new object[] { null, null, null, "TABLE" });
20 21 connection.Close();
22 }
23 catch (Exception ex)
24 {
25 26 MessageBox.Show("Attenzione:" + ex.Message);
27 }
28 }
29 return workSheetsDataTable ;
30 }
Technorati Tag: ,
posted @ giovedì 21 febbraio 2008 12.27 | Feedback (0)
[OT]Finalmente...

Volevo condividere la mia gioia con chiunque dovesse leggere questo post, ieri mi sono finalmente laureato (in informatica), prossimo obiettivo : specialistica....ovviamente non sottraendo tempo allo studio del .Net ( lavoro permettendo...)

posted @ giovedì 21 febbraio 2008 9.16 | Feedback (8)
Da non credere...

Da questo link è possibile ascoltare (e vedere) una sinfonia realizzata utilizzando solamente i suoni di sistema di Windows XP e 98.

posted @ lunedì 18 febbraio 2008 14.55 | Feedback (0)
[OT] K.i.t.t. 2008

Scusate l'OT, ma penso che chiunque abbia visto Supercar, sarà contento di leggere questa notizia.

posted @ domenica 17 febbraio 2008 13.58 | Feedback (5)
Virus "buoni"

Allo studio di Microsoft una soluzione per favorire la diffusione di "patch" per la correzione di bachi presenti nei programmi sfruttando l'idea del peer-to-peer. Notizia completa qui

posted @ venerdì 15 febbraio 2008 17.03 | Feedback (2)
Facebook...

Leggevo questo articolo a riguardo del social network facebook. Certe notizie mi lasciano perplesso, sono sempre più convinto che la privacy sia sempre più un miraggio...

posted @ venerdì 15 febbraio 2008 11.57 | Feedback (0)
DataTable.RowChanged e ProgressBar

Se abbiamo bisogno di una soluzione veloce per visualizzare l'avanzamento di un controllo ProgressBar durante il caricamento di un DataTable, possiamo gestire l'evento RowChanded in questo modo:

1 Private Sub CustomRowChanged(ByVal sender As Object, ByVal e As DataRowChangeEventArgs) 2 3 If (e.Action = DataRowAction.Commit) Then 4 'Avanziamo il valore della progress bar 5 ProgressBar1.Value += 1 6 Application.DoEvents() 7 End If 8 9 End Sub

Il codice per popolare il DataTable con i dati e per registrare il gestore eventi personalizzato può essere del tipo:

1 'Imposto la proprietà Maximux del controllo ProgressBar 2 ProgressBar1.Value = 0 3 ProgressBar1.Maximum = GetNumeroRecords() 4 5 'Registro il gestore eventi personalizzato 6 AddHandler Articoli.ArticoliDataTable.RowChanged, AddressOf CustomRowChanged 7 8 Try 9 DataGridView1.SuspendLayout() 10 11 'Popolo il DataTable 12 ArticoliTableAdapter.Fill(Articoli.ArticoliDataTable) 13 14 MessageBox.Show(String.Format("Caricati {0} records",Articoli.ArticoliDataTable.Rows.Count)) 15 16 Catch ex As Exception 17 MessageBox.Show(ex.Message) 18 Finally 19 DataGridView1.ResumeLayout() 20 'Rimuovo l'handler... 21 RemoveHandler Articoli.ArticoliDataTable.RowChanged, AddressOf CustomRowChanged 22 End Try

Ovviamente si potrebbero usare modelli di programmazione asincrona o popolare dati mediante un thread diverso da quello principale.

posted @ mercoledì 13 febbraio 2008 17.00 | Feedback (0)
Sincronizzazione dei thread

Thread e loro sincronizzazione, classi messe a disposizione  dal .Net Framework (continua)

posted @ domenica 10 febbraio 2008 19.58 | Feedback (0)
Ultimo acquisto...

Il mio ultimo acquisto: HP W2207 22"

w2207_lcd_monitor

 

Visual Studio in dolby digital surround... :-)

posted @ sabato 9 febbraio 2008 20.11 | Feedback (3)
2008 Launch Roadshow...

Evento

Spero di poter incontrare qualcuno del gruppo...

posted @ venerdì 8 febbraio 2008 11.50 | Feedback (0)
Isolated Storage

L'uso dell'isolated storage permette alle nostre applicazioni di memorizzare dati su file, senza preoccuparsi di avere privilegi sufficienti per creare/modificare/cancellare file su disco. La classe necessaria all'utilizzo dell'isolated storage è IsolatedStorageFile che fornisce le funzionalità di base per la creazione di file e di cartelle nell'isolated storage. Questa si compone dei seguenti metodi statici , secondo del livello di isolamento che vogliamo ottenere:

GetMachineStoreForApplication
GetMachineStoreForAssembly
GetMachineStoreForDomain
GetStore
GetUserStoreForApplication
GetUserStoreForAssembly
GetUserStoreForDomain

Uno store di tipo machine-level può contenere informazioni relative all'assembly chiamante e alla macchina locale, uno store di tipo user-level, può contenere informazioni relative all'assembly chiamante e allo specifico user. Per poter creare, scrivere, leggere dati in un file dell'isolated storage, è necessario creare un istanza di tipo  IsolatedStorageFileStream (derivata da FileStream), che può essere utilizzata nel modo in cui siamo già abituati con i normali stream. Ad esempio, il seguente codice:

1 IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly();
2 3 CreateFile(store, "Dati_Utente.txt");
4 5 ...

crea un store in ambito Assembyl\User e crea un file di testo  nel quale memorizzare delle informazioni. Il codice della funzione CreateFile è il seguente:

1 private void CreateFile(IsolatedStorageFile store, string fileName)
2 {
3 //Crea istanza di oggetto IsolateStorageFileStream 4 using (IsolatedStorageFileStream storeStream =
5 new IsolatedStorageFileStream(fileName , FileMode.Create, store))
6 {
7 //Crea istanza di oggetto streamWriter 8 using (StreamWriter streamWriter = new StreamWriter(storeStream))
9 {
10 //Scrive dei dati 11 streamWriter.WriteLine("Linea #1");
12 streamWriter.WriteLine("Linea #2");
13 streamWriter.WriteLine("Linea #3");
14 streamWriter.WriteLine("Linea #4");
15 streamWriter.WriteLine("Linea #5");
16 //Esegue il flush e chiude lo stream 17 streamWriter.Flush();
18 streamWriter.Close();
19 }
20 }
21 }

Per recuperare i dati, il codice è altrettanto semplice, infatti è sufficiente utilizzare uno StreamReader:

1 private void ReadFile(IsolatedStorageFile store, string fileName)
2 {
3 using (IsolatedStorageFileStream storeStream = new IsolatedStorageFileStream(fileName , FileMode.Open, store))
4 {
5 using (StreamReader streamReader = new StreamReader(storeStream))
6 {
7 while (!streamReader.EndOfStream)
8 {
9 MessageBox.Show(streamReader.ReadLine());
10 }
11 streamReader.Close();
12 }
13 }
14 }

Per testare l'esistenza di un file all'interno dell'isolated storage non esiste nessun metodo, ma è possibile rimediare creando del codice ad hoc:

1 private bool StoreFileExists(IsolatedStorageFile store, string fileName)
2 {
3 return (store.GetFileNames(fileName).Length == 1);
4 }

Per creare una directory all'interno nell'isolated storage è sufficiente utilizzare l'apposita funzione CreateDirectory

1 store.CreateDirectory("Seconda_Directory")

Come per i file, non esiste un metodo per testare se una directory esiste, ma possiamo scrivere dell' opportuno codice:

1 private bool StoreDirectoryExists(IsolatedStorageFile store, string directotyName)
2 {
3 return (store.GetDirectoryNames(directotyName).Length == 1);
4 }

IsolatedStorageFile su MSDN

Technorati Tag:
posted @ mercoledì 6 febbraio 2008 14.30 | Feedback (0)
Windows Form, thread ed eccezioni

Supponiamo di avere una semplice applicazione Windows Form il cui unico (e stupido) compito è quello di eseguire una divisione, qualcosa  del tipo

Img_1

Se non eseguiamo nessuna validazione sui campi, potrebbe accadere che vengano eseguiti calcoli sbagliati (ad esempio una divisione per zero)  e di conseguenza che vengano sollevate le corrispondenti eccezioni. Per catturarle, possiamo utilizzare dei blocchi Try...Catch...Finally oppure  gestire l'evento Application.ThreadException. Così facendo, oltre alla possibilità di memorizzare un log delle eccezioni a livello di applicazione o eseguire del codice di pulizia, possiamo visualizzare una Windows Form User-Friendly, senza interrompere bruscamente l'applicazione. Per registrare il gestore  dell'evento ThreadException, possiamo aggiungere un modulo al nostro progetto e scrivere il seguente codice:

1 <STAThread()> _
2 Public Sub Main()
3
4 'Imposta il gestore evento Application.ThreadExeception personalizzato
5 AddHandler Application.ThreadException, AddressOf CustomErrorHandler
6
7 AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomainCustomErrorHandler
8
9 'Imposta il gestore evento Application.ApplicationExit personalizzato
10 AddHandler Application.ApplicationExit, AddressOf CustomApplicationExit
11
12 Application.Run(New Form1())
13 End Sub

Dove il gestore CustomErrorHandler è del tipo:

 

1 Public Sub CustomErrorHandler(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
2
3 Try
4 'Gestisce l'eccezione visualizzando una finestra di dialogo comune per l'eventuali eccezioni
5 My.Forms.frmExeception.DescrizioneEccezione = e.Exception.Message
6 My.Forms.frmExeception.ShowDialog()
7 Catch ex As Exception
8
9 End Try
10
11 End Sub

 

Il quale, in caso di eccezione, visualizza la seguente finestra di dialogo:

Img_2

Nel Sub Main, oltre a registrare l'evento Application.ThreadException, viene registrato anche il gestore per l'evento AppDomain.CurrentDomain.UnhandledExecption, perchè nel in cui caso la nostra applicazione sfrutti il multithreading, l'eventuali eccezioni dovute ai thread secondari non sarebbero catturate da CustomErrorHandler. Il codice del gestore per l'evento AppDomain.CurrrentDomain.UnhandledException è il seguente:

1 Public Sub AppDomainCustomErrorHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
2 Try
3 'Gestisce l'eccezione visualizzando una finestra di dialogo comune per l'eventuali eccezioni
4 'Ottiene l'oggetto Exception
5 Dim appDomainException As Exception = DirectCast(e.ExceptionObject, System.Exception)
6 My.Forms.frmExeception.DescrizioneEccezione = appDomainException.Message
7 My.Forms.frmExeception.ShowDialog()
8
9 If (e.IsTerminating) Then
10 'Operazioni di pulizia...
11 End If
12 Catch ex As Exception
13
14 End Try
15 End Sub

Il quale esegue una cast dell'oggetto e.ExceptionObject in System.Exception e visualizza la finestra di dialogo su mostrata. L'istanza di oggetto UnhandledExecptionEventArgs espone la proprietà IsTerminating che indica se il common language runtime stà terminando o meno. Nel caso di UnhandledExecption, il .Net Framework , con o senza gestione del relativo evento, visualizza la classica finestra di dialogo per l'esecuzione del debug  dell'applicazione. Per testare il codice ed il relativo comportamento dell'applicazione, da Visual Studio è necessario lanciare l'applicazione  senza Debug.

Thread Exception.zip

posted @ domenica 3 febbraio 2008 12.26 | Feedback (0)
Operazione cross-thread non valida...

Post nato da una discussione su forum. Se utilizziamo un componente Backgroundworker per l'esecuzione di codice in
background, bisogna stare attenti alle operazioni "cross-thread", ad esempio quando il codice interagisce con i controlli
di una Windows Form. Se abbiamo ad esempio un controllo ListView, per popolarlo senza provocare eccezioni durante
l'esecuzione dell'applicazione, possiamo costruire ed utilizzare un delegate come nel codice seguente:

Private Delegate Sub ScriviSuListViewDelegate()

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
   ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

   If (Not (ListView1.InvokeRequired)) Then
      For i As Integer = 0 To 20
         ListView1.Items.Add(String.Format("Item #{0}", i))
      Next
   Else
      Dim d As New ScriviSuListViewDelegate(AddressOf ScriviSuListiView)
      ListView1.Invoke(d)
   End If
End Sub
Technorati Tag:
posted @ venerdì 1 febbraio 2008 12.51 | Feedback (0)
News

View Pietro Libro's profile on LinkedIn

Pietro Libro