Mario De Ghetto

Microsoft MVP – Visual Basic (VB.NET: Programmare che passione!)

Archivio per Gennaio 2009

[WPF] Un tutorial video di Corrado Cavalli su MSDN

Pubblicato da Mario De Ghetto su 30 Gennaio 2009

Sul blog del Team di MSDN Italia è stata annunciata la pubblicazione di alcuni video di Corrado Cavalli sulla nuova piattaforma video MSDN.

Questa serie di video forma un tutorial su WPF (Windows Presentation Foundation). Ovviamente il tutorial è estremamente consigliato a cui volesse avvicinarsi a questa tecnologia, come anche a chi si è già avvicinato ma vuole imparare qualcosa di più, perché non c’è niente di meglio che poter vedere in pratica cosa si può fare e sentire la spiegazione dalla viva voce di uno dei più esperti italiani in materia.

I primi video pubblicati sono i seguenti, ma vi consiglio di dare sempre un’occhiata alla piattaforma video MSDN, perché ci saranno molte altre novità:

  • Introduzione a WPF
  • Nuovi concetti per lo sviluppatore Windows Forms (prima parte)
  • Nuovi concetti per lo sviluppatore Windows Forms (seconda parte)
  • Databinding
  • WPF nel mondo reale: architettura e pattern Model-View-ViewModel

     

     

  • Pubblicato su Novità | Lascia un commento »

    Conversione di file CSV con VB 2008

    Pubblicato da Mario De Ghetto su 23 Gennaio 2009

    Spesso mi è capitato, e ancora oggi mi capita, di avere a che fare con file CSV (file di testo con “Campi Separati da Virgola”) che, aperti con Excel, vengono caricati senza separare i vari campi. In pratica, ogni riga (record) viene inserito nella corrisponte cella della prima colonna.

    Il motivo è semplice: questi file CSV sono stati creati con sistemi le cui impostazioni internazionali sono impostate secondo il sistema americano, con la virgola per la separazione del campo e il punto per separare i valori interi dai decimali. Nelle impostazioni italiane, invece, ovviamente è diverso: la virgola è il separatore dei decimali, mentre il punto e virgola è il separatore dei campi.

    Come risolvere questo problema per poter caricare i dati in un foglio Excel?

    Una prima soluzione che ho tentato è quella di sostituire tutti i separatori direttamente in Excel, salvando poi nuovamente in file CSV. Il risultato è deludente, in quanto Excel registra, sì, le modifiche, ma circonda ciascuna riga da doppi apici, rendendo ugualmente impossibile la lettura campo per campo.

    Una seconda soluzione è quella di aprire NotePad e fare la sostituzione manuale, prima da virgola a punto e virgola e poi da punto a virgola. Questa soluzione risolve il problema ma è macchinosa, un po’ difficile da ricordare e poi straordinariamente LENTA.

    Da qui mi è venuto in mente che tutto questo lavoro può essere fatto in modo più efficace con un programmino di utilità, naturalmente in VB 2008 (anche la versione 2.0 del Framework .NET va bene, quindi si può fare anche in VB 2005).

    Ho creato un nuovo progetto di tipo Applicazione Windows Form e ho inserito due controlli Label (il nome non ha importanza) e quattro caselle di testo: txtCartella e txtFile per caricare rispettivamente il nome della cartella (per aprire sempre la stessa cartella se i file da convertire sono più di uno) e il nome del file, nonché txtTestoDaConvertire e txtTestoConvertito, più grandi e multilinea, con ovvio significato.

    Poi ho creato un menu per gestire le varie azioni da eseguire. Il menu ha la seguente struttura:

    • File
      … Apri
      …… Cartella
      …… File
      … Salva
      … Chiudi file
      … Esci
    • Conversione
      … CSV inglese –> CSV italiano
      … CSV italiano –> CSV inglese

    Infine ho inserito i seguenti controlli, per gestire tutte le operazioni su file e nel menu: MenuStrip, StatusStrip, ToolStrip, FolderBrowserDialog, OpenFileDialog e SaveFileDialog.

    Il form ha quindi il seguente aspetto finale:

    CSVconverterForm

    Infine, il codice che ho inserito è il seguente:

    Public Class Form1
       Private Sub CartellaToolStripMenuItem_Click(ByVal sender _
               As System.Object, ByVal e As System.EventArgs) _
               Handles CartellaToolStripMenuItem.Click
          Dim nomeCartella As String = ""
          If FolderBrowserDialog1.ShowDialog = _
                 Windows.Forms.DialogResult.OK Then
             nomeCartella = FolderBrowserDialog1.SelectedPath
          End If
          Me.txtCartella.Text = nomeCartella
       End Sub
    
       Private Sub FileToolStripMenuItem1_Click(ByVal sender _
               As System.Object, ByVal e As System.EventArgs) _
               Handles FileToolStripMenuItem1.Click
          Dim nomeFile As String = ""
          OpenFileDialog1.InitialDirectory = Me.txtCartella.Text
          If OpenFileDialog1.ShowDialog = _
                 Windows.Forms.DialogResult.OK Then
             nomeFile = OpenFileDialog1.FileName
          End If
          Me.txtFile.Text = nomeFile
          Me.txtTestoDaConvertire.Text = _
               My.Computer.FileSystem.ReadAllText(Me.txtFile.Text)
       End Sub
    
       Private Sub ToolStripMenuItem2_Click(ByVal sender _
               As System.Object, ByVal e As System.EventArgs) _
                    Handles ToolStripMenuItem2.Click
          Dim nomeFile As String = Me.txtFile.Text
          Dim nomeCompleto As String = ""
          SaveFileDialog1.FileName = nomeFile
          If SaveFileDialog1.ShowDialog = _
                  Windows.Forms.DialogResult.OK Then
             nomeCompleto = SaveFileDialog1.FileName
             My.Computer.FileSystem.WriteAllText( _
                  nomeCompleto, Me.txtTestoConvertito.Text, False)
          Else
             MessageBox.Show("Operazione annullata")
          End If
       End Sub
    
       Private Sub Label2_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Label2.Click
          If Me.txtFile.Enabled = True Then
             Me.txtFile.Enabled = False
          Else
             Me.txtFile.Enabled = True
          End If
       End Sub
    
       Private Sub Label1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Label1.Click
          If Me.txtCartella.Enabled = True Then
             Me.txtCartella.Enabled = False
          Else
             Me.txtCartella.Enabled = True
          End If
       End Sub
    
       Private Sub CSVIngleseCSVItalianoToolStripMenuItem_Click( _
               ByVal sender As System.Object, ByVal e As System.EventArgs) _
               Handles CSVIngleseCSVItalianoToolStripMenuItem.Click
          Me.txtTestoConvertito.Text = Me.txtTestoDaConvertire.Text
          Me.txtTestoConvertito.Text = Me.txtTestoConvertito.Text.Replace(",", ";")
          Me.txtTestoConvertito.Text = Me.txtTestoConvertito.Text.Replace(".", ",")
          Me.txtTestoConvertito.Text = Me.txtTestoConvertito.Text.Replace( _
               System.Environment.NewLine, System.Environment.NewLine)
       End Sub
    
       Private Sub CSVItalianoCSVIngleseToolStripMenuItem_Click( _
               ByVal sender As System.Object, ByVal e As System.EventArgs) _
               Handles CSVItalianoCSVIngleseToolStripMenuItem.Click
          Me.txtTestoConvertito.Text = Me.txtTestoDaConvertire.Text
          Me.txtTestoConvertito.Text = Me.txtTestoConvertito.Text.Replace(",", ".")
          Me.txtTestoConvertito.Text = Me.txtTestoConvertito.Text.Replace(";", ",")
       End Sub
    
        Private Sub EsciToolStripMenuItem_Click(ByVal sender _
                 As System.Object, ByVal e As System.EventArgs) _
                 Handles EsciToolStripMenuItem.Click
            Me.Close()
        End Sub
    
        Private Sub ChiudiFileToolStripMenuItem_Click(ByVal sender _
                 As System.Object, ByVal e As System.EventArgs) _
                 Handles ChiudiFileToolStripMenuItem.Click
            Me.txtTestoDaConvertire.Text = ""
            Me.txtTestoConvertito.Text = ""
        End Sub
    End Class
    

    Il punto chiave, è nei metodi CSVIngleseCSVItalianoToolstripMenuItem e nell’opposto CSVItalianoCSVIngleseToolStripMenuItem.

    In questi metodi emerge chiaramente che la conversione “inversa” avviene non solo sostituendo i due valori da sostituire, nell’ambito della stessa istruzione di conversione, ma anche scambiando le due istruzioni che utilizzano il metodo Replace. Solo così, infatti, è possibile effettuare una conversione corretta ed eventualmente ripetere la conversione per ripristinare la situazione precedente.

    Pubblicato su Novità | 1 Commento »

    #49: Leggere lo stato di un servizio con VB.NET

    Pubblicato da Mario De Ghetto su 7 Gennaio 2009

    Supponiamo di avere un’applicazione inserita nel menu “Esecuzione automatica” e che tale applicazione abbia la necessità di accedere automaticamente a un database collegato a un’istanza di SQL Server 2008 Express locale.

    Nel caso in cui il computer sia appena stato acceso, potrebbe verificarsi un ritardo di avvio del servizio di SQL SERVER e quindi potremmo ottenere un errore di connessione dalla nostra applicazione.

    Dobbiamo quindi verificare che il servizio MSSQL$SQLEXPRESS sia già stato avviato, così da permettere alla nostra applicazione di restare in attesa o, addirittura, di avviare il servizio prima di procedere alle operazioni programmate.

    Per verificare che il servizio sia stato avviato, possiamo utilizzare il seguente frammento di codice che include sia la direttiva di importazione dell’opportuno namespace, sia il codice del metodo che legge lo stato del servizio, sia il codice del metodo principale che testa il metodo di lettura dello stato.

    Imports System.ServiceProcess
    
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button1.Click
            Dim nomeServizio As String = "MSSQL$SQLEXPRESS"
            Dim risposta As Boolean = StatoServizio(nomeServizio)
            MessageBox.Show("Servizio " & nomeServizio & " = " & risposta)
        End Sub
        Private Function StatoServizio(ByVal nomeServizio As String) As Boolean
            Dim risultato As Boolean = False
    
            Dim mySCMs() As ServiceController
            mySCMs = ServiceController.GetServices()
    
            Dim mySCMTemp As ServiceController
    
            For Each mySCMTemp In mySCMs
                If mySCMTemp.ServiceName = nomeServizio Then
                    If mySCMTemp.Status = ServiceControllerStatus.Running Then
                        risultato = True
                    Else
                        risultato = False
                    End If
                    mySCMTemp.Close()
                    Exit For
                End If
            Next
            Return risultato
        End Function
    End Class

    Naturalmente è sufficiente cambiare il nome del servizio da verificare per avere la possibilità di conoscere lo stato (“Avviato” oppure no) di qualsasi servizio installato.

    Il significato dei valori della proprietà ‘Status‘ sono i seguenti:

    1 – Stopped = Il servizio non è in esecuzione

    2 – StartPending = Il servizio si sta avviando

    3 – StopPending = Il servizio si sta fermando

    4 – Running = Il servizio è in esecuzione

    5 – ContinuePending = Il servizio si sta riavviando

    6 – PausePending = Il servizio si sta ponendo in pausa

    7 – Paused = Il servizio è in pausa


    Pubblicato su Novità | Lascia un commento »

    La serie di tip di Sara Ford si chiude

    Pubblicato da Mario De Ghetto su 7 Gennaio 2009

    Nel blog di Sara Ford è apparso alcuni giorni fa l’annuncio che il tip #382 sarà l’ultimo della serie (http://blogs.msdn.com/saraford/archive/2008/12/19/did-you-know-that-today-s-tip-on-msinfo32-exe-ends-the-series-382.aspx). Da questo momento, Sara si occuperà di sviluppo di progetti per CodePlex.

    Naturalmente il blog non sparirà e quindi i 382 tip su Visual Studio rimarranno disponibili a chi vorrà consultarli. Ricordo a tale proposito che io e Aldo Donetti stiamo lavorando (compatibilmente con il tempo disponibile) alla loro sistematica traduzione in italiano. Trovate la versione italiana del blog di Sara, limitatamente ai tip, qui: http://blogs.msdn.com/sarafordita/.

    Pubblicato su Novità | Lascia un commento »

    MSDN Magazine – traduzione automatica in italiano

    Pubblicato da Mario De Ghetto su 7 Gennaio 2009

    Purtroppo devo dare una brutta notizia a chi aveva l’abitudine di leggere gli articoli di MSDN Magazine nella versione italiana (http://msdn.microsoft.com/it-it/magazine/default.aspx): Microsoft ha deciso di attivare anche qui i meccanismi di traduzione automatica per supportare un maggiore numero di lingue.

    Ovviamente, come già abbiamo più volte appurato nella Knowledge Base (KB), le traduzioni automatiche sono estremamente inefficienti e rendono spesso il testo completamente illeggibile, costringendo il lettore che volesse capire qualcosa di più a passare alla versione originale in inglese.

    Anche la traduzione automatica di MSDN Magazine non si sottrae a questa situazione e, sebbene le traduzioni siano un po’ migliorate, si trovano ancora delle frasi espresse in modo innaturale, per noi italiani, o addirittura incomprensibili.

    Microsoft, però, questa volta ha fatto qualcosa di più: ha implementato un sistema per farsi aiutare dai lettori. Infatti, nelle pagine che contengono gli articoli tradotti, vedrete che il testo è diviso in due parti, verticalmente: la parte sinistra è la versione originale in inglese mentre la parte destra è la versione tradotta nella lingua desiderata (nel nostro caso in italiano). Gli iscritti alla Community hanno la possibilità di selezionare singolarmente ciascuna frase e, premendo il pulsante “Modifica”, potranno disporre di un riquadro che permette di suggerire la traduzione più corretta.

    Insomma, un sistema “ibrido” che coinvolge persone che volontariamente possono decidere di collaborare con Microsoft per fornire un servizio più accurato per tutti gli sviluppatori e/o tecnici di sistemi Microsoft.

    Questo sistema avrà maggiore successo delle traduzioni automatiche implementate nella KB? Ai posteri l’ardua sentenza …

    Pubblicato su Novità | 3 Commenti »

    CodeProject: algoritmo delle 8 regine in VB.NET

    Pubblicato da Mario De Ghetto su 6 Gennaio 2009

    Come sicuramente sa chi ha studiato gli algoritmi (indipendentemente dal linguaggio utilizzato), uno dei problemi più interessanti è quello di trovare tutte le soluzioni del problema delle “8 Regine”.

    Per chi non conoscesse il gioco degli scacchi, la Regina si può spostare orizzontalmente o diagonalmente per un numero di caselle pari alle caselle che trova libere, quindi anche da un’estremità all’altra della scacchiera. La scacchiera è formata da 8 x 8 caselle e su tale scacchiera devono poter trovare posto 8 Regine, senza che ciascuna Regina sia posta sulla stessa riga, sulla stessa colonna o sulla stessa diagonale di un’altra Regina.

    Su CodeProject è disponibile il codice sorgente di un programma scritto in VB.NET che risolve il problema delle 8 Regine: http://www.codeproject.com/KB/vb/EightQueensProblem.aspx.

    Il programma permette di visualizzare tutte le soluzioni possibili oppure di provare a trovare la propria personale soluzione.

    Pubblicato su Novità | Lascia un commento »