VB & .NET - Mario De Ghetto

Visual Basic & .NET: programmare che passione!

Archivio per il 'Tips' Categoria

Suggerimenti e trucchi di programmazione

#43: Spostare un insieme di file in una diversa cartella con VB.NET (anche con LINQ)

Pubblicato da Mario De Ghetto su 8 Luglio 2008

Per spostare un file da una cartella a un’altra, possiamo utilizzare semplicemente il metodo My.Computer.FileSystem.MoveFile.

Il problema consiste nel fatto che questo metodo non consente di utilizzare i caratteri jolly e quindi non possiamo eseguire questa istruzione:

My.Computer.FileSystem.MoveFile( _

            “C:\Test1\*.jpg”, “C:\Test2\*.jpg”)

Abbiamo quindi la necessità di recuperare prima di tutto i nomi di tutti i file che rispondono a un determinato schema come *.jpg, poi potremo spostare i file singolarmente, utilizzando un ciclo For Each:

Imports System.IO

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, _

         ByVal e As System.EventArgs) Handles Button1.Click

      ‘ creazione array con elenco file *.jpg:

      Dim d As New DirectoryInfo(“C:\Test1″)

      Dim f As FileInfo() = d.GetFiles(“*.jpg”)

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

            “C:\Test1\” & fNext.Name, _

            “C:\Test2\” & fNext.Name)

      Next

   End Sub

End Class

Da qui possiamo poi creare una procedura riutilizzabile più volte, inserendola in un modulo di codice:

Imports System.IO

Module Utility

   Public Sub spostaGruppoFile(ByVal nomeFile As String, _

         ByVal dir1 As String, ByVal dir2 As String)

      ‘ creazione array con elenco file *.jpg:

      Dim d As New DirectoryInfo(dir1)

      Dim f As FileInfo() = d.GetFiles(nomeFile)

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

            dir1 & fNext.Name, _

            dir2 & fNext.Name)

      Next

   End Sub

End Module

Tale procedura può essere chiamata semplicemente come segue, passando il nome del file o lo schema (con i caratteri jolly), la cartella di origine e la cartella di destinazione:

spostaGruppoFile(“*.jpg”, “C:\Test1\”, “C:\Test2\”)

Ovviamente è possibile passare una qualsiasi parte del nome dei file che vogliamo selezionare, non solo l’estensione. Per esempio:

 

Imports System.IO

Module Utility

   Public Sub spostaGruppoFile(ByVal nomeFile As String, _

         ByVal dir1 As String, ByVal dir2 As String)

      ‘ creazione array con elenco file:

      Dim d As New DirectoryInfo(dir1)

      Dim f = From elenco In d.GetFiles(nomeFile) _

              Select elenco.Name

      ‘ ciclo di spostamento:

      For Each fNext In f

         My.Computer.FileSystem.MoveFile( _

             dir1 & fNext, _

             dir2 & fNext)

      Next

   End Sub

End Module

 

 

Pubblicato su Tips | Non ci sono Commenti »

#42: Abbreviare la dimensione di un file con VB.NET

Pubblicato da Mario De Ghetto su 2 Luglio 2008

Come tutti i programmatori sanno, in informatica vengono utilizzate delle abbreviazioni per indicare l’unità di misura per la dimensione di un file, della RAM o di un hard disk: per esempio un file di 1.024 byte equivale a un file di 1 “kB”.

Le abbreviazioni utilizzate attualmente sono le seguenti:

  • kiloByte –> kB –> 1.024 (circa 10^3)
  • MegaByte –> MB –> 1.048.576 (circa 10^6)
  • GigaByte –> GB –> 1.073.741.824 (circa 10^9)
  • TeraByte –> TB –> 1.099.511.627.776 (circa 10^12)
  • PetaByte –> PB –> 1.125.899.906.842.620 (circa 10^15)
  • ExaByte –> EB –> 1.152.921.504.606.850.000 ( circa 10^18 )
  • ZettaByte –> ZB –> 1,180.591.620.717.41E+21 (circa 10^21)
  • YottaByte –> YB –> 1,208.925.819.614.63E+24 (circa 10^24)

Per noi programmatori potrebbe quindi essere utile avere una funzione in grado di abbreviare un numero molto grande, così da avere una rappresentazione molto più compatta. Il seguente codice fa proprio questo:

Module Module1

   Public Function ConvertiByte( _

         ByVal strNumero As String) As String

      Dim risultato As String

      Dim potenza As Integer = 0

      Dim nByte As Decimal = 0

      ‘ verifico se è stato passato un parametro:

      ‘ se si, lo converto nel tipo Decimal

      ‘ se no, esco

      ‘TODO: aggiungere verifica se è un numero valido!

      If strNumero <> “” Then

         Try

            nByte = CType(strNumero, Decimal)

         Catch ex As Exception

            Return “Numero troppo grande: Overflow”

         End Try

      Else

         Return “Errore: nessun numero da valutare”

      End If

      ‘ ciclo di riduzione del numero, estraendo

      ‘ il numero di iterazioni effettuate

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1024

         potenza += 1

      Loop

      ‘ conversione in stringa con arrotondamento

      risultato = Decimal.Round(nByte, 2).ToString

      ‘ aggiunta della giusta unità di misura

      Select Case potenza

         Case 0

            risultato &= ” byte”

         Case 1

            risultato &= ” KB”

         Case 2

            risultato &= ” MB”

         Case 3

            risultato &= ” GB”

         Case 4

            risultato &= ” TB”

         Case 5

            risultato &= ” PB”

         Case 6

            risultato &= ” EB”

         Case 7

            risultato &= ” ZB”

         Case 8

            risultato &= ” YB”

         Case Else

            risultato = “Non valutabile”

      End Select

      Return risultato

   End Function

End Module

A questo punto basta creare un form, aggiungere una casella di testo e un pulsante. Il codice per gestire l’evento Click del pulsante è il seguente:

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, _

         ByVal e As System.EventArgs) Handles Button1.Click

      MessageBox.Show(ConvertiByte(Me.TextBox1.Text))

   End Sub

End Class

Semplice vero? Ma proviamo a migliorare un po’ la nostra funzione. E’ sufficiente sostituire tutto il codice seguente al commento “aggiunta della giusta unità di misura”:

      ‘ aggiunta della giusta unità di misura

      Dim misure() As String = _

         {“byte”, “KB”, “MB”, “GB”, “TB”, “PB”, “EB”, “ZB”, “YB”}

      If potenza > 8 Then

         risultato &= ” Non valutabile”

      Else

         risultato &= ” “ & misure(potenza)

      End If

      Return risultato

Con una semplice modifica, poi, possiamo fare in modo che la nostra funzione rappresenti un’abbreviazione di potenze di 10^3. Per esempio (i punti di separazione delle migliaia sono inseriti solo per chiarezza visiva):

- 1.000 –> 1 x 10^3
- 1.000.000 –> 1 x 10^6
- 55.555.555.555 –> 55,56 x 10^9

Ecco quindi la nostra funzione modificata:

Module Module1

   Public Function ConvertiByte( _

         ByVal strNumero As String) As String

      Dim risultato As String

      Dim potenza As Integer = 0

      Dim nByte As Decimal = 0

      ‘ verifico se è stato passato un parametro:

      ‘ se si, lo converto nel tipo Decimal

      ‘ se no, esco

      ‘TODO: aggiungere verifica se è un numero valido!

      If strNumero <> “” Then

         Try

            nByte = CType(strNumero, Decimal)

         Catch ex As Exception

            Return “Numero troppo grande: Overflow”

         End Try

      Else

         Return “Errore: nessun numero da valutare”

      End If

      ‘ ciclo di riduzione del numero, estraendo

      ‘ il numero di iterazioni effettuate

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1000

         potenza += 1

      Loop

      ‘ conversione in stringa con arrotondamento

      risultato = Decimal.Round(nByte, 2).ToString

      ‘ aggiunta della giusta unità di misura

      risultato &= ” x 10^” & (potenza * 3).ToString

      Return risultato

   End Function

End Module

Come potete vedere, le uniche differenze sono date dal diverso divisore (1000 anziché 1024) e nella parte finale, dove viene composta la stringa che viene restituita dalla funzione al codice chiamante.

Una precisazione, prima che qualcuno possa pensare che si tratti di un errore. Il seguente codice:

      Do While ((nByte / 1000) >= 1)

         nByte = nByte / 1024

         potenza += 1

      Loop

potrebbe apparire strano o perfino sbagliato. Perché confronto la divisione per 1000 e poi divido per 1024?

E’ molto semplice: nel caso in cui, per esempio, volessi abbreviare 1000 byte, con il confronto per 1024 otterrei la non esecuzione dell’abbreviazione e quindi il risultato sarebbe “1000 byte” anziché “0,98 KB”. Di solito è abbastanza brutto veder superare il valore di 1000 in questi casi e quindi si preferisce comunque arrivare al massimo a 999 (confrontate per esempio con la visualizzazione dell’Esplora Risorse di Windows).

Una curiosità: notate come sia possibile, in VB.NET, scrivere una cosa del genere:

(potenza * 3).ToString

senza dover memorizzare il calcolo matematico in una variabile.

C’è ancora qualcuno che non è convinto a passare a VB.NET?   :-)

Pubblicato su Tips | Non ci sono Commenti »

#41: Scaricare il contenuto HTML di una pagina web con VB.NET

Pubblicato da Mario De Ghetto su 29 Giugno 2008

Nel precedente post abbiamo visto come è possibile estrarre il testo semplice da una pagina HTML registrata sul disco fisso. In questo post, invece, vedremo come è possibile scaricare il contenuto HTML di una pagina web, fornendo semplicemente l’URL, e come da questa è possibile estrarre il testo semplice.

Procediamo per gradi: innanzi tutto creiamo una nostra classe (ScaricaURL) per gestire la comunicazione con il web server.

Imports System.Text

Imports System.IO

Imports System.Net

Public Class ScaricaURL

   Private m_strURL As String

   Public Sub SetURL(ByVal strURL As String)

      m_strURL = strURL

   End Sub

   Public Function Scarica() As String

      Dim wreq As WebRequest = WebRequest.Create(m_strURL)

      Dim wres As WebResponse = wreq.GetResponse()

      Dim iBuffer As Integer = 0

      Dim buffer( 128 ) As [Byte]

      Dim stream As Stream = wres.GetResponseStream()

      iBuffer = stream.Read(buffer, 0, 128 )

      Dim strRes As New StringBuilder(“”)

      While iBuffer <> 0

         strRes.Append(Encoding.ASCII.GetString(buffer, 0, iBuffer))

         iBuffer = stream.Read(buffer, 0, 128 )

      End While

      Return strRes.ToString()

   End Function

End Class

Successivamente inseriamo in un form: due pulsanti (Button1 e Button2) e un textbox (TextBox1). Quest’ultimo dovrà essere configurato come nel post precedente: proprietà Multiline a True e Scrollbar verticale.

Il codice dei gestori degli eventi Click dei due pulsanti sono i seguenti:

Public Class Form1

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

      Dim URL As String

      URL = “http://community.visual-basic.it/mario/” & _
         “archive/2008/06/29/23164.aspx”

      Dim objScaricaURL As New ScaricaURL

      objScaricaURL.SetURL(URL)

      Me.TextBox1.Text = objScaricaURL.Scarica

   End Sub

   Private Sub Button2_Click(ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles Button2.Click

      Dim URL As String

      URL = “http://community.visual-basic.it/mario/” & _
         “archive/2008/06/29/23164.aspx”

      Dim objScaricaURL As New ScaricaURL

      objScaricaURL.SetURL(URL)

      Me.TextBox1.Text = _
         System.Text.RegularExpressions.Regex.Replace( _
         objScaricaURL.Scarica, “<[^>]*>”, “”)

   End Sub

End Class

Vedrete quindi che premendo il primo pulsante il programma scaricherà la pagina e visualizzerà il relativo codice HTML, mentre nel secondo caso scaricherà la pagina ed estrarrà solamente il testo semplice, eliminando tutti i tag HTML.

Pubblicato su Tips | Non ci sono Commenti »

#40: Estrarre il testo da una pagina HTML con VB.NET

Pubblicato da Mario De Ghetto su 29 Giugno 2008

Le espressioni regolari sono uno strumento estremamente potente per estrarre del testo da una pagina HTML registrata su disco.

Una delle cose più interessanti è il fatto che possiamo raggiungere questo obiettivo con una sola riga di codice!

Ecco qui la nostra funzione:

Public Function EstraiTestoDaHTML(ByVal HTML As String) As String

   ‘ rimuove i tag HTML

   Return System.Text.RegularExpressions.Regex.Replace( _

      HTML, “<[^>]*>”, “”)

End Function

 

… ed ecco il codice, inserito nel gestore dell’evento Click di un pulsante:

Dim testoHTML As String

testoHTML = My.Computer.FileSystem.ReadAllText(“C:\paginaX.html”)

Me.TextBox1.Text = EstraiTestoDaHTML(testoHTML)

 

A questo punto basta inserire una casella di testo di nome TextBox1, impostare la sua proprietà Multiline a True e definire la scrollbar verticale e il gioco è fatto!

 

Pubblicato su Tips | Non ci sono Commenti »

#39: Aggiungere un collegamento ai Preferiti con VB.NET

Pubblicato da Mario De Ghetto su 29 Giugno 2008

Tempo addietro ho avuto la necessità di creare un piccolo programma per aggiungere un collegamento ai Preferiti, per permettere a un numero consistente di utenti dell’azienda dove lavoro di collegarsi a un nostro sito interno, nella Intranet aziendale.

Il programma è estremamente semplice, come si può vedere dal seguente codice:

Public Class Form1

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

      CreaShortcut(“Prova”, “http://www.visual-basic.it”)

   End Sub

 

   Public Sub CreaShortcut(ByVal Titolo As String, ByVal URL As String)

      ‘ crea uno shortcut nella cartella Preferiti

      Dim strCartellaPreferiti As String

      ‘ recupera la cartella Preferiti

      strCartellaPreferiti = System.Environment.GetFolderPath( _

         Environment.SpecialFolder.Favorites)

      ‘ crea uno shortcut basato su Titolo

      Dim objSW As System.IO.StreamWriter = _

         System.IO.File.CreateText(strCartellaPreferiti & _

         “\” & Titolo & “.url”)

      ‘ scrive l’URL nel file

      objSW.WriteLine(“[InternetShortcut]“)

      objSW.WriteLine(“URL=” & URL)

      ‘ chiude il file

      objSW.Close()

   End Sub

End Class


 

Nel form ho inserito un pulsante che semplicemente richiama la Sub CreaShortcut, passandogli il titolo del collegamento e l’indirizzo (URL) del collegamento vero e proprio.

Nella Sub CreaShortcut, invece, viene prima di tutto recuperato il percorso della cartella speciale dei Preferiti, poi viene aperto uno stream per la scrittura del file, all’interno del quale vengono inserite due righe di testo: la prima con un “tag” speciale che specifica che il file costituisce una “scorciatoia” a un indirizzo internet e la seconda con l’URL vero e proprio. Infine il file viene correttamente chiuso.

N.B.: questo mio post fa parte di alcuni suggerimenti di programmazione per i quali traggo ispirazione, spesso, da richieste che vedo nelle liste VB T&T oppure in giro per la Rete. Spero che vi possano interessare…   :-)

Pubblicato su Tips | Non ci sono Commenti »

#38: spostare un file nel Cestino con VB.NET

Pubblicato da Mario De Ghetto su 28 Giugno 2008

Per permettere agli utenti dei vostri programmi di spostare un file nel Cestino di Windows (alias “Recycle Bin”) dobbiamo utilizzare una funzione della libreria di sistema shell32.dll.

Per rendere più semplici le cose, potete utilizzare il seguente modulo di codice:

Imports System.IO

Module SpostaFileCestino

    Private Structure ShFileOpStruct

        Dim hwnd As Integer

        Dim wFunc As Integer

        Dim pFrom As String

        Dim pTo As String

        Dim fFlags As Short

        Dim fAnyOperationAborted As Boolean

        Dim hNameMappings As Integer

        Dim lpszProgressTitle As String

    End Structure

 

    Private Const SFC_DELETE As Short = &H3S

    Private Const SFC_ALLOWUNDO As Short = &H40S

    Private Const SFC_NOCONFIRMATION As Short = &H10S

 

    Private Declare Function ShFileOperation _

        Lib “shell32.dll” _

        Alias “SHFileOperationA” _

        (ByRef lpFileOp As ShFileOpStruct) As Integer

 

    Public Function Ricicla(ByRef sPath As String) As Integer

        Dim FileOp As ShFileOpStruct

        If Not File.Exists(sPath) Then

            MessageBox.Show(“File “ & sPath & ” non trovato.”)

            Return -1

            Exit Function

        End If

        With FileOp

            .wFunc = SFC_DELETE

            .pFrom = sPath & vbNullChar

            .pTo = vbNullChar

            .fFlags = SFC_NOCONFIRMATION Or SFC_ALLOWUNDO

            .lpszProgressTitle = “Invio file “ & _

                sPath & ” al Cestino di Windows.”

        End With

        Try

            ShFileOperation(FileOp)

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

        Return 0

    End Function

End Module 

 

 

Infine, per utilizzare effettivamente la funzione Ricicla potete fare riferimento al seguente esempio:

Dim esito As Integer = 0

esito = Ricicla(“C:\prova.txt”)

If esito = -1 Then

   MessageBox.Show(“Errore: operazione annullata!”)

Else

   MessageBox.Show(“Spostamento nel Cestino “ & _

      “eseguito correttamente.”)

End If

 

 

 

L’utilizzo non richiede ulteriori commenti, dato che è sufficiente passare alla funzione Ricicla il nome del file completo del percorso.

Pubblicato su Tips | Non ci sono Commenti »

#37: Trucco per commentare blocchi di codice con VB.NET

Pubblicato da Mario De Ghetto su 23 Giugno 2008

Come è noto a tutti i programmatori Visual Basic, con questo linguaggio non è possibile commentare blocchi di codice o di testo e ci si deve rassegnare a commentare riga per riga con l’apice singolo (’). I programmatori C#, C++ e JAVA, invece, hanno una sintassi specifica estremamente comoda che si presenta così:

/*
   Qui posso scrivere quello che voglio
   senza nessun problema!!
*/

Con il seguente trucco, però, possiamo simulare la stessa situazione di cui sopra: è sufficiente utilizzare la direttiva #If … #End If.

Create una nuova applicazione Windows Forms (linguaggio Visual Basic) e aggiungete un pulsante nel form principale. Sostituite poi il codice sottostante con il seguente:

Public Class Form1
   Private Sub Button1_Click( _
       
ByVal sender As System.Object, _
         ByVal e As System.EventArgs) _
         Handles Button1.Click
      MessageBox.Show(”Trucco per ” & _
         “
commentare blocchi di codice…”)

#If False Then
   MessageBox.Show(”Questo non dovrebbe apparire…”)
   Posso scrivere qualsiasi cosa!
#End If

      MessageBox.Show(”Fine trucco!”)
   End Sub
End Class

Eseguendo il programma, vedrete apparire il primo messaggio (”Trucco per…”) e poi l’ultimo messaggio (”Fine trucco!”), mentre tutto ciò che è stato inserito nel blocco #If … #End If è totalmente ignorato, sia che si tratti di un’istruzione valida, sia che si tratti di puro testo.

Certo, non è così ordinato e intuitivo come la coppia /* … */ di C#, ma è utile per commentare velocemente parti di codice che vogliamo temporaneamente disattivare o per inserire lunghi commenti descrittivi.

Come funziona? Il blocco #If … #End If è tecnicamente una direttiva per il compilatore: quest’ultimo, trovando #If, eseguirà il test indicato subito dopo. Se il test risulterà negativo (False), come nel caso sopra illustrato, ignorerà tutto ciò che troverà successivamente fino a #End If, se invece risulterà positivo (True), eseguirà il codice contenuto al suo interno.

Uno degli usi più importanti di questa direttiva è, oltre tutto, eseguire del codice condizionale a seconda che ci si trovi in modalità di DEBUG o in modalità RELEASE.

Pubblicato su Tips | Non ci sono Commenti »

#36: Calcolare il tempo di esecuzione di un frammento di codice (VB.NET)

Pubblicato da Mario De Ghetto su 12 Giugno 2008

Sviluppando o studiando una nuova tecnica, in un qualsiasi linguaggio di programmazione, spesso abbiamo bisogno di avere una valutazione oggettiva del tempo di esecuzione di più frammenti di codice, per poter valutare quale dei due impiega meno tempo. Infatti il minore tempo di esecuzione di certe parti di codice, specialmente quelle ripetute più volte nel corso del programma o utilizzate in più parti del programma stesso, ha per conseguenza un minore tempo di esecuzione dell’intero programma e quindi migliori prestazioni che vengono percepite positivamente dall’utente.

In questo post vedremo quindi come si crea e come si utilizza una classe in grado di memorizzare il momento iniziale di un test e la differenza tra un momento successivo e il momento iniziale.

La classe è la seguente:
 

Public Class Cronometro

   Private inizio As DateTime

   Private durata As TimeSpan

   Public Sub New()

      inizio = New DateTime

      durata = New TimeSpan

   End Sub

   Public Sub ferma()

      durata = CType(DateTime.Now.Subtract(inizio), TimeSpan)

   End Sub

   Public Sub avvia()

      GC.Collect()

      GC.WaitForPendingFinalizers()

      inizio = DateTime.Now

   End Sub

   Public ReadOnly Property Result() As TimeSpan

      Get

         Return durata

      End Get

   End Property

End Class

 

Le istruzioni GC.Collect() e GC.WaitForPendingFinalizers() servono per avviare la “raccolta della spazzatura” da parte del Garbage Collector, cioè l’eliminazione degli oggetti non più utilizzati. Infatti, come sappiamo, gli oggetti non vengono eliminati immediatamente al termine del loro utilizzo, ma rimangono in memoria finché il Garbage Collector non decide di eliminarli. In particolare la seconda istruzione (GC.WaitForPendingFinalizers) attende che siano terminati tutti i metodi Finalizer degli oggetti in corso di eliminazione.

Perché avviare esplicitamente il Garbage Collector? E’ presto detto: vogliamo che nel corso del nostro test non avvenga la “raccolta dei rifiuti” che rallenterebbe l’esecuzione e causerebbe l’invalidazione del test stesso.

In un’applicazione Console possiamo poi testare la classe Cronometro con questo codice:

Option Strict On

Imports System.Console

Module Module1

   Sub Main()

      Dim numeri(99999) As Integer

      BuildArray(numeri)

      Dim tObj As New Cronometro()

      tObj.avvia()

      ScriviNumeri(numeri)

      tObj.ferma()

      Console.WriteLine(“tempo in secondi: “ & _

         tObj.Result.TotalSeconds)

      Console.Read()

   End Sub

   Sub BuildArray(ByVal arr() As Integer)

      Dim indice As Integer

      For indice = 0 To 99999

         arr(indice) = indice

      Next

   End Sub

   Sub ScriviNumeri(ByVal arr() As Integer)

      Dim indice As Integer

      For indice = 0 To arr.GetUpperBound(0)

         Console.Write(arr(indice) & ” “)

      Next

   End Sub

End Module

 

Quella che abbiamo visto è la soluzione “classica” che viene spesso utilizzata e che, peraltro, va bene con qualsiasi linguaggio OOP (anche quelli non-.NET, fatti gli opportuni adattamenti).

E’ possibile ottenere una soluzione più ordinata e pulita utilizzando la classe System.Diagnostics.Stopwatch, implementata in tutti i Framework .NET dalla versione 2.0 in poi. Per esempio questo è il codice di un’applicazione Console che fa uso di tale classe:

Public Class Test

    Shared Sub main()

        Dim str As String = “”

        Dim watch As New System.Diagnostics.Stopwatch()

        watch.Start()     ‘ avvio del cronometro

        ‘ … fai qualcosa …

        Dim i As Integer = 0

        For i = 1 To 100

            str &= “*”

            Console.WriteLine(“<” & str & “>”)

        Next

        watch.Stop()    ‘ stop del cronometro

        Console.WriteLine(“Tempo impiegato: “ + watch.Elapsed.ToString())

        Console.ReadLine()

    End Sub

End Class

 

Attenzione che il test può non funzionare perfettamente in tutti i casi: se il nostro computer è pieno di programmi e servizi in esecuzione, potremmo ottenere dei risultati non corretti. In particolare, quando dobbiamo confrontare i tempi di due versioni di codice diverse (per esempio due algoritmi di ordinamento diversi), lo stato del computer dovrebbe essere il più possibile uguale in entrambe le esecuzioni, altrimenti si rischia di falsare i risultati.

Il consiglio è sempre quello, se possibile, di utilizzare un’installazione “pulita”, con solo i programmi e i servizi indispensabili per l’esecuzione del programma e del relativo test.

 

Pubblicato su Tips | Contrassegnato da tag: , , | Non ci sono Commenti »

#35: Cancellare la lista dei progetti

Pubblicato da Mario De Ghetto su 5 Giugno 2008

Sono molti i programmatori che sentono la mancanza di un metodo per cancellare la lista (o una parte della lista) dei progetti nell’ambiente di sviluppo.

L’unico modo per farlo è quello di intervenire a livello di registro di sistema, eliminando le chiavi contenute nelle seguenti voci di registro:

Visual Studio 2008 Professional:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList

Visual Basic 2008 Express:

HKEY_CURRENT_USER\Software\Microsoft\VBExpress\9.0\ProjectMRUList

Visual Web Developer 2008 Express:

HKEY_CURRENT_USER\Software\Microsoft\VWDExpress\9.0\ProjectMRUList

Visual C# 2008 Express:

HKEY_CURRENT_USER\Software\Microsoft\VCSExpress\9.0\FileMRUList

NOTA - attenzione alle modifiche che apportate al registro di sistema: basta molto poco per danneggiare l’installazione di Windows!

*** AGGIORNAMENTO ***

Su questo argomento si sono “sbizzarriti” anche, dapprima, Alessandro Del Sole che ha pubblicato nel suo blog l’annuncio di un add-in creato da lui stesso e pubblicato su Code Gallery di MSDN, poi Diego Cattaruzza che ha pubblicato nel suo blog l’annuncio di un “non-add-in” per le versioni Express.

In conclusione, ora avete anche degli strumenti più “user-friendly” per eliminare la lista dei progetti anche senza rischiare di maneggiare maldestramente il registro di sistema!

Pubblicato su Tips | 2 Commenti »

#34: Problema di duplicazione menu con IDE di VS 2008 Pro

Pubblicato da Mario De Ghetto su 5 Maggio 2008

A ogni avvio, VS 2008 Professional (Trial) aveva iniziato a segnalare l’impossibilità di caricare alcuni pacchetti (add-in o altri) e per ognuno consigliava di digitare “devenv /ResetSkipPkgs” da riga di comando per risolvere il problema.
Oggi ho eseguito tale comando e il risultato è che… i menu si sono duplicati al loro interno e quadruplicati nel loro insieme! In pratica questo è il menu principale risultante:

File File Modifica Modifica Visualizza Visualizza Strumenti Strumenti Test Test Finestra Finestra ? ? File File Modifica Modifica Visualizza Visualizza Strumenti Strumenti Test Test Finestra Finestra ? ? File File Modifica Modifica Visualizza Visualizza Strumenti Strumenti Test Test Finestra Finestra ? ? File File Modifica Modifica Visualizza Visualizza Strumenti Strumenti Test Test Finestra Finestra ? ?

E’ vero che le voci sono ugualmente accessibili, ma è anche vero che è abbastanza fastidioso, oltre al fatto che occupa spazio prezioso.

Ho provato a reinstallare con il CD di setup utilizzando l’opzione “ripara” e fortunatamente ha funzionato.

Mi piacerebbe proprio sapere il motivo per cui quel comando ha dato un esito così infausto…

 

Pubblicato su Tips | Non ci sono Commenti »

#33: Creare un GUID con Visual Studio 2008

Pubblicato da Mario De Ghetto su 21 Aprile 2008

Questa tip è un po’ diversa dal solito perché non presenta codice, ma mostra una funzionalità dell’IDE di Visual Studio 2008 Professional.

Infatti l’IDE di Visual Studio 2008 Professional offre la possibilità di creare automaticamente un GUID, cioè un Globally Unique Identifier, adatto anche all’uso nel registro di sistema. Alcuni esempi di GUID sono i seguenti:

{8ED66C10-25DC-4d49-9A7B-17E400202B81}
{B359036E-53BD-492f-AE3C-28D8771759A0}
{D310A47C-E9CD-48db-86B0-88439C7E5344}

La funzione per creare il GUID la trovate nel menu Strumenti > Crea GUID: scegliendo il formato “Registry format” otterrete proprio una stringa simile a quelle mostrate qui sopra. Se poi ne volete creare più di una, è sufficiente premere più volte il pulsante “New GUID” e naturalmente copiare ciascun GUID con il pulsante “Copy” (la copia avviene negli appunti di Windows, quindi bisogna poi “riversare” il codice GUID con CTRL+V da qualche altra parte).

Pubblicato su Tips | Contrassegnato da tag: | Non ci sono Commenti »

#32: Elencare hard disk con spazio libero disponibile

Pubblicato da Mario De Ghetto su 18 Aprile 2008

In realtà la tip che presento oggi elenca gli hard disk ma anche gli eventuali dischi di altro tipo che dovessero essere disponibili nel sistema. Dato che alcune unità possono essere al momento prive di disco (es. l’unità per floppy disk A:, unità con disco removibile, lettori CD/DVD ecc.), è necessario gestire l’eccezione che interromperebbe l’esecuzione del programma.

Per provare questa tip è sufficiente creare un form, aggiungere un pulsante e una TextBox, impostare quest’ultima a “MultiLine” e inserire il seguente codice:

Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, _
        
ByVal e As System.EventArgs) Handles Button1.Click
      Dim driveInfo As System.IO.DriveInfo() = _
         System.IO.DriveInfo.GetDrives()
      For Each d As System.IO.DriveInfo In driveInfo
         Try
            TextBox1.Text += “Drive: “ + d.Name.ToString _
               + System.Environment.NewLine +
“Size: “ _
               + d.TotalSize.ToString + System.Environment.NewLine _

               + “Free Space: “ + d.TotalFreeSpace.ToString _
               + System.Environment.NewLine + System.Environment.NewLine
         Catch ex As Exception
            ‘ ignora gli errori dovuti a dischi “non hard disk”
            ‘ es. A:\ oppure lettori CD/DVD e unità non pronte
            ‘ (senza disco)
         End Try
      Next
   End Sub
End Class 

 

Ecco un esempio del risultato che possiamo ottenere:

Esempio tip #32

 

Pubblicato su Tips | Non ci sono Commenti »

#31: Aprire file XLS