none
Duda sobre gestión de Formularios RRS feed

  • Pregunta

  •  

    Hola compañeros.

    Quiero plantear una duda a ver cómo gestionáis vosotros los formularios en las aplicaciones Window.

    Yo trabajo con VS2005 y hago una aplicación Window con VB

     

    El tema está en que hay un formulario principal, y  cuando llamo desde él a otro, lo puedo hacer de forma normal con el Show o como modal. En cualquiera de los dos casos se gestionan ya dos pantallas, cuando mi idea sería que cuando el formulario principal llame a otro, el principal desaparezca, y el principal pase a ser el formulario llamado.

     

    El dispose al formulario principal no puedo hacerlo porque como actúa de "contenedor" también se evapora el formulario llamado.

     

    Lo mejor que he conseguido es hacer invisible el principal para que de la sensación de que desaparece, pero sigue consumiendo recursos.

     

    Mi pregunta es. ¿Hay alguna forma de hacer que el formulario principal desaparezca y deje de consumir recursos al llamar a un formulario y el formulario llamado pase a ser el formulario principal? Luego la idea sería que al cerrar el formulario llamado, vuelva a cargar el formulario principal de la aplicación.

     

    Creo que ésta vez me he explicado bien Big Smile

     

    A ver qué ideas salen

    jueves, 11 de octubre de 2007 7:37

Respuestas

  • Hola Javichechu,

    de entrada se me ocurren dos formas igualmente válidas.

     

    a) Podrías controlar tanto el principal como los secundarios desde una clase principal, cuando desde el principal quieras mostrar un subformulario, lanzale un evento a la clase y que esta muestre el secundario y oculte, incluso destruya la instancia del principal. Una vez terminas con el secundario, este que le devuelva "el testigo" a la clase para que se vuelva a cargar el principal.

     

    b) En vez de ocultar el principal, haz que actue de contenedor. No como un MDI, sino, por ejemplo, crea un control Panel, lo suficientemente grande para albergar los forms secundarios, y lo que harias seria eso, "incrustar" los forms secundarios dentro del panel (al fin y al cabo es un contenedor), con un simple  

    "FormPrincipal.ObjetoPanel.Controls.Add(FormSecundarioX)"

     

    A partir de ahí, puedes hacer que el control del flujo lo lleve el principal, determinando cual es el form secundario que está mostrandose.

     

    A ver si te sirve alguna de las dos ideas. Smile
    jueves, 11 de octubre de 2007 11:28
  • yo solucione el problema de esta forma espero y te funcione

    cree una clase que llame managerforms que contiene este codigo. que contenga esto es muy importante(System.Windows.Forms.ApplicationContext)

     

     

     

    class managerforms : System.Windows.Forms.ApplicationContext

         {

     

            public managerforms()

           {

     

            //Abrir el formulario principal(frmPrincipal)

     

            frmPrincipal principal = new frmPrincipal();

            principal.Show();

           }

     

        }
    despues en el program.cs haces este codigo

     

       static void Main()

       {

     

        Application.EnableVisualStyles();

     

        Application.SetCompatibleTextRenderingDefault(false);

     

        //se cambio Aplication.run para que se iniciara de la clase y no del form principal

     

        Application.Run(new managerforms());// se cambia el nombre de form por la clase y ya inicia desde la clase no del form

       }

     

         public static void Close()

     

         //metodo close sirve para cerrar la clase ya que no se cerrara cuando des click en la cruz,

         {

     

          Application.Exit();

         }

    sábado, 30 de mayo de 2009 7:16

Todas las respuestas

  • Hola Javichechu,

    de entrada se me ocurren dos formas igualmente válidas.

     

    a) Podrías controlar tanto el principal como los secundarios desde una clase principal, cuando desde el principal quieras mostrar un subformulario, lanzale un evento a la clase y que esta muestre el secundario y oculte, incluso destruya la instancia del principal. Una vez terminas con el secundario, este que le devuelva "el testigo" a la clase para que se vuelva a cargar el principal.

     

    b) En vez de ocultar el principal, haz que actue de contenedor. No como un MDI, sino, por ejemplo, crea un control Panel, lo suficientemente grande para albergar los forms secundarios, y lo que harias seria eso, "incrustar" los forms secundarios dentro del panel (al fin y al cabo es un contenedor), con un simple  

    "FormPrincipal.ObjetoPanel.Controls.Add(FormSecundarioX)"

     

    A partir de ahí, puedes hacer que el control del flujo lo lleve el principal, determinando cual es el form secundario que está mostrandose.

     

    A ver si te sirve alguna de las dos ideas. Smile
    jueves, 11 de octubre de 2007 11:28
  • yo solucione el problema de esta forma espero y te funcione

    cree una clase que llame managerforms que contiene este codigo. que contenga esto es muy importante(System.Windows.Forms.ApplicationContext)

     

     

     

    class managerforms : System.Windows.Forms.ApplicationContext

         {

     

            public managerforms()

           {

     

            //Abrir el formulario principal(frmPrincipal)

     

            frmPrincipal principal = new frmPrincipal();

            principal.Show();

           }

     

        }
    despues en el program.cs haces este codigo

     

       static void Main()

       {

     

        Application.EnableVisualStyles();

     

        Application.SetCompatibleTextRenderingDefault(false);

     

        //se cambio Aplication.run para que se iniciara de la clase y no del form principal

     

        Application.Run(new managerforms());// se cambia el nombre de form por la clase y ya inicia desde la clase no del form

       }

     

         public static void Close()

     

         //metodo close sirve para cerrar la clase ya que no se cerrara cuando des click en la cruz,

         {

     

          Application.Exit();

         }

    sábado, 30 de mayo de 2009 7:16