Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Caricare un form dal nome

Ciao a tutti,
girando sui vari siti di codice 
vb.net
 ho trovato questa linea di
codice che a me risulta utilissima, magari serve anche a voi:
Public Sub ShowForm(ByVal FrmParent As Form, ByVal Value As String)
Dim Frm As Form
Frm =
AppDomain.CurrentDomain.CreateInstanceAndUnwrap(
FrmParent.GetType.Assembly.GetName.Name
,
System.String.Concat(
FrmParent.GetType.Assembly.GetName.Name
, ".",
Value))
Frm.MdiParent = FrmParent
Frm.StartPosition = FormStartPosition.CenterScreen
Frm.Show()
End Sub
Non fate caso alla formattazione :-)
L'ho trovata inizialmente in
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=640&lngWId=10
Ciao
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email happyman69 (at) 
libero.it


http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=640&lngW
Id=10
Ho testato il codice e mi risulta quanto segue, smentite sono d'obbligo:
- Non evita la costruzione di nuove istanze
- la parola chiave Me, non permette l'utilizzo in un modulo
- Mi sembra, il seguente più immediato:
 Dim f As New yourForm()
 f.Show()
giuseppeD

  f.Show()
Il punto e' che quel codice accede ad una form il cui nome e' contenuto in
una *stringa*, e quindi non e' noto in fase di compilazione come in questo
esempio.
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 esempio.
Se la moltiplicazione delle istanze non è un problema o le cerchi, è una
soluzione che fa comodo,
ma se le devi impedire, il nome del form lo devi dichiarare, quindi non ne
vedo l'utilità per lo show delle form.
Interessante è la costruzione che aiuta a capire meglio il Framework.
Salve
giuseppeD

 vedo l'utilità per lo show delle form.
No, dichiari il nome della classe, non del form.
Metti che una sub debba visualizzare un form tra vari (metti uno per 
ogni cliente diverso): o passi il nome della classe, oppure devi fare un 
select case, con lo svantaggio che quando aggiungi un form nuovo (o ti 
aggiungono se l'assembly è di terze parti) tu dovresti preoccuparti di 
aggiornare questo select.

 ha scritto nel messaggio
news:bjk99k$jvgqs$1...@ID-184808.news.uni-berlin.de...

Per attivare una form ed evitare la moltiplicazione devo dichiararla; se
voglio utilizzare l'esempio di start post;
quindi sempre:
- dim frm as yourForm (nome della classe)
- controllare se è stata istanziata
- quindi passare la stringa alla sub
devo scrivere del codice.
Salve
giuseppeD

 devo scrivere del codice.
Ancora falso.
Metti che il nome della classe sia semplicemente
strMyForm = "Form_" & Cstr(lngCodiceCliente)
Non devi scrivere nessun codice, aggiungi il tuo form e basta e la tua app č
"polimorfica" a costo zero.
Ovviamente il tutto va guardato nel contesto della propria app.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 vedo l'utilità per lo show delle form.
[SNIP]
L'utilita' e' appunto quella detta sopra, che non ha nulla a che vedere con
il creare una o piu' istanze di form: la routine serve a istanziare un
oggetto risolvendo *a runtime* il nome della classe, contenuto in una
stringa
Tanto per capirci, per fare, tra le altre cose, qualcosa di simile a quello
che serviva a 'ivangray' nel thread "Indirizzare un Command ???" di ieri, e
che in VB6 e' parzialmente fattibile con CallByName
E poi, anche se volessi usare un unica istanza di form per tutto il
progetto, puoi usare quel codice in ogni caso...
appurato che per mantenere una singola istanza di form devi salvare un
riferimento da qualche parte, e visto che un sistema comodo e di cui trovi
molti esempi in giro e' quello di creare una tua collection tipizzata sulla
falseriga della collection Forms di VB6, ti sarebbe sufficiente usare la
stringa con il nome della tua form come Key per far funzionare il tutto.


 stringa con il nome della tua form come Key per far funzionare il tutto.
Proviamo con un percorso:
- il Me non lo posso utilizzare in un modulo (già detto)
- il Me non lo posso utilizzare come Shared, in quanto è valido solo
all'interno di una istanza
- quindi volendo utilizzarlo da tutta l'applicazione devo istanziare la
classe cui opera da metodo.
Quindi avrò il seguente:
Class OpenForm
    Public Sub showForm(ByVal frmName As String)
'verifico se è presente nella collection
'se si
Exit Sub
        Dim frm As Form
        frm =
AppDomain.CurrentDomain.CreateInstanceAndUnwrap(Me.GetType.Assembly.GetName.
Name,
System.String.Concat(
Me.GetType.Assembly.GetName.Name
, ".", frmName))
        frm.Show()
    End Sub
'Questo implica
- Classe collection
- classe openForm
- dover caricare e scaricare la collection. (volendo, codice in una maschera
Master, eriditata da tutte le altre)
- Istanziare la classe openForm come segue:
 Dim cl As New OpenForm()
 cl.showForm("frmSeconda")
Vedremo
giuseppeD

  cl.showForm("frmSeconda")
Supponendo che tu abbia dichiarato e istanziato in una classe qualunque un
oggetto shared 'Forms' della tua FormCollection, con le modifiche di cui
sopra e' sufficiente che da qui in poi carichi tutte le form con
Forms.Show(frmSeconda)
oppure
Forms.Show("frmSeconda")


 Si
Non ho capito cosa c'entri la collection: non serve per lo scopo principale
del thread ed è assolutamente forviante, tant'è che Giuseppe credo non abbia
nemmeno capito il problema.


 Show la prima volta che la form non e' gia' in lista
Se la chiudo e la devo successivamente riaprire, dalla collection la devo
per forza scaricare.
Salve
giuseppeD

 nemmeno capito il problema.
Si parlava di verificare se una form, o classe, era di già istanziata.
Mi puoi spiegare praticamente come accerti che l'istanza è viva ?
giuseppeD

 nemmeno capito il problema.
No, infatti non c'era nessun problema in origine, solo un esempio di codice.
Era gia' stato fatto notare che la faccenda "istanza singola" non c'entrava
nulla con il thread iniziale, ma tant'e'... gia' che si e' andati avanti
comunque con quel discorso, rispondevo a quello.


 Mi puoi spiegare praticamente come accerti che l'istanza č viva ?
Io credevo si stesse parlando di come poter instanziare una classe
conoscendone il nome.


 conoscendone il nome.
Vero,
in considerazione che la classe in questione è riferita ad un form,
incuriosito, ho tentato di ampliare un pochino il discorso,
visto, che evitare, per le form, la costruzione di nuove istanze, viaggia
quasi di pari passo.
E con i suggerimenti di Luca Dormio ho snellito una situazione in essere.
L'appetito vien mangiando, a meno che non si è a dieta,
quindi sarebbe interessante, verificare la possibilità di inglobare codice
che faccia dialogare due form,
e no come adesso che utilizzo del codice a parte.
Salve
giuseppeD