none
Dudas acerca de la estructura de Forms y sus llamadas. RRS feed

  • Pregunta

  • Hola de nuevo, bueno aprovechando que ya retome el lenguaje y estoy volviendo a aprender cosas nuevas (y acordarme de otras) me surgieron algunas dudas con respecto al como crear de manera correcta un proyecto con formularios.

    Si se hace un proyecto de inicio eligiendo Windows.Forms en la clase Program se llama a la clase del primer formulario usando el metodo Application.Run(new Class); Sin embargo, si intento llamar a otro formulario ya sea desde Program usando el formulario o la clase de mi formulario no puedo usar la instruccion Application.Run, como tambien no puedo cerrarla por que se cerraria todo el proyecto viendo que al cerrar la ventana me gustaria que se abriera otro formulario.

    En resumen mis dudas son las siguientes:

    1. Program.cs llama a la primera clase de formulario ¿Como cierro el formulario por codigo sin cerrar todo el proyecto y abrir la siguiente ventana?
    2. Lei que el metodo Dispose(); hace esto, pero al llamarlo no cierra el formulario.
    3. ¿Seria mejor llamar a todos los formularios usando el metodo .ShowDialog()?

    No se si haga falta codigo para explicarme, si es asi dejenme la aclaracion en una respuesa e intentare resumir el codigo de mi proyecto actual. Un saludo.
    viernes, 23 de marzo de 2018 8:41

Respuestas

  • Buenas,

    En primer lugar, para lo que tu quieres, podrias hacerlo en el evento "FormClosing", ir minimizando el formulario actual e ir abriendo el siguiente formulario de forma modal (ShowDialog), de modo que al cerrar el ultimo de todos, se acaben de cerrar completamente todos.

    El método Dispose no cierra formularios, libera recursos, y usarlo para cerrar formularios puede dar problemas.

    La solución que te planteo de ir abriéndolos modales al "cerrar el anterior", es valida (aunque no la mejor) si la lógica de formularios es simple, es decir, por ejemplo si vas ejecutar una secuencia y después a cerrar. Supongo que no es ese el caso, así que por favor, indícanos algo más sobre como quieres que actúe tu programa para poder darte una mejor información.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta DrazeD viernes, 23 de marzo de 2018 11:49
    viernes, 23 de marzo de 2018 10:02
  • Buenas,

    Vamos a hacer una prueba a ver que te parece...

    Main:

    static void Main()
    {
      //Necesario para WinForms
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
    
      //Creamos el MainUI
      MainUI mainForm = new MainUI();
    
      //Creamos a iniciamos el UpdateCheck form
      UpdateCheck update = new UpdateCheck();
      update.ShowDialog();
    
      //De que el UpdateCheck acaba, arrancamos el MainUI
      Application.Run(mainForm);
    }

    Para tu timer en el UpdateCheck:

    private void OpacityCheck_Tick(object sender, EventArgs e)
    {
      if (this.Opacity >= 0.6f) //Lo deje a 0.6f para ver resultados
      {
        this.Opacity = this.Opacity - 0.1f;
      }
      else
      {
        OpacityCheck.Stop();
        this.Close(); //Close en vez de Dispose
      }
    }

    Con eso, primero se abre el formulario de check, y despues se abre el MainUI de la manera que creo que te interesa.

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta DrazeD viernes, 23 de marzo de 2018 11:49
    viernes, 23 de marzo de 2018 11:39

Todas las respuestas

  • Buenas,

    En primer lugar, para lo que tu quieres, podrias hacerlo en el evento "FormClosing", ir minimizando el formulario actual e ir abriendo el siguiente formulario de forma modal (ShowDialog), de modo que al cerrar el ultimo de todos, se acaben de cerrar completamente todos.

    El método Dispose no cierra formularios, libera recursos, y usarlo para cerrar formularios puede dar problemas.

    La solución que te planteo de ir abriéndolos modales al "cerrar el anterior", es valida (aunque no la mejor) si la lógica de formularios es simple, es decir, por ejemplo si vas ejecutar una secuencia y después a cerrar. Supongo que no es ese el caso, así que por favor, indícanos algo más sobre como quieres que actúe tu programa para poder darte una mejor información.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta DrazeD viernes, 23 de marzo de 2018 11:49
    viernes, 23 de marzo de 2018 10:02
  • Buenas,

    En primer lugar, para lo que tu quieres, podrias hacerlo en el evento "FormClosing", ir minimizando el formulario actual e ir abriendo el siguiente formulario de forma modal (ShowDialog), de modo que al cerrar el ultimo de todos, se acaben de cerrar completamente todos.

    El método Dispose no cierra formularios, libera recursos, y usarlo para cerrar formularios puede dar problemas.

    La solución que te planteo de ir abriéndolos modales al "cerrar el anterior", es valida (aunque no la mejor) si la lógica de formularios es simple, es decir, por ejemplo si vas ejecutar una secuencia y después a cerrar. Supongo que no es ese el caso, así que por favor, indícanos algo más sobre como quieres que actúe tu programa para poder darte una mejor información.

    Ok, antes de probar el metodo que me acabas de sugerir te escribo parte del codigo resumido en dos partes.

    Program.cs: No tiene ciencia, solo añadi un metodo mas que se llama desde el otro formulario

    static void Main(String[] args)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new UpdateCheck());
            }
            public static void executeMainUI()
            {
                MainUI mw = new MainUI();
                mw.ShowDialog();
            }
    Por el momento UpdateCheck solo es una ventana de bienvenida que tiene un efecto visual de desvanecimiento que al llegar su opacidad a no ser visible deberia cerrarse y darle paso a otro formulario.

    Este es UpdateCheck en la parte importante donde estoy teniendo problemas:

    //... Esta es la clase UpdateCheck();
    
    //Evento de cierre de ventana y ejecucion de una nueva:
    //Este esta configurado para hacerlo desde un Timer llamado OpacityCheck
    private void OpacityCheck_Tick(object sender, EventArgs e)
            {
                if (this.Opacity >= 0.6f) //Lo deje a 0.6f para ver resultados
                {
                    this.Opacity = this.Opacity - 0.1f;
                } 
                else 
                { 
                    OpacityCheck.Stop();
                    Program.executeMainUI();
                    this.Dispose();
                } //Este else manda lllamar al metodo de Program.cs para construir una nueva ventana, aqui mismo intento en UpdateCheck intento cerrar el formulario para que no gaste recursos. El Stop del timer
    El codigo que falta son solo cosas visuales por ello no lo pongo y lo resumi al objetivo del post.

    Ahora probare el metodo que me dejastes, aun asi, dime si hay una manera mejor de hacerlo o si tienes alguna sugerencia. Bueno, tienes mi marcador de respuestas asegurado jaja, pero esperare a ver que mas me sugieres o si alguien mas me da su opinion. Asi que si no lo ves ahora es por que no estoy o sigo esperando recomendaciones.

    Saludos y gracias :)
    viernes, 23 de marzo de 2018 10:57
  • Buenas,

    Vamos a hacer una prueba a ver que te parece...

    Main:

    static void Main()
    {
      //Necesario para WinForms
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
    
      //Creamos el MainUI
      MainUI mainForm = new MainUI();
    
      //Creamos a iniciamos el UpdateCheck form
      UpdateCheck update = new UpdateCheck();
      update.ShowDialog();
    
      //De que el UpdateCheck acaba, arrancamos el MainUI
      Application.Run(mainForm);
    }

    Para tu timer en el UpdateCheck:

    private void OpacityCheck_Tick(object sender, EventArgs e)
    {
      if (this.Opacity >= 0.6f) //Lo deje a 0.6f para ver resultados
      {
        this.Opacity = this.Opacity - 0.1f;
      }
      else
      {
        OpacityCheck.Stop();
        this.Close(); //Close en vez de Dispose
      }
    }

    Con eso, primero se abre el formulario de check, y despues se abre el MainUI de la manera que creo que te interesa.

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta DrazeD viernes, 23 de marzo de 2018 11:49
    viernes, 23 de marzo de 2018 11:39
  • Si funciona muy bien jaja, muchisimas gracias. Aunque me acaba de dejar bastante extrañado el comportamiento del codigo... del por que precisamente espera a que las funciones del primer formulario terminen para seguir la secuencia de Program.cs. Eso significa que las instancias primero deben terminar su ejecucion para seguir con el codigo xD, pero no sabia que esto aplicaba para los forms tambien (Bueno al final de cuentas tambien es una clase... que mal jaja todavia no eh aprendido todas las cosas basicas)

    Bueno gracias, te dejo la marca de respuesta en ambos mensajes, un saludo y gracias por tomarte la molestia de reescribir un poquito mi programa xD.
    viernes, 23 de marzo de 2018 12:01
  • Buenas DrazeD,

    Ese comportamiento lo marca el .ShowDialog(), eso hace que se abra como un dialogo, y hasta que no termina no continua, si por el contrario, necesitas abrir un formulario sin usar el otro, puedes usar .Show(), lo cual no bloquea el método llamador, puedes hacer la prueba cambiando uno por otro en el código que te he pasado, y ves la diferencia entre ambos.

    Si tienes dudas comentanos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    viernes, 23 de marzo de 2018 12:13