Problema al mostrar un formulario por segunda vez

18/01/2005 - 01:03 por Public | Informe spam
Hola. Quiero mostrar un formulario desde otro. Tengo el Form1 que es el
principal y el Form2 que es el que quiero mostrar cuando de un botón del
Form1.

En el Form1 tengo este código:
Option Strict On
Public Class Form1
Inherits System.Windows.Forms.Form
Dim frm As Form2 = New Form2()
Codigo generado por el Diseñador de Windows Forms

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
frm.Show()
End Sub

Y en el Form2 tengo un botón donde he puesto solamente close()

Lo que no quiero es que me saque una ventana cada vez que de al botón del
Form1, solo quiero una sola ventana del Form2.

Ejecuto el programa y doy al botón del Form1. Me muestra el Form2. Cierro el
Form2. Vuelvo a dar al botón del Form1 y me da el siguiente error:

Excepción no controlada del tipo 'System.ObjectDisposedException' en
system.windows.forms.dll

Información adicional: No se puede obtener acceso al objeto denominado
"Form2".

He probado a poner en el Form2 en el evento closing esto:
Me.Hide()
e.Cancel = True
Pero no me parece la solución ocultar el Form2, ya que cuando quiera hacer
un programa de verdad, cosa que me esta pasando. El evento Load del Form2
solo se ejecuta la primera vez, no cada vez que se muestra el formulario.

Lo que necesito es descargar el Form2 y cargarlo cada vez que lo necesite.

Algo tan sencillo como en Visual Basic 6

Form2.show
y el el Form2; Unload Me

Gracias.

Preguntas similare

Leer las respuestas

#6 Eduardo A. Morcillo [MS MVP VB]
18/01/2005 - 16:01 | Informe spam
También serviría... con la salvedad de que creo que lo que quiere
Public es que cuando se lance nuevamente Form2, se ejecute Form_Load
nuevamente.

En el código que envías te pasa como a mí en el primer código que
envié, que eso no sucede.



En mi codigo eso sucede (con una pequena correcion, el OR debe ser ORELSE)
ya que si el formulario estaba "disposed" se crea una instancia nueva.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#7 Laforge
18/01/2005 - 18:41 | Informe spam
y algo como

En FORM 1:
(declarar e instanciar frm2 en Private Sub)
Private Sub ButtonX_Click() Handles ButtonX.Click
Dim frm2 as New Form2()
frm2.show()
End Sub

En FORM2

Private Sub ButtonY_Click(...) Handles ButtonX.Click
Me.Close()
End Sub

a mí, así me funciona y cada vez que pulso el botón para mostrar FORM 2
me pasa por Form Loades lo que yo utilizo para suplir el..."Form2.show y
el Unload Me" del VB 6...

?¿?¿?





"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
Hola,

Entonces prueba esto otro como ejemplo:

FORM1

Dim frm As New Form2

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
frm.Val = True
frm.Show()
End Sub



FORM2

Public Val As Boolean

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
If Val Then
'Aquí la rutina o rutinas del evento Load
Val = False
TextBox1.Text = TextBox1.Text & " // "
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.Hide()
End Sub

Private Sub Form2_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Form2_Load(sender, e)
End Sub


Espero que te sirva.

Un saludo,

Jorge Serrano Pérez
MVP VB.NET


"Public" wrote:

> He probado esto que has puesto y el problema que hay es que cada vez que
> pulso para que salga el Form2 me saca un nuevo Form2. Yo solo quiero que
> salga una sola ventana del Form2.

Respuesta Responder a este mensaje
#8 Jorge Serrano [MVP VB]
18/01/2005 - 21:25 | Informe spam
Sí, pero la pregunta salvo que yo lo haya entendido mal, es que lo que se
quiere es cargar el FORM2 desde el FORM1 sólo la primera vez.

Lo que he entendido es esto:
En el FORM1 hay un botón que lanza el FORM2.
En el FORM2 hay un botón que oculta el FORM2.
Si pulsamos nuevamente el botón que lanza el FORM2, mostramos el FORM2, pero
en este caso, lanzamos (porque nos interesa) lo que contiene el evento
Form_Load de FORM2.
Evidentemente, el Form_Load de FORM2, se lanza la primera vez que se crea el
formulario FORM2. Las siguientes veces no se crea porque existe ya en
memoria, sólamente se muestra.

Eso es lo que he entendido yo al menos. O:-)

Un saludo,

Jorge Serrano Pérez
MVP VB.NET




"Laforge" wrote:

y algo como

En FORM 1:
(declarar e instanciar frm2 en Private Sub)
Private Sub ButtonX_Click() Handles ButtonX.Click
Dim frm2 as New Form2()
frm2.show()
End Sub

En FORM2

Private Sub ButtonY_Click(...) Handles ButtonX.Click
Me.Close()
End Sub

. a mí, así me funciona y cada vez que pulso el botón para mostrar FORM 2
me pasa por Form Loades lo que yo utilizo para suplir el..."Form2.show y
el Unload Me" del VB 6...

?¿?¿?





"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
> Hola,
>
> Entonces prueba esto otro como ejemplo:
>
> FORM1
>
> Dim frm As New Form2
>
> Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles Button3.Click
> frm.Val = True
> frm.Show()
> End Sub
>
>
>
> FORM2
>
> Public Val As Boolean
>
> Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> If Val Then
> 'Aquí la rutina o rutinas del evento Load
> Val = False
> TextBox1.Text = TextBox1.Text & " // "
> End If
> End Sub
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles Button1.Click
> Me.Hide()
> End Sub
>
> Private Sub Form2_Paint(ByVal sender As Object, ByVal e As
> System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
> Form2_Load(sender, e)
> End Sub
>
>
> Espero que te sirva.
>
> Un saludo,
>
> Jorge Serrano Pérez
> MVP VB.NET
>
>
> "Public" wrote:
>
> > He probado esto que has puesto y el problema que hay es que cada vez que
> > pulso para que salga el Form2 me saca un nuevo Form2. Yo solo quiero que
> > salga una sola ventana del Form2.
>




Respuesta Responder a este mensaje
#9 Jorge Serrano [MVP VB]
19/01/2005 - 10:33 | Informe spam
Esa es la solución que yo aportaba. :-)

Pero bueno, tampoco se al final el objeto real de la duda y si ha servido
alguna de las respuestas dadas... :'(

Un abrazo,

Jorge Serrano Pérez
MVP VB.NET



"Eduardo A. Morcillo [MS MVP VB]" wrote:

Ah! Pero una cosa es la pregunta y otra lo que puede hacerse. Si el
formulario se cierra no queda otra, aunque se tenga todavia la referencia,
que crearlo de nuevo. Lo otro es poner el codigo del Load en algun metodo
publico y en lugar de cerrar el formulario se lo oculta y cuando debe
mostrarse se llama a ese metodo para reinicilizar el formulario. Soluciones
hay muchas y para todos los gustos :)

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida