Cuando un formulario se llama por su método SHOWDIALOG() no necesita esta
solución, ni tampoco se puede asociar a un formulario padre.
En esta oportunidad veremos como instanciar solo
una vez con ayuda del patrón singleton, si no estás enterado que son patrones, puedes leerlo aquí, los patrones son soluciones a problemas comunes de diseño de software y con esto me refiero mas propiamente al diseño de clases.
En este ejemplo crearemos un un formulario padre que albergue dos formularios de los cuales uno sera singleton y otro simple.
Formulario padre
En propiedades de formulario IsMdiContainer valor true para que tenga un comportamiento de formulario padre, en este caso usé el control toolStrip para llamar a la creación de formularios y también para cerrarlos, posteriormente añadí dos formularios, como vemos a continuacion, FormSimple, FormSingleton.
Explorador de soluciones de Visual Estudio 2010
Bién nos concentraremos en el formulario Singleton es el que nos interesa, el formulario simple lo añadi solo para ver la diferencia no tiene ninguna característica particular.
A continuación las lineas de codigo del formulario singleton:
public partial class FormSingleton : Form { private static FormSingleton InstanciaFormulario = null; public FormSingleton() { InitializeComponent(); } public static FormSingleton Instance() { if (InstanciaFormulario == null) { InstanciaFormulario = new FormSingleton(); } return InstanciaFormulario; } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); InstanciaFormulario = null; } }
Analizando el código, en la cabecera de la clase declaramos como un tipo privado estático de la misma clase del Formulario Singleton.
Después creamos un método estático publico del mismo tipo del formulario que verificara la existencia de la instancia, y que devuelve el formulario instanciado.
Y por ultimo modificar método Dispose añadiendo la linea de código InstanciaFormulario = null; al final, este método se crea por defecto al agregar un formulario al proyecto, podemos encontrarlo haciendo clic derecho sobre InitializeComponent(); del método constructor del Formulario, e Ir a Definición ; como vemos en la siguiente imagen.
Accediendo a la definición de InitializeComponent()
En este caso yo elimine el método Dispose de la Clase parcial Desinger.cs del Formulario , poniéndola en la clase que generalmente usamos para programar.
EL método dispose de un formulario se ocupa de liberar todo los componentes que pertenecen al formulario como por ejemplo los controles, este se ejecuta cuando el formulario se cierra, en este caso aprovechamos para convertir nula la instancia del formulario.
A continuación el código del Formulario padre:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void toolStripLabel1_Click(object sender, EventArgs e) { //corresponde al boton creacion formulario simple FormSimple FormularioSimple = new FormSimple(); FormularioSimple.MdiParent = this; FormularioSimple.Show(); } private void toolStripLabel2_Click(object sender, EventArgs e) { //corresponde al boton creacion Formulario Singleton FormSingleton FormularioSingleton = FormSingleton.Instance(); FormularioSingleton.MdiParent = this; FormularioSingleton.Show(); } private void toolStripLabel3_Click(object sender, EventArgs e) { // Cerrar todos los formulario hijos creados foreach (Form ChildForm in this.MdiChildren) { ChildForm.Close(); } } }
Analizando el código del formulario padre, el método que usamos para la creación del formulario singleton es el evento toolStripLabel2_Click , accediendo al método estático del formulario Instantce() que resuelve la instanciación del mismo.
Los métodos estáticos son una característica de las Clases singleton, uno puede acceder a estos métodos o clases sin necesidad de instanciarlos.
Y el método para cerrar todos los formulario hijos abiertos definido por el evento toolStripLabel3_Click puede ser considerado un tip en Windows Forms, muy útil para despejar la vista del usuario.
Los métodos estáticos son una característica de las Clases singleton, uno puede acceder a estos métodos o clases sin necesidad de instanciarlos.
Y el método para cerrar todos los formulario hijos abiertos definido por el evento toolStripLabel3_Click puede ser considerado un tip en Windows Forms, muy útil para despejar la vista del usuario.
Presentamos en un Slide de imágenes la aplicación:
Imágenes de la aplicación.
Mas adelante veremos la aplicación de patrones a proyectos de software, si duda un tema muy interesante.