Impedir multiples instancias de un form

17/01/2006 - 23:04 por GilNaj | Informe spam
Que tal!

Tengo un formulario MDI padre y varios hijos en VB 2003, lo que pretendo
hacer es que cuando llame a alguno de los formularios hijo, el programa
verifique si ya existe una instancia abierta de ese objeto, si existe que
muestre la existente, si no que cree una nueva.

Ya intenté con activeform pero no me funciona.

Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Jose Luis Manners
18/01/2006 - 02:49 | Informe spam
Otra manera de hacerlo es diseñar los formularios hijos para que usen el
patrón de diseño Singleton:

http://www.elguille.info/colabora/p...iosMDI.htm

-
Coopera con el foro. Dinos si te sirvió la respuesta aquí planteada.
-

Saludos,

Jose Luis Manners, MCP
http://www.josemanners.com/

"Vale más saber alguna cosa de todo, que saberlo todo de una sola cosa."
-Blaise Pascal

"GilNaj" wrote in message
news:
Que tal!

Tengo un formulario MDI padre y varios hijos en VB 2003, lo que pretendo
hacer es que cuando llame a alguno de los formularios hijo, el programa
verifique si ya existe una instancia abierta de ese objeto, si existe que
muestre la existente, si no que cree una nueva.

Ya intenté con activeform pero no me funciona.

Gracias de antemano.

Respuesta Responder a este mensaje
#2 Edilberto Arteaga Lopez
18/01/2006 - 15:10 | Informe spam
Podes hacer lo siguiente

En el formulario Hijo

Public Shared ChildInstance As form1
Public Shared Function Instancia() As form1
If ChildInstance Is Nothing OrElse ChildInstance.IsDisposed Then
ChildInstance = New form1
End If
ChildInstance.BringToFront()
Return ChildInstance
End Function

En el formulario MDI

Dim frmInvIni As form1 = form1.Instancia
frmInvIni.MdiParent = Me
frmInvIni.Show()


saludos.

"GilNaj" escribió en el mensaje
news:
Que tal!

Tengo un formulario MDI padre y varios hijos en VB 2003, lo que pretendo
hacer es que cuando llame a alguno de los formularios hijo, el programa
verifique si ya existe una instancia abierta de ese objeto, si existe que
muestre la existente, si no que cree una nueva.

Ya intenté con activeform pero no me funciona.

Gracias de antemano.

Respuesta Responder a este mensaje
#3 GilNaj
18/01/2006 - 22:45 | Informe spam
Gracias por su ayuda, opté por el patrón Singleton y funcionó a la
perfección.
Respuesta Responder a este mensaje
#4 Jesús Villalobos
18/01/2006 - 23:46 | Informe spam
En fin, no quiero parecer ni mucho menos *ofendido* ni aguarle la solución
Singleton a nadie (que es una buena solución), pero quisiera recordar que al
declarar una variable como Shared esta no se descarga de memoria de la forma
habitual, ya que no está en la pila, sino en el heap o montón global de
memoria. Su existencia no depende del ámbito de ejecución en que ha sido
creada, ya que está en una zona de memoria compartida. Eso significa que al
cerrar el form sus recursos no se descargan de memoria.

Esto puede comprobarse cerrando el formulario hijo y volviendolo a abrir. Se
puede poner un breakpoint en el punto adecuado de la función:

Public Shared Function Instancia() As form1
If ChildInstance Is Nothing OrElse ChildInstance.IsDisposed Then
'<-Poner breakpoint aquí
ChildInstance = New form1
End If
ChildInstance.BringToFront()
Return ChildInstance
End Function

La segunda vez que se abre podemos comprobar que
(ChildInstance Is Nothing)=False 'El formulario sigue existiendo
y
ChildInstance.IsDisposed =True 'El formulario ha sido marcado para que
el GarbageCollector lo elimine, pero al ser Shared no lo hará.

Es decir, ChildInstance sigue existiendo, y como es un form todos sus
recursos también (aunque no se hayan inicializado). El GarbageCollector no
elimina una variable marcada como Shared. Si ponemos una TextBox dentro del
formulario podremos comprobar que es perfectamente accesible desde el
breakpoint, es decir, antes de la segunda "creación" del form1.

Por supuesto, si lo que se desea precísamente es mantener esos recursos en
memoria para que el form se cargue más rápidamente la segunda vez, este es
el método adecuado.
Jesús Villalobos
Responsable de desarrollo
Consultoría Certia

"GilNaj" escribió en el mensaje
news:
Gracias por su ayuda, opté por el patrón Singleton y funcionó a la
perfección.


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