<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Varie</title>
        <link>http://community.dotnetwork.it/AndreaZ/category/49.aspx</link>
        <description>Varie amenità</description>
        <language>it-IT</language>
        <copyright>Andrea Zingoni</copyright>
        <managingEditor>andrea.zingoni@poste.it</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Macro per inserire immagini in Word 2007 e creare automaticamente un PDF</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx</link>
            <description>&lt;p&gt;Sfruttando gli ultimi 2 post: &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx"&gt;Macro per utilizzare lo scanner da Word 2007&lt;/a&gt; e &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx"&gt;Esportare un documento Office 2007 in PDF&lt;/a&gt;, ho leggermente automatizzato il procedimento aziendale di “scansione, inserimento immagni, esportazione in PDF”.&lt;/p&gt;  &lt;p&gt;Tutta la procedura viene svolta da una semplice macro:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; Crea_PDF()
&lt;span class="rem"&gt;'&lt;/span&gt;
&lt;span class="rem"&gt;' Crea_PDF Macro&lt;/span&gt;
&lt;span class="rem"&gt;' Riduce i margini del foglio.&lt;/span&gt;
    &lt;span class="kwrd"&gt;With&lt;/span&gt; Selection.PageSetup
        .LineNumbering.Active = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .Orientation = wdOrientPortrait
        .TopMargin = CentimetersToPoints(1.27)
        .BottomMargin = CentimetersToPoints(1.27)
        .LeftMargin = CentimetersToPoints(1.27)
        .RightMargin = CentimetersToPoints(1.27)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(21)
        .PageHeight = CentimetersToPoints(29.7)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .DifferentFirstPageHeaderFooter = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .MirrorMargins = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .TwoPagesOnOne = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldPrinting = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldRevPrinting = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;With&lt;/span&gt;
    
&lt;span class="rem"&gt;' Scannerizza le immagini.&lt;/span&gt;
&lt;span class="kwrd"&gt;On&lt;/span&gt; &lt;span class="kwrd"&gt;Error&lt;/span&gt; &lt;span class="kwrd"&gt;Resume&lt;/span&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;
WordBasic.InsertImagerScan
          
&lt;span class="rem"&gt;' Esporta in PDF.&lt;/span&gt;
ActiveDocument.ExportAsFixedFormat OutputFileName:= _
        &lt;span class="str"&gt;"C:\Documents and Settings\Andrea\Desktop\Doc1.pdf"&lt;/span&gt;, ExportFormat:= _
        wdExportFormatPDF, OpenAfterExport:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, OptimizeFor:= _
        wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, &lt;span class="kwrd"&gt;To&lt;/span&gt;:=1, _
        Item:=wdExportDocumentContent, IncludeDocProps:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, KeepIRM:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, _
        CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, _
        BitmapMissingFonts:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, UseISO19005_1:=&lt;span class="kwrd"&gt;False&lt;/span&gt;
        
        &lt;span class="rem"&gt;' Messaggio di notifica.&lt;/span&gt;
        MsgBox &lt;span class="str"&gt;"Creazione del file PDF completata."&lt;/span&gt;, vbInformation, &lt;span class="str"&gt;"Crea PDF"&lt;/span&gt;
                 
&lt;span class="rem"&gt;' Chiude Word chiedendo conferma.&lt;/span&gt;
Application.Quit

&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;NB: In questo caso il file PDF viene generato nel “C:\Documents and Settings\Andrea\Desktop”, sempre col solito nome (Doc1.pdf). Questa è una soluzione rapida per chi, come me, crea dei semplici file temporanei. E’ invece possibile personalizzare i nomi dei file inserendo ad esempio una &lt;a href="http://msdn.microsoft.com/it-it/library/6z0ak68w(VS.80).aspx" target="_blank"&gt;inputbox&lt;/a&gt; prima dell’esportazione.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1f89b1b8-a6bf-4b08-be83-c5cf7debf767" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Office+2007/default.aspx" rel="tag"&gt;Office 2007&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/378.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:56:23 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/378.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/378.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Esportare un documento Office 2007 in PDF</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx</link>
            <description>&lt;p&gt;Per esportare un documento Office 2007 (Word, Excel) in PDF, basta installare questo componente aggiuntivo scaricabile direttamente dal sito Microsoft:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it" href="http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una volta installato il componente basterà poi cliccare su: Pulsante Office=&amp;gt;Salva con nome=&amp;gt;PDX o XPS.&lt;/p&gt;  &lt;p&gt;That's all folks!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0295b0b7-1f17-4263-b5a7-d742abbb3e6c" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/office/default.aspx" rel="tag"&gt;office&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Excel+2007/default.aspx" rel="tag"&gt;Excel 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/377.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:44:53 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/377.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/377.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Macro per utilizzare lo scanner da Word 2007</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx</link>
            <description>&lt;p&gt;Per scrivere una macro che utilizza lo scanner da Word 2007 basta una sola riga di codice:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;WordBasic.InsertImagerScan&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;In questo modo, appena effettuata la scansione, l’immagine verrà inserita automaticamente all’interno del documento.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2c5ec28c-3d74-4675-9163-f2d1fcdb6006" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Office/default.aspx" rel="tag"&gt;Office&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/376.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:36:12 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/376.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/376.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Intercettare l&amp;rsquo;evento ItemCheck della CheckedListBox</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx</link>
            <description>&lt;p&gt;Sfortunatamente la &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.forms.checkedlistbox.objectcollection.aspx" target="_blank"&gt;CheckedListBox&lt;/a&gt; non possiede un evento che si scatena dopo che è stato “flaggato” un item, percui è difficile poter interagire direttamente con l’elemento selezionato.&lt;/p&gt;  &lt;p&gt;E’ possibile aggirare il problema creando degli items personalizzati visto che all’interno della CheckedListBox è possibile aggiungere qualunque oggetto indicizzato (che espone l’interfaccia &lt;a href="http://msdn.microsoft.com/it-it/library/s4ys34ea(VS.95).aspx" target="_blank"&gt;IDictionary&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Creiamo una classe personalizzata che rappresenti un item e che abbia una proprietà di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.forms.checkstate.aspx" target="_blank"&gt;CheckState&lt;/a&gt; che memorizzi il flag impostato dalla CheckedListBox che lo contiene.&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' Oggetto personalizzato myChekedItem.&lt;/span&gt;
&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; myChekedItem
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _Nome &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
    &lt;span class="kwrd"&gt;Property&lt;/span&gt; Nome() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; _Nome
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
        &lt;span class="kwrd"&gt;Set&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; value &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)
            _Nome = value
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Set&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt;

    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _Stato &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState
    &lt;span class="kwrd"&gt;Property&lt;/span&gt; Stato() &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; _Stato
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
        &lt;span class="kwrd"&gt;Set&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; value &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState)
            _Stato = value
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Set&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; nome &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; stato &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState)
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Nome = nome
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Stato = stato
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Overrides&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ToString() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Nome
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; Class&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Eseguendo l’overrides della funzione &lt;a href="http://msdn.microsoft.com/it-it/library/ms173154.aspx" target="_blank"&gt;.ToString&lt;/a&gt; della classe base, permetteremo alla CheckedListBox di visualizzare automaticamente la proprietà Nome nell’item personalizzato, senza dover impostare la proprietà (nascosta) DisplayMember.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Popoliamo la CheckedListBox con gli items personalizzati.&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; Form1_Load(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; System.&lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.EventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; &lt;span class="kwrd"&gt;MyBase&lt;/span&gt;.Load
        &lt;span class="rem"&gt;' Aggiunge gli oggetti myChekedItem alla CheckedListBox.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; myChekedItem(&lt;span class="str"&gt;"prova Item personalizzato 1"&lt;/span&gt;, CheckState.Indeterminate))
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; myChekedItem(&lt;span class="str"&gt;"prova Item personalizzato 2"&lt;/span&gt;, CheckState.Indeterminate))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;

&lt;p&gt;Intercettiamo l’evento .ItemCheck della CheckedListBox e risaliamo all’item personalizzato selezionato:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CheckedListBox2_ItemCheck(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.Windows.Forms.ItemCheckEventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; CheckedListBox1.ItemCheck
        &lt;span class="rem"&gt;' Imposta il checkstate all'oggetto myChekedItem selezionato.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; chkItem &lt;span class="kwrd"&gt;As&lt;/span&gt; myChekedItem = &lt;span class="kwrd"&gt;DirectCast&lt;/span&gt;(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items(e.Index), myChekedItem)
        chkItem.Stato = e.NewValue

        &lt;span class="rem"&gt;' Aggiunge l'item selezionato.&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; e.NewValue = CheckState.Checked &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ListBox1.Items.Add(chkItem)
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; e.NewValue = CheckState.Unchecked &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ListBox1.Items.Remove(chkItem)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;All’interno dell’evento .ItemCheck gestiremo i nostri items come oggetti indipendenti sfruttandone tutte le loro funzionalità. In questo caso li abbiamo aggiunti o rimossi ad una ListBox sfruttandone i metodi .Items.Add e .Items.Remove a seconda del valore della loro prorietà Stato.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:34653de3-a482-4654-ac9e-68a41fe55681" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/CheckedListBox/default.aspx" rel="tag"&gt;CheckedListBox&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/ItemCheck/default.aspx" rel="tag"&gt;ItemCheck&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/275.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx</guid>
            <pubDate>Mon, 14 Dec 2009 16:32:28 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/275.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/275.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Se lo StreamWriter &amp;egrave; troppo lento</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx</link>
            <description>&lt;p&gt;Generalmente per salvare un file di testo è molto comodo utilizzare uno StreamWriter:&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sw &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.StreamWriter(&lt;span class="str"&gt;"C:\SW prova.txt"&lt;/span&gt;)
            sw.Write(&lt;span class="str"&gt;"Mio testo"&lt;/span&gt;)
            sw.Flush()
            sw.Close()&lt;/pre&gt;

&lt;p&gt;Se il testo da salvare però è di grandi dimensioni, lo StreamWriter sarà lento ad eseguire la scrittura su disco. Per evitare rallentamenti è possibile salvare il file come flusso di byte utilizzando la classe IO.FileStream:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; fs &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.FileStream(&lt;span class="str"&gt;"C:\FS prova.txt"&lt;/span&gt;, IO.FileMode.OpenOrCreate)
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; enc &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Text.UTF8Encoding
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; bytes() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; = enc.GetBytes(&lt;span class="str"&gt;"Mio testo molto lungo"&lt;/span&gt;)
            fs.Write(bytes, 0, bytes.Length)
            fs.Flush()
            fs.Close()&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2205e1bd-404b-4fe3-8e2d-e098a20e5e67" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/tips/default.aspx" rel="tag"&gt;tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/248.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx</guid>
            <pubDate>Fri, 23 Oct 2009 07:48:07 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/248.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/248.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Nome del primo e dell&amp;rsquo;ultimo giorno del mese</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx</link>
            <description>&lt;p&gt;Niente di eccezionale ma abbastanza utile:&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; myDaysOfYear
    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetFirstDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; DateTime.Parse(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"01/{0}/{1}"&lt;/span&gt;, data.Month, data.Year))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetNameOfFirstDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(GetFirstDayOfMonth(data).DayOfWeek)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetLastDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; DateTime.Parse(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}/{1}/{2}"&lt;/span&gt;, &lt;span class="kwrd"&gt;Date&lt;/span&gt;.DaysInMonth(data.Year, data.Month), data.Month, data.Year))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetNameOfLastDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(GetLastDayOfMonth(data).DayOfWeek)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; Class&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Le funzioni della classe si richiamano così:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; NomeDelPrimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = myDaysOfYear.GetNameOfFirstDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; DataPrimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt; = myDaysOfYear.GetFirstDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; NomeUltimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = myDaysOfYear.GetNameOfLastDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; DataUltimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt; = myDaysOfYear.GetLastDayOfMonth(DateTime.Today)&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:48aff68d-c983-4c9c-976f-2a846df99627" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/221.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx</guid>
            <pubDate>Mon, 12 Oct 2009 10:53:14 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/221.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/221.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tanti auguri BOSS!!</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx</link>
            <description>&lt;p align="center"&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://www.andreazingoni.it/The_Boss.jpg" width="640" height="258" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;Non ho mai parlato nel blog del mio mito… che con la sua musica mi ha accompagnato per più di vent’anni.&lt;/p&gt;  &lt;p align="center"&gt;Oggi però è il suo 60eimo compleanno ed uno strappo alla regola lo devo proprio fare:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="7"&gt;TANTI AUGURI BOSS!!!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="7"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/190.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx</guid>
            <pubDate>Wed, 23 Sep 2009 12:42:14 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/190.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/190.aspx</wfw:commentRss>
        </item>
        <item>
            <title>RowFilter non funziona con i nomi di colonna con spazi</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx</link>
            <description>&lt;p&gt;Può capitare di ritrovarsi con una &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.datatable.aspx" target="_blank"&gt;DataTable&lt;/a&gt; contenente delle &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.datacolumn(en-us,VS.71).aspx" target="_blank"&gt;DataColumns&lt;/a&gt; nominate in modo non convenzionale, ossia con caratteri non validi o con spazi.&lt;/p&gt;  &lt;p&gt;In questo caso le proprietà .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.rowfilter.aspx" target="_blank"&gt;RowFilter&lt;/a&gt; e .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.sort.aspx" target="_blank"&gt;Sort&lt;/a&gt; dell’oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.aspx" target="_blank"&gt;DataView&lt;/a&gt; non funzionano correttamente.&lt;/p&gt;  &lt;p&gt;Per aggirare questo problema basta rinominare le colonne interessate prima di impostare il filtro di ricerca o di ordinamento:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;            &lt;span class="rem"&gt;' Rinomina la colonna "Nome colonna con spazi" in "Nome_colonna_con_spazi".&lt;/span&gt;
            dt.Columns(13).ColumnName = dt.Columns(13).ColumnName.Replace(&lt;span class="str"&gt;" "&lt;/span&gt;, &lt;span class="str"&gt;"_"&lt;/span&gt;)

            &lt;span class="rem"&gt;' Imposta il filtro sulla colonna rinominata.&lt;/span&gt;
            dt.DefaultView.RowFilter = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} = '{1}'"&lt;/span&gt;, dt.Columns(13).ColumnName, &lt;span class="str"&gt;"Italia"&lt;/span&gt;)&lt;/pre&gt;

&lt;p&gt;Volendo è possibile ripristinare il nome originale eseguendo l’operazione inversa dopo aver impostato i filtri.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            dt.Columns(13).ColumnName = dt.Columns(13).ColumnName.Replace(&lt;span class="str"&gt;"_"&lt;/span&gt;, &lt;span class="str"&gt;" "&lt;/span&gt;)&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5dede15b-13b2-4acd-90cc-5aedce44be3e" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Tips" rel="tag"&gt;Tips&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DataTable" rel="tag"&gt;DataTable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DataView" rel="tag"&gt;DataView&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/185.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx</guid>
            <pubDate>Mon, 17 Aug 2009 17:00:29 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/185.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/185.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Censurare le parole non gradite</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx</link>
            <description>&lt;p&gt;Non ho mai avuto l'esigenza di censurare l'input dell'utente ma leggendo un &lt;a href="http://www.dotnetwork.it/Forums/tabid/54/afv/topic/aff/3/aft/3152/Default.aspx" target="_blank"&gt;post&lt;/a&gt;  su DNW ho capito che è una cosa da fare necessariamente, soprattutto se si gestiscono forum o altre discussioni pubbliche.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Proviamo quindi a realizzare una funzione che effettui il controllo delle parole non gradite. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;La censura potrebbe avvenire semplicemente sovrascrivendo le parole indesiderate con dei caratteri non leggibili (es. l'asterisco).  &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Il sistema presentato avrà una contronidicazione: censurarà parti di parole che in realtà non devono essere censurate. Prendiamo ad esempio una frase come questa:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Cazzottare un figaro siculo&lt;/strong&gt;&lt;/em&gt; (prendere a pugni un barbiere siciliano)&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;la versione censurata risulterà in questo modo: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;c****ttare un f***ro sic***&lt;/strong&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Per evitare censure di questo tipo bisognerà lavorare molto sulla logica del programma tenendo in considerazione svariati scenari (parole singole, parole incorporate, parole con spazi, ecc…)&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;La funzione che segue non tiene conto della sopracitata logica ma effettua una censura indistinta delle parole indesiderate.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Il codice della funzione è molto semplice.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Creiamo un elenco in un file di testo (o in un database) delle parole da censurare (parolaccie, offese, riferimenti religiosi, ecc...) &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaA&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaB&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaC&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Cicliamo ognuna di queste parole e controlliamo se è presente nel testo da controllare. Se la parola è presente nel testo, la sovrascriveremo con una serie di caratteri non leggibili utilizzando una &lt;a href="http://msdn.microsoft.com/it-it/library/system.text.regularexpressions(VS.80).aspx" target="_blank"&gt;regular expression&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Chi non ha dimestichezza con le regex può sfruttare direttamente il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.string.replace.aspx" target="_blank"&gt;.Replace&lt;/a&gt; dell'oggetto stringa (String, Textbox.Text, ecc...) ma questa soluzione non è performante come l'utilizzo delle regular expression. Un trucco per velocizzare comunque questo procedimento potrebbe essere quello di appoggiarsi ad uno &lt;a href="http://msdn.microsoft.com/it-it/library/system.text.stringbuilder.aspx" target="_blank"&gt;stringbuilder&lt;/a&gt; ma a conti fatti il codice da scrivere risulterebbe più articolato di quello delle regex. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;    &lt;span class="rem"&gt;' VB.&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; System.&lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.EventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; Button1.Click
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.TextBox2.Text = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CensorRegex(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.TextBox1.Text)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; CensorRegex(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; text &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; path &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"c:\Parole sgradite.txt"&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; My.Computer.FileSystem.FileExists(path) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            Using sr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.StreamReader(path)
                &lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt; sr.Peek() &amp;gt;= 0

                    &lt;span class="rem"&gt;' Crea il pattern per la regex.&lt;/span&gt;
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; pattern &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, sr.ReadLine)

                    &lt;span class="rem"&gt;' Crea la stringa di censura.&lt;/span&gt;
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; mask &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}{1}"&lt;/span&gt;, pattern.Substring(0, 1), &lt;span class="kwrd"&gt;New&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;(&lt;span class="str"&gt;"*"&lt;/span&gt;c, pattern.Length - 1))

                    &lt;span class="rem"&gt;' Esegue la censura.&lt;/span&gt;
                    text = Regex.Replace(text, pattern, mask, RegexOptions.IgnoreCase)
                &lt;span class="kwrd"&gt;Loop&lt;/span&gt;

                sr.Close()
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using

            &lt;span class="rem"&gt;' Ritorna il valore.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; text
         &lt;span class="kwrd"&gt;Else&lt;/span&gt;
            MessageBox.Show(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"File {0} non è stato trovato."&lt;/span&gt;, path), &lt;span class="str"&gt;"Errore"&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.&lt;span class="kwrd"&gt;Error&lt;/span&gt;)
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;.Empty
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Un altro problema di questo codice è che non riesce a mantenere maiuscuola la prima lettera della parola da censurare. Ovviamente il problema è aggirabile ma richiederebbe un overhead che annullerebbe ogni beneficio dell'utilizzo delle regex in termini di velocità.&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/183.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx</guid>
            <pubDate>Tue, 04 Aug 2009 12:55:04 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/183.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/183.aspx</wfw:commentRss>
        </item>
        <item>
            <title>OT - Capire il sistema binario</title>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2008/06/01/ot---capire-il-sistema-binario.aspx</link>
            <description>&lt;font face="Verdana"&gt;Ci sono 10 tipi di persone al mondo: quelle che capiscono il sistema binario e quelle che non lo capiscono.&lt;/font&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/108.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2008/06/01/ot---capire-il-sistema-binario.aspx</guid>
            <pubDate>Sun, 01 Jun 2008 10:22:28 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/108.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2008/06/01/ot---capire-il-sistema-binario.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/108.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
