VB & .NET - Mario De Ghetto

Visual Basic & .NET: programmare che passione!

#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 »

Capitolo 10 del libro su Visual Basic 2008

Pubblicato da Mario De Ghetto su 2 Aprile 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 http://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.

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

E’ uscito il mio nuovo libro su Visual Basic 2008

Pubblicato da Mario De Ghetto su 1 Aprile 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     -)

Pubblicato su Novità | Contrassegnato da tag: , , , | 24 Commenti »

Libro su Visual Basic 2008 - aggiornamento

Pubblicato da Mario De Ghetto su 3 Marzo 2008

Pubblicato su Novità | Contrassegnato da tag: , , | 12 Commenti »

#25: Conversione di data e ora in stringa

Pubblicato da Mario De Ghetto su 27 Febbraio 2008

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 DateTimedt = 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

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

#24: Limite superiore e inferiore di un array

Pubblicato da Mario De Ghetto su 26 Febbraio 2008

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)

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

#23 Cancellare tutti i file di una cartella

Pubblicato da Mario De Ghetto su 25 Febbraio 2008

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

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

#22 Salvare la schermata tramite la clipboard

Pubblicato da Mario De Ghetto su 18 Febbraio 2008

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

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

[VB.NET] Proposte di argomenti da sviluppare

Pubblicato da Mario De Ghetto su 12 Febbraio 2008

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

Pubblicato su ADO.NET, Articoli vari, LINQ, Novità, Tips, WCF, WPF, WF | Contrassegnato da tag: , , , , , , , , , , , | Non ci sono Commenti »

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

Pubblicato da Mario De Ghetto su 10 Febbraio 2008

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“.

Pubblicato su ADO.NET | Contrassegnato da tag: , , | Non ci sono Commenti »

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

Pubblicato da Mario De Ghetto su 9 Febbraio 2008

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.

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

#18 Conversione da numero decimale a binario

Pubblicato da Mario De Ghetto su 7 Febbraio 2008

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

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

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

Pubblicato da Mario De Ghetto su 7 Febbraio 2008

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.

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

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

Pubblicato da Mario De Ghetto su 6 Febbraio 2008

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.

Pubblicato su Articoli vari, VB6-VBA | Contrassegnato da tag: , , , , , | Non ci sono Commenti »

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

Pubblicato da Mario De Ghetto su 30 Gennaio 2008

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!

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

#16 Inviare e-mail in formato HTML con allegati

Pubblicato da Mario De Ghetto su 25 Gennaio 2008

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.

Pubblicato su Tips | Contrassegnato da tag: , , | 4 Commenti »

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

Pubblicato da Mario De Ghetto su 23 Gennaio 2008

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.

Pubblicato su ASP.NET | Contrassegnato da tag: , , , | Non ci sono Commenti »

#15 Ricerca del primo ed ultimo giorno del mese

Pubblicato da Mario De Ghetto su 23 Gennaio 2008

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)

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

[VB.NET] Inviare e-mail

Pubblicato da Mario De Ghetto su 22 Gennaio 2008

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.

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

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

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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!

Pubblicato su ADO.NET | Contrassegnato da tag: , | Non ci sono Commenti »

#13 Inversione di una stringa

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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

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

#12 Ripete una stringa

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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

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

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

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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.

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

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

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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

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

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

Pubblicato da Mario De Ghetto su 19 Gennaio 2008

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 “0×000ff” nella Label.

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

#7 Nascondere/ripristinare il puntatore del mouse

Pubblicato da Mario De Ghetto su 18 Gennaio 2008

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!

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

#6 Sabato o domenica?

Pubblicato da Mario De Ghetto su 18 Gennaio 2008

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

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

#5 Verifica se anno bisestile

Pubblicato da Mario De Ghetto su 18 Gennaio 2008

Spesso è necessario conoscere se un anno sia bisestile. Nel tempo si sono trovate molte soluzioni diverse a questo problema.

Con VB.NET il problema è stato risolto alla fonte: è fornito un opportuno metodo, IsLeapYear, che accetta in input un valore intero (l’anno) e restituisce un valore booleano (True = bisestile, False = non bisestile).

Per provare questa funzione, creare una form, aggiungere due TextBox di nome rispettivamente TextBox1 e TextBox2 ed un pulsante e infine, nell’evento Click del pulsante inserire il seguente codice:

If TextBox1.Text = "" Then
  TextBox2.Text = "anno non indicato"
Else
  If (DateTime.IsLeapYear(Integer.Parse(TextBox1.Text)) = True) _
        Then
     TextBox2.Text = "L'anno " & TextBox1.Text & " è bisestile."
  Else
     TextBox2.Text = "L'anno " & TextBox1.Text & " NON è bisestile."
  End If
End If

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

#4 Ottenere l’indirizzo IP

Pubblicato da Mario De Ghetto su 18 Gennaio 2008

Per ottenere l’indirizzo IP della macchina (collegata in rete) sulla quale gira il programma, ecco una soluzione valida per Visual Basic 2005:

Private Shared Sub NamedSub()
  Dim loip() As System.Net.IPAddress = _
    System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName)
  Dim ip As String = loip(0).ToString
  MessageBox.Show(ip)
End Sub

E’ possibile ottenere altre informazioni sulla connessione di rete leggendo questo articolo pubblicato su MSDN

Il metodo usato in Visual Basic 2003 è obsoleto e da evitare:

Dim ip As String = _
System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)