Archivi Blog

#47: VB.NET – ADO.NET 2.0 – Supporto a Vista 64 bit e Access 2007

Prendendo spunto da una discussione nel forum dedicato a VB & .NET (http://www.visual-basic.it/forum/thread.asp?m=163649) della Community Visual Basic Tips & Tricks (www.visual-basic.it), ma anche da un mio problema personale proprio su questo argomento, ho pensato che fosse opportuno fissare un paio di appunti e di precisazioni, in particolare sull’uso del Provider JET 4.0 per l’accesso ai database in formato Access 2007 e sul problema del sistema operativo Windows Vista a 64 bit.

Partiamo dal caso dei 64 bit. Come molti sapranno, Vista è distribuito in due edizioni: a 32 bit, che è la piattaforma che molti di noi sono abituati ad utilizzare da molto tempo, e a 64 bit. Prossimamente, le nuove versioni di Windows arriveranno esclusivamente a 64 bit e quindi ci dobbiamo abituare a convivere con questa nuova piattaforma, con le sue particolarità.

Il problema deriva dal fatto che Windows Vista a 64 bit non supporta JET 4.0, in quanto questo provider dati è fornito solo a 32 bit.

Le alternative per risolvere questo problema sono sostanzialmente due:

  • evitare di utilizzare Access e orientarsi direttamente all’uso di SQL Server Express, Compact o edizioni superiori (consigliato!);
  • compilare il progetto Visual Basic 2008 o Visual C# 2008 con il solo supporto per la piattaforma x86 (cioè a 32 bit).

Per questa seconda possibilità, dobbiamo eseguire i seguenti passi:

  1. fare click con il pulsante destro del mouse sul nome del progetto e scegliere “Proprietà”;
  2. passare alla scheda “Compilazione”;
  3. fare click sul pulsante “Opzioni di compilazione avanzate”;
  4. nella combo “CPU di destinazione” selezionare “x86″, anziché “AnyCPU”.

A questo punto potremo eseguire l’applicazione anche su Vista a 64 bit, tenendo però conto che la nostra applicazione non sarà compilata a 64 bit ma bensì a 32 bit. Questo potrebbe comportare qualche problema nel futuro, se Microsoft deciderà prima o poi di chiudere il supporto ai 32 bit sui sistemi operativi a 64 bit.

Vediamo ora come si utilizza il provider JET 4.0 per Access: in particolare le stringhe di connessione ai database Access cambiano a seconda che utilizziamo Access 2003 o Access 2007:

' Access 2003:
Dim stringaconn As String = _
    "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
    "c:\test\prova2.mdb"

' Access 2007:
Dim stringaconn As String = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=c:\test\prova2.accdb;" & _
    "Persist Security Info=False;"

Per maggiori dettagli sulle stringhe di connessione di ciascun provider dati (anche non-Access), date un’occhiata al sito www.connectionstrings.com.

Scriviamo quindi il programma finale per inserire un record in una tabella Access (2003 o 2007):

  1. creiamo un nuovo progetto in Visual Basic 2008;
  2. nel form predefinito aggiungiamo due TextBox di nome txtCognome e txtNome, nonché un pulsante per eseguire il frammento di codice;
  3. inserire il seguente codice a livello di form (di nome Form1):
Imports System.Data.OleDb

Public Class Form1
   Private Sub cmdInserisci_Click(ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles cmdInserisci.Click

      ' Access 2003:
      'Dim stringaconn As String = _
      '    "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
      '    "c:\test\prova2.mdb"

      ' Access 2007:
      Dim stringaconn As String = _
         "Provider=Microsoft.ACE.OLEDB.12.0;" & _
         "Data Source=c:\test\prova2.accdb;" & _
         "Persist Security Info=False;"

      Dim objconn As New OleDbConnection(stringaconn)
      objconn.Open()
      Dim stringasql As String = _
         "Insert into prova2(Cognome,Nome) " & _
         "values(@cognome, @nome)"
      Dim objcomm As New OleDbCommand(stringasql, objconn)
      objconn = New OleDbConnection(stringaconn)
      objconn.Open()
      objcomm = New OleDbCommand(stringasql, objconn)
      objcomm.Parameters.Add(New OleDbParameter("@cognome", _
         Me.txtCognome.Text))
      objcomm.Parameters.Add(New OleDbParameter("@nome", _
         Me.txtNome.Text))
      Try
         Dim righeAggiornate As Integer = objcomm.ExecuteNonQuery
         If righeAggiornate = 1 Then MessageBox.Show("tutto bene")
      Catch ex As Exception
         MessageBox.Show(ex.Message & _
            Environment.NewLine & ex.StackTrace, "Errore")
      Finally
         objconn.Close()
         Me.txtCognome.Text = ""
         Me.txtNome.Text = ""
         Me.txtCognome.Focus()
      End Try
   End Sub
End Class

Naturalmente, per utilizzare alternativamente Access 2003 o Access 2007, è sufficiente commentare/decommentare la definizione della stringa di connessione opportuna.

[VB.NET] Valutazione di espressioni grazie a System.Reflection

Mi è capitato più volte di leggere delle richieste di funzioni per la valutazione di espressioni matematiche, tipo questa:

3+2*((5*3)-(20/10))

Una buona soluzione è stata scritta da Corrado Cavalli in un post di “MSDN Tips & Tricks” e precisamente utilizzando le librerie System.Reflection e System.CodeDom. Il post, realizzato con codice VB.NET e C#, si trova qui.

#46: VB.NET – impedire lo spostamento di un form

Prendo l’occasione di una discussione intercorsa oggi nella lista/forum “dotnet” di VB T&T, tra me e Riccardo Girardi, il quale aveva la necessità di trovare il modo per bloccare la posizione di un form. La gestione dell’evento di spostamento del form stesso non andava bene, perché causava un brutto sfarfallìo (flickering).

Ho trovato nel blog di Luciano Bastianello il codice in C# con cui viene realizzata questa funzionalità e l’ho convertito in VB.NET, con una correzione da parte di Riccardo Girardi:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
   Const WM_NCLBUTTONDOWN As Integer = 161
   Const WM_SYSCOMMAND As Integer = 274
   Const HTCAPTION As Integer = 2
   Const SC_MOVE As Integer = 61456
   If (m.Msg = WM_SYSCOMMAND) AndAlso _
         (m.WParam.ToInt32() = SC_MOVE) Then
      Return
   End If
   If (m.Msg = WM_NCLBUTTONDOWN) AndAlso _
         (m.WParam.ToInt32() = HTCAPTION) Then
      Return
   End If
   MyBase.WndProc(m)
End Sub

E’ sufficiente inserire questo codice all’interno del codice del form da bloccare e il gioco è fatto.

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

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.

 

Capitolo 10 del libro su Visual Basic 2008

Ho concordato con l’editore la pubblicazione di un capitolo di esempio del mio nuovo libro “Visual Basic 2008 spiegato a mia nonna”. Il capitolo di esempio è il 10° e riguarda menu, finestre di dialogo, stampa e così via: Capitolo 10 di esempio (PDF 2 Mb)(ZIP 1,4 Mb).

Ricordo a chi fosse interessato che ho annunciato l’uscita del libro proprio ieri con il post https://deghetto.wordpress.com/2008/04/01/e-uscito-il-mio-nuovo-libro-su-visual-basic-2008/, dove potete trovare la scheda del libro, il booksite, tutti gli esempi del libro liberamente scaricabili e l’elenco degli argomenti trattati, nonché l’indice completo del libro.

E’ uscito il mio nuovo libro su Visual Basic 2008

Ho il piacere di annunciare che è iniziata la distribuzione del mio nuovo libro su Visual Basic 2008, dal titolo “Visual Basic 2008 spiegato a mia nonna“, 576 pagine, edito da FAG Milano, prezzo 39,00 Euro.

Il libro sarà disponibile on-line dal sito www.fag.it e nelle librerie specializzate con la seguente tempistica:

  • da oggi stesso per gli acquisti online;
  • entro questa settimana in tutta la Lombardia e presso i principali bookshop online (IBS, BOL eccetera);
  • entro la prossima settimana nelle librerie in tutta Italia.

 Alcuni link utili sono i seguenti:

Ecco l’elenco dettagliato degli argomenti trattati nel libro:

Cap. 1 – Il primo capitolo è introduttivo, per avvicinare gradualmente il lettore alla programmazione senza spaventarlo dai nuovi concetti a cui andrà incontro. Ecco perché, quindi, abbiamo adottato uno stile molto discorsivo e amichevole (in informatica diremmo user friendly) in grado di mostrare al lettore cos’è la programmazione, basandoci su oggetti comunemente usati. Potranno anche avere una piccola simpatica sorpresa tutti coloro che pensano che il computer non possa fare il caffè!

Cap. 2 – Il secondo capitolo introduce le caratteristiche principali del Framework .NET e del linguaggio Visual Basic, con un breve cenno su tutte le più importanti tecnologie correlate.

Cap. 3 – Nel terzo capitolo iniziamo a vedere l’ambiente di sviluppo realmente in azione. Potrete quindi vedere quali strumenti visuali principali troverete all’avvio del software e alcune indicazioni sul loro uso.

Cap. 4 – Il quarto capitolo potremmo definirlo un male necessario: non si può parlare di un linguaggio di programmazione senza prima capire cosa sono le variabili e i tipi di dato. In questo capitolo esamineremo quindi tutti i tipi di dato elementari e vedremo come si utilizzano.

Cap. 5 – Nel quinto capitolo continuiamo il discorso dei tipi di dati elementari introducendo le matrici. Anche in questo capitolo ci sarà molto codice per vedere l’uso pratico di queste strutture.

Cap. 6 – Con il sesto capitolo iniziamo a vedere le istruzioni del linguaggio Visual Basic e molti esempi sulle istruzioni condizionali e sulla programmazione strutturata.

Cap. 7 – Finalmente, nel settimo capitolo, tratteremo in modo esteso la programmazione orientata agli oggetti. Come vedrete, la programmazione  in .NET è completamente orientata agli oggetti: in .NET tutto è un oggetto, anche l’utente! Vedremo quindi molti esempi per scrivere delle buone classi e per gestire correttamente gli oggetti.

Cap. 8-9 – I capitoli ottavo e nono riguardano rispettivamente i form e i controlli basati sulla tecnologia Windows Forms. Questi argomenti fanno parte della programmazione visuale e, tutto sommato, sono forse la parte più divertente della programmazione. Alla fine di ciascun capitolo abbiamo inserito dei brevi cenni sulla nuova tecnologia emergente per la programmazione visuale: Windows Presentation Foundation (WPF).

Cap. 10 – Il decimo capitolo illustra l’uso di tutte le finestre comuni di dialogo e dei menu. Con questo obiettivo, abbiamo realizzato un’applicazione di esempio perfettamente funzionante che ci permette di gestire i file di testo.

Cap. 11 – Nel capitolo undicesimo trattiamo un argomento molto importante: la gestione degli errori o, come si dice in .NET, la gestione delle eccezioni. Sebbene questo argomento compaia in una posizione molto avanzata del libro, è un argomento che va sempre tenuto presente tra le principali attenzioni del programmatore.

Cap. 12 – Il capitolo dodicesimo fornisce numerose informazioni per la gestione delle stringhe e dei file di testo.

Cap. 13 – Nel tredicesimo capitolo abbiamo spiegato in modo approfondito l’uso dell’oggetto My, disponibile solo agli sviluppatori di Visual Basic e non a quelli di C#. My è un oggetto che mette a disposizione del programmatore numerosi oggetti e proprietà più comunemente utilizzati, con una semplicità disarmante.

Cap. 14 – Il quattordicesimo e ultimo capitolo introduce la più recente tecnologia per l’accesso ai dati e precisamente LINQ. Vengono spiegate le novità apportate al linguaggio e alla gestione delle classi e degli oggetti quale presupposto per l’utilizzo di LINQ e vengono mostrati alcuni esempi della sintassi di quest’ultimo per la gestione dei dati.

Appendici - Ho messo a disposizione anche quattro appendici: la prima illustra passo per passo le installazioni delle versioni Espress e Professional e della documentazione di MSDN Library, mentre le altre tre forniscono alcune tabelle accessorie che talvolta è utile avere a portata di mano.

Ovunque troverete anche molto codice Visual Basic: mini-programmi di prova per spiegare in modo semplice una tecnica e qualche programma completo e funzionante.

Tutti gli elementi dell’interfaccia grafica e dell’ambiente di sviluppo (nomi di finestre, voci di menu, ecc.) sono tratti dalla versione in lingua italiana e, tra parentesi, dalla versione in lingua inglese. Questa scelta è stata fatta per accontentare sia chi vuole utilizzare il software nella nostra lingua, sia per chi ritiene più opportuno utilizzarlo nella lingua originale. Questa impostazione è altresì utile per facilitare le ricerche nella documentazione MSDN, dato che i documenti migliori sono sempre espressi in lingua inglese.

FEEDBACK: spero che il libro vi piacerà. In ogni caso, come ho già più volte affermato, sono graditi consigli, suggerimenti, critiche e segnalazioni di errori (e-mail mario@deghetto.it). Qualunque cosa possa aiutarmi a migliorare, sarà ben accetto. Gli insulti saranno immediatamente cestinati     -)

Libro su Visual Basic 2008 – aggiornamento

AGGIORNAMENTO {QUI}:

https://deghetto.wordpress.com/2008/04/01/e-uscito-il-mio-nuovo-libro-su-visual-basic-2008/

#25: Conversione di data e ora in stringa

Per convertire un dato di tipo DateTime in stringa formattata, possiamo utilizzare una delle forme del metodo ToString. Il seguente esempio mostra come è possibile ricavare la data e ora corrente, solo la data corrente e solo l’ora corrente:

Dim dt As DateTime
dt = DateTime.Now
‘ data e ora:
Dim dataOra As String = dt.ToString
‘ solo data in formato GG/MM/AAAA:
Dim data As String = dt.ToString(“dd/MM/yyyy”)
‘ solo ora in formato HH.MM.SS (ore da 0 a 23):
Dim ora As String = dt.ToString(“T”)
‘ stampa i tre valori:
Dim s As String = dataOra & Environment.NewLine & _
    data & Environment.NewLine & ora
MessageBox.Show(s)

Il risultato sarà simile al seguente:

27/02/2008 20.36.23
27/02/2008
20.36.23

 

#24: Limite superiore e inferiore di un array

Per trovare i limiti superiore e inferiore di un array monodimensionale (vettore), in VB6 avevamo le funzioni UBound() e LBound().

Con VB.NET dobbiamo invece utilizzare due metodi messi a disposizione dall’array, cioè GetUpperBound e GetLowerBound, come nel seguente esempio:

Dim a() As Integer = {1, 2, 3} 
Dim limiteSuperiore As Integer = a.GetUpperBound(0) 
Dim limiteInferiore As Integer = a.GetLowerBound(0)

#23 Cancellare tutti i file di una cartella

Per cancellare tutti i file contenuti in una cartella, possiamo utilizzare una semplice routine come questa:

Public Sub SvuotaDir(ByVal cartella As String)
    Dim di As IO.DirectoryInfo = _
            New IO.DirectoryInfo(cartella)
    For Each oFile As IO.FileInfo In di.GetFiles()
        oFile.Delete()
    Next
End Sub

E’ necessario passare alla Sub una stringa contenente il percorso della cartella da svuotare (compreso l’identificativo del drive). Ecco un esempio di utilizzo, con un pulsante nel form per avviare la cancellazione dei file: 

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Dim cartella As String = “”
        cartella = “C:prova”
        SvuotaDir(cartella)
        MessageBox.Show(“Fatto!”)
    End Sub
    Public Sub SvuotaDir(ByVal cartella As String)
        Dim di As IO.DirectoryInfo = _
                New IO.DirectoryInfo(cartella)
        For Each oFile As IO.FileInfo In di.GetFiles()
            oFile.Delete()
        Next
    End Sub
End Class

#22 Salvare la schermata tramite la clipboard

Per implementare in un nostro programma il salvataggio su file del contenuto dello schermo possiamo utilizzare una tecnica come quella seguente che non fa uso di API di sistema ma utilizza la clipboard. 

In sostanza:
- mettiamo un controllo Image e un pulsante in un form
- inseriamo il seguente codice:

Private Sub Button1_Click(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) Handles Button1.Click 
    Me.PictureBox1.Image = My.Computer.Clipboard.GetImage() 
    Dim frmImage As System.Drawing.Imaging.ImageFormat 
    frmImage = System.Drawing.Imaging.ImageFormat.Jpeg 
    Me.PictureBox1.Image.Save("C:\immagine.jpg", frmImage) 
End Sub

Dopo aver avviato il programma, se vogliamo salvare il contenuto dello schermo:
- premiamo il tasto “Stamp”
- premiamo il pulsante Button1
… e automaticamente il controllo Image visualizzerà il contenuto della clipboard, salvando il tutto nel file C:\immagine.jpg.
Se dovesse servire un altro formato di file immagine non serve fare altro che cambiare la definizione

frmImage = System.Drawing.Imaging.ImageFormat.Jpeg

con un altro formato, per esempio

frmImage = System.Drawing.Imaging.ImageFormat.Bmp

[VB.NET] Proposte di argomenti da sviluppare

Con questo post vorrei aprire una sperimentazione un po’ al di fuori dell’uso normale di un blog: ho visto nelle statistiche di WordPress.com (che ospita questo blog) che molti visitatori cercano in questo blog argomenti ai quali potrei rispondere in modo agevole, altri probabilmente meno (o addirittura, in alcuni casi, non c’entrano nulla).

Mi piacerebbe quindi aprire un dialogo con voi per verificare se posso aiutarvi meglio, ma naturalmente voi dovete aiutarmi ad aiutarvi!   :-)

Vi chiedo quindi di inserire dei commenti a questa pagina con delle richieste di suggerimenti di programmazione, chiarimenti, segnalazioni di articoli, avvisi e quant’altro potrebbe aiutarmi a preparare del materiale da mettere a disposizione di tutti i visitatori. Non garantisco, al momento, di poter rispondere a tutti i quesiti, ma conoscendo le vostre necessità posso cercare di organizzarmi in tal senso.

Non è una proposta di una nuova Community: ce ne sono tante che trattano argomenti di Visual Basic (per esempio le principali sono Visual Basic Tips&Tricks e ASP Italia) e quindi non avrebbe senso. L’obiettivo è invece quello di rendere questo blog più interessante e utile per chi viene a visitarlo.

Proviamo a crescere insieme…  Happy coding!   :-)

[VB.NET] Salvare la stringa di connessione al database

In alcuni articoli che ho pubblicato in questo blog ho spiegato come sia possibile utilizzare una stringa per connettersi a un database e come sia possibile e doveroso salvarla in un file di configurazione dell’applicazione.

Qualche lettore mi ha chiesto come sia possibile modificare a runtime la stringa di connessione memorizzata nel file di configurazione, visto che con My.Settings non è possibile farlo, dato che è a sola lettura.

Cercando su CodeProject ho trovato questo articolo interessante che risolve proprio questo problema: “How to persist changes to My.Settings.ConnectionStrings“.

Le tecniche illustrate non sono particolarmente complesse e quindi possono essere agevolmente utilizzate da chiunque, senza particolari problemi.

Alla fine dell’articolo, l’autore si raccomanda di verificare che nelle proprietà dell’applicazione sia impostata la proprietà “Salva My.Settings alla chiusura“.

[VB.NET] Controlli visuali aggiuntivi “free” e a pagamento

Un po’ per non dimenticarli e un po’ per soddisfare eventuali richieste di altri interessati, ecco un elenco di siti dai quali è possibile scaricare dei controlli visuali aggiuntivi.

Controlli a pagamento:

Non c’è nulla di meglio, mi si dice, di http://www.infragistics.com/
Un’altra possibilità interessante è questa: http://www.devexpress.com/

Controlli free:

http://www.purecomponents.com/products/nicepanel/default.aspx 
             Costo licenza per sviluppo: zero (si fanno pagare i sorgenti)
http://www.ideablade.com/index.html
http://www.componentfactory.com/
http://www.codeplex.com/
Microsoft Visual Basic 2005 Power Packs 2.0

Attenzione che per Visual Studio 2008, il Power Pack è già incluso, mentre per la versione 2005 deve essere scaricato e installato a parte.

#18 Conversione da numero decimale a binario

Per convertire un numero intero in numero binario possiamo utilizzare la classe BitArray che converte un array di numeri in un array di bit. Per rappresentare la sequenza di bit, poi, utilizziamo una stringa e, per separare visivamente ogni byte, aggiungiamo anche uno spazio separatore:

Dim numero As Integer = 32767 
Dim numDecimale() As Integer = {numero} 
Dim numBinario As New BitArray(numDecimale) 
Dim str As String = "" 
Dim contaBit As Integer = 0 
For i As Integer = (numBinario.Count - 1) To 0 Step -1 
    If contaBit = 8 Then 
        str &= " " 
        contaBit = 0 
    End If 
    If numBinario.Item(i) = False Then 
        str &= "0" 
    Else 
        str &= "1" 
    End If 
    contaBit += 1 
Next 
MessageBox.Show(str)

Con il numero intero 32767 otteniamo la stringa seguente:

00000000 00000000 01111111 11111111

[VB.NET e LINQ to SQL] Interrogare DBMS multipli nella stessa query

Spesso si verifica la necessità di interrogare dei dati provenienti da fonti eterogenee, per esempio alcuni presenti in un database di Microsoft Access e altri in un database di SQL Server.

L’articolo “LINQtoSQL: Query multiple databases in one LINQ expression and more…” pubblicato su CodeProject permette di comprendere le tecniche che stanno alla base dell’estrazione di dati provenienti da fonti diverse. Corredato da esempio in VB.NET.

[VB6-VB.NET] Add-in per l’interoperabilità dei form

Per chi non conoscesse l’add-in gratuito “Interop Forms Toolkit 2.0“, voglio sottolineare una sua caratteristica fondamentale: permette di estendere un progetto VB6, permettendo di utilizzare dei form di Visual Basic.NET direttamente da un’applicazione VB6.

Questo agevola sicuramente chi ha sviluppato un’applicazione “enorme” in VB6 e non si può permettere di perdere molto tempo nell’effettuare la migrazione dell’intero progetto sotto .NET. In questo modo viene garantita la produttività, almeno a breve termine, con una facile estensione del progetto iniziale con nuove funzionalità che VB.NET offre nativamente.

[VB.NET-C#] Convertitore di codice VB.NET-C#

Se avete la necessità di convertire delle porzioni di codice o intere classi da VB.NET a C# e viceversa, potete utilizzare questa utile pagina gratuita:

http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx

Per utilizzarla, prima scegliete il linguaggio (VB.NET o C#) e inserite o incollate il codice. Poi premete il pulsante “Convert to…” e aspettate: poco dopo avrete il codice convertito nell’altro linguaggio!

#16 Inviare e-mail in formato HTML con allegati

Per inviare un’e-mail con allegati e per di più in formato HTML non c’è niente di meglio che una manciata di codice VB.NET, come potete vedere dal seguente codice:

Imports System.Text
Public Class Form1
   Dim strBody As _
      New StringBuilder("Ciao da Mario De Ghetto!,")
   Dim objMail As New System.Net.Mail.MailMessage()
   Dim strPath As String = "C:\prova.txt"
   Dim strFrom As String = "mittente@dominio.com"
   Dim strTo As String = "destinatario@libero.it"
   Private Sub Button1_Click(ByVal sender _
         As System.Object, _
         ByVal e As System.EventArgs) _
         Handles Button1.Click
      strBody.Append("<br>")
      strBody.Append("<br>")
      strBody.Append("<strong>Testo di prova</strong>")
      strBody.Append("<br>")
      strBody.Append("<br>")
      strBody.Append("<br>")
      strBody.Append("Cordiali saluti.")
      strBody.Append("<br>")
      strBody.Append("Ditta XYZ")
      strBody.Append("<br>")
      Dim frmaddress As _
         New System.Net.Mail.MailAddress(strFrom)
      Dim attachement As _
         New System.Net.Mail.Attachment(strPath)
      objMail.To.Add(strTo)
      objMail.From = frmaddress
      objMail.Subject = "Invio documento allegato: " & strPath
      objMail.Priority = Net.Mail.MailPriority.High
      objMail.IsBodyHtml = True
      objMail.Body = strBody.ToString
      If strPath <> "" Then
         objMail.Attachments.Add(attachement)
      End If
      Dim SmtMail As _
         New System.Net.Mail.SmtpClient("smtp.libero.it")
      SmtMail.Send(objMail)
      MessageBox.Show("Mail spedita!")
   End Sub
End Class

Il codice è abbastanza chiaro. Ovviamente dovrete personalizzare i dati, come l’indirizzo del vostro server SMTP, l’indirizzo del mittente e del destinatario e così via. Se vi auto-inviate l’e-mail, potrete verificare che effettivamente c’è l’allegato e che il testo è in formato HTML.

[ASP.NET 2.0]: user control in VB e in C# nello stesso sito

Introduzione
Fin dall’uscita di Visual Studio 2005, mi ha affascinato la possibilità di utilizzare diversi linguaggi nello stesso progetto.
Il principio è semplice, ma allo stesso tempo geniale: dato che ogni parte del codice di un linguaggio viene tradotta in un linguaggio intermedio (MSIL), è possibile combinare sorgenti di linguaggi differenti, per esempio VB e C#, per creare un progetto unico.
Questo fatto agevola soprattutto i team composti da programmatori con diverse competenze e conoscenze, dove alcuni conoscono meglio C# e altri conoscono meglio VB, ma agevola anche il programmatore “solitario”, facilitandogli l’uso dei molti esempi e componenti già pronti disponibili su Internet.In questo articolo vedremo in modo estremamente semplice come si possono applicare questi principi anche alla programmazione web. Infatti in un sito web si possono utilizzare pagine scritte in linguaggi diversi, ma anche user control con la stessa caratteristica.

Il progetto è in sé banale: creiamo due user control, uno scritto in VB e uno, sostanzialmente identico, scritto in C# per la visualizzazione della data e ora del server web. Questi user control sono utili per verificare l’ora del server, magari quando il nostro sito è in hosting all’estero.

Creazione del progetto
Naturalmente la prima cosa da fare è creare una normale applicazione web:

  1. File/Nuovo sito web
  2. Selezionare “Sito web ASP.NET“, scegliere la cartella dove posizionare il progetto (per esempio C:\VB2005\UserControl) e scegliere il linguaggio predefinito (in questo articolo preferisco cominciare con VB);
  3. Alla conferma avremo la nostra pagina Default.aspx vuota: aggiungiamo alcune stringhe di testo, giusto per vedere qualcosa.

A questo punto la pagina web sarà così formata:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" 
Inherits="_Default" %> 
<!DOCTYPE html PUBLIC 
"-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Pagina senza titolo</title> 
</head> 
<body style="font-size: 12pt"> 
    <form id="form1" runat="server"> 
    <div> 
        <span style="color: darkorange; font-family: Verdana"> 
        <strong>HOME PAGE<br /> 
        </strong><span style="color: black"> 
            <br /> 
            Prova di controllo personalizzato con VB<br /> 
            <br /> 
            <br /> 
            <br /> 
            Prova di controllo personalizzato con C#<br /> 
            <br /> 
            <br /> 
        </span></span> 
    </div> 
    </form> 
</body> 
</html>

Creazione di uno User Control in VB
Procediamo ora alla creazione di uno user control con il linguaggio VB:

  1. nella finestra “Esplora Soluzioni“, fare clic con il tasto destro del mouse sul nome del progetto e selezionare “Aggiungi Nuovo Elemento…”;
  2. nella finestra di dialogo scegliere “Controllo utente web“, modificare il nome in “TimeVB.ascx” e, lasciando invariato il linguaggio (VB), confermare;
  3. fare doppio clic su “TimeVB.ascx” e inserire un controllo Label nella finestra di progettazione del controllo e modificare il suo ID in “LabelVB“.
  4. Nel file “TimeVB.ascx.vb“, invece, inserire il seguente codice:
Partial Class TimeVB 
    Inherits System.Web.UI.UserControl 
    Protected Sub Page_Load(ByVal sender As Object, _ 
            ByVal e As System.EventArgs) Handles Me.Load 
        Dim dt As DateTime = DateTime.Now 
        LabelVB.Text = String.Concat("Ora del server: ", dt.ToString) 
    End Sub 
End Class

Come è possibile vedere, abbiamo dichiarato una variabile dt di tipo DateTime, assegnandole la data e ora attuale. Subito dopo abbiamo assegnato alla proprietà Text della LabelVB la stringa composta da una stringa letterale e la data e ora convertita in testo con il metodo ToString.

Aggiungiamo ora il controllo nella pagina web: torniamo alla pagina Default.aspx, prendiamo con il mouse il file TimeVB.ascx e lo trasciniamo nella posizione voluta (cioè dopo la stringa “Prova di controllo personalizzato con VB” presente nella pagina).

Se a questo punto eseguiamo il progetto con F5, otterremo l’effetto voluto: abbiamo la nostra data e ora visualizzati nella pagina.

Creazione di uno User Control in C#
Procediamo nello stesso modo per creare lo user control in C#:

  1. nella finestra “Esplora Soluzioni“, fare clic con il tasto destro del mouse sul nome del progetto e selezionare “Aggiungi Nuovo Elemento…”;
  2. nella finestra di dialogo scegliere “Controllo utente web“, modificare il nome in “TimeCS.ascx” e, dopo aver modificato il linguaggio in “Visual C#“, confermare;
  3. fare doppio clic su “TimeCS.ascx” e inserire un controllo Label nella finestra di progettazione del controllo e modificare il suo ID in “LabelCS“;
  4. nel file “TimeCS.ascx.cs“, invece, inserire il seguente codice:
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
public partial class TimeCS : System.Web.UI.UserControl 
{ 
  protected void Page_Load(object sender, EventArgs e) 
  { 
    DateTime dt = DateTime.Now; 
    LabelCS.Text = string.Concat("Ora del server: ", dt); 
  } 
}

Anche questa volta aggiungiamo il controllo nella pagina web: torniamo alla pagina Default.aspx, prendiamo con il mouse il file TimeCS.ascx e lo trasciniamo nella posizione voluta (cioè dopo la stringa “Prova di controllo personalizzato con C#” presente nella pagina).

Eseguiamo nuovamente il progetto con F5 per verificare che entrambi i controlli, scritti in VB e in C#, funzionino correttamente.

Per differenziare le due versioni del controllo possiamo anche cambiare qualche proprietà dei controlli Label inseriti nei due controlli, magari cambiandone i colori, il font e quant’altro si desideri, così come ho fatto nell’esempio allegato a questo articolo.

La pagina default.aspx finale
Diamo ora uno sguardo alla pagina Default.aspx finale, dopo l’aggiunta dei due controlli utente:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" 
Inherits="_Default" %><%@ Register src="TimeCS.ascx" 
mce_src="TimeCS.ascx" TagName="TimeCS" TagPrefix="uc2" %> 

<%@ Register src="TimeVB.ascx" mce_src="TimeVB.ascx" TagName="TimeVB" TagPrefix="uc1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head id="Head1" runat="server"> 
    <title>Pagina senza titolo</title> 
</head> 
<body style="font-size: 12pt"> 
    <form id="form1" runat="server"> 
    <div> 
        <span style="color: darkorange; font-family: 
        Verdana"><strong>HOME PAGE<br /> 
        </strong><span style="color: black"> 
            <br /> 
            Prova di controllo personalizzato con VB<br /> 
            <uc1:TimeVB ID="TimeVB1" runat="server" /> 
            <br /> 

            <br /> 
            <br /> 
            Prova di controllo personalizzato con C#<br /> 
            <uc2:TimeCS ID="TimeCS1" runat="server" /> 
            <br /> 
            <br /> 
        </span></span> 
    </div> 
    </form> 
</body> 
</html>

Ci sono due elementi da notare: il primo è che sono state aggiunte due direttive per la registrazione dei due controlli che abbiamo aggiunto alla pagina:

<%@ Register src="TimeCS.ascx" mce_src="TimeCS.ascx" 
    TagName="TimeCS" TagPrefix="uc2" %> 
<%@ Register src="TimeVB.ascx" mce_src="TimeVB.ascx" 
    TagName="TimeVB" TagPrefix="uc1" %>

mentre il secondo è costituito dai due tag che inseriscono ciascun controllo utente nella posizione della pagina che abbiamo stabilito:

<uc1:TimeVB ID="TimeVB1" runat="server" /> <uc2:TimeCS ID="TimeCS1" runat="server" />

Conclusioni
I controlli utente che abbiamo creato sono estremamente banali, ma l’obiettivo di questo articolo era quello di mostrare come si crea e si inserisce un controllo utente e come possono essere create delle parti dell’applicazione web scritte in linguaggi differenti.

Un’altra particolarità interessante dei controlli utente è il fatto che nella finestra di progettazione del controllo stesso possono essere inseriti più “controlli-base”. Per esempio possono essere inseriti una Label, una Textbox e un ListBox: in questo caso il controllo utente sarà un controllo composto da tutti i controlli che sono stati inseriti al suo interno, semplificando il riutilizzo di componenti complessi (per esempio un controllo per inserire in un colpo solo un “form” di login). Questa possibilità, estremamente semplice da provare, non è mostrata in questo esempio ma viene lasciata come esercizio al lettore.

L’esempio è scaricabile da qui.

#15 Ricerca del primo ed ultimo giorno del mese

Queste 2 funzioni, abbastanza simili, calcolano rispettivamente la data del primo giorno e dell’ultimo giorno del mese.
I valori restituiti sono 2:

  • PrimoGiornoDelMese e UltimoGiornoDelMese restituiscono una stringa contenente il nome del giorno della settimana
  • i parametri dataPrimoGiorno e dataUltimoGiorno passati per riferimento vengono modificati per restituire la corrispondente data del primo e dell’ultimo giorno
  Public Function PrimoGiornoDelMese(ByVal data _ 
          As Date, ByRef dataPrimoGiorno As Date) As String 
  ' Parametri di input: 
    ' - data:            una data di riferimento per i calcoli 
    ' - dataPrimoGiorno: parametro passato per riferimento e 
    '                    modificato dalla funzione 
    ' 
  ' Parametri di output: 
    ' - PrimoGiornoDelMese: stringa contenente il nome del primo 
    '                       giorno del mese 
    ' - dataPrimoGiorno:    data del primo giorno del mese 
    
    Dim numeroGiornoSettimana As Integer 
    ' creazione array con nomi della settimana: 
    Dim nomiGiorniSettimana As String() = 
        ("Domenica", "Lunedì", "Martedì", _ 
        "Mercoledì", "Giovedì", "Venerdì", "Sabato"}    

    ' conversione della data da formato stringa (gg/mm/aaaa) a 
    ' formato DateTime 
    dataPrimoGiorno = 
        DateTime.Parse("01/" & data.Month & _ 
            "/" & data.Year)    

    ' calcolo del numero del giorno della settimana (da 0 a 6) 
    numeroGiornoSettimana = dataPrimoGiorno.DayOfWeek 
    
    ' estrazione del nome del giorno della settimana in base al 
    ' numero calcolato nell'istruzione precedente 
    PrimoGiornoDelMese = nomiGiorniSettimana(numeroGiornoSettimana) 
    
  End Function 
  Public Function UltimoGiornoDelMese(ByVal data _ 
          As Date, ByRef dataUltimoGiorno As Date) As String 
  ' Parametri di input: 
    ' - data:             una data di riferimento per i calcoli 
    ' - dataUltimoGiorno: parametro passato per riferimento e 
    '                     modificato dalla funzione 
    ' 
  ' Parametri di output: 
    ' - UltimoGiornoDelMese: stringa contenente il nome dell'ultimo 
    '                        giorno del mese 
    ' - dataUltimoGiorno:    data dell'ultimo giorno del mese 
    
    Dim numeroGiornoSettimana As Integer 
    ' creazione array con nomi della settimana: 
    Dim nomiGiorniSettimana As String() = _         
        {"Domenica", "Lunedì", "Martedì", _ 
        "Mercoledì", "Giovedì", "Venerdì", "Sabato"} 
                                            
    ' conversione della data da formato stringa (gg/mm/aaaa) a 
    ' formato DateTime 
    dataUltimoGiorno = _ 
        DateTime.Parse(data.DaysInMonth(data.Year, _ 
            data.Month) & "/" & data.Month & "/" & data.Year) 
                                      
    ' calcolo del numero del giorno della settimana (da 0 a 6) 
    numeroGiornoSettimana = dataUltimoGiorno.DayOfWeek 
    
    ' estrazione del nome del giorno della settimana in base al 
    ' numero calcolato nell'istruzione precedente 
    UltimoGiornoDelMese = _ 
        nomiGiorniSettimana(numeroGiornoSettimana) 
  End Function

Per testare le funzioni di cui sopra, questo è del codice che può essere inserito nell’evento Load di una form o nell’evento Click di un pulsante:

  Dim dataPrimoGiorno As Date 
  Dim dataUltimoGiorno As Date    

  ' calcolo il nome e la data del primo e dell'ultimo giorno 
  ' di Maggio 2008 
  System.Windows.Forms.MessageBox.Show("" & _       
      PrimoGiornoDelMese(#5/17/2008#, _ 
      dataPrimoGiorno) & " " & dataPrimoGiorno) 
  System.Windows.Forms.MessageBox.Show("" & _ 
      UltimoGiornoDelMese(#5/17/2008#, _ 
      dataUltimoGiorno) & " " & dataUltimoGiorno)    

  ' calcolo il nome e la data del primo e dell'ultimo 
  ' giorno di Marzo 2008 
  System.Windows.Forms.MessageBox.Show("" & _ 
      PrimoGiornoDelMese(#3/19/2008#, _ 
      dataPrimoGiorno) & " " & dataPrimoGiorno) 
  System.Windows.Forms.MessageBox.Show("" & _ 
      UltimoGiornoDelMese(#3/19/2008#, _ 
      dataUltimoGiorno) & " " & dataUltimoGiorno)

[VB.NET] Inviare e-mail

Un articolo interessante di Jim Duffy, Visual Basic MVP, con la trattazione completa del namespace System.Net.Mail per l’invio di e-mail con VB.NET:

http://msdn2.microsoft.com/it-it/vbasic/bb630227.aspx

L’articolo espone le modalità per gestire un messaggio di posta elettronica, per inviarlo, per allegare file, per gestirne le eccezioni, per modificare alcune proprietà (nome visualizzato, indirizzo per il reply, priorità del messaggio, richiesta di ricevuta di ritorno), per includere nel messaggio delle immagini, per utilizzare SSL, per effettuare l’autenticazione e per spedire i messaggi in modo asincrono.

[VB.NET] Finestra di dialogo per scelta e salvataggio della stringa di connessione

Su CodeProject c’è un articolo interessante, corredato dal codice sorgente, che definisce una finestra di dialogo per consentire la composizione e il salvataggio della connection string:

http://www.codeproject.com/useritems/SQL_Connection_Dialog.asp 

Non male, davvero!

#13 Inversione di una stringa

La funzione restituisce la stringa invertita passatagli come parametro.

Public Function ReverseString(ByVal stringToReverse As String) As String 
    ' dichiarazione variabili 
    Dim i As Long 
    Dim tmpString As String = "" 
    Dim lunghezza As Long = 0 
    If stringToReverse = "" Then 
        ' se stringa vuota restituiscila 
        tmpString = "" 
    Else 
        ' altrimenti esegui l'inversione della stringa 
        lunghezza = stringToReverse.Length 
        For i = (lunghezza - 1) To 0 Step -1 
            tmpString = String.Concat(tmpString, _ 
                stringToReverse.Substring(i, 1)) 
        Next 
    End If 
    Return (tmpString) 
End Function

#12 Ripete una stringa

La funzione e’ simile alla String() nativa di VB, con in piu’ la possibilita’ di definire una stringa (e non un carattere) da ripetere.

Public Function RepeatString(ByVal repetitions As Long, _ 
        ByVal stringToRepeat As String) As String 
    ' dichiarazione variabili 
    Dim i As Long 
    Dim tmpString As String = "" 
    If repetitions <= 0 Then 
       ' se numero ripetizioni inferiore a 1 (zero o negativo) 
       ' restituisci stringa vuota 
       tmpString = "" 
    ElseIf repetitions = 1 Then 
       ' se numero ripetizioni = 1 restituisci la stringa stessa 
       tmpString = stringToRepeat 
    Else 
       ' altrimenti esegui la ripetizione della stringa 
       For i = 0 To repetitions - 1 
          tmpString = String.Concat(tmpString, stringToRepeat) 
       Next 
    End If 
    Return (tmpString) 
End Function

Per testare questa funzione, creare un form con 3 textbox e un pulsante (rispettivamente denominati TextBox1, TextBox2, TextBox3 e Button1) e inserire il seguente codice nell’evento Click di Button1:

Private Sub Button1_Click(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) Handles Button1.Click 
    ' dichiarazione variabili 
    Dim stringaDaRipetere As String = "" 
    Dim ripetizioni As Long = 0 
    Dim stringaFinale As String = "" 
    ' lettura TextBox1 con stringa da ripetere (es.: "ABC") 
    stringaDaRipetere = Me.TextBox1.Text 
    ' lettura numero ripetizioni da campo TextBox2 (es.: 3) 
    ' N.B.: solitamente l'input numerico va controllato 
    ripetizioni = Long.Parse(Me.TextBox2.Text) 
    ' esecuzione della funzione di ripetizione stringa 
    stringaFinale = RepeatString(ripetizioni, stringaDaRipetere) 
    ' risultato nella TextBox3 (es.: "ABCABCABC") 
    Me.TextBox3.Text = stringaFinale 
End Sub

#11 Leggere il nome del file in uno “Shortcut” (file .LNK)

In un nuovo progetto, aggiungere il riferimento alla libreria COM (unmanaged) “Windows Script Host Object Model“.

Nella sezione del codice del form (Form1.vb) inserire questo esempio:

  Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, _ 
           ByVal As System.EventArgs) Handles Button1.Click 
        MessageBox.Show(ReadShortcut("C:\prova2.lnk")) 
    End Sub 
 
    Public Function ReadShortcut(ByVal FilePath As StringAs String 
        If System.IO.File.Exists(FilePath) Then 
            Dim theShell As New IWshRuntimeLibrary.WshShell() 
            Dim theShortcut As IWshRuntimeLibrary.WshShortcut _ 
                   theShell.CreateShortcut(FilePath) 
            Return theShortcut.TargetPath 
        Else 
            Return "Il file non esiste." 
        End If 
    End Function 
  End Class 

Come si può vedere, ReadShortcut è una funzione che richiede il nome completo del file .LNK (compreso path) e restituisce il nome completo del file collegato.

#10 Convertire una data dal formato “yyyymmdd” a DateTime

Questo semplice codice permette di convertire una data dal formato “yyyymmdd” (ad es. “20081102″) e trasformarla in un’istanza di DateTime:

Private Function ToDateTime(ByVal dataYyyyMmDd _ 
            As String) As DateTime 
    Dim myCultureInfo As _ 
        New System.Globalization.CultureInfo("it-IT", True) 
    Dim formato As String = "yyyyMMdd" 
    Return System.DateTime.ParseExact(dataYyyyMmDd, _ 
        formato, myCultureInfo) 
End Function 

#9 Conversione decimale-esadecimale con formato “0x…”

Il problema è questo: vogliamo convertire un numero decimale in esadecimale, rappresentandolo con il prefisso “0x”.

Creiamo quindi un nuovo progetto VB 2005 e al Form1 che viene incluso di default al progetto aggiungiamo una TextBox, un Button e una Label, lasciando tutti con il nome predefinito. Incolliamo poi il seguente codice nell’evento Click del pulsante:

  Private Sub Button1_Click(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) Handles Button1.Click 
    Me.Label1.Text = String.Format("0x{0}", _ 
        Integer.Parse(TextBox1.Text).ToString("x").PadLeft(5, "0"c)) 
  End Sub

Ad esempio, inserendo 255 nella TextBox e premendo il pulsante, otterremo “0x000ff” nella Label.

#7 Nascondere/ripristinare il puntatore del mouse

Talvolta alcune applicazioni richiedono che non sia visibile il puntatore del mouse (Cursor).

Con VB.NET è possibile farlo in modo estremamente semplice.

Per farlo scomparire:

        System.Windows.Forms.Cursor.Hide()

e per farlo riapparire

        System.Windows.Forms.Cursor.Show()

Attenzione però che l’eventuale crash dell’applicazione potrebbe lasciare il cursore del mouse nello stato “invisibile” fino al riavvio del sistema!

#6 Sabato o domenica?

A volte, specialmente in programmi gestionali, e’ utile sapere se una determinata data cade di sabato o domenica. Ecco una routine che svolge questo lavoro.

Public Function IsWeekend(ByVal data As Date, _ 
     ByRef giorno As String) As Boolean 
  ' Parametri di input: 
  ' - data: la data da testare 
  ' - giorno: parametro passato per riferimento 
  ' Il parametro 'giorno', passato per riferimento, viene 
  ' modificato per restituire il nome del giorno della settimana, 
  ' se sabato o domenica, oppure l'indicazione "feriale". 
  ' 
  ' Parametri di output: 
  ' - True: il giorno testato è un sabato o una domenica 
  ' - False negli altri casi 
    Select Case Weekday(data) 
      Case FirstDayOfWeek.Saturday 
          giorno = "Sabato" 
          IsWeekend = True 
      Case FirstDayOfWeek.Sunday 
          giorno = "Domenica" 
          IsWeekend = True 
      Case Else 
          giorno = "feriale" 
          IsWeekend = False 
  End Select 
End Function

La funzione di cui sopra viene testata con il seguente codice (da inserire nell’evento Load della Form, oppure nell’evento Click di un pulsante):

Dim giorno As String 
Dim i As Integer 
For i = 0 To 1 
  ' test su 2 giorni consecutivi (domenica e lunedi) 
  If IsWeekend(DateAdd("d", i, #1/20/2008#), giorno) Then 
      MsgBox("Non si lavora di " & giorno) 
  Else 
      MsgBox("Giorno " & giorno & ": OK, lavora lavora!!") 
  End If 
Next i
Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 846 follower