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:
- Definizione di un oggetto di Tipo Assembly
- Utilizzo della For Each per estrarre la lista dei Tipi presenti nell’Assembly (è noto che ogni oggetto ha il proprio tipo che lo contraddistingue).
- 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
Il flusso delle operazioni è molto semplice:
- Viene impostata una stringa con il nome qualificato (comprensivo dell’assembly) della form da richiamare
- 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
Nessun commento:
Posta un commento