none
Varias preguntas sobre el tema del uso de los Form en vb.net

    Pregunta

  • Hola amigos del foro: He estado haciendo algunas pruebas para un programa que me regresan a ciertas preguntas de cuando comencé a estudiar .NET.   Tengo un formulario primcipal en donde al inicio declaro un formulario para una consulta de clientes: Dim frmCatalogoClientes As frmConsultaCatalogoClientes = New frmConsultaCatalogoClientes. En el formulario frmConsultaClientes tengo a la vez una sub pública con el nombre Mensajes. En el formulario principal tengo varios botones para hacer pruebas y ver el comportamiento de los formularios, en el botón1 tengo las siguientes instrucciones: Me.AddOwnedForm(frmCatalogoClientes)
    frmCatalogoClientes.Show() y desde otro botón del formulario principal muestro un mensaje de pruebas frmCatalogoClientes.Mensaje() y aparece un simple mensaje de pruebas que dice "Aquí estoy". Para salir del formulario de clientes presiono un botón en este formulario con la instrucción me.Close. Si vuelvo a presionar el mismo botón1 del form principal para mostrar el form de clientes me aparece un mensaje diciendo que este ya ha sido desechado, pero si presiono el boton del mensaje, este aparece y no hay erores. Y si pregunto If (frmCatalogoClientes Is Nothing) Then me dice o confirma que no es Nothing.

    ¿Por que para mostrarlo no existe despues de cerrarlo con el método Close y sí existe para presentar el mensaje de pruebas?¿Application.OpenForms me indica que un formulario está abierto o que este existe? ¿si ya cerré el formulario con Close tengo que volver a crearlo con Dim frmCatalogoClientes As frmConsultaCatalogoClientes = New frmConsultaCatalogoClientes?

    Espero haber expresado la duda correctamente y me puedan ayudar. Saludos a todos.

    viernes, 26 de agosto de 2016 5:27

Respuestas

  • "Carlos Cuenta" preguntó:

    > Para salir del formulario de clientes presiono un botón en este formulario
    > con la instrucción me.Close. Si vuelvo a presionar el mismo botón1 del form
    > principal para mostrar el form de clientes me aparece un mensaje diciendo
    > que este ya ha sido desechado, pero si presiono el boton del mensaje, este
    > aparece y no hay erores. Y si pregunto If (frmCatalogoClientes Is Nothing) Then
    > me dice o confirma que no es Nothing.
    >
    > ¿Por que para mostrarlo no existe despues de cerrarlo con el método Close
    > y sí existe para presentar el mensaje de pruebas?

    Hola, Carlos:

    Hace ya unos cuantos años que escribí el siguiente artículo:

    Abrir y cerrar formularios con Visual Basic .net

    En el apartado 3 del Escenario 1 indico los motivos para que se obtenga una excepción del tipo ObjectDisposedException, que me imagino será la excepción que obtienes cuando indicas que "me aparece un mensaje diciendo que este ya ha sido desechado":

    [...]

    3. Cierre el segundo formulario y pulse de nuevo el control Button existente para mostrar nuevamente Form2.

    Si no lo esperaba, lo mismo se estará preguntando por el motivo de haber obtenido una excepción del tipo ObjectDisposedException, a pesar de que la instancia del formulario no tiene el valor Nothing. El motivo de ello, se encuentra en que al cerrarse el formulario no modal, el marco de trabajo de .NET ha llamado a su método Close, el cual, a su vez, se encarga de eliminar el identificador asociado al formulario. En realidad, desde el método Close lo que se hace es efectuar una llamada a la función SendMessage de la API de Windows, para ejecutar el mensaje WM_CLOSE, constante cuyo valor es &H10. Si desea usted mismo probarlo, ejecute el siguiente código fuente para cerrar el formulario actual:

    [...]

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta Carlos Cuenta sábado, 27 de agosto de 2016 8:05
    viernes, 26 de agosto de 2016 7:03
    Moderador
  • Si quieres mostrarlo y ocultarlo, usa los métodos .Hide y .Show, no uses el .Close. Este último libera los componentes internos, por lo que el form queda en un estado en el que no puede mostrarse de nuevo en pantalla, aunque la clase sigue instanciada y por tanto puedes seguir usando los métodos que contenga y accediendo a sus propiedades. Es muy común hacer esto para mostrar un form que pide datos, y después de cerrarlo leer los datos que se introdujeron en él.

    Si después de hacerle el Close (en lugar de Hide) quieres volver a mostrarlo, debes mostrar una instancia nueva, cosa que se consigue llamando al operador New como ya sabes. Por cierto, antes de hacer esto para construir la nueva instancia, es buena práctica llamar al .Dispose de la instancia anterior, para que termine de liberar sus recursos internos no-gestionados.

    • Marcado como respuesta Carlos Cuenta sábado, 27 de agosto de 2016 8:06
    viernes, 26 de agosto de 2016 6:48

Todas las respuestas

  • Si quieres mostrarlo y ocultarlo, usa los métodos .Hide y .Show, no uses el .Close. Este último libera los componentes internos, por lo que el form queda en un estado en el que no puede mostrarse de nuevo en pantalla, aunque la clase sigue instanciada y por tanto puedes seguir usando los métodos que contenga y accediendo a sus propiedades. Es muy común hacer esto para mostrar un form que pide datos, y después de cerrarlo leer los datos que se introdujeron en él.

    Si después de hacerle el Close (en lugar de Hide) quieres volver a mostrarlo, debes mostrar una instancia nueva, cosa que se consigue llamando al operador New como ya sabes. Por cierto, antes de hacer esto para construir la nueva instancia, es buena práctica llamar al .Dispose de la instancia anterior, para que termine de liberar sus recursos internos no-gestionados.

    • Marcado como respuesta Carlos Cuenta sábado, 27 de agosto de 2016 8:06
    viernes, 26 de agosto de 2016 6:48
  • "Carlos Cuenta" preguntó:

    > Para salir del formulario de clientes presiono un botón en este formulario
    > con la instrucción me.Close. Si vuelvo a presionar el mismo botón1 del form
    > principal para mostrar el form de clientes me aparece un mensaje diciendo
    > que este ya ha sido desechado, pero si presiono el boton del mensaje, este
    > aparece y no hay erores. Y si pregunto If (frmCatalogoClientes Is Nothing) Then
    > me dice o confirma que no es Nothing.
    >
    > ¿Por que para mostrarlo no existe despues de cerrarlo con el método Close
    > y sí existe para presentar el mensaje de pruebas?

    Hola, Carlos:

    Hace ya unos cuantos años que escribí el siguiente artículo:

    Abrir y cerrar formularios con Visual Basic .net

    En el apartado 3 del Escenario 1 indico los motivos para que se obtenga una excepción del tipo ObjectDisposedException, que me imagino será la excepción que obtienes cuando indicas que "me aparece un mensaje diciendo que este ya ha sido desechado":

    [...]

    3. Cierre el segundo formulario y pulse de nuevo el control Button existente para mostrar nuevamente Form2.

    Si no lo esperaba, lo mismo se estará preguntando por el motivo de haber obtenido una excepción del tipo ObjectDisposedException, a pesar de que la instancia del formulario no tiene el valor Nothing. El motivo de ello, se encuentra en que al cerrarse el formulario no modal, el marco de trabajo de .NET ha llamado a su método Close, el cual, a su vez, se encarga de eliminar el identificador asociado al formulario. En realidad, desde el método Close lo que se hace es efectuar una llamada a la función SendMessage de la API de Windows, para ejecutar el mensaje WM_CLOSE, constante cuyo valor es &H10. Si desea usted mismo probarlo, ejecute el siguiente código fuente para cerrar el formulario actual:

    [...]

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta Carlos Cuenta sábado, 27 de agosto de 2016 8:05
    viernes, 26 de agosto de 2016 7:03
    Moderador