De entrada este no es el for para VB.NET si no el de VB 6.0, peor bueno, ya lo moverá algún admin si se percata...
Creas una clase y que sea la clase la que haga todo el trabajo de lectura.
La clase ha de tener una única instancia, luego... debe ser creada en un módulo (de forma privada), y tener una propiedad pública para obtener acceso a la instancia. Así cada formulario logra acceso a la misma, previo registro.
El registro de cada formulario sobre la clase, es para identificar cuantos consumidores de datos tiene la clase y si es posible, derivar el contenido únicamente al consumidor final. Esto es, la clase debe mantener una colección de objetos a los que lanzar algún evento.
...de modo informal y rápido (en pseudocodigo):
' Esta sería la clase de la que se crea una sola instancia y que realiza todo el trabajo de lectura del puerto... e informa a los consumidores 'registrados'.
' Esta clase debe declararse como pública pero no creable desde fuera.
Clase SerialRead
coleccion de clsInformation colInformation
Evento DataReceived(bytes() Data)
buleano = funcion Registro(c tipo clsInformation)
si colInformation.Contains(c)= false luego
colInformation.Add(c, c.Id)
devolver TRUE
fin si
fin funcion
' digamos que esto representa la lectura de datos del puerto...
sub SerialReaded(data)
si data.Id <> "" luego
clsInformation c = colInformation.Search(data.Id, encontrado)
Si encontrado=true
c.Data = data ' al asignar los datos, dicha clase dispara su evento... Datareceived, etc...
sino
' parece que ninguna clase REGISTRADA fuera el destino de los datos leídos???
fin si
sino
' los datos leídos no contienen info del destino de los mismos.
' en tal caso decidir que hacer, una posible solución es asumir que es para todos (o para ninguno, claro)...
'Por cada c en clasInformation ' se informa a todos... ya cada uno debería saber si debe o no fitrarlo.
' c.Data = Data
'siguiente
' pero para informar a todos es mucho mejor usar en evento de la clase que es instancia única. así informa a todos de una vez, (es imposible saber el orden, si el orden de llamada es importante, usar mejor la forma del bucle.
DispararEvento DataReceived(data)
fin si
fin sub
buleano = Funcion Desregistrar( string Id)
colInformation.Search(Id, encontrado)
Si encontrado luego
colInformation.Delete(Id)
devolver TRUE
fin si
' Si no se precisa devolver info sobre su eliminación, puede invocarse duirectamente 'delete', si existe se elimina y si no no, como no hay que informar del resultado sobra el resto del código.
' Opcionalmente si una clase así consume muchos recursos podría ser autoeliminada cuando no tenga consumidores registrados... ya con nuevos registros se creará si no existe.
'si colInformation.Count = 0 luego ME = nada ' Me en el sentido de VB otorga a Me, la referencia al objeto donde se está. ...el equivalente para los 'C'dores y 'Javaneses' es 'This'...
fin funcion
fin clase
Esto sería básicamente el código de la clase que opera leyendo... es decir mantiene una colección donde registra consumidores a los que informa debidamente cuando lea... además de forma asíncrona, esto es cuando se lean... sin las exigencias de las prisas 'dame algo si lo tienes'... (cuando llega se entrega y al destinatario adecuado si es conforme que pueda ser así).
OJO: No confundir colInformation con las instancias de clsInformation, ni sus métodos.
colInformation es una clase de tipo colección, que como cualquier colección tendrá los típicos métodos Add, Delete, Search, Contains, etc... vamos para añadir, eliminar y buscar. Y al menos que pueda buscarse por un string o un entero, luego dicha clase no requiere más descripciones, son genéricas.
En cambio las instancias de clsInformation son otro objeto distinto, que se describe más abajo y su única relación con colInformation es que dichas instancias son guardadas ahí, lo mismo que un array de bytes guardaría bytes, pero el byte y el array son dos tipos distintos.
Por su parte el módulo sería más o menos crear la única instancia de la clase y entregarla a cada uno que la solicite.
Su único cometido es que como nadie fuera de l ámbito d ela clase puede crear instancias de la clase, creara él, una única instancia y entregar referencia de la misma a qien la solicite si pudo registrarse.
Modulo Repartidor
privado SerialRead cLector
SerialRead = propiedad get Lector(clsInformation ci)
Si cLector no existe luego
clector = nueva SerialRead
Sino
si cLector.Registro(ci, ci.Id) = false devolver nada ' si no pudo registrarse es porque ya está registrado.
fin si
devolver cLector
fin propiedad
fin modulo
La clase clsInformation tampoco tiene mucha miga, es sólo una clase con 1 constructor, y 2 métodos/propiedades y un evento. Cuando se reciben datos dispara su evento para entregarlos a quien creó su instancia.
La otra propiedad (Id) identifica únivocamente a una instancia (solo es preciso si la clase lectora está capacitada para determinar el destino de los datos. Y por tanto, si procede quizás el ID, en vez de ser aleatorio debe tener una cadena fija establecida desde e lprincipio (incluso desde código) conocida por todos, esto básicamente una enumeración...).clase clsInformation
string s_Id
Evento Datareceived(bytes() Data)
Propiedad Set Data(bytes() d)
DispararEvento DataReceived(d)
fin propiedad
String = propiedad Get Id
devolver s_Id
fin propiedad
' Cuando se crea una instancia debe asignarse un identificador en lo posible único...
funcion Nuevo(string IdName)
Si IdName.Lenght = 0 luego IdName= RandomString(16 chars)
s_Id = idName
fin funcion
fin clase
Finalmente tus formularios tendrían un código similar a:
(vamos lo necesario para tratar con los objetos desceritos antes)
Class formulario
clsInformation mInformation enganchado a sus eventos
serialRead mRead enganchado a sus eventos
funcion Nuevo
Hacer
' crea una instancia de dicha clase y le asigna el id que usará.
' parte del id, es aleatorio, para evitar coincidencia con existentes y en caso contrario nuevos reintentos, podrían dar positivo...
mInformation = Nuevo clsInformation(randomstring(8 chars) + form.name)
mRead = Repartidor.Lector(mInformation)
repetir mientras (mRead = nada)
fin funcion
Funcion Terminar
mRead.Desregistrar(mInformation.Id)
mRead = nada
mInformation = nada
fin funcion
' este evento se dispara cuando éste objeto sea el único consumidor destinatario d edichos datos (si así es preciso y está establecdio en la clase lectora, claro)
funcion mInformation_DataReceived(bytes() Data)
' lo que tengas que hacer con los datos
fin funcion
' este evento se recibirá cuando los mismos datos sean enviados a todos los destinatarios.
funcion mRead_DataReceived(bytes() Data)
' lo que tengas que hacer con los datos
fin funcion
fin clase
...seguramente al 100% no podrás aplicarlo, ya que has sido parco en descripciones, es imposible acertar a darte la solución que se adapta al 100% sin cambios con tus necesidades.
Sin embargo ofrece la suficiente info, como para entender que cambios son precisos hacer para adaptarlo a tus necesidades.
El resto es trabajo tuyo...