Soy estudiante de telecomunicaciones por imagen y sonido (para los que no han leído mi otro hilo), haciendo un proyecto más bien de informática... Una aplicación multicanal de audio capaz de reproducir y registrar audio simultáneamente en C#.
He avanzado mucho ya en el código y en la estructura del programa, pero creo que debería abstraer un poco más mis clases y objetos, ya que empiezo a tener una dependencia entre todos ellos que tiene mi codigo muy "enmarañado".
Os explico brevemente:
- El form principal MDIPrincipal es el que contiene todas las barras de herramientas, los botones de PLAY, STOP... etc, los botones de carga de sesión, gestión de pistas, etc... Una simple interfaz gráfica, no implemento demasiado código en ella.
-En este form existe un objeto de tipo PanelDePistas (control de usuario) , que es el que va a contener un número indefinido de pistas de audio, y además llevará implementadas las funcionalidades de reproducción simultánea de todas las pistas, y grabación de todas las pistas (mediante otras clases internas).
-Luego tenemos una unidad fundamental: El control de usuario UnaPista. A esta pista le podremos asociar un archivo WAV, podremos establecer su Volumen, su Balance, si está en modo MUTE o en modo SOLO...
-Esta pista además contiene un objeto de tipo: GraficaOnda, que como su propio nombre indica es el encargado de leer del archivo WAV y representar gráficamente. Además se encargará de hacer zoom y todo eso. La idea es que sea independiente (dentro de lo posible) del objeto UnaPista.
-Por otro lado tenemos un objeto llamado BaseDeTiempos que simplemente se encarga de representar una base de tiempos, y de establecerle funcionalidades para desplazar la gráfica o posicionar el cursor.
-Y además hay otro objeto llamado Vumetro, que es un control grafico capaz de representar con lucecitas un determinado valor.
.... Habiendo explicado brevemente los objetos principales de mi programa: PanelDePista, UnaPista, GraficaOnda, BaseDeTiempos, Vumetro... Os cuento qué hace que mi código esté tan enmarañado:
El problema principal está en que los objetos deben tener una relación entre sí. Así, por ejemplo, necesitamos acceder desde el objeto GraficaOnda al objeto padre UnaPista para cambiar sus propiedades (por ejemplo, un indicador de nivel de Zoom). Además, por ejemplo, necesitamos acceder desde el objeto UnaPista al objeto padre PanelDePistas, por ejemplo para que éste sepa que se han producido cambios en las propiedades de la pista... etc.
Hasta ahora estaba haciendo todo esto pasando por parámetro el objeto padre en el contructor del objeto. Por ejemplo:
public UnaPista(UserControl PanelPadre)
{
InitializeComponents( );
this.PanelPadre = PanelPadre as PanelDePistas; //Aquí definimos el objeto padre.
}
De esta forma, si desde el objeto GraficaOnda, quería cambiar un dato de PanelDePistas, simplemente llamaba de esta forma:
this.PistaPadre.PanelPadre.PropiedadTal = Cual;
... ¿Problema? Ha llegado un momento en que todos los objetos dependen de todos. Si hago un cambio en PanelDePista necesito cambiar todos los demás, ya que estos acceden a él.
----------------------------------------------
He estado pensando hoy y creo que debería empezar a crear eventos a mis objetos... De esta forma, si cambiamos una propiedad de GraficaOnda, salta un evento y en el objeto padre definimos una rutina para esto. Sin embargo me surgen mis dudas...
Además, me gustaría que los objetos fueran independientes: es decir, si modifico PanelDePista, que UnaPista no se entere, y viceversa. Y además me gustaría "ensamblar" todas las clases y subcontroles que forman un control en un único Control de Usuario para poder usarlo de forma independiente incluso en otro proyecto. ¿Cómo se hace esto?.
------- Resumen de preguntas:
1- ¿Cómo se gestionan los componentes en programas complejos cuando estos deben tener relación entre sí?
¿Es correcto pasar el objeto padre por parámetro, o esto a la larga es una chapuza?
2.- ¿Cómo puedo asociar distintas clases a un mismo Control De Usuario, para compilarlo de forma independiente y usarlo en distintos proyectos?
¿Deben las clases internas aparecer como "internal" siempre?
¿Qué sucede si hay clases que quiero usar en varios controles a la vez, las defino como "internal" varias veces en los distintos controles?
¿No rompe esto la norma de reutilización de código?
------
Muchísimas gracias de antemano, y lo siento por haberme extendido tanto pero no he sabido resumir más.
Un saludo
Emilio.