locked
Form en control panel VB RRS feed

  • Pregunta

  • Hola a todos,

    he hecho un formulario (form1) padre como esta

    Con dos botones un panel al costado...

    Quisiera que me ayuden en como podría hacer para que solo pueda abrirse solamente una sola vez, ya que al presionar en el boton "hijo1" me genera varios, como esto:

    Ahora si presiono en boton "hijo1" solamente quiero que se maximize el que existe, no quiero que se duplique...

    Quisiera una sugerencia de como podrpía hacerlo ya el código para el anterior es lo siguiente:

    Public Class Form1

        Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click
            If (Me.panelContenedor.Controls.Count > 0) Then
                'Me.panelContenedor.Controls.RemoveAt(0) para que que borre y genere nuevamente
            End If
            Dim hijo1 As New hijo1
            hijo1.TopLevel = False
            hijo1.Dock = DockStyle.Fill
            Me.panelContenedor.Controls.Add(hijo1)
            Me.panelContenedor.Tag = hijo1
            hijo1.Show()
        End Sub
    End Class


    Ruben(benuvni)

    sábado, 4 de noviembre de 2017 15:59

Respuestas

  • Eso es porque lo has cerrado con Close() en lugar de con Hide(). Si lo cierras con Close(), se produce un Dispose() y entonces ya no se le puede volver a hacer el Show() sin antes crear una instancia nueva.

    Si no tienes más remedio que cerrarlo con Close, entonces la solución es interceptar el evento Closed y dentro del manejador poner Nothing en la variable InstanciaDeHijo1. Eso hará que el siguiente click del botón cree una instancia nueva en lugar de abrir la antigua.

    AddHandler InstanciaDeHijo1.FormClosed AddressOf(SeCerro1)
    
    ....
    
    Private Sub SeCerro1(sender As Object, e As FormClosedEventArgs)
        InstanciaDeHijo1 = Nothing
    End Sub

    domingo, 5 de noviembre de 2017 9:02
  • Guarda una variable que referencia el hijo1. Si está vacía, es que se trata de la primera vez y hay que inicializar el hijo. Sino, en lugar de construir un nuevo hijo maximizas el existente:

    Public Class Form1
         Private InstanciaDeHijo1 AS Hijo1 = Nothing
         Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click
           If InstanciaDeHijo1 is Nothing Then
             InstanciaDeHijo1 = New hijo1()
             InstanciaDeHijo11.TopLevel = False
             InstanciaDeHijo1.Dock = DockStyle.Fill
             Me.panelContenedor.Controls.Add(InstanciaDeHijo1)
             InstanciaDeHijo1.Show()
           Else
             InstanciaDeHijo1.WindowState = WindowState.Maximized 'Aquí lo que corresponda para mostrar el form en el estado que quieras
             InstanciaDeHijo1.Show()
           End If
         End Sub
     End Class

    sábado, 4 de noviembre de 2017 17:32

Todas las respuestas

  • Guarda una variable que referencia el hijo1. Si está vacía, es que se trata de la primera vez y hay que inicializar el hijo. Sino, en lugar de construir un nuevo hijo maximizas el existente:

    Public Class Form1
         Private InstanciaDeHijo1 AS Hijo1 = Nothing
         Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click
           If InstanciaDeHijo1 is Nothing Then
             InstanciaDeHijo1 = New hijo1()
             InstanciaDeHijo11.TopLevel = False
             InstanciaDeHijo1.Dock = DockStyle.Fill
             Me.panelContenedor.Controls.Add(InstanciaDeHijo1)
             InstanciaDeHijo1.Show()
           Else
             InstanciaDeHijo1.WindowState = WindowState.Maximized 'Aquí lo que corresponda para mostrar el form en el estado que quieras
             InstanciaDeHijo1.Show()
           End If
         End Sub
     End Class

    sábado, 4 de noviembre de 2017 17:32
  • Esta muy bien la repuesta pero, hay un detalle:

    Cuando lo cierras definitivamente el formulario "hijo1" y nuevamente presionas en el boton "hijo1"

    muestra un error:


    Ruben(benuvni)

    sábado, 4 de noviembre de 2017 23:34
  • Eso es porque lo has cerrado con Close() en lugar de con Hide(). Si lo cierras con Close(), se produce un Dispose() y entonces ya no se le puede volver a hacer el Show() sin antes crear una instancia nueva.

    Si no tienes más remedio que cerrarlo con Close, entonces la solución es interceptar el evento Closed y dentro del manejador poner Nothing en la variable InstanciaDeHijo1. Eso hará que el siguiente click del botón cree una instancia nueva en lugar de abrir la antigua.

    AddHandler InstanciaDeHijo1.FormClosed AddressOf(SeCerro1)
    
    ....
    
    Private Sub SeCerro1(sender As Object, e As FormClosedEventArgs)
        InstanciaDeHijo1 = Nothing
    End Sub

    domingo, 5 de noviembre de 2017 9:02
  • Muchisimas gracias por la explicacion alberto. Eres un mestro!

    Saludos!


    Ruben(benuvni)

    domingo, 5 de noviembre de 2017 13:28
  • Hola,

    Te paso un trozo de código que yo uso:

    For Each f2 As Form In Application.OpenForms
        If f.Name = f2.Name Then
             Abierto = True
             Exit For
        End If
    Next

    Esto está en una función que se le pasa f tipo Form por referencia y devuelve un Booleano.

    Además en tu código añadiría después del Show un BringToFront()

    Espero que te sirva.

    Un saludo.

    Miguel


    domingo, 5 de noviembre de 2017 17:58
  • Este error te da porque cuando haces el .Show() InstanciaDeHijo1 es Nothing

    Un saludo.

    Miguel

    domingo, 5 de noviembre de 2017 18:51