none
opcion de cerrar formularios RRS feed

  • Pregunta

  • Hola buenos días: mi pregunta es sobre cerrar 2,  formulario,form1 y form2,  el form1  es el que inicia la aplicación con un RadioButton3 que abre el form2 correctamente, pues en el form2 tengo un Button1 para cerrar la aplicación con un MsgBoxResult  YesNo  en el que advierte que va acerrar la aplicación. Pero. hay esta el problema tanto si hago clic en Si como en No la aplicación termina cerrandose  total mente, Cono puedo controlar que cuando haga clic enNo  esta no se cierre y permanezca tal cual??. y si  es Si pues que se cierre. Gracias desde ya gracias. dejo el código del msgboxresult.
      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim msg As String
            Dim title As String
            Dim style As MsgBoxStyle
            Dim response As MsgBoxResult
            msg = "Quieres salir?"
            style = MsgBoxStyle.DefaultButton2 Or _
               MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
            title = "Salir"
            response = MsgBox(msg, style, title)
            If response = MsgBoxResult.Yes Then
                Me.Close()
                Exit Sub
            Else
            End If
        End Sub

    El código que utilizo 
    jueves, 15 de diciembre de 2016 10:35

Respuestas

  • "Andrés7722" escribió:

    > en propiedades del proyecto lo tengo definido como al cerrar el ultimo
    > formulario, no se si es correcto así ...

    Para lo que dices que deseas hacer entiendo que NO ES CORRECTO, porque si deseas que el usuario cierre la aplicación desde Form1 (que según comentas es el formulario de inicio de tu aplicación), en las Propiedades del Proyecto tienes que establecer el Modo de apagado al valor Al cerrar el formulario de inicio, tal y como aparece en la captura de pantalla anterior.

    Y si tu intención es cerrar solamente el formulario Form2 cuando el usuario haya pulsado el botón del cuadro de diálogo, entonces simplemente ejecutarías el método Close en el evento Click del botón Button1:

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Procedemos a cerrar el formulario
            Me.Close()
    
       End Sub

    Y en el evento Closing de dicho formulario le preguntarías al usuario si realmente desea cerrarlo:

        Private Sub Form2_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    
            ' El formulario se está cerrando. Preguntamos si deseamos que se cierre.
    
            Dim msg As String = "Quieres salir?"
            Dim title As String = "Salir"
    
            Dim response As DialogResult = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Information)
            If (response = DialogResult.No) Then
                ' Cancelamos la operación de cierre.
                e.Cancel = True
            End If
    
        End Sub 

    Piensa que un formulario también se puede cerrar cuando se pulsa sobre la "famosa" [X] existente en la esquina superior derecha del mismo.

    > la llamada al form2 te dejo el código que utilizo en el form1.
    >
    >  Private Sub RadioButton2_CheckedChanged(...) Handles RadioButton2.CheckedChanged
    >
    >        'Crear una instancia de Form2 pasando los valores de los cuadros de texto como argumento
    >        Dim form As New Form1(TextBox1.Text, TextBox2.Text)
    >        ...
    >        ....
    >        form.ShowDialog(Me)
    >
    >   End Sub

    No sé si te has equivocado al escribir el código en la respuesta o es que así es cómo lo tienes en tu proyecto, pero si te fijas bien, estás creando una nueva instancia de Form1, no de Form2.

    Para instanciar Form2, tendrás que crear una nueva instancia de dicho formulario:

        'Crear una instancia de Form2 pasando los valores de los cuadros de texto como argumento
        Dim form As New Form2(TextBox1.Text, TextBox2.Text)


    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.




    viernes, 16 de diciembre de 2016 9:31
    Moderador

Todas las respuestas

  • La línea del Me.Close() solo se ejecuta si pulsa "Si" en el MsgBox.

    Pon un punto de interrupción en la línea

    If response = MsgBoxResult.Yes Then

    para ver por donde se ejecuta el código y donde se está cerrando el formulario.


    Saludos, Javier J

    jueves, 15 de diciembre de 2016 10:49
  • Dim result As DialogResult
            result = MessageBox.Show("Salir?", "Saliendo del sistema", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
            If result = DialogResult.Yes Then
                Me.Close()
            Else
    
            End If

    jueves, 15 de diciembre de 2016 10:52
  • Hola sr. Javier, perdona mi torpeza pero no en tiendo bien lo que me dices , puedes ponerme un ejemplo? te lo agradecería
    jueves, 15 de diciembre de 2016 11:07
  • Sitúate en la linea "If response = MsgBoxResult.Yes Then" y pulsa F9 para poner un punto de interrupción.

    Luego ejecuta la aplicación y cuando salga la caja de mensaje pulsa en "No". Se visualizará el editor de código parando en la linea de interrupción. Ahora pulsa F8 para ir ejecutando linea a linea y comprobar lo que ocurre.


    Saludos, Javier J

    jueves, 15 de diciembre de 2016 11:42
  • Hola de nuevo Javier lo que hace es cerrar todo?
    jueves, 15 de diciembre de 2016 12:08
  • "Andrés7722" escribió:

    > mi pregunta es sobre cerrar 2,  formulario,form1 y form2,  el form1  es el
    > que inicia la aplicación con un RadioButton3 que abre el form2 correctamente,
    > pues en el form2 tengo un Button1 para cerrar la aplicación con un MsgBoxResult
    >  YesNo  en el que advierte que va acerrar la aplicación. Pero. hay esta el
    > problema tanto si hago clic en Si como en No la aplicación termina cerrandose
    >  total mente, Cono puedo controlar que cuando haga clic enNo  esta no se cierre
    > y permanezca tal cual??. y si  es Si pues que se cierre.

    Hola:

    Con el código que nos has mostrado, lo único que puede pasar es que se cierre ÚNICAMENTE Form2, si el usuario pulsa sobre el botón "Sí" del cuadro de diálogo, pero en NINGÚN CASO se cerrará la aplicación por completo. Para conocer el motivo de que también se cierre Form1, y por ende la aplicación completa, tendremos que conocer cómo realizas la llamada para que se abra Form2, y qué valor tiene el Modo de apagado en las propiedad de tu proyecto de Windows Forms.

    Por defecto, el Modo de apagado es Al cerrar el formulario de inicio, tal y como muestra la siguiente captura de pantalla de las Propiedades del proyecto:


    Si tu intención es que se cierre la aplicación por completo cuando el usuario pulsa el botón "Sí" en el cuadro de diálogo que le muestras en Form2, lo que tienes que hacer es ejecutar el código tal cual indico.

    En Form1 llamamos a Form2 ejecutando lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Abrimos Form2 de manera modal.
            Using frm2 As New Form2()
                Dim result As DialogResult = frm2.ShowDialog()
                If (result = DialogResult.OK) Then
                    ' Form2 nos ha comunicado que se cierre la
                    ' aplicación por completo. Para ello,
                    ' solamente tenemos que llamar al método
                    ' Close del formulario de inicio de la 
                    ' aplicación, que se supone es Form1.
                    Me.Close()
                End If
            End Using
    
        End Sub

    Y en el evento Click del control Button existente en Form2 procederías a ejecutar lo siguiente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim msg As String = "Quieres salir?"
            Dim title As String = "Salir"
    
            'Dim style As MsgBoxStyle = MsgBoxStyle.DefaultButton2 Or MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
            'Dim response As MsgBoxResult = MsgBox(msg, style, title)
            'If (response = MsgBoxResult.Yes) Then
            '    Me.Close()
            '    Exit Sub
            'End If
    
            Dim response As DialogResult = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Information)
            If (response = DialogResult.Yes) Then
                ' Solamente cerramos el formulario actual (Form2),
                ' comunicándole al formulario llamador (Form1 )
                ' que nuestra intención es que se cierre la
                ' aplicación por completo.
                '
                Me.DialogResult = DialogResult.OK
    
            Else
                ' Si solamente deseamos que se cierre Form2,
                ' tan solo hay que llamar a su método Close,
                ' o bien, establecer un valor adecuado a su
                ' propiedad DialogResult.
                ' 
                ' Me.Close()
                Me.DialogResult = DialogResult.Cancel
    
            End If
    
        End Sub

    Es decir, si el usuario pulsa el botón "Sí", le indicamos a Form1 que cierre la aplicación, pero en caso contrario, solamente se cerrará el formulario Form2.

    ¿Que no deseas que se cierre Form2 cuando el usuario pulsa el botón "No" del cuadro de diálogo. Entonces eliminarías el bloque Else de la instrucción If ... End If, y cerrarías el formulario pulsando sobre el botón de cierre del propio formulario, la "famosa" [X]:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim msg As String = "Quieres salir?" Dim title As String = "Salir"

    Dim response As DialogResult = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Information) If (response = DialogResult.Yes) Then ' Solamente cerramos el formulario actual (Form2), ' comunicándole al formulario llamador (Form1 ) ' que nuestra intención es que se cierre la ' aplicación por completo. ' Me.DialogResult = DialogResult.OK End If End Sub


    Así es como entiendo yo que deberías de actuar, de acuerdo con la información que nos has proporcionado en tu pregunta, claro está.

    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.


    viernes, 16 de diciembre de 2016 7:43
    Moderador
  • Hola: señor Enrique, en propiedades del proyecto lo tengo definido como al cerrar el ultimo formulario, no se si es correcto así , la llamada al form2 te dejo el código que utilizo en el form1. Lo que pretendo hacer es que cuando el usuario pulse No en el cuadro de dialogo pues que no se cierre el form2 y si pulsa Si se cierre solamente el form2, para que el usuario cuando regrese al form1 le quede por ultimo la opción de volver al form2, o cerrar la aplicación por completo, no se si me esplique bien. gracias por tu respuesta muchas gracias
     Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
            TextBox1.Text = Val(300)      
            'Crear una instancia de Form2 pasando los valores de los cuadros de texto como argumento
            TextBox2.Text = Val(0)
            Dim form As New Form1(TextBox1.Text, TextBox2.Text)
            Dim retraso As Integer
            Button1.Visible = True
            retraso = 300 + GetTickCount
            While retraso >= GetTickCount
                Application.DoEvents()
            End While
            form.ShowDialog(Me)
    
        End Sub

    viernes, 16 de diciembre de 2016 8:56
  • "Andrés7722" escribió:

    > en propiedades del proyecto lo tengo definido como al cerrar el ultimo
    > formulario, no se si es correcto así ...

    Para lo que dices que deseas hacer entiendo que NO ES CORRECTO, porque si deseas que el usuario cierre la aplicación desde Form1 (que según comentas es el formulario de inicio de tu aplicación), en las Propiedades del Proyecto tienes que establecer el Modo de apagado al valor Al cerrar el formulario de inicio, tal y como aparece en la captura de pantalla anterior.

    Y si tu intención es cerrar solamente el formulario Form2 cuando el usuario haya pulsado el botón del cuadro de diálogo, entonces simplemente ejecutarías el método Close en el evento Click del botón Button1:

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Procedemos a cerrar el formulario
            Me.Close()
    
       End Sub

    Y en el evento Closing de dicho formulario le preguntarías al usuario si realmente desea cerrarlo:

        Private Sub Form2_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    
            ' El formulario se está cerrando. Preguntamos si deseamos que se cierre.
    
            Dim msg As String = "Quieres salir?"
            Dim title As String = "Salir"
    
            Dim response As DialogResult = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Information)
            If (response = DialogResult.No) Then
                ' Cancelamos la operación de cierre.
                e.Cancel = True
            End If
    
        End Sub 

    Piensa que un formulario también se puede cerrar cuando se pulsa sobre la "famosa" [X] existente en la esquina superior derecha del mismo.

    > la llamada al form2 te dejo el código que utilizo en el form1.
    >
    >  Private Sub RadioButton2_CheckedChanged(...) Handles RadioButton2.CheckedChanged
    >
    >        'Crear una instancia de Form2 pasando los valores de los cuadros de texto como argumento
    >        Dim form As New Form1(TextBox1.Text, TextBox2.Text)
    >        ...
    >        ....
    >        form.ShowDialog(Me)
    >
    >   End Sub

    No sé si te has equivocado al escribir el código en la respuesta o es que así es cómo lo tienes en tu proyecto, pero si te fijas bien, estás creando una nueva instancia de Form1, no de Form2.

    Para instanciar Form2, tendrás que crear una nueva instancia de dicho formulario:

        'Crear una instancia de Form2 pasando los valores de los cuadros de texto como argumento
        Dim form As New Form2(TextBox1.Text, TextBox2.Text)


    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.




    viernes, 16 de diciembre de 2016 9:31
    Moderador
  • Hola: sr. Enrique, ahora es para agradecerte la ayuda prestada  todo me esta funcionando como yo quiero Gracias muchas gracias de corazón estaba echo un lio me fue perfecto tus sugerencias un saludo.
    viernes, 16 de diciembre de 2016 14:26