Principales respuestas
Llamar a un formulario desde varios eventos en otro formulario

Pregunta
-
Hola.
Estoy usando Visual Studio 2015 Express para Escritorio
Como puedo solucionar lo siguiente?
Dim frms As New Form2 Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click frms.show End Sub Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click frms.show End Sub
Se que de esta otra manera se consigue, pero no me sirve
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Dim frms As New Form2 frms.show End Sub Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click Dim frms As New Form2 frms.show End Sub
Gracias.
Rafael FM
sábado, 31 de diciembre de 2016 12:51
Respuestas
-
"RafaelFM" preguntó:
> Como puedo solucionar lo siguiente?
>
> Dim frms As New Form2
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> frms.show
> End Sub
>Hola, Rafael:
Como estás creando la instancia de Form2 a la misma vez que declaras el objeto frms, no te va a quedar más remedio que consultar si la instancia de ese formulario ha sido desechada. Para ello, solamente tienes que llamar a la propiedad IsDisposed del formulario:
Dim frms As New Form2() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If (Not frms.IsDisposed) Then frms.Show() Else frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If (Not frms.IsDisposed) Then frms.Show() Else frms = New Form2() frms.Show() End If End Sub
> Se que de esta otra manera se consigue, pero no me sirve
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> Dim frms As New Form2
> frms.show
> End SubLo mejor que puedes hacer es lo siguiente:
Private frms As Form2 = Nothing ' Declarar la variable objeto sin inicializarla Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If ((frms Is Nothing) OrElse (frms.IsDisposed)) Then ' Si el valor del objeto es Nothing o está desechado,
' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If ((frms Is Nothing) AndAlso (frms.IsDisposed)) Then
' Si el valor del objeto es Nothing o está desechado,
' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub
Lo mismo te resulta de utilidad el contenido del artículo siguiente:
Abrir y cerrar formularios con Visual Basic .NET
Un saludo y ¡Feliz Año Nuevo!
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.
- Editado Enrique M. MontejoModerator lunes, 2 de enero de 2017 15:50 Ampliar información
- Propuesto como respuesta Joyce_ACModerator lunes, 2 de enero de 2017 16:55
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 4 de enero de 2017 10:58
lunes, 2 de enero de 2017 15:42Moderador -
Hola RafaelFM,
En el primer caso creas una nueva instancia pública de tu formulario Form2 dónde si ejecuta el evento Click del botón 1 mostraría el formulario, pero si este es cerrado, al ejecutar el evento click del botón 2, ese objeto ya estaría deshechado (IDisposable).
Un truco sería cancelar la acción cerrar usando el evento FormClosing de tu Form2.
Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing e.Cancel = True 'Cancela el cierre Me.Hide() 'Esconde el formulario End Sub
Por lo que en tu form solo bastaría :
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click frms.Show() End Sub
Enlazando ambos eventos Click a uno solo.
Saludos.
JC NaupaCrispín
Lima - Perú
La magia no existe, la programación SI- Propuesto como respuesta Joyce_ACModerator lunes, 2 de enero de 2017 16:55
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 4 de enero de 2017 10:57
sábado, 31 de diciembre de 2016 18:12
Todas las respuestas
-
Hola RafaelFM,
En el primer caso creas una nueva instancia pública de tu formulario Form2 dónde si ejecuta el evento Click del botón 1 mostraría el formulario, pero si este es cerrado, al ejecutar el evento click del botón 2, ese objeto ya estaría deshechado (IDisposable).
Un truco sería cancelar la acción cerrar usando el evento FormClosing de tu Form2.
Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing e.Cancel = True 'Cancela el cierre Me.Hide() 'Esconde el formulario End Sub
Por lo que en tu form solo bastaría :
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click frms.Show() End Sub
Enlazando ambos eventos Click a uno solo.
Saludos.
JC NaupaCrispín
Lima - Perú
La magia no existe, la programación SI- Propuesto como respuesta Joyce_ACModerator lunes, 2 de enero de 2017 16:55
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 4 de enero de 2017 10:57
sábado, 31 de diciembre de 2016 18:12 -
lunes, 2 de enero de 2017 14:46
-
"RafaelFM" preguntó:
> Como puedo solucionar lo siguiente?
>
> Dim frms As New Form2
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> frms.show
> End Sub
>Hola, Rafael:
Como estás creando la instancia de Form2 a la misma vez que declaras el objeto frms, no te va a quedar más remedio que consultar si la instancia de ese formulario ha sido desechada. Para ello, solamente tienes que llamar a la propiedad IsDisposed del formulario:
Dim frms As New Form2() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If (Not frms.IsDisposed) Then frms.Show() Else frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If (Not frms.IsDisposed) Then frms.Show() Else frms = New Form2() frms.Show() End If End Sub
> Se que de esta otra manera se consigue, pero no me sirve
>
> Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
> Dim frms As New Form2
> frms.show
> End SubLo mejor que puedes hacer es lo siguiente:
Private frms As Form2 = Nothing ' Declarar la variable objeto sin inicializarla Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If ((frms Is Nothing) OrElse (frms.IsDisposed)) Then ' Si el valor del objeto es Nothing o está desechado,
' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If ((frms Is Nothing) AndAlso (frms.IsDisposed)) Then
' Si el valor del objeto es Nothing o está desechado,
' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub
Lo mismo te resulta de utilidad el contenido del artículo siguiente:
Abrir y cerrar formularios con Visual Basic .NET
Un saludo y ¡Feliz Año Nuevo!
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.
- Editado Enrique M. MontejoModerator lunes, 2 de enero de 2017 15:50 Ampliar información
- Propuesto como respuesta Joyce_ACModerator lunes, 2 de enero de 2017 16:55
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 4 de enero de 2017 10:58
lunes, 2 de enero de 2017 15:42Moderador