Archivi Blog

Arduino & C. – Un mio articolo su ioProgrammo

Volete creare un pianoforte elettronico con Arduino e Visual Studio?

Su ioProgrammo in edicola in questi giorni (“Novembre 2017”) c’è il mio articolo con programmazione in Visual Basic e in C# (ved. riquadro in basso a destra).

Buona lettura e buon divertimento! Winking smile

ioprogrammo_november2017

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

Libro “Visual C# 2008 spiegato a mia nonna”

Finalmente, dopo l’annuncio che avevo pubblicato su questo blog il 30 Gennaio 2008 e dopo l’uscita del libro “Visual Basic 2008 spiegato a mia nonna” avvenuta il 1° Aprile, posso annunciare che sta uscendo anche il mio libro “Visual C# 2008 spiegato a mia nonna”.

Appena l’editore mi darà conferma dell’avvio della distribuzione (inizialmente su Internet), pubblicherò i link al booksite e al file .zip contenente tutti gli esempi di sorgente in C#.

AGGIORNAMENTO: il libro è stato pubblicato il 7 Giugno 2008. Vai a questo indirizzo per informazioni dettagliate e per tutti i link utili.

#30: Conteggio record con ADO.NET

L’articolo http://support.microsoft.com/kb/308050/en-us spiega che non è possibile conoscere in anticipo il numero di record restituiti dalla query con un DataReader, perché per conoscere il numero di
record è necessario spostarsi all’ultimo record. In quest’altro articolo viene sostanzialmente spiegata la stessa cosa: http://www.velocityreviews.com/forums/t112093-datareader-and-recordcount.html.

Per risolvere questo problema è possibile eseguire un conteggio PRIMA di aprire il DataReader, con istruzioni simili alle seguenti:

VB:

Dim cmd As SqlCommand = _
   New SqlCommand("SELECT COUNT(*) FROM Clienti;", conn)
Dim numeroClienti As Integer = CInt(cmd.ExecuteScalar())

C#:

SqlCommand cmd = _
   new SqlCommand("SELECT Count(*) FROM Clienti", conn);
Int32 count = (Int32)cmd.ExecuteScalar;

#28: Progetti “usa e getta” in Visual Studio 2008

Specialmente quando studiamo una nuova tecnologia o una nuova tecnica di programmazione, in Visual Basic o in C#, può esserci utile evitare di salvare il progetto.

Infatti quello che vorremmo fare, dato che siamo persone ordinate (!), è semplicemente aprire un nuovo progetto senza salvarlo alla creazione, provare il codice e poi chiudere il progetto eliminando ogni sua traccia. In questo modo possiamo evitare di avere l’hard disk pieno di progetti di prova che provocano solo una grande confusione.

Possiamo realizzare tutto questo semplicemente modificando un’opzione di Visual Studio 2008, di Visual Basic 2008 Express o di Visual C# 2008 Express:

  1. selezionate il menu Strumenti > Opzioni > Progetti e soluzioni > Generale (nella versione inglese: Tools > Options > Projects and Solutions > General);
  2. nella scheda che apparirà, esiste una casella di controllo con la voce “Salva nuovi progetti alla creazione” (in inglese “Save new projects when created”): togliendo la spunta potremo disattivare la richiesta di salvataggio del progetto al momento della creazione!

[C#] TextBox personalizzata con evento TextChanged ritardato

Segnalo l’articolo pubblicato su CodeProject intitolato “Custom TextBox that Delays the TextChanged Event” che è molto interessante, soprattutto per la sua utilità.

Il problema consiste nel fatto che l’evento TextChanged viene scatenato ogni volta che digitiamo un nuovo carattere nella TextBox, anche se l’inserimento del dato non è completato. Per esempio, in una pagina ASP.NET, possiamo avere una TextBox che utilizziamo per inserire la pagina dei dati a cui vogliamo accedere. Se la pagina è 100, prima inseriamo “1” (e viene scatenato l’evento TextChanged e quindi eseguita la query al database), poi digitiamo lo “0” di “10” (e viene ulteriormente scatenato l’evento con una seconda query al database) e infine digitiamo lo zero finale per ottenere “100” (scatenando per una terza volta evento e query). Questo non è desiderabile sia per l’effetto visuale pessimo, sia per l’inefficienza e le prestazioni dell’applicazione.

Ecco quindi che l’autore ha creato un controllo custom derivato da TextBox per ritardare l’evento di un certo numero di millisecondi.

L’articolo, dotato di sorgente e di esempio in C#, è piuttosto semplice da seguire e non è particolarmente difficile da convertire in VB.NET.

[C#] Rilevare inserimento/rimozione di dischi removibili USB

Un nuovo interessante articolo su CodeProject: come rilevare l’inserimento e la rimozione di dischi removibili.

Corredato da un progetto in linguaggio C#.

[C#] Un controllo visuale per indirizzi IP

Chi dovesse chiedersi come mai Microsoft non abbia incluso nella toolbox un controllo visuale per la gestione degli indirizzi IP, così come esisteva la classe MFC CIPAddressCtrl, avrà comunque la soluzione a questo problema.
Su CodeProject è disponibile, infatti, una classe creata in C#, con sorgente ed esempi:http://www.codeproject.com/cs/miscctrl/IpAddrCtrlLib.asp

[ASP.NET 2.0] Controllo per includere un documento PDF

Su CodeProject è stato pubblicato un articolo che spiega come utilizzare un controllo per pubblicare file PDF su una pagina web.
L’articolo è corredato dai sorgenti scaricabili dalla pagina stessa. Il codice presentato è scritto in C#.

Libro su Visual C# 2008

Un’altra novità sul fronte dei miei libri: oltre ad avere quasi finito il libro su Visual Basic 2008, ho appena firmato un altro contratto con la FAG per scrivere anche un libro su Visual C# 2008!

Appena ci saranno novità sul fronte di questi due nuovi libri, le comunicherò tramite questo blog, così come tutto quello che riguarderà capitoli di esempio, sorgenti, eventuali errata corrige successive alla pubblicazione dei libri ecc. ecc..

[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!

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