EVENTOS Y VARIABLES ESTÁTICAS: MÁS COMUNICACIÓN ENTRE FORMULARIOS

Tengo una aplicación en C# con dos ventanas: la principal (form1), que se abre apenas inicia el programa, y una segunda ventana (form2), que se abre al pulsar un botón. Ambas deben trabajar con el mismo archivo (que puede ser un archivo de texto con datos de configuración o una base de datos). form1 tiene una ruta predeterminada a ese archivo, pero ésta puede ser cambiada por el usuario en cualquier momento. 

En el caso de Form1, la ruta al archivo se puede guardar en una variable tipo String, luego usando un delegado, pasársela a Form2.


Para acceder a los delegados de form1, necesito una instancia de la clase Form1, la cual debe ser estática porque se declara dentro de la clase estática Program, además como es la ventana principal, form2 (y cualquier otra ventana secundaria o clase en la aplicación) no crearán nuevas instancias de form1.

 

De esta manera, form2 ya puede suscribirse (y desuscribirse) al evento Enviar de form1:


Pero esto sólo actualiza las rutas en form2 al abrir la ventana form2. Si quiero que cada vez que cambie de ruta al archivo en form1, también se cambie en form2, se debe añadir esta línea de código en el evento Click del botón que sirve para cambiar la ruta al archivo mediante un OpenFileDialog llamado dlgOpen:


Con este sistema, puedo abrir todos los form2 que desee y, como todos están suscritos al evento Enviar, todos actualizarán sus rutas al archivo cuando lo haga desde form1.
Además, como todos los form2 (o mejor dicho: todas las instancias de la clase Form2) fueron creados y declarados desde form1, basta cerrar form1 para cerrar todos los form2 y terminar la aplicación.


Pero, ¿qué ocurre si sólo quiero abrir un form2? Por alguna razón no me funcionó el patrón Singleton, que es simplemente permitir una sola instancia de una clase. 
Para solucionarlo, creé una variable tipo byte estática a nivel de clase en la clase Form2:

 

En el evento Click del botón btnForm2 que abre form2 desde form1 se pondrá el siguiente código:


Si existe una instancia de Form2, la variable estática flagForm2 será 1, si no hay ninguna instancia (en este caso cuando se cierra la ventana form2), será 0. form1 evalúa flagForm2 y sólo abrirá una ventana form2 si su valor es 0. Las variables estáticas permanecen en memoria aún si la clase a la que pertenecen no tiene ninguna instancia tal y como lo indica la documentación del lenguaje C#:


¿y si deseo abrir sólo un número determinado de form2?
Sólo se debe cambiar el valor que form2 asigna a la variable flagForm2:

 

Y cómo se valúa desde form1:


Esto sólo me permitirá abrir hasta cinco form2. No importa si las cierro y vuelvo a abrir, sólo se abrirá un máximo de cinco.
El código fuente se puede descargar de aquí.

www.000webhost.com