none
¿Cómo abro un formulario y que se quede abierto en esta situación? (explico) RRS feed

  • Pregunta

  • Abro un primer formulario desde un Sub Main así:

    Application.Run(forPrincipal)

    Dentro de ese formulario pongo un boton. Quiero que ese botón abra un segundo formulario pero que se quede abierto.

    No quiero abrirlo con ShowDialog, porque aparte quiero abrir otro con ShowDialog pero que el anterior siga en pantalla. Es decir en algún momento queden los tres abiertos a la vez.

    martes, 17 de mayo de 2016 1:08

Respuestas

  • "James-2016" escribió:

    > jeje creo que ya tengo la respuesta. Debo abrirlo directamente noo? o sea así:
    >
    > MiFormulario.Show (sin el bloque Using)

    Efectivamente. Si tu intención es abrir un formulario no modal (mediante el método Show), NO PUEDES llamar a su método Dispose (que es lo que hace automáticamente la instrucción End Using) hasta que decidas cerrarlo por completo.

    > Using MiFormulario As New MiFormulario1
    >
    >    MiFormulario.ShowDialog
    >
    > End Using

    Utilizar el bloque Using ... End Using está bien para abrir un formulario modal (mediante su método ShowDialog), pero no un formulario no modal. Para éste último, tienes que declarar la correspondiente variable objeto y llamar a su método Show:

        ' Declaramos la variable que referencia al formulario.
        Dim MiFormulario As New MiFormulario1()
    
        ' Añadimos el controlador para el evento FormClosed del formulario
        AddHandler MiFormulario.FormClosed, AddressOf FormOnClosed
    
        ' Mostramos el formulario no modal.
        MiFormulario.Show()
    
        Private Sub FormOnClosed(sender As Object, e As FormClosedEventArgs)
    
            ' El formulario se está cerrando.
            '
            ' Obtenemos la referencia al objeto o formulario
            ' que ha provocado el evento.
            '
            Dim frm As Form = TryCast(sender, Form)
    
            ' Llamamos a su método Dispose.
            '
            If (Not frm Is Nothing) Then
                frm.Dispose()
            End If
    
        End Sub


    De ésta manera, cuando se cierre el formulario se ejecutará el procedimiento FormOnClosed y ahí será donde llamaremos al método Dispose de dicho formulario.

    ¿Conoces la diferencia existente entre un formulario modal y no modal?

    Abrir y cerrar formularios con Visual Basic .net


    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.



    martes, 17 de mayo de 2016 8:52
    Moderador
  • "James-2016" preguntó:

    > pero qué pasa si no se invoca explícitamente al método dispose? ¿o sea
    > si solamente cierro el formulario desde el botón cerrar de su barra de
    > título?

    El formulario lo puedes cerrar desde el botón de la barra de título o llamando explícitamente a su método Close. Pero si no llamas a su método Dispose, puede que los componentes que estés utilizando en dicho formulario no se destruyan hasta transcurrido un tiempo, que no se puede determinar de antemano, o cuando se cierre por completo la aplicación.

       'Form reemplaza a Dispose para limpiar la lista de componentes.
        <System.Diagnostics.DebuggerNonUserCode()>
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub

    El método Dispose anterior lo inserta automáticamente Visual Studio en todos aquellos formularios que añadas a tu proyecto, de tal manera que si no llamas explícitamente a su método Dispose, se ejecutará automáticamente la sobrecarga del método Dispose(boolean) cuando se cierre el formulario, por lo que digamos que tampoco es sumamente necesario llamar explícitamente al método Dispose de un formulario no modal (aquel mostrado mediante su método Show), aunque sí es una buena práctica para que no te lleves algún que otro "sobresalto"  ;-)

    Si tienes algo de tiempo, te aconsejaría que leyeras el artículo que te he indicado anteriormente, así como la ayuda del método Form.Dispose (Método) (Boolean)


    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.


    martes, 17 de mayo de 2016 9:36
    Moderador
  • Simplemente ponle .Show en lugar de .ShowDialog. Todos los formularios que abres con el .Show() se van quedando abiertos, mientras no hagas algo para cerrarlos.
    • Propuesto como respuesta PGF_MSDN martes, 17 de mayo de 2016 7:18
    • Marcado como respuesta James-2016 sábado, 21 de mayo de 2016 1:54
    martes, 17 de mayo de 2016 6:09

Todas las respuestas

  • Simplemente ponle .Show en lugar de .ShowDialog. Todos los formularios que abres con el .Show() se van quedando abiertos, mientras no hagas algo para cerrarlos.
    • Propuesto como respuesta PGF_MSDN martes, 17 de mayo de 2016 7:18
    • Marcado como respuesta James-2016 sábado, 21 de mayo de 2016 1:54
    martes, 17 de mayo de 2016 6:09
  • Tenía entendido que es como me dice pero estoy probando y no funciona, pongo en el evento click de un botón lo siguiente:

    Using MiFormulario As New MiFormulario1

        MiFormulario.ShowDialog

    End Using

    Cuando pongo ShowDialog, queda hasta que lo cierre, pero cuando pongo el using de abajo se cierra:

    Using MiFormulario As New MiFormulario1

        MiFormulario.Show

    End Using

    jeje creo que ya tengo la respuesta. Debo abrirlo directamente noo? o sea así:

    MiFormulario.Show (sin el bloque Using)




    • Editado James-2016 martes, 17 de mayo de 2016 8:25
    martes, 17 de mayo de 2016 8:24
  • "James-2016" escribió:

    > jeje creo que ya tengo la respuesta. Debo abrirlo directamente noo? o sea así:
    >
    > MiFormulario.Show (sin el bloque Using)

    Efectivamente. Si tu intención es abrir un formulario no modal (mediante el método Show), NO PUEDES llamar a su método Dispose (que es lo que hace automáticamente la instrucción End Using) hasta que decidas cerrarlo por completo.

    > Using MiFormulario As New MiFormulario1
    >
    >    MiFormulario.ShowDialog
    >
    > End Using

    Utilizar el bloque Using ... End Using está bien para abrir un formulario modal (mediante su método ShowDialog), pero no un formulario no modal. Para éste último, tienes que declarar la correspondiente variable objeto y llamar a su método Show:

        ' Declaramos la variable que referencia al formulario.
        Dim MiFormulario As New MiFormulario1()
    
        ' Añadimos el controlador para el evento FormClosed del formulario
        AddHandler MiFormulario.FormClosed, AddressOf FormOnClosed
    
        ' Mostramos el formulario no modal.
        MiFormulario.Show()
    
        Private Sub FormOnClosed(sender As Object, e As FormClosedEventArgs)
    
            ' El formulario se está cerrando.
            '
            ' Obtenemos la referencia al objeto o formulario
            ' que ha provocado el evento.
            '
            Dim frm As Form = TryCast(sender, Form)
    
            ' Llamamos a su método Dispose.
            '
            If (Not frm Is Nothing) Then
                frm.Dispose()
            End If
    
        End Sub


    De ésta manera, cuando se cierre el formulario se ejecutará el procedimiento FormOnClosed y ahí será donde llamaremos al método Dispose de dicho formulario.

    ¿Conoces la diferencia existente entre un formulario modal y no modal?

    Abrir y cerrar formularios con Visual Basic .net


    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.



    martes, 17 de mayo de 2016 8:52
    Moderador
  • Claro, un formulario modal no permite continuar la ejecución hasta cerrarlo, el otro sí. No tenía claro que el bloque Using llama al método dispose y allí estaba el problema.

    Ok, hay que declarar la variable para instanciar al formulario. De la otra forma también funciona pero no es una buena práctica. Gracias.

    martes, 17 de mayo de 2016 9:00
  • >  hay que declarar la variable para instanciar al formulario.

    Lee de nuevo mi respuesta porque la acabo de ampliar.


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



    martes, 17 de mayo de 2016 9:01
    Moderador
  • Gracias, la ampliación de su respuesta aclara más el panorama, pero qué pasa si no se invoca explícitamente al método dispose? ¿o sea si solamente cierro el formulario desde el botón cerrar de su barra de título o si invoco al método close?
    • Editado James-2016 martes, 17 de mayo de 2016 9:21
    martes, 17 de mayo de 2016 9:10
  • "James-2016" preguntó:

    > pero qué pasa si no se invoca explícitamente al método dispose? ¿o sea
    > si solamente cierro el formulario desde el botón cerrar de su barra de
    > título?

    El formulario lo puedes cerrar desde el botón de la barra de título o llamando explícitamente a su método Close. Pero si no llamas a su método Dispose, puede que los componentes que estés utilizando en dicho formulario no se destruyan hasta transcurrido un tiempo, que no se puede determinar de antemano, o cuando se cierre por completo la aplicación.

       'Form reemplaza a Dispose para limpiar la lista de componentes.
        <System.Diagnostics.DebuggerNonUserCode()>
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub

    El método Dispose anterior lo inserta automáticamente Visual Studio en todos aquellos formularios que añadas a tu proyecto, de tal manera que si no llamas explícitamente a su método Dispose, se ejecutará automáticamente la sobrecarga del método Dispose(boolean) cuando se cierre el formulario, por lo que digamos que tampoco es sumamente necesario llamar explícitamente al método Dispose de un formulario no modal (aquel mostrado mediante su método Show), aunque sí es una buena práctica para que no te lleves algún que otro "sobresalto"  ;-)

    Si tienes algo de tiempo, te aconsejaría que leyeras el artículo que te he indicado anteriormente, así como la ayuda del método Form.Dispose (Método) (Boolean)


    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.


    martes, 17 de mayo de 2016 9:36
    Moderador
  • No me había percatado del enlace anterior, voy a revisar con calma los dos que puso, muchas gracias.
    martes, 17 de mayo de 2016 9:47