Instanciar Un formulario MDI una sola vez en vb.net

 

Fecha: 10/Abr/2006 (08-04-06)
Autor: Denis Enrique Guido Rodríguez ([email protected])

 


Introducción

 

La mayoría de nosotros hemos trabajado con formularios MDI, lo que significa que podemos instanciar indeterminadamente un mismo formulario lo cual hace lenta la aplicación y lo molesto de estar cerrando formulario tras formulario. Dado este problema me puse a crear una función que me permitiera instanciar una sola vez un formulario, en un grupo de noticias encontré un articulo (Autor: Diego Cofré <[email protected]>) que describía la forma de saber si un formulario estaba abierto, la  solución se basaba en crear un propiedad compartida en el formulario, y cambiar a true si el formulario se mostraba.

 

Resulta que esta propiedad compartida se debe crear en cada uno de los formularios que serán invocados desde el menú principal pero resulta un problema si son 50 formularios que llamas desde el menú principal también serian 50 propiedades, la solución a esto es crear una clase  de un formulario que contenga la propiedad y listo.

 

Pasaremos a crear el ejemplo

 

1-Crear el proyecto con el nombre prjdenisMDI

 

 

2-Crear un formulario con el nombre FrmPlantilla

 

 

    3-Crear un formulario con el nombre FrmMenuMDI y cambiar el valor de  la propiedad IsMdiContainer=True, WindowState=Maximized

  

 

4-Agregar un menú al formulario FrmMenuMDI con las siguientes opciones

Catálogos

      &Articulo

Operaciones

      &Facturación

Reportes

      &Listado de Artículos

Salir

 

5-Agregar nuevos formularios con los nombres FrmArticulo, FrmFacturacion y FrmListadoArticulos, además cambiar la propiedad WindoState=Maximized

 

 

 

6-Cambiar en cada uno de los siguientes formularios FrmArticulo, FrmFacturacion y FrmListadoArticulos la siguiente línea  inherits System.Windows.Forms.Form por inherits FrmPlantilla (Para utilizar la clase FrmPlantilla)

 

7-Agregar un modulo con el nombre de principal  y agregar el siguiente código

Module Principal

    Public Function OpenFormMDI(ByVal NombreFormulario As Form, ByVal FueMostrado As Boolean , ByVal MDI As form) 
        Dim encontroformulario As Boolean = False 
        If Not FueMostrado Then 
            NombreFormulario.MdiParent = MDI 'formulario mdi Princiapl
            NombreFormulario.Show()
        Else 
            For i As Integer = 0 To mdi.mdichildren.length - 1
                If mdi.mdichildren (i).Text = NombreFormulario.Text.Trim Then 
                    EncontroFormulario = True 
                    MDI.MdiChildren(i).WindowState = FormWindowState.Maximized
                    MDI.MdiChildren(i).Show()
                End If 
            Next 
            If Not EncontroFormulario Then 
                NombreFormulario.MdiParent = MDI 'formulario mdi Princiapl
                NombreFormulario.Show()
            End If 
        End If 
    End Function 

End Module

 

8- Realizar el llamado de cada una de las opciones del Menú

Private Sub MenuItem4_Click(ByVal sender As system.Object , ByVal e As system.eventargs ) Handles menuitem4.click 
    Me.close ()
End Sub
 
Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click
    Dim FrmArticulo As New frmarticulo 
    OpenFormMDI(FrmArticulo, FrmArticulo.FueMostrado, Me) 
End Sub
 
Private Sub MenuItem6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem6.Click
    Dim FrmFacturacion As New frmfacturacion 
    OpenFormMDI(FrmFacturacion, FrmFacturacion.FueMostrado, Me) 
End Sub
 
Private Sub MenuItem7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem7.Click
    Dim FrmListadoArticulos As New frmlistadoarticulos 
    OpenFormMDI(FrmListadoArticulos, FrmListadoArticulos.FueMostrado, Me) 
End Sub 

 

Conclusiones

 

Como comentarios finales la Función OpenFormMDI tiene 3 parámetros

NombreFormulario : El cual será abierto

FueMostrado            : Propiedad que indica si un formulario esta abierto

MDI                            : Formulario MDI Actualmente

 

Además de instanciar una sola vez el formulario la función recupera el formulario ya abierto y lo pone en el plano principal, creo que eso si es de gran ayuda para todos nosotros que trabajamos con MDI, en vb6.0 quede maravillado con un control llamado ACTIVEBAR2.0 (www.datadynamics.com) que realiza todo esto que se hace con esta función y mas, pero desgraciadamente no hay versión para NET.

 

Esperando que este artículo sea de su agrado me despido

 

Si la Patria es pequeña uno grande la sueña

Rubén Darío (Poeta Nicaragüense)

Lic. Denis Enrique Guido Rodríguez


Espacios de nombres usados en el código de este artículo:

System.Windows.Forms.Form


Fichero con el código de ejemplo: denisenrique_Instanciar_formulario_MDI_una_sola_vez.zip - 46.1 KB

(MD5 checksum: 8D95EF0E3343A9CA81E99D9BC01B4897)

 


ir al índice