Abrir formularios solo conociendo su nombre

22/09/2006 - 10:32 por AsierMM | Informe spam
Hola tengo muchas formularios en mi proyecto y una funcion que los abre.
Por parametro recivire su nombre y me gustaria saber una forma de hacer un
new de ese informe pero de una forma que no tenga que hacer un case y hacer
su new.
La idea es tener un new unico para todos los formularios.
Yo estaba pensando en si existia una funcion estilo a la Eval de JavaScript
que me permitiese evaluar el "new 'Nombre de informe' "
Bueno cualquier idea sera bien recivida. Muchas gracias a todos

Preguntas similare

Leer las respuestas

#6 floyd303
22/09/2006 - 13:11 | Informe spam
Hola!

Si, es la opcion por reflexion (me la apunto porque no la conocia :D ).
Y, si, tiene pinta de ser lenta.

Siento si he sido un poco "critico". A lo mejor es que no lo habia
explicado bien.
Ya digo: si necesitas mas ayuda, ya sabes donde estoy.

Un saludo
Roberto M. Oliva

AsierMM ha escrito:

Igual no te habia entendido bien, le volvere a echar un vistazo.
El codigo que he conseguido hacer hasta ahora que funciona mas o menos bien
para lo que queria es el siguiente: aunque pensamos que puede ser muy lento,
por lo que revisare tu propuesta. Gracias de nuevo.

Dim nombreInfome As String = "Form1"

Dim formulario As Form
Dim EsteEnsamblado As System.Reflection.Assembly > System.Reflection.Assembly.GetExecutingAssembly

For Each Tipo As Type In EsteEnsamblado.GetTypes()
If Tipo.Name() = nombreInfome Then
formulario = Activator.CreateInstance(Tipo, true)
End If
Next

formulario.Show()


"" wrote:

>
> Hola!
>
> Perdona, pero no creo que sea asi lo que me estas diciendo. Con lo que
> yo te digo no tienes que modificar nada del codigo de los formularios.
> Hacer 60 implementaciones de la interfaz que yo te he propuesto no creo
> que tardes mas de media hora.
> Lo que si vas a tener que cambiar es la instanciacion de los
> formularios, pero con lo que estas buscando tambien vas a tener que
> hacerlo.
> No tienes porque plantearte esta solucion desde el principio, estoy
> convencido de que ahora mismo ya la puedes aplicar sin que te produzca
> mucho problema en tu codigo.
> A ver... que no la quieras implementar... no pasa nada! Ahora, que me
> digas que no la tienes que cuenta porque tienes que modificar los
> formularios si que no lo entiendo, porque no hay que tocarlos para
> nada... bueno, tu mismo ;)
>
> Si te puedo ayudar en algo mas... ya sabes donde estoy.
>
> Saludos
> Roberto M. Oliva
>
> AsierMM ha escrito:
>
> > Muvhas gracias por tu ayuda, pero creo que eso no es lo que estan buscando.
> > Me parece muy buena idea pero ya hay creados unos 50 o 57 informes y no creo
> > que ahora quieran empezar a modificarlos. Por ese motivo lo de la funcion a
> > parte, xq no quieren tocar nada de codigo. De todas formas te lo agradezco y
> > para la proxima planteare esta solucion antes de empezar.
> >
> >
> > "" wrote:
> >
> > >
> > > Hola!
> > >
> > > Esto se puede hacer por reflexion, lo que pasa es que ahora mismo no
> > > tengo el codigo,
> > >
> > > Pero lo que quieres hacer tambien se puede hacer con un patron Factory:
> > > Suponte que tienes 2 formularios: frmCliente y frmProveedor.
> > >
> > > Creas un interfaz como el siguiente:
> > >
> > > public interface IFormElement
> > > {
> > > string Nombre { get;}
> > > Form ObtenerFormulario();
> > > }
> > >
> > > Escribes una implementacion del interfaz para cada formulario:
> > >
> > > public class FormClienteElement : IFormElement
> > > {
> > > public string Nombre
> > > {
> > > get { return "frmCliente"; }
> > > }
> > >
> > > public Form ObtenerFormulario()
> > > {
> > > return new frmCliente;
> > > }
> > > }
> > >
> > > public class FormProveedorElement : IFormElement
> > > {
> > > public string Nombre
> > > {
> > > get { return "frmProveedor"; }
> > > }
> > >
> > > public Form ObtenerFormulario()
> > > {
> > > return new frmProveedor;
> > > }
> > > }
> > >
> > > y creas una clase Factoria que mantiene una lista de los IFormElement y
> > > busca el que quieres:
> > >
> > > public class FormElementFactory
> > > {
> > > public static IList<IFormElement> TodosLosFormularios()
> > > {
> > > IList<IFormElement> objLista = new List<IFormElement>();
> > > objLista.Add(new FormClienteElement());
> > > objLista.Add(new FormProveedorElement());
> > > return objLista;
> > > }
> > >
> > >
> > > public static Form GetFormulario(string strNombreFormulario)
> > > {
> > > foreach (IFormElement formElement in TodosLosFormularios)
> > > {
> > > if (formElement.Nombre == strNombreFormulario)
> > > return formElement.ObtenerFormulario();
> > > }
> > > return null;
> > > }
> > > }
> > >
> > > Cuando quieras obtener un formulario solo tienes que hacer como sigue:
> > >
> > > frmCliente frm = (frmCliente)
> > > FormElementFactory.GetFormulario("frmCliente");
> > >
> > > o:
> > >
> > > frmProveedor frm = (frmProveedor)
> > > FormElementFactory.GetFormulario("frmProveedor");
> > >
> > > Cuando quieras añadir un nuevo formulario a esta factoria, solo tienes
> > > que crear una implementacion del IFormElement (2 lineas de codigo no
> > > automatico) y añadir el elemento a la lista de la factoria (1 linea de
> > > codigo).
> > >
> > > Espero que te ayude
> > > Saludos
> > > Roberto M. Oliva
> > >
> > >
> > >
> > >
> > >
> > > AsierMM ha escrito:
> > >
> > > > Hola tengo muchas formularios en mi proyecto y una funcion que los abre.
> > > > Por parametro recivire su nombre y me gustaria saber una forma de hacer un
> > > > new de ese informe pero de una forma que no tenga que hacer un case y hacer
> > > > su new.
> > > > La idea es tener un new unico para todos los formularios.
> > > > Yo estaba pensando en si existia una funcion estilo a la Eval de JavaScript
> > > > que me permitiese evaluar el "new 'Nombre de informe' "
> > > > Bueno cualquier idea sera bien recivida. Muchas gracias a todos
> > >
> > >
>
>
Respuesta Responder a este mensaje
#7 Eduardo A. Morcillo [MS MVP VB]
24/09/2006 - 17:26 | Informe spam
Mas simple que recorrer todo los tipos del ensamblado es hace Type.GetType:

Dim nombreInfome As String = "MiNamespace.Form1"
Dim formulario As Form
Dim tipo as Type

tipo = Type.GetType(nombreInforme)
formulario = Activator.CreateInstance(tipo)
formulario.Show()

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida