giovedì 29 novembre 2007

Windows Vista - Ancora non ci siamo con la velocità delle cartelle condivise

Ho due portatili, uno con un Acer Travelmate 8104WLMi con XP / SP2 2GB ram ed un Acer Travelmate 8125WLMi con Vista Ultimate + SP1 beta 2 4GB ram.
Ho connesso su entrambi un disco del mio server Linux, ho "alzato" Wingrep, fatto la medesima ricerca su entrambi, su XP 41,1 secondi, con Vista 132,4 secondi.
Da notare che su Vista ho già disattivato la feature "Compressione Differenziale Remota".
Speriamo bene perchè Vista nonostante tutto comincia a piacermi

mercoledì 21 novembre 2007

Gestire l'allineamento del testo nei controlli ListBox con C# e VB.NET

Per risolvere il problema dell'allineamento (Sinistra, Giustificato, Destra) si può intercettare l'evento DrawItem del controllo di tipo ListBox e ridefinire graficamente la stringa.

Una enumerazione per la gestione del DataSource della ComboBox

enum Allineamento
{      
      
Giustificato,
        Sinistra,
        Destra
}
...
comboBox1.DataSource = Enum.GetValues(typeof(Allineamento));

Gestiamo il ridisegno delle stringhe  intercettando DrawItem

// intercettiamo l'evento DrawItem

void ListBox1DrawItem(object sender, DrawItemEventArgs e)
{
       Graphics g = e.Graphics;
       SolidBrush sBrush;
       string s;
       StringFormat sFormat = new StringFormat();
       // Scelta allineamento
       switch(comboBox1.SelectedValue.ToString())
       {
           case "Sinistra":
              sFormat.Alignment = StringAlignment.Near;
              break;
           case "Destra":
              sFormat.Alignment = StringAlignment.Far;
              break;
           default:
              sFormat.Alignment = StringAlignment.Center;
              break;
       }
       try
       {
             s = listBox1.Items[e.Index].ToString();
       }
       catch (Exception ex)
       {
             s = "";
             Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
       }
       // definizione oggetto di tipo SolidBrush che
       // utilizzeremo per disegnare la stringa
        sBrush = new SolidBrush(Color.White);
       g.FillRectangle(sBrush, e.Bounds);
       if (e.State == DrawItemState.Selected)
             g.FillRectangle(Brushes.LightBlue, e.Bounds);
        g.DrawString(s, listBox1.Font, Brushes.Black, (RectangleF) e.Bounds, sFormat);
        sBrush.Dispose();
}

Riferimenti
Esempio realizzato con C
Esempio realizzato con VB.NET

martedì 20 novembre 2007

Automazione Office Outlook - Utilizzo del Late Binding - Esempio Invio Mail

A compendio del mio post precedente ho potuto verificare che la libreria, necessaria per l'interfacciamento Microsoft.Office.Interop.Outlook è disponibile solo a partire dalla versione 2003.

Per poter usare l'automazione su queste e sulle versioni precedenti ho installato Office 2000 su un mio pc virtuale, ho potuto in questo modo referenziare la libreria di Outlook e "costringere" il compiler a generare la dll wrapper, cosa che non ero riuscito a fare con Office 2007.

Anche i riferimenti interne alle enumerazioni di Outlook sono leggermente cambiate.

Ho riconfezionato gli esempi:

Progetto di esempio con C#
Progetto di esempio con VB.NET

domenica 18 novembre 2007

Automazione Office Outlook - Utilizzo del Late Binding - Esempio di invio Mail

Ne avevo bisogno per lavoro, ho provato a cercare in giro ma non sono riuscito a trovare esempi di utilizzo del Late Binding per l'invio di posta utilizzando l'automazione di Office Outlook.
Pazienza :)) me lo sono fatto da me.

L'automazione di Office su C# e VB.NET è possibile sostanzialmente con le tecniche:

  1. Early Binding
  2. Late Binding

L'Early Binding prevede la definizione e l'utilizzo degli oggetti di Office all'interno del programma, l'uso dei membri di Office è fatto direttamente all'interno degli statements, l'associazione degli oggetti è fatta durante la fase di compilazione.

Microsoft.Office.Interop.Outlook.Application oApp; // definizione oggetto di tipo Outlook.Application
oApp = new Microsoft.Office.Interop.Outlook.Application(); // creazione nuovo oggetto
// Definizione di oggetto di tipo MailItem
Microsoft.Office.Interop.Outlook.MailItem mItem = (Microsoft.Office.Interop.Outlook.MailItem) oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

// Assegnazione valori
mItem.To = myemail@myserver.com;
...
mitem.Send(); //invio email

L'early Binding è relativamente semplice da utilizzare una volta imparato il "trucco" è più veloce del Late Binding ma ha il grosso svantaggio che l'associazione tra la nostra interfaccia e Office prevede che chi utilizza il programma sia in possesso della stessa versione di Office di chi ha scritto il programma.
Per ovviare a questo fondamentale inconveniente di solito "il programmatore" fa uso della versione più bassa di Office in circolazione, infatti con questa tattica è di solito le versioni successive di Office "funzionano" con l'Early Binding.

Il Late Binding invece è più complesso perchè prevede la definizione e l'utilizzo di Office solo come server, nel programma si "lanciano" dei comandi al server (Outlook) e con questi comandi si possono impostare/leggere delle proprietà o eseguire dei metodi.
L'ho detto che si utilizzano solo o quasi la classe object e la Reflection per dare i comandi?, ora si può ben capire che diventa tutto molto, molto più complicato.
In compenso però si è svincolati dal legame alla versione di Office, infatti l'associazione è realizzata durante l'esecuzione del programma.
L'apertura del collegamento con il server è fatta generando un'istanza di Otlook:

objClassType = Type.GetTypeFromProgID("Outlook.Application");
objApplication = Activator.CreateInstance(objClassType);

Si prosegue definendo un oggetto di tipo MailItem, allo sesso modo dell'Early ma .. con una sintassi alquanto più complicata.

// Definizione di oggetto di tipo MailItem
objMailItem = (( Microsoft.Office.Interop.Outlook.MailItem) InvokeMethod(objApplication, "CreateItem", Microsoft.Office.Interop.Outlook.OlItemType.olMailItem));
Per ovviare in modo parziale alla complicazione ho provveduto con un Metodo ad hoc.

// Definizione interfaccia per Esecuzione metodo
private object InvokeMethod(object obj, string sProperty, object[] oParam)
{
     return obj.GetType().InvokeMember(sProperty, BindingFlags.InvokeMethod, null, obj, oParam
);
}

L'assegnazione delle proprietà avviene sempre in modo indiretto tramite InvokeMember mediante l'utilizzo di del metodo "SetProperty"
// Assegnazione valori
SetProperty(objMailItem, "To", m.To);
..

Allo stesso modo dei metodi ho provveduto alla definizione del metodo SetProperty

private void SetProperty(object obj, string sProperty, object oValue)
{
    object[] oParam = new object[1];
    oParam[0] = oValue;
    obj.GetType().InvokeMember(sProperty, BindingFlags.SetProperty, null, obj, oParam);
}

Alla fine si può inviare la mail
// Invio mail
object ob = InvokeMethod(objMailItem, "Send" , null );

Riferimenti
Progetto di esempio realizzato con C#
Progetto di esempio realizzato con VB.NET
Reflection
Definizione Binding

Windows Vista Sp1 Release Candidate Preview

Ho recentemente installato il Sp1 RC preview di Windows Vista.
Anche questo Service Pack è riservato ai beta tester Microsoft agli abbonati MSDN e TechNet.
Visto che avevo già precedentemente installato il SP1 RTM (Release To Manufacturing) ho dovuto disinstallarlo.
Tra la disinstallazione e la successiva installazione del SP1 RC di Windows Vista ho "consumato" circa 3 ore.
La prima impressione è che si tratti di un prodotto "maturo", i drivers / programmi preesistenti sia alla prima beta che installati durante la prima beta continuano a funzionare correttamente.
Mi aspetto ora qualche grosso guaio come contraccolpo alle mie dichiarazioni :))

sabato 10 novembre 2007

Piccole differenze tra Visual Studio 2005 e SharpDevelop

Usando indifferentemente secondo entrambi, Visual Studio 2005 e SharpDevelop ho notato alcune differenze su come vengono organizzati, alla creazione,  i progetti Visual Basic e C#.

Con C# entrambi generano un progetto che ha nella classe "program.cs" il punto di entrata e partenza con le classiche istruzioni:

/*
* Creato da SharpDevelop.
 * Utente: Luciano
 * Data: 14/10/2007
 * Ora: 11.13
 *
 */

 

using System;
using System.Windows.Forms;

namespace SerializeCs
{
               /// <summary>
               /// Class with program entry point.
               /// </summary>
               internal sealed class Program
               {
                              /// <summary>
                              /// Program entry point.
                              /// </summary>
                              [STAThread]
                              private static void Main(string[] args)
                              {
                                            Application.EnableVisualStyles();
                                            Application.SetCompatibleTextRenderingDefault(false);
                                            Application.Run(new MainForm());
                              }                            

               }
}

Visual Studio come unica differenza da #D on C# genera la classe Program non dichiarandola internal e sealed

Dove cambia invece è sulla generazione dei progetti Visual Basic.
Visual Studio non genera nessun file separato e mette la Form (Form1) come oggetto di avvio.
#D genera un file "program.vb" che contiene una estensione della classe MyApplication e mette questo oggetto come oggetto di avvio

' Creato da SharpDevelop.
' Utente: Luciano
' Data: 09/11/2007
' Ora: 16.25
'

Imports Microsoft.VisualBasic.ApplicationServices 

Namespace My
       ' This file controls the behaviour of the application.
       Partial Class MyApplication
             Public Sub New()
                    MyBase.New(AuthenticationMode.Windows)
                    Me.IsSingleInstance = False
                    Me.EnableVisualStyles = True
                    Me.SaveMySettingsOnExit = False ' MySettings are not supported in SharpDevelop.
                    Me.ShutDownStyle = ShutdownMode.AfterMainFormCloses
             End Sub

             Protected Overrides Sub OnCreateMainForm()
                    Me.MainForm = My.Forms.MainForm
             End Sub
       End Class
End Namespace

Visual Studio inoltre di default "mostra tutto" su C# e "nasconde gran parte" dei file su Visual Basic (per vedere i file nascosti è necessario premere  l'opzione "mostra tutti i file".
Queste differenze mi hanno portato ad una semplice conclusione:
Psicologicamente Microsoft considera Visual Basic inferiore a C# in quanto considera Visual Basic come un IDE che deve predisporre un progetto che avrà in genere una sola Form.
L'atteggiamento mentale della costruzione dell'interfaccia è sì rivolta alla semplificazione del lavoro ma qui abbiamo passato il limite, si è fatto un gran lavoro per nascondere di default agli occhi del pubblico opzioni che invece su C# non sono neanche state parametrizzate o previste.

giovedì 8 novembre 2007

Window Live Suite finale disponibile per il download

La versione definitiva di Windows Live è disponibile per lo scaricamento.
Per chi non lo sapesse si tratta di una collezione di alcuni programmi:

  • Windows Live Mail, sostituisce Outlook Express
  • Messenger - non credo abbia bisogno di spiegazioni
  • Raccolta foto
  • Writer (questo post è scritto con Windows Live Writer)
  • Windows Live Toolbar (i hate this)
  • One Care (ma ... non è gratis)

Si tratta di programmi molto interessanti alcuni già conosciuti (Live Mail/outlook) sono stati completamente ridisegnati con un look & feel particolarmente accattivante.
Accattatevillo!

MSDN Library edizione giugno 2007 - disponibili le ISO per il download

Per chi ancora non lo sapesse ... ci sono circa 2 gb di documentazione (e che documentazione!) da scaricare, cosa aspettiamo?

domenica 4 novembre 2007

Archivio Sportelli Bancari - Elenco Abi Cab Aggiornato a fine Ottobre 2007

L'archivio sportelli bancari elenco Abi Cab aggiornato a fine ottobre 2007  è disponibile per lo scaricamento a questo indirizzo:
Alcune informazioni sui files:
- campi separati da tabulazione hex: 09
- righe separate dal terminatore di riga windows hex: 0d0a
- intestazione colonne sulla prima riga
Il file TabAbi contiene i dati relativi alle banche.
Il file TabAbiCab contiene le informazioni relative agli sportelli
Nel file TabAbi e TabAbiCab è presente il campo "Aggiornamento" che evidenzia la data di riferimento di validità dei dati.
Tutte le righe di TabAbiCab che NON contengono la data più recente sono da considerarsi relative a sportelli non più attivi o assorbiti da altre banche, tali sportelli sono presenti solo come log dei dati storici, ne è sconsigliato l'utilizzo per nuove emissioni di flussi di comunicazione con le banche.

giovedì 1 novembre 2007

Virtual Server 2005 - Disponibile il supporto di Linux come sistema operativo Guest

Microsoft ha reso disponibile per il download le "Virtual Machine Additions per Linux" i programmi che rendono l'interazione di Virtual Server 2005 con il sistema operativo Linux installato come Guest rendendo molto più facile e veloce lo switch tra l'uno e l'altro, la tastiera, il mouse ecc.
Nell'elenco non compare Fedora ma ... visto che c'è "Red Hat Linux 9" che è quello che è venuto prima molto probabilmente funzioneranno, (almeno spero).