Visual Basic.NET - Formularios MDI: ¡Ahora tienen hijitos!

 
Vista:

Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 27/07/2004 10:36:07
Bueno, era por darle un toque gracioso... Tengo otra pregunta con formularios MDI.

¿Cuál es el mejor método para llamar formularios hijos que, cuando se cierren, se puedan volver a llamar, pero que no se puedan instanciar más si ya están abiertos? Porque si yo pongo en el evento de un menú lo siguiente:

Dim ventanuco as MiVentanaHija
If ventanuco Is Nothing Then
ventanuco = New MiVentanaHija()
ventanuco.MdiParent = Me
End If
ventanuco.show()

En este caso podría instanciarlo n veces.

Si me creo un atributo privado a nivel de formulario:

Private MiVentanuco as MiVentanaHija

Y luego desde el menú:

If MiVentanuco Is Nothing Then
MiVentanuco = New MiVentanaHija()
MiVentanuco.MdiParent = Me
End If
MiVentanuco.show()

La primera vez funciona, pero luego no puedo volver a llamar al formulario.

El caso es que no quiero tener que hacerle vudú al formulario. Sobre todo porque casi toda la aplicación utiliza este tipo de formularios. Tampoco quiero mantener en memoria el formulario constantemente cuando es posible que el usuario no utilice esa parte de la aplicación. Ya me entendéis.

Bueno, un saludo a todos. Y muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 153
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Yamil Bracho (631 intervenciones) el 27/07/2004 15:46:33
La manera mas elegante que he visto para solucionar este problema es crear la ventana hija como un Singleton. En pocas palabras y con codigo haces lo siguiente :

1) En el formulario hijo colocas:
static FormularioHijo formularioHijo
Public Static Function GetInstance() As FormularioHijo
If (formularioHijo== null) Then
formularioHijo= new FormularioHijo;
End If
GetInstance = FormularioHijo
End Function

2) En el formulario padre colocas lo sguiene :
FormularioHijo formularioHijo = FormularioHijo.GetInstance()
formularioHijo.MdiParent = Me
formularioHijo.Show()
formularioHijo.BringToFront()


Como es un metodo estatico la primera vez GetInstance() creara y retornara una instancia del formulario hijo a la segunda vez simplemente retorna la misma referencia que se ha creado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 28/07/2004 09:38:25
Muchas gracias por la respuesta. Ahora: no la entiendo :D. No sé dónde he de colocar el código del formulario Hijo. ¿En qué parte o a qué nivel? ¿Seguro que es static? ¿no es shared? Esto que acabo de decir no lo he probado, se me está ocurriendo sobre la marcha. Pero bueno, por si lo lees y me vuelve a ayudar, porque veo que me debes haber puesto el código en una mezcla de VB y C# :D

Un abrazo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 28/07/2004 09:50:52
Bueno, ahora he probado lo siguiente:

Public Class Hijo
...

Private Shared FHijo As Hijo
Public Shared Function GetInstance() As Hijo
If FHijo Is Nothing Then
FHijo = New Hijo()
End If
Return FHijo
End Function

End Class

Y en el padre, al pulsar un botón:

Dim MiHijo As Hijo = Hijo.GetInstance()
MiHijo.MdiParent = Me
MiHijo.Show()
MiHijo.BringToFront()

Mientras el formulario hijo permanezca abierto, todo perfecto, no abre más que una instancia, pero si lo cierro e intento volver a abrirlo, da una excepción "ObjectDisposedException".

Si en el formulario hijo pongo:

Public Shared Function GetInstance() As Hijo
Static FHijo As Hijo
If FHijo Is Nothing Then
FHijo = New Hijo()
End If
Return FHijo
End Function

Me da la misma excepción.

¿Cómo puedo hacer que se pueda abrir el formulario hijo siempre que yo quiera pero nunca más de uno por vez? Sin dejar el formulario en memoria eternamente, porque eso ya lo he hecho, pero me gustaría aprender la solución "elegante". Por cierto, muy útil lo que me has enseñado del singleton. A ver si lo perfeccionamos. Un abrazo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Edgar (1501 intervenciones) el 28/07/2004 14:40:03
Hola

El problema del Singleton es que siempre debes tener creada la instancia en memoria, y esta instancia es la única que vas a usar durante la ejecución de la aplicación.

El otro problema es que al cerrar un formulario este libera la memoria que tenia reservada (entre comillas) y por eso te da la excepción que te da.

Lo que debes hacer es crear siempre el formulario cada vez que lo vas a ejecutar, pero antes de crearlo debes preguntar si el objeto está creado... Una solución que te podría dar es que dehabilites el menu cuando creas el formulario en el evento Load, y lo vuelves a habilitar en el evento Closed del formulario. No se que opinarás al respecto!!!

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 28/07/2004 15:14:23
Opino... Que no me queda más remedio que cancelar el evento de cerrar el formulario correspondiente y tener mucho cuidado de hacer Dispose de la ventana cuando ya no vaya a ser utilizada definitivamente, porque se de el caso de que el usuario se carga el objeto mantenedor de dicha referencia. Es que hay un objeto intermedio, entre el padre MDI y los hijos, que se puede agregar o quitar. Cuando el usuario se cargue ese objeto, yo controlo que el sistema se cargue sus formularios asociados.

Bueno, muchas gracias. De todos modos, no se si estoy matando moscas a cañonazos, pero bueno. Un abrazo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Edgar (1501 intervenciones) el 28/07/2004 15:40:59
Hola

Si cancelas el evento de cerrar el formulario, este no se cerrará (si estás hablando de asignar la propiedad Cancel en true en el evento Closing)

Por otra parte, evitar que el formulario se descarge provoca que este resida en memoria cuando se carga la primera vez hasta que lo descargues explicitamente....

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 28/07/2004 17:52:32
Te mandaré un correo para que te imagines la situación. Si Yamil quiere copia por pura curiosidad de "qué estará haciendo este tipejo", se lo mando también. Un abrazo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 153
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Yamil Bracho (631 intervenciones) el 28/07/2004 19:11:51
OK y disculpa que haya hecho una traduccion a medias de C# a VB.NET pero es que trabajo con C# pero para que vean que poderoso es .NET y realmente no importa el lenguaje con que trabajas...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Formularios MDI: ¡Ahora tienen hijitos!

Publicado por Carlos Escribano Rey (59 intervenciones) el 29/07/2004 09:19:04
El problema ya está solucionado en mi caso. Como hay objetos gestores de las ventanas que solo se pueden abrir una vez, entre el formulario padre y dichas ventanas, no hay más que añadir propiedades que controlen si los formularios están abiertos o no.

Solución 100% Edgar. ¡Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar