Le he echado un vistazo y te puedo decir el error:
Un formulario es una clase estática, es decir no es necesario instanciarla para utilizarla... aunque, a mi entender es muy conveniente. El problema con tu código es que en el fMain haces esto:
Código:
Public Sub toolAnadirNuevoTrabajo_Click()
Dim ventana As AnndirTrabajo
ventana = New AnndirTrabajo(base)
ventana.Show
End
Es decir creas una nueva instancia de AnndirTrabajo con New
Luego desde AnndirTrabajo, a la hora de mostrar el formulario nuevoCliente haces esto:
Código:
Dim ventana As NuevoCliente
Dim a As Integer
Dim n As String
ventana = New NuevoCliente(base, True)
ventana.Showmodal()
...
...
Es decir creas una nueva instancia de NuevoCliente, igual que antes con New.
Pero a la hora de cerrar NuevoCliente, haces esto:
Código:
Message.Info("Cliente creado correctamente.")
If anadirTrabajo Then
anndirTrabajo.$idCliente = i
Endif
Me.Close(1)
Es decir invocas un símbolo de anndirTrabajo como clase estática pero sin instanciar... y eso no es posible.
Solución:
Cuando en un formulario quieras mencionar algún símbolo del formulario que lo llamó, pásale una referencia de éste. Es decir, en este caso, en el formulario instanciado anndirTrabajo haz esto:
Código:
Dim ventana As NuevoCliente
Dim a As Integer
Dim n As String
ventana = New NuevoCliente(base, True, Me) 'Como tercer parámetro una referencia al formulario llamador
ventana.Showmodal()
Luego en el formulario NuevoCliente:
Código:
Private base As BaseDatos
Private anadirTrabajo As Boolean 'Si es True es que viene de la ventana anadirTrabajo, eso significa que llama a la propiedad de esta ventana
Private $anndirTrabajo As Object
Public Sub _new($base As BaseDatos, $anadirTrabajo As Boolean, oLlamador As Object) 'Recibimos la referencia al form llamador como tercer parámetro
base = $base
anadirTrabajo = $anadirTrabajo
$anndirTrabajo = oLlamador 'asignamos la referencia del llamador a una variable privada
End
Public Sub btnGuardar_Click()
....
....
i = base.annadirNuevoCliente(textos)
Message.Info("Cliente creado correctamente.")
If anadirTrabajo Then
$anndirTrabajo.$idCliente = i 'asignamos valor al símbolo $idCliente de la instancia del formulario llamador
Endif
Me.Close(1)
End
Public Sub btnCancelar_Click()
Me.Close(0)
End
y con esto te funcionará siempre. Usa esta técnica siempre que quierar pasar datos de un formulario a otro abierto por él mismo, no importa si es la primera o la segunda.
Por último me permito un consejo:
Yo no soy muy partidario de una notación Húngara estricta, hay momentos en los que más bien me estorba que me ayuda. Pero hay algunas convenciones que deberían "ser sagradas" y una de ellas es: Reserva el $ inicial para las variables privadas y en lo posible asigna un nombre indicativo a las propiedades (eso ya lo haces) y el mismo nombre precedido por el $ para las variables controladas por ellas. No uses $ ni para nombres de métodos ni controles ni variables públicas.
Es algo, quizá, relativo a las preferencias de cada uno, pero realmente hace el código más legible.
Perdón por el ladrillo.
Saludos