Colabora .NET

Cargar un formulario desde su nombre en una variable y solamente una vez

Permitirá cargar desde un formulario MDI, los formularios hijos pero a partir del nombre de cada uno y por una única vez.

 

Fecha: 21/Ago/2006 (20-8-2006)
Autor: Alexánder Murcia - sistemassagam@hotmail.com

 


Introducción

Cuando desarrollamos un aplicativo, por lo general utilizamos un formulario MDI donde diseñaremos un menú de acuerdo a nuestras necesidades y para cargar los formularios hijos, deberemos declarar cada uno de ellos.
Hasta ahi, todo es normal y ya nos hemos acostumbrado a hacerlo en NET pero qué sucede si poseemos una determinada cantidad de opciones de menú o deseamos crear en algún momento, un menú con opciones dinámicas? vamos a definir esa misma cantidad de veces los formularios además de una buena cantidad de código y dinámicamente no será fácil; Pero si los tenemos definidos ya sea en arrays o en un archivo externo (texto, xml, etc.) o tabla de BD, los nombres de los formularios para ser invocados, solo debemos utilizar una rutina única y además que valide que no se puedan abrir mas de una vez. A continuación describiremos mediante un ejemplo sencillo, la forma como podemos realizar estas dos cosas al mismo tiempo. Posteriormente cada desarrollador podrá diseñar su propia forma de adecuación de acuerdo a sus necesidades.

 

Primer Paso

Crearemos un proyecto el cual incluirá 3 formularios donde uno será el MDI (formulario principal) y los otros 2 serán hijos del MDI. Recordemos que para colocar un formulario MDI, debemos cambiar la propiedad IsMdiContainer a True en el formulario que lo será. También adicionaremos un módulo.

Segundo Paso

Al formulario MDI le adicionaremos dos botones. Al primer botón le colocaremos en la propiedad Text, "Hijo1" y al segundo botón le coloreamos en la propiedad Text, "Hijo2".

A cada uno de los formularios hijos, le adicionamos un botón que llevará en la propiedad Text, "Cerrar".


Tercer Paso

Al módulo le adicionaremos el siguiente código:

Module modulo
    'Función: chequear si el formulario ya ha sido cargado
    Public Sub llamarform(ByVal formulario As Form, ByVal mdi As Form)
        Dim frmllamado As Form
        Dim escargado As Boolean = False
        Try
            'chequemos si el formulario ha sido cargado
            For Each frmllamado In mdi.MdiChildren
                'Compara si es igual y retorna verdadero si lo es.
                If frmllamado.Text = formulario.Text Then
                    'Marca la bandera
                    escargado = True
                    'Sale del loop si es verdadero
                    Exit For
                End If
            Next

            If Not escargado Then
                'Carga el formulario si no esta llamado
                formulario.MdiParent = mdi
                formulario.Show()
            ElseIf escargado Then
                'Enfoca el objeto
                frmllamado.Focus()
            End If

            'Nada que hacer, toca colocar la exception
        Catch ex As Exception
            'Mostrar mensaje
            MsgBox(ex.Message & vbCrLf & ex.Source & vbCrLf & _
                   ex.StackTrace, MsgBoxStyle.Critical, "Error")
        End Try
        'Limpiar todo
        formulario = Nothing
        frmllamado = Nothing
    End Sub
End Module

A formulario MDI le anexaremos el siguiente código:

Public Class frmmdi 
    Inherits System.Windows.Forms.Form

 Código 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
        mostrarForm("frmhijo1")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button2.Click
        mostrarForm("frmhijo2")
    End Sub
    Private Sub mostrarForm(ByVal nombreform As String)
        'Creamos una variable tipo Form
        Dim frmdinamico As Form
        'Extraemos toda la información necesaria para poder pasar
        'con el solo nombre del formulario a la variable "frmdinamico", el objeto
        frmdinamico = AppDomain.CurrentDomain.CreateInstanceAndUnwrap( _
                      Me.GetType.Assembly.GetName.Name, _
        System.String.Concat(Me.GetType.Assembly.GetName.Name, ".", nombreform))
        'Llamamos la rutina que no permitira abrir 2 veces el formulario
        llamarform(frmdinamico, Me)
    End Sub
End Class

A cada formulario hijo le anexaremos el siguiente código:
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

A continuación procedemos a compilar y realizar las pruebas pertinentes.

Espero que sea de mucha utilidad.

Nota: Es de aclarar que alguna parte de este código lo encontré originalmente en inglés de la página www.planet-source-code.com y le hice la debida adaptación al español.

 


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

System.Windows.Forms.Form

 


Código de ejemplo (ZIP):

 

Fichero con el código de ejemplo: amurcia_formulario_nombre.zip - 12.6 KB

(MD5 checksum: C7FE79AAB1C59FF859A2466BFCDC4C49)

 


ir al índice principal del Guille