mario.deghetto

Visual Basic & .NET
posts - 319, comments - 203, trackbacks - 0

domenica 14 febbraio 2010

[VB.NET] Aprire un documento con l’applicazione predefinita

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.

posted @ domenica 14 febbraio 2010 5.49 | Feedback (0) |

[.NET Framework 4.0] Un po’ di numeri …

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?

posted @ domenica 14 febbraio 2010 5.48 | Feedback (0) |

Scorciatoie di tastiera di VB 2008 e di C# 2008

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?

posted @ domenica 14 febbraio 2010 5.39 | Feedback (0) |

#56 – [VB.NET] Verificare lo stato della coda di stampa predefinita

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

posted @ domenica 14 febbraio 2010 5.38 | Feedback (0) |

Nuovi forum Microsoft

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)

posted @ domenica 14 febbraio 2010 5.37 | Feedback (0) |

#55: [VB.NET] Misurare il tempo di esecuzione

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.

posted @ domenica 14 febbraio 2010 5.34 | Feedback (0) |

[VB.NET] Dichiarazione di un array con parametro

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))

posted @ domenica 14 febbraio 2010 5.29 | Feedback (0) |

Libro su SQL Server 2008 + esempi in VB 2008

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.

posted @ domenica 14 febbraio 2010 5.28 | Feedback (0) |

[VB.NET] Inserire o estrarre un file da un campo BLOB

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.

posted @ domenica 14 febbraio 2010 5.26 | Feedback (0) |

#54: [VB 2008] Apertura documento Word o creazione da modello

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.

posted @ domenica 14 febbraio 2010 5.24 | Feedback (1) |

Programmare in Visual Studio con Speech Recognition

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.   ;-)

posted @ domenica 14 febbraio 2010 5.20 | Feedback (0) |

#53: Sostituzione case-insensitive di una stringa all’interno di altra stringa

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.

posted @ domenica 14 febbraio 2010 5.18 | Feedback (0) |

[VS 2010 RC] Una precisazione sulle versioni del Framework .NET e la versione 4.0

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!

posted @ domenica 14 febbraio 2010 5.16 | Feedback (0) |

[VS 2010 RC] Controlli visuali per progetti WPF in Visual Basic

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.

posted @ domenica 14 febbraio 2010 5.13 | Feedback (0) |

Powered by: