domenica 14 febbraio 2010
Per aprire un documento qualsiasi con l’applicazione predefinita, cioè quella associata alla specifica estensione del documento, si può procedere come nel seguente esempio:
Process.Start(My.Application.Info.DirectoryPath & _
"\Prova.docx")
Questa istruzione apre un documento di Word 2007, presente nella cartella dell’applicazione VB.NET. Se volete testare questa funzionalità, ricordatevi di copiare il file da aprire in entrambe le cartelle, Bin\Debug e Bin\Release.
L’istruzione di cui sopra non funziona se all’inizio del codice non avete inserito anche la seguente dichiarazione:
Imports System.Diagnostics
Se poi volete avere un maggiore controllo di quello che succede durante l’apertura del documento, potete utilizzare il seguente codice:
Dim p As New Process()
With p.StartInfo
.Arguments = My.Application.Info.DirectoryPath & _
"\Prova.pdf"
.UseShellExecute = True
.WindowStyle = ProcessWindowStyle.Minimized
.WorkingDirectory = _
"C:\Program Files (x86)\Adobe\Reader 9.0\Reader\"
.FileName = "AcroRd32.exe"
End With
p.Start()
p.Close()
p.Dispose()
In questo modo, potete, per esempio, aprire un documento con un’applicazione specificata oppure aprirlo con la finestra minimizzata nella barra delle applicazioni oppure addirittura nascosta.
Anche se è ancora in versione RC, ormai i giochi sono quasi fatti e si possono vedere un po’ di numeri sul contenuto del Framework .NET 4.0.
Per cominciare, il Team di sviluppo ha fatto un gran lavoro di “pulizia” e ha lavorato molto sull’ottimizzazione dei pacchetti di installazione e sulla compressione. I risultati sono i seguenti:
- il pacchetto di installazione del Framework .NET “full”, sia per x64 sia per x86, “pesa” ora solamente 54 Mb contro i circa 250 della versione 3.5 SP1
- il pacchetto della sola versione x86 si è ridotto a circa 36 Mb
- la versione “client profile” ora “pesa” ancora meno: solo circa 30 Mb.
(Fonte: una discussione tra Corrado Cavalli, Scott Guthrie in persona e altri http://groups.google.com/group/wpf-disciples/browse_thread/thread/12c6e01aa83987ec/6a2cc9dc195bd2ac?lnk=raot&pli=1)
Se volete analizzare le varie versioni del Framework .NET o addirittura confrontarle tra loro, potete utilizzare una utility di nome NDepend (http://www.ndepend.com/). Ecco qui un paio di articoli sull’uso di questo software:
http://codebetter.com/blogs/patricksmacchia/archive/2009/06/01/analyze-and-explore-the-evolution-of-net-framework-by-yourself.aspx
http://codebetter.com/blogs/patricksmacchia/archive/2009/08/04/reporting-code-diff.aspx
Interessante il fatto che NDepend permette di interrogare i Framework .NET con una sintassi SQL-like. Per esempio:
- Quali metodi pubblici hanno più di 30 linee di codice?
SELECT METHODS WHERE NbLinesOfCode > 30 AND IsPublic
- Quali classi implementano System.IDisposable?
SELECT TYPES WHERE IsClass AND Implements "System.IDisposable"
- Quali metodi hanno subito un refactoring recentemente e non sono completamente coperti dal test?
SELECT METHODS WHERE CodeWasChanged AND PercentageCoverage < 100
I risultati dei test, precedenti al Framework .NET 4.0, sono pubblicati in questa pagina:
http://blogs.msdn.com/brada/archive/2008/03/17/number-of-types-in-the-net-framework.aspx
L’analisi del Framework .NET 4.0 Beta 1 è pubblicata in questa pagina:
http://codebetter.com/blogs/patricksmacchia/archive/2009/05/21/a-quick-analyze-of-the-net-fx-v4-0-beta1.aspx
mentre le differenze tra la Beta 1 e la Beta 2 dello stesso Framework .NET sono qui:
http://codebetter.com/blogs/patricksmacchia/archive/2009/10/21/interesting-findings-in-the-diff-between-net-fx-v4-beta1-and-beta2.aspx
Un lavoro niente male, no?
Molti utilizzatori di Visual Studio 2008 chiedono, su vari forum e newsgroup, qual è la combinazione di tasti “per fare questo e per fare quello”.
Se anche voi avete il desiderio di imparare qualche scorciatoia di tastiera, dato che con la tastiera “si fa prima”, invece di farsi venire la sindrome del tunnel carpale agitando continuamente il mouse, potete scaricare questi due PDF:
Visual Basic 2008 Keybinding Reference Poster
http://www.microsoft.com/downloads/details.aspx?familyid=255B8CF1-F6BD-4B55-BB42-DD1A69315833&displaylang=en
Visual C# 2008 Keybinding Reference Poster
http://www.microsoft.com/downloads/details.aspx?FamilyID=e5f902a8-5bb5-4cc6-907e-472809749973&displaylang=en
Sono dei poster in inglese per VB 2008 e per C# 2008 che potete stampare (sia a colori che in tonalità di grigio) e affiggere vicino al computer, così non vi perdete nemmeno una scorciatoia di tastiera! Comodo, no?
Se avete la necessità di verificare lo stato della coda di stampa predefinita, potete utilizzare il namespace System.Printing che trovate però solo dal Framework .NET 3.0 in poi.
Per prima cosa dovete aggiungere un riferimento a System.Printing nella scheda Riferimenti delle proprietà del progetto.
Una volta aggiunto il riferimento, utilizzate un codice simile a questo:
Imports System.Printing
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim ps As New LocalPrintServer()
Dim pq As PrintQueue = ps.DefaultPrintQueue
Dim err As Boolean = pq.IsInError
If err = True Then
MessageBox.Show("Errore di stampante")
Else
MessageBox.Show("Nessun errore di stampante")
End If
End Sub
End Class
Da qualche tempo è nata la nuova piattaforma per i forum Microsoft e una parte di questa è preposta ad ospitare alcuni forum di Microsoft Italia.
L’indirizzo dei forum italiani è il seguente: http://social.microsoft.com/Forums/it-IT/categories
Da oggi, poi, sono stati creati anche alcuni forum dedicati agli sviluppatori, per le seguenti tecnologie/linguaggi:
- ASP.NET
- Silverlight
- Visual C#
- Visual C++
- Visual Basic (creato su mia proposta)
Microsoft sta puntando molto su questi forum, con la probabile intenzione di far perdere gradualmente interesse nei confronti dei newsgroup.
Quindi … “social-forum-izziamoci” 
(P.S. io e Alessandro Del Sole siamo i moderatori del forum dedicato a VB)
Spesso ci capita di conoscere varie tecniche per risolvere un nostro problema applicativo e/o di programmazione e non sappiamo quali di queste tecniche è più efficace dal punto di vista delle prestazioni, cioè quale impiega meno tempo a terminare l’esecuzione.
Le prestazioni di diversi algoritmi, talvolta, hanno una piccola differenza di tempo nell’esecuzione di singoli passi di programma, ma se moltiplichiamo la differenza di tempo per centinaia di migliaia di elementi da elaborare, il tempo totale diventa percepibile in modo pesante dall’utente. E’ quindi necessario sperimentare i vari algoritmi o frammenti di codice per verificare quale sia preferibile tra le varie possibilità.
Un modo semplice è quello di utilizzare un oggetto di classe TimeSpan, rilevando i “ticks” all’inizio del frammento di codice e alla fine del frammento, calcolando poi la differenza tra le due registrazioni.
I “tick” sono le più piccole unità di tempo in .NET, equivalenti a 100 nanosecondi.
Per esempio:
' ...
' prima registrazione
Dim ts1 As New TimeSpan(Now.Ticks)
' frammento di codice o ciclo da valutare
' ...
' registrazione finale e visualizzazione della differenza di tempo
Dim ts2 As New TimeSpan(Now.Ticks)
MessageBox.Show((ts2 - ts1).ToString)
' ...
Un metodo alternativo e anche più appropriato è il seguente
Dim ts1 As long = Environment.TickCount
…
MessageBox.Show((Environment.TickCount – ts1).ToString)
E’ una versione più appropriata, in quanto utilizza Environment che fa parte del Framework .NET, al posto della funzione Now che deriva dal vecchio VB6.
In questo modo sarà possibile esaminare i tempi di diversi algoritmi ed effettuare così la scelta del migliore, nel caso preso in esame.
Attenzione: non è un metodo che permette di effettuare dei veri e propri benchmark, perché i tempi di esecuzione spesso dipendono da molti altri fattori. Per esempio servizi e programmi attivi, disponibilità di RAM nel momento dell’esecuzione, carico del processore e così via. In ogni caso, il metodo proposto è un metodo empirico sufficientemente significativo e soprattutto semplice per fare delle valutazioni “a spanne” ma con dei dati alla mano. Per un migliore risultato e una maggiore sicurezza delle misurazioni è consigliabile ripetere la misurazione più volte.
Mi è stato fatto rilevare che con VB.NET è possibile dichiarare un array utilizzando una sintassi che prevede l’uso di un parametro, anziché un valore costante.
Nel mio libro su VB 2008, per esempio, in tutti gli esempi ho sempre utilizzato la forma:
Dim x(10) As Integer
ma con VB 2008 (e precedenti VB .NET) è possibile farlo anche con la seguente sintassi:
Dim numero As Integer = 10
Dim x(numero) As Integer
Ecco quindi che possiamo creare anche un array con dimensione variabile, utilizzando un valore random:
' prendiamo il numero di secondi dall’ora attuale
Dim seme As Integer = Now.Second
' creiamo un oggetto di tipo Random, utilizzando
' come seme il numero di secondi
Dim x As New Random(seme)
' definiamo il limite superiore dell’array
Dim limite As Integer = x.NextDouble * 100
' dichiariamo l’array con il parametro indicato
Dim arr0(limite) As String
' inseriamo in ciascun elemento il valore
' del suo indice
For i As Integer = 0 To arr0.GetUpperBound(0)
arr0(i) = i
Next
' visualizziamo il valore dell’ultimo elemento
MessageBox.Show(arr0.GetUpperBound(0))
Come già preannunciato da tempo, il nuovo libro dedicato a “SQL Server 2008 – Guida all’uso” è uscito il 31 Agosto 2009.
Nel frattempo, visto comunque che la mia principale “vocazione” è per Visual Basic, vi anticipo che l’undicesimo capitolo è interamente dedicato a Visual Basic 2008 alle modalità di accesso a un database di SQL Server 2008 e alle modalità di visualizzazione e aggiornamento dei dati: con i wizard e con comandi diretti, utilizzando un controllo DataGridView o controlli Windows Form, in data binding. Inoltre, nel decimo capitolo ci sono anche due esempi di creazione di stored procedure da Visual Studio 2008, in linguaggio VB.
Ho quindi il piacere di pubblicare gli esempi VB che potete scaricare liberamente e gratuitamente da questo link.
Sono certo che non ci saranno obiezioni da parte dell’editore anche nell’anticipazione del Capitolo 11 in PDF.
Questi esempi dovrebbero quanto meno soddisfare le necessità di chi ha difficoltà a “ingranare” con ADO.NET 2.0 per creare applicazioni in grado di leggere e modificare dati memorizzati in database di SQL Server 2008.
Per chi dovesse avere la necessità di inserire un file in un campo BLOB o, viceversa, estrarre un file da un campo BLOB utilizzando VB.NET e ADO.NET, con i provider OleDb e SqlClient, potrà farlo seguendo le indicazioni di questo articolo:
http://support.microsoft.com/kb/316887
L’articolo è un po’ vecchiotto (2004) ma sempre utile.
Personalmente, però, preferisco sempre la scelta di mantenere i file nel filesystem e di inserire nel database il solo riferimento alla posizione nel filesystem.
Se avete la necessità di aprire da Visual Studio 2008 un documento Word esistente oppure se volete creare un nuovo documento basato su un modello di Word, è necessario seguire una procedura ben precisa.
Innanzi tutto, è necessario scaricare e installare il prodotto “2007 Microsoft Office System Update: Redistributable Primary Interop Assemblies” da questa pagina: http://www.microsoft.com/downloads/details.aspx?FamilyID=59daebaa-bed4-4282-a28c-b864d8bfa513&displaylang=en. Esistono versioni di questo pacchetto anche per Office 2003 e XP. Infatti, l’interoperabilità con Office non fa parte di Visual Studio 2008 e bisogna installare le librerie a parte.
Una volta che avete estratto i file di installazione e licenza e avete installato le librerie (avviando il file .msi), dovreste trovarle nella cartella C:\Windows\assembly. Le riconoscete facilmente, perché iniziano tutte per Microsoft.Office.Interop.*. Al posto dell’asterisco trovate Word, Excel e così via.
La versione 12.0.0.0 delle librerie si riferisce a Office 2007, mentre la versione 11.0.0.0 si riferisce alla versione 2003.
Create un modello di Word 2007 (va bene anche il formato .doc di Word 2003) di nome “MioModello.dot” e posizionatelo nella vostra cartella Documenti predefinita.
Ora create un nuovo progetto in Visual Basic 2008, un normale progetto Applicazione Windows Form.
Aprite le proprietà del progetto e aggiungete il riferimento alle librerie appena installate (Microsoft.Office.Interop.*).
Terminata questa fase “preparatoria”, aggiungete un pulsante al form e, nel codice del gestore dell’evento Click del pulsante stesso, inserite quanto segue:
Dim oWord As Word.Application = CreateObject("Word.Application")
Dim oDoc As Word.Document
Dim strDocumentName As String = ""
oWord.Visible = True
strDocumentName = "C:\Users\Mario\Documents\MioDocumento.doc"
If Dir(strDocumentName) = "" Then
oWord.Documents.Add(My.Computer.FileSystem.SpecialDirectories.MyDocuments & _
"\MioModello.dot").SaveAs(FileName:=strDocumentName)
Else
oDoc = oWord.Documents.Open(strDocumentName)
End If
oWord.Activate()
oDoc = Nothing
oWord = Nothing
Dopo aver avviato il programma, premete il pulsante: se il documento MioDocumento.doc esiste già, verrà aperto in una finestra di Word. Se non esiste (come al primo avvio), verrà aperto un nuovo documento, con il nome MioDocumento.doc, con i contenuti del modello MioModello.dot.
Naturalmente se premete nuovamente il pulsante, dopo aver modificato e salvato il documento Word, verrà aperto questo nuovo documento.
A questo punto diventa estremamente semplice passare delle variabili al metodo per aprire qualsiasi documento Word si voglia o per creare qualsiasi documento basato su un modello di Word.
Non è una nuova tecnologia, né una nuova funzionalità di Visual Studio 2010, ma è un tipo di applicazione della tecnologia Speech Recognition (riconoscimento vocale).
Ammirate come si programma in Visual Studio semplicemente parlando:
Immaginate per esempio le opportunità che si possono mettere a disposizione a persone affette da qualche tipo di disabilità o di invalidità!
Se invece siete un po’ … esibizionisti, potreste andare in spiaggia e programmare semplicemente parlando al vostro portatile, stando distesi sul lettino a prendere il sole ed evitando di riempire la tastiera di crema per la protezione solare. 
Il metodo Replace di un oggetto stringa è case-sensitive, cioè tiene conto delle lettere maiuscole-minuscole. Per esempio, provate a eseguire questo codice:
Dim str As String = "Testo da Sostituire"
str = str.Replace("sostituire", "cancellare")
MessageBox.Show(str)
str = str.Replace("Sostituire", "cancellare")
MessageBox.Show(str)
Il risultato visualizzato dalla prima MessageBox sarà uguale alla stringa originale, perché “Sostituire” è diverso da “sostituire”, mentre con la seconda MessageBox otterremo effettivamente la sostituzione desiderata, perché abbiamo specificato esattamente la stringa così come appare nel testo originale.
Da questo esempio desumiamo che il metodo Replace è “case sensitive”, cioè tiene conto dei caratteri maiuscoli-minuscoli.
Come fare, quindi, a sostituire una stringa all’interno di un’altra stringa senza tenere conto della differenza maiuscole-minuscole, cioè quello che in inglese è definito “case insensitive”?
Possiamo per una volta scomodare le espressioni regolari: intendiamoci, non dobbiamo utilizzare strane sequenze di caratteri che a prima vista sembrano geroglifici. Basta utilizzare il metodo … Replace! Più facile di così… Il codice per ottenere questo risultato è il seguente:
Dim str As String = _
"trova PaRoLa e sostituisci con parola"
Dim strReplace As String = "parola"
str = Regex.Replace(str, "parola", _
strReplace, RegexOptions.IgnoreCase)
MessageBox.Show(str)
Attenzione che per utilizzare le espressioni regolari, dobbiamo anche importare il relativo namespace:
Imports System.Text.RegularExpressions
In questo caso vedremo che il risultato è perfettamente adatto al nostro scopo.
Dato che è una domanda che ricorre abbastanza frequentemente su alcuni newsgroup e anche in alcune e-mail che ho ricevuto, è doverosa una precisazione in merito alle varie versioni del Framework .NET.
Quando installate la versione 3.5 del Framework .NET, in realtà installate un’estensione della versione 3.0 che, a sua volta, è un’estensione della versione 2.0. Di conseguenza, se sviluppate con la versione 3.5, dovete avere necessariamente anche le versioni 2.0 e 3.0 (e naturalmente le avete anche installate o le installate insieme alla 3.5).
La versione 4.0 del Framework .NET non è un’estensione: è un Framework .NET completo che non richiede l’installazione o la presenza delle versioni precedenti.
Ciò non toglie che sulla stessa macchina possono (e devono poter) coesistere diversi programmi che fanno uso di versioni del Framework .NET. Inutile, quindi, chiedersi come disinstallare le versioni precedenti del Framework .NET: a meno che non abbiate veramente dei grossi problemi di spazio su disco (e non potete comprare un nuovo hard disk più capiente), potete anche lasciare tutte le versioni “storiche” lì dove sono!
Mentre nelle applicazioni per Windows Form non ci sono grosse novità a riguardo di nuovi controlli visuali (pare che questa tecnologia sia ormai destinata ad esaurirsi senza ulteriori aggiornamenti), c’è qualche miglioramento per quanto riguarda le applicazioni WPF.
I nuovi controlli visuali che ora sono a disposizione degli sviluppatori, nella Release Candidate di VS 2010 rispetto ai precedenti di VS 2008, sono:
Calendar
DataGrid
DatePicker
WebBrowser
Qualcosa sembra invece essersi “perso per strada” visto che dalla Beta 1 in poi non c’è più il controllo UniformGrid. Probabilmente è stato eliminato a favore del nuovo controllo DataGrid. In ogni caso è sempre possibile recuperarlo e disporlo nella casella degli strumenti, con la voce del menu contestuale Choose Toolbox Items, sezione WPF Components. Troverete che ci sono moltissimi altri componenti che non sono inseriti nella casella degli strumenti…
Come piccolo appunto, ritengo opportuno ribadire che la tecnologia Windows Form è probabilmente al capolinea. Naturalmente resterà a disposizione, perché è molto radicata e la stanno ancora utilizzando quasi tutti, ma non credo che ci saranno nuovi sviluppi o estensioni di questa tecnologia.
La tendenza, ormai, è quella di favorire lo sviluppo di WPF, una tecnologia che ci ha già fatto vedere cose strabilianti e che ora è perfino la tecnologia con la quale è stata sviluppata l’interfaccia grafica di Visual Studio 2010.