- Se estuvo hablando de pasar variables de aquí para allá; ese vocabulario no es muy acertado e influye negativamente en los razonamientos.
- Se están mezclando conceptos de los paradigmas de programación imperativa (de procedimientos) con el de programación orientada a objetos.
Hay que tener claro que:
- Un formulario es una clase.
- Una variable pública declarada en un formulario rompe el encapsulamiento que debe tener esa clase.
- Los controles en los formularios pueden ser privados o públicos y cuando se generan en tiempo de diseño su ámbito se controla desde el cuadro de diálogo Propiedades del proyecto. Si se crean en tiempo de ejecución sin especificar el ámbito (PRIVATE|PUBLIC) su ámbito será controlado por la opción de configuración antes mencionada. Si son públicos se rompe el encapsulamiento de esa clase.
- Si no se declara el ámbito de las variables en un módulo, serán públicas o privadas de acuerdo a la configuración Símbolos en módulos son públicos por defecto [Sí|No] del mismo cuadro de diálogo.
Entonces, si se opta por el paradigma imperativo se debe evitar el uso de variables globales (hay que hacerse la idea de que están prohibidas) y toda rutina (procedimiento o función) debe recibir los datos con los que opera por medio de sus argumentos. A veces esto genera largas listas de argumentos en una gran cantidad de funciones, pero es la única manera de mantener bajo control los terribles efectos colaterales que puede traer el uso de variables globales (y esto es especialmente cierto en proyectos medianos/grandes).
Es frecuente que varias rutinas tengan que operar con los mismos datos, si se usan variables globales (cuantas más sean mayor es el riesgo) cualquier modificación a una de esas variables afectará a todas las funciones que la usen.
Si en cambio las funciones operan únicamente con sus propios argumentos, sus valores se definen en cada llamada de forma explícita permitiendo un mayor control (pero de nada serviría si lo que se pasa como argumentos son variables globales).
Las funciones (FUNCTION) pueden modificar un valor y devolverlo (RETURN). Las funciones deberían usarse cuando resulta necesario devolver un único valor.
Los procedimientos (SUB) deberían usarse para procesos que no devuelven resultados o devuelven varios valores modificados.
Se debe recordar utilizar la palabra clave byref al pasar argumentos a un procedimiento que éste debe modificar.
Puede parecer trivial pero uno de los problemas más habituales de este paradigma desde siempre ha sido la modificación inadvertida de una variable (global) que usa una determinada rutina.
Si por el contrario se opta por el paradigma de programación orientada a objetos, cada formulario (clase) debe encapsular sus datos (propiedades). Por lo tanto, no debería accederse directamente a ninguna variable ni propiedad de un control desde otra clase, sino sólo a través de las interfaces públicas que hayas declarado en ese formulario (clase).
Esas interfaces públicas se pueden declarar a través de la palabra clave (PROPERTY) o métodos (FUNCTION | SUB), pero nunca debería utilizarse una variable pública (global) como interfaz.
Mezclar los paradigmas es una muy, pero muy mala idea.
En conclusión, si se utiliza el POO no hay ninguna necesidad de "pasar" absolutamente nada. Cada clase (sea visual -formulario- o no) debe tener su interfaz pública (propiedades y métodos) que es lo que se debe usar desde otras clases. Si esto no se respeta de forma estricta: no se está usando POO, es muy fácil liarse y los problemas aparecerán como por arte de magia.
Saludos cordiales.