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

#1 floyd303
22/09/2006 - 11:36 | Informe spam
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
#2 AsierMM
22/09/2006 - 11:49 | Informe spam
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
#3 floyd303
22/09/2006 - 12:05 | Informe spam
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.

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
#4 floyd303
22/09/2006 - 12:07 | Informe spam
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
#5 AsierMM
22/09/2006 - 12:29 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida