sabato 19 settembre 2009

Gestire l'apertura di più Forms Tramite La Reflection con Visual Basic

Un piccolo esempio di apertura di più forms tramite la System.Reflection.

 

Nel medesimo progetto c’è una form principale “MainForm”  e di 3 forms secondarie, nella form principale ci sono 2 controlli una comoda combobox e un bottone.
La combobox “contiene” tanti items quante forms secondarie appartengono al progetto, ciascun item riporta il nome di una singola form.

All’inizializzazione è richiamato il metodo AggiungiForm che si occupa di estrarre i nomi delle forms secondarie dall’Assembly.

Private Sub AggiungiForm()
   Dim asmbly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
  
For Each t As Type In asmbly.GetTypes()
       If t.BaseType.Equals(GetType(Form)) AndAlso Not (t Is Me.GetType) Then
            Me.comboBox1.Items.Add(t.Name)
       End If
   Next
End Sub

Si possono notare le seguenti cose:

  1. Definizione di un oggetto di Tipo Assembly 
  2. Utilizzo della For Each per estrarre la lista dei Tipi presenti nell’Assembly (è noto che ogni oggetto ha il proprio tipo che lo contraddistingue).
  3. Per le forms che come base hanno System.Windows.Forms.Form ad esclusione della form corrente è estratto il  nome che è aggiunto alla ComboBox (da notare l’utilizzo di BaseType per le form secondarie e del costrutto Is per la form principale).

La ComboBox si presenta così con la lista delle forms presenti nel progetto.

Il click sul Button richiama un altro metodo ApriFormByName che si occupa del lavoro “sporco” :) e cioè tradurre il nome in un oggetto / tipo specifico e richiamare il costruttore di questo.

Il metodo ApriFormByName:

Private Sub ApriFormByName(ByVal formName As String, ByVal namespaceName As String)

        Dim fullName As String = namespaceName
        Try
            If namespaceName Is Nothing Then
                Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
                fullName = asm.GetName.Name
            End If

            If Not fullName.EndsWith(".") Then
                fullName += "."
            End If
            fullName += formName
            Dim oFormType As Type = Type.GetType(fullName, True, True)
            CType(oFormType.GetConstructor(System.Type.EmptyTypes).Invoke(Nothing), Form).Show()
        Catch ex As Exception
            MessageBox.Show(ex.Message + " " + ex.StackTrace)
        End Try

    End Sub

Il flusso delle operazioni è molto semplice:

  1. Viene impostata una stringa con il nome qualificato (comprensivo dell’assembly) della form da richiamare
  2. E’ richiamato il costruttore della form prescelta, spero sia noto che richiamare il costruttore (New) genera un nuovo oggetto del tipo indicato: CType(oFormType.GetConstructor(System.Type.EmptyTypes).Invoke(Nothing), Form).Show()

E’ disponibile il sorgente del programma scritto con SharpDevelop e Visual Studio 2008

Powered with Windows Live Writer

Nessun commento: