none
Instancia a objetos en C#... RRS feed

  • Pregunta

  • Hola a toda la comunidad.

    Estoy estudiando programación y llevándolo a la practica en C#.

    Consulta: Tengo un formulario PADRE, con el nombre MenuPrincipal (con un MenuStrip), un formulario HIJO con el nombre Login. El login lo inicio desde el evento load del formulario padre. Una vez ingresado el usuario correctamente. En el MenuStrip, hay un comando con el nombre LogOut para desloguearse y una vez deslogueado el nombre pasa a LogIn para loguearse nuevamente. El Login lo abro nuevamente desde el evento del comando del MenuStrip mencionado anteriormente.

    Resulta que debo instanciar nuevamente el objeto del formulario hijo desde el evento del comando MenuStrip:

    Login FormLogin = new Login();
    FormLogin.MdiParent = this;

    Si no instancio de nuevo el objeto, no hace nada. No inicia de nuevo el formulario Login. Es decir, analizo que cada vez que se cierra el formulario, el objeto se destruye, pero la instancia no. Ya que antes de crear una nueva instancia para abrir el Login, me fijé los siguiente:

    if(FormLogin != null){

    messagebox.show("Ya existe una instancia del formulario");

    }

    Y efectivamente el mensaje aparecía. Pero al darle formLogin.Show(); no pasa nada, no se inicia. Sin antes volver a instanciar el objeto.

    Estoy casi seguro, que no son prácticas aconsejables instanciar varias veces el mismo objeto. Ya que, si esto se hace con muchos formularios. Y el programa pasa mucho tiempo en funcionamiento, se abrirían muchísimas instancias de objetos. En una PC con bajos recursos, empezarían a faltar recursos.

    Cómo hago para poder abrir las veces que necesite el formulario hijo Login, sin tener que instanciar el objeto cada vez?

    Desde ya muchas gracias. Saludos Leopoldo.


    • Editado LeoMiracco lunes, 9 de diciembre de 2019 22:20
    lunes, 9 de diciembre de 2019 22:15

Respuestas

  • Hola Leopoldo

    Close() elimina el objeto Form o la instancia de la clase derivada de Form, que es lo mismo.

    Tenes que instanciar la clase del Form otra vez si usaste Close()

    Si queres esconder el Form y luego mostrarlo, tendrías que usar Hide() y luego Show() o ShowDialog() que no son lo mismo. El primero hace el diálogo No modal y el segundo lo hace Modal

    Ojo que si creas una variable tipo Form en un métdodo controlador de un evento Click por ejemplo, y creas el Form con new, por más que no lo elimines explícitamente, al terminar el método todas las variables u objetos locales dejan de existir.

    Saludos

    Pablo

    lunes, 9 de diciembre de 2019 22:44
  • Gracias Leandro por tus consejos. Haber sabido lo iniciaba como me indicas, iniciando desde el Program.cs

    El problema que tenía, es que al sistema se puede ingresar como invitado, con opciones importantes desactivadas. Por eso, era necesario, que se tenga la posibilidad de loguearse más adelante, o depende quién se siente en ese momento, que tenga acceso o no.

    Y recién ahora caí en la cuenta. Que se puede solucionar. Si cuando se usa el sistema como invitado, y luego supongamos que llega un Admin, y sin cerrar la aplicación se quiere loguear. Cuando le da clic a LogIn, se puede ponder Application.Restart();

    De esta manera se reinicia todo con el Login desde Program.cs. Quizás hay mas posibilidades. Muchas gracias!


    Leopoldo

    martes, 10 de diciembre de 2019 0:51

Todas las respuestas

  • Hola Leopoldo

    Close() elimina el objeto Form o la instancia de la clase derivada de Form, que es lo mismo.

    Tenes que instanciar la clase del Form otra vez si usaste Close()

    Si queres esconder el Form y luego mostrarlo, tendrías que usar Hide() y luego Show() o ShowDialog() que no son lo mismo. El primero hace el diálogo No modal y el segundo lo hace Modal

    Ojo que si creas una variable tipo Form en un métdodo controlador de un evento Click por ejemplo, y creas el Form con new, por más que no lo elimines explícitamente, al terminar el método todas las variables u objetos locales dejan de existir.

    Saludos

    Pablo

    lunes, 9 de diciembre de 2019 22:44
  • hola

    >>El login lo inicio desde el evento load del formulario padre

    Eso no seria una buena idea

    El login deberias instanciarlo desde el Main() de Program.cs, de esta forma poder mostrar el dialogo de autenticacion antes de asignar el Application.Run()

    >>Cómo hago para poder abrir las veces que necesite el formulario hijo Login, sin tener que instanciar el objeto cada vez?

    porque necesitas varias veces la instancia del form ? porque no lo muestras como modal

    using(Login frmLogin = new Login()){

        frmLogin.ShowDialog();

    }

    asi sabes que se destruye correctamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de diciembre de 2019 22:47
  • Muchas gracias por los consejos. Usando formularios hijos, creo que no me dejó usar el ShowDialog(). Pero me quedo tranquilo que al usar Close(), se elimina objeto e instancia. Por las dudas atrás del Close(); le puse un Dispose();

    Genial!


    Leopoldo

    martes, 10 de diciembre de 2019 0:45
  • Gracias Leandro por tus consejos. Haber sabido lo iniciaba como me indicas, iniciando desde el Program.cs

    El problema que tenía, es que al sistema se puede ingresar como invitado, con opciones importantes desactivadas. Por eso, era necesario, que se tenga la posibilidad de loguearse más adelante, o depende quién se siente en ese momento, que tenga acceso o no.

    Y recién ahora caí en la cuenta. Que se puede solucionar. Si cuando se usa el sistema como invitado, y luego supongamos que llega un Admin, y sin cerrar la aplicación se quiere loguear. Cuando le da clic a LogIn, se puede ponder Application.Restart();

    De esta manera se reinicia todo con el Login desde Program.cs. Quizás hay mas posibilidades. Muchas gracias!


    Leopoldo

    martes, 10 de diciembre de 2019 0:51