Actualizar control en formulario instanciado

Tengo un formulario instancia
De otro. Este formulario tiene un control LISTBOX que al clicar uno de
los registros que muestra me abre un segundo formulario de
edición/modificación del registro seleccionado. Este segundo formulario
al cerrarlo debe actualizar el listbox del primero para que los cambios
se muestren en el LISTBOX.
Un ejemplo gráfico sería un formulario
Que muestre en un listbox los almacenes de la empresa y al clicar sobre
un almacén abre un segundo formurio para editarlo, por ejemplo cambiarle el nombre. Al cerrar el segundo el nombre en el listbox del primero debe actualizarse.
Si fuese un formulario normal sería muy fácil poner en el evento AL SALIR: Forms! Formulario! LISTBOX. Requery
El problema es que es una instancia y no sé como referirme al formulario instanciado
La instancia es abierta desde otro formulario, digamos que panel de control, con el siguiente procedimiento
Option Compare Database
Option Explicit
Dim instancia(1 To 5) As Form
Dim numinstancia As Integer
-------------------------
Private Sub AbreInstancia()
numinstancia = numinstancia + 1
If numinstancia > 5 Then
AvisoLimiteinstancias = MsgBox("Demasiadas ventanas abiertas. Debe cerrar alguna.", vbCritical, "Aviso")
Exit Sub
End If
Set instancia(numinstancia) = New Form_frmTablas
instancia(numinstancia).Visible = True
End Sub
El esquema sería
Botón de FORMULARIO0-->abre INSTANCIA(1)...que es una instancia del formulario [frmTablas]
Listbox de INSTANCIA(1)-->abre FORMULARIO2
FORMULARIO2-->actualiza Listbox de INSTANCIA(1)
Lógicamente las instancias pueden ser varias: INSTANCIA(1), INSTANCIA(2)... Y todas ellas pueden abrir el FORMULARIO2.

1 respuesta

Respuesta
1

No acabo de entender lo de que "as instancias pueden ser varias: INSTANCIA(1), INSTANCIA(2)... y todas ellas pueden abrir el FORMULARIO2,", un mismo formulario no debe ser llamado más de una vez (instanciarse sólo 1 vez).

Si es así, no hay manera de solucionar lo que quieres, ya que el código no puede saber a cual de todas las instancias te estás rfefiriendo, ya que todas tienen el mismo nombre.

En caso contrario, puedes hacer la llamada al FORMULARIO2 pasándole entre los argumentos, el nombre del formulario, luego desde el propio FORMULARIO2, haces la actualización del formulario que hace la llamada.

Efectivamente esa frase la verdad es que la expresé mal.

Lo que quería decir es que cada instancia abre un formulario distinto. Por ejemplo:

- Instancia(1) muestra los almacenes en un listbox y al clicar en un almacén abre un formulario2 que muestra el almacen seleccionado para modificar por ejemplo su nombre

- Instancia(2) muestra los clientes en un listbox y al clicar en un cliente abre un formulario3 que muestra el almacén seleccionado para modificar por ejemplo su nombre

...

Lo de pasarle al formulario2 el nombre del formulario que lo abre, por ejemplo en el openargs con me.name. No funciona (con un formulario normal sí, pero con una instancia no)

Gracias de todas formas. Tendré que poner en cada instancia un botón que actualice el listbox me.listbox.requery.

No es automático,pero por ahora es la solución que tengo.

Saludos

Tendría que ver la base de datos.

En realidad, cada vez que abres un formulario, haces una llamada a una instancia del mismo, lo que pasa es que Access es "bastante listo" y no permite que se abra más de una instancia de un formulario, aunque con técnicas avanzadas de programación es posible hacerlo.

Si quieres enviarme la base de datos, puedes subirla a un sitio tipo Dropbox, OneDrive, Google Drive y similares; y luego pones el enlace por aquí.

El código que puse en el primer post es el código que permite abrir más de una instancia. El problema que tengo no es abrirla, sino como referirse a un control de cada una de las instancias

No me había fijado en el código, ya que yo suelo hacerlo de otra forma, pero las dos son válidas y correctas.

En tu caso, para hacer referencia a un control de la instancia, debes hacer lo siguiennte:

Instancia(numinstancia). NombreDelControl



Donde NombreDelControl es el nombre del control al que quieres hacer referencia.

Esa sería lo lógico, ya lo había probado pero No funciona.

¿Por qué estoy tan interesado en las instancias?

Porque la aplicación tendrá muchas tablas y para las tablas básicas, con el fin de no hacer muy pesada la aplicación, no quiero hacer un formulario para cada tabla. Así si con un sólo formulario puedo mostrar todas las tablas básicas en instancias de un formulario base y cambiar el controlsource para cada instancia me ahorro mucho, mucho espacio. Amén de que en caso de tener que corregir algo no es lo mismo corregir el formulario base una sola vez que corregir tantos formularios como tablas. El beneficio es muy grande y me parece muy interesante lo de las instancias.

Te dejo un link con parte de la aplicación para que lo veas.

https://dl.dropboxusercontent.com/u/43557133/todoexpertos/todoexpertos.rar

Formulario inicial con dos botones: Ambos abren una instancia cada uno del formulario base que se llama FrmTablas

Luego o bien doble clic en un elemento del listbox o bien presionando el botón modificar se abre el tercer formulario con el detalle del elemento seleccionado.

Cambia, por ejemplo el nombre y ve que da error en el evento al cerrar que supuestamente debería actualizar el listbox de la instancia previa.

Es como si las instancias no las añadiera a la colección de formularios y sólo pudiesen ser llamados desde el formulario que crea las instancias. Porque si te refieres a la instancia desde el F0 sí que actualiza, pero ni es lo que intento ni tiene sentido, porque para eso podría poner un botón en la propia instancia que lo actualizara, pero ya obligas al usuario a darle al botón

A ver si puedes encontrar una solución. Muchas gracias

Las instancias no se añaden a la colección de formularios.

Access no es Visual basic, ni java, ni C... no tiene muchas de las características de estos lenguajes, lo que requiere que para programar correctamente en Access tengas que invertir mucho tiempo y trabajo. Y para hacer aplicaciones complejas, se necesite mucho más tiempo de lo que parece.

Voy a mirar tu base de datos, a ver si encuentro el fallo.

Ya he visto algo; el procedimiento ActualizaLst_lookup no existe en ningún sitio..

En el evento al cerrar del formulario FrmDetalleFamilia

Private Sub Form_Close()
instancia(Openargs).Lst_lookup.Requery
End Sub

(el otro FrmDetalleIva me olvide de cambiar la linea de ese evento, así que usa el FrmDetalleFamilia, por favor)

Otra cosa,

En el form FrmDetalleFamilia haces la llamada a la variable instancia, que no está declada en el alcance actual.

Voy a seguir revisando...

Ya le solucionado.

He creado un módulo, donde declaro la variable instancia,

En el formulario base de las instancias, he agregado código para pasar el número de instancia al formulario de detalles.

En los formularios de detalles he creado la variable NumInstancia para que contenga el número de instancia recibido. He modificado el código al cerrar el formulario para que actualice la instancia que ha llamado al formulario.

Te dejo el enlace a la base de datos. https://drive.google.com/file/d/0ByBko0yg2EOweF9XUS03cEF2MGs/edit?usp=sharing

Gracias. lo voy a ver.

Pero no me deja bajar, me dice que tengo que pedir permiso:

"Necesitas permiso
¿Quieres entrar? Pide acceso al propietario o cambia a una cuenta que disponga de permiso"

¿cómo bajo la bd?

Perdona, ya está solucionado, el fichero tenía permisos, pero la carpeta no.

Prueba ahora a ver si te deja.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas