Abrir formularios dinámicamente

30/03/2005 - 09:29 por Lucía | Informe spam
Hola,

Necesito crear una función que me permita abrir formularios de forma
dinámica, es decir pasándole un parámetro tipo string que contiene el nombre
del formulario (cada vez uno) Debería quedar de esta forma (pero en VB.NET)

Sub ver Formulario (f as string)
Dim Form1 as form
Form1 = Forms.Add(f)
Form1.Show( )
End Sub

Este código me funciona en VB6 ¿Qué debo cambiar para que me funcione en
VB.NET?

Gracias

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
30/03/2005 - 15:46 | Informe spam
Utiliza Activator.CreateInstance para crear objetos a partir del tipo o
nombre de la clase. Por ejemplo:

Public Sub VerFormulario(ByVal t As Type)

Dim f As Form

f = DirectCast(Activator.CreateInstance(t), Form)
f.Show()

End Sub

Y lo llamarias asi:

VerFormulario(GetType(Form1))
VerFormulario(Type.GetType("MiNamespace.Form1"))

Tambien puedes optar por usar la sobrecarga de CreateInstance que toma
String:

Public Sub VerFormulario(ByVal formulario As String)

Dim f As Form

f = DirectCast(Activator.CreateInstance(Nothing, formulario).Unwrap,
Form)
f.Show()

End Sub

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
#2 Marcos Beccar Varela
30/03/2005 - 23:17 | Informe spam
Hola Eduardo..
Tengo un problema similar.. mi aplicacion corre un slpash y luego llama a un
MDI que a su vez abre otros formularios.
Pero nunca puedo hacer referencias a los formularios con el estilo de VB 6.
Gman.form1 donde Gman es el root namespace que setee en las propiedades del
proyecto.

Yo necesito hacer una rutina que abra un formulario y que pase un String de
parametro..
al probar ocn el codigo que propusiste me da error

ERROR
An unhandled exception of type 'System.ArgumentNullException' occurred in
mscorlib.dll
Additional information: El valor no puede ser nulo.

LINEA
f = DirectCast(Activator.CreateInstance(t), Form)

La ventana se muestra pero se traba el proyecto justo en ese momento.
Ademas solo se referenciarlo si la public sub (rutina) la ingreso dentro del
formulario origen ya que no puedo referenciarla desde algun modulo.
Gracias por todo





"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:
Utiliza Activator.CreateInstance para crear objetos a partir del tipo o
nombre de la clase. Por ejemplo:

Public Sub VerFormulario(ByVal t As Type)

Dim f As Form

f = DirectCast(Activator.CreateInstance(t), Form)
f.Show()

End Sub

Y lo llamarias asi:

VerFormulario(GetType(Form1))
VerFormulario(Type.GetType("MiNamespace.Form1"))

Tambien puedes optar por usar la sobrecarga de CreateInstance que toma
String:

Public Sub VerFormulario(ByVal formulario As String)

Dim f As Form

f = DirectCast(Activator.CreateInstance(Nothing,
formulario).Unwrap,
Form)
f.Show()

End Sub

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C


Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
31/03/2005 - 01:46 | Informe spam
Tengo un problema similar.. mi aplicacion corre un slpash y luego
llama a un MDI que a su vez abre otros formularios.
Pero nunca puedo hacer referencias a los formularios con el estilo de
VB 6. Gman.form1 donde Gman es el root namespace que setee en las
propiedades del proyecto.



En vb.net no tienes la instancia por defecto del formulario (esa que se
llama igual que el formulario) que tienes en VB6. Para llamar a cualquier
metodo/propiedad de un formulario deberas tener una referencia a este
guardada tal como necesitas con cualquier otro objeto. Si quieres tener algo
como la instancia de VB6 utiliza el patron Singleton en la clase del
formulario (si no sabes lo que es busca en los mensajes viejos del grupo).

Yo necesito hacer una rutina que abra un formulario y que pase un
String de parametro..
al probar ocn el codigo que propusiste me da error



¿El constructor recibe un parametro? Si ese es el caso deberas llamar a una
de las sobrecargas de CreateInstance que permiten el paso de parametros al
constructor.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
#4 Lucía
31/03/2005 - 09:33 | Informe spam
Las dos soluciones que nos has facilitado me dan error: "Excepción no
controlada del tipo System.TypeLoadException en MSCORLIB.dll - No se puede
cargar el tipo form1 del ensamblado FormsContenedores.

También he visto lo del patrón Singleton pero no tengo claro cómo
utilizarlo. Todo lo que he encontrado es para aplicaciones cliente/servidor
y lo que realmente estoy intentando conseguir es abrir formularios
dinámicamente, si hay alguna cosa más que pueda hacer te agradecería que me
lo explicases o me dijeses donde puedo encontrar más información

Gracias y un saludo,



"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:
Utiliza Activator.CreateInstance para crear objetos a partir del tipo o
nombre de la clase. Por ejemplo:

Public Sub VerFormulario(ByVal t As Type)

Dim f As Form

f = DirectCast(Activator.CreateInstance(t), Form)
f.Show()

End Sub

Y lo llamarias asi:

VerFormulario(GetType(Form1))
VerFormulario(Type.GetType("MiNamespace.Form1"))

Tambien puedes optar por usar la sobrecarga de CreateInstance que toma
String:

Public Sub VerFormulario(ByVal formulario As String)

Dim f As Form

f = DirectCast(Activator.CreateInstance(Nothing,
formulario).Unwrap,
Form)
f.Show()

End Sub

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C


Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
31/03/2005 - 16:18 | Informe spam
Para ambos casos, necesitas usar el nombre de la clase junto con el
namespace en el que esta definido (por ejemplo MiNamespace.MiClase) y
escrito exactamente igual a como esta definido ya que se diferencian
mayusculas de minusculas. Si el formulario no esta en el ensamblado en que
creas el formulario deberas indicar tambien el ensamblado en CreateInstance:

Public Sub VerFormulario( _
ByVal formulario As String, _
Optional ByVal ensamblado As String = Nothing)

Dim f As Form

f = DirectCast(Activator.CreateInstance(ensamblado,
formulario).Unwrap, Form)
f.Show()

End Sub

VerFormulario("MiNamespace.MiForm","MiEnsambladoConForms")

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida