2010-12-29 21 views
6

Tengo un formulario (FORMATO-A) que requiere que el usuario seleccione un vehículo. El usuario debe hacer clic en un botón en el FORMATO-A que dice seleccionar el vehículo. Se debe abrir un formulario de selección (FORMATO-B) donde el usuario pueda seleccionar un vehículo. El valor seleccionado debe comunicarse nuevamente a FORM-A.MS Access: ¿cómo se comunican los formularios entre sí los formularios?

¿Cómo lo lograrías en MS Access 2010?

FORM-B es una forma continua que contiene una imagen del vehículo y otra información.

+0

¿Por qué has predeterminada que una forma emergente es la forma correcta de hacer esto? ¿Por qué no una lista desplegable en el formulario principal? –

+0

Admito que esto es lo que inicialmente hice, pero luego quise incluir una imagen del vehículo en el proceso de selección. A menos que haya algún control de selección de lista que pueda hacer esto, estoy atascado con un subformulario o una ventana emergente. La ventana emergente hace que el usuario sienta que la selección es cierta, mientras que el subformulario (forma continua) hace que el usuario dude si la selección realmente ocurrió. – cmaduro

Respuesta

11

Por lo que entiendo de su pregunta, quiere que formB abra un tipo de ventana emergente. Cuando se cierra la ventana emergente, su resultado se coloca en algún lugar en el formulario de llamada.
Propuesta de solución:
a) abra FormB utilizando la sintaxis docmd.openform "formB", windowmode:=acDialog.
Esto evitará la ejecución de las siguientes líneas hasta que el formularioB esté cerrado u oculto.
b) en el botón Aceptar de FormB, simplemente oculta el formulario, no lo cierres.
c) cuando el código se reanuda en forma, ahora puede

  1. verificación si formB todavía está abierta. Si no es así, se ha cancelado
  2. leer el valor en formB oculta (todavía abierto), a continuación, cierre formB

lo contrario, también podría tener formB para actualizar un control en forma antes del cierre. Pero no me gusta ese enfoque porque entonces formB no es reutilizable y crea una dependencia innecesaria entre formB y formA.

+1

Si tiene que tener el diálogo por separado, entonces esto parece ser el camino a seguir. –

+1

Convierta este tipo de cosas en una función que se puede llamar a lo largo de la aplicación. Puede hacer que la función devuelva un conjunto complejo de valores al declarar un tipo, con cada uno de los campos que desea devolver. Deje uno llamado "válido" como un booleano que puede decir si funcionó o se canceló de – akc42

+1

Esta es una gran solución para un sistema limitado. En el pasado, pasé (utilizando Me.OpenArgs) el nombre del formulario que realizaba la llamada y un campo oculto en el formulario de llamada para almacenar el valor de devolución pero manteniendo el formulario abierto y cambiando el estado visible a falso también hace que el código de llamada del formulario continúe como si el cuadro de diálogo se cerró, ¡esto es MUCHO más simple! :) Gracias +1 – GazB

0

No estoy seguro de por qué necesitaría un formulario separado para esto - solo haga que el primer cuadro de texto sea una lista de todos los registros de vehículos en la base de datos, donde seleccionaría uno, y el resto de la información del vehículo es auto-poblada de la tabla del vehículo, pero no copiada en su tabla principal. Por supuesto, tampoco estoy seguro de la estructura de su mesa, por lo que podría haber una razón para este método que no es evidente para mí.

Los beneficios del método anterior es que si se añade más vehículos, el cuadro de selección se actualiza automáticamente - y mantener las formas que tiene que cargar a un mínimo (siempre un buen rendimiento movimiento)

0

Puede crea una instancia de formB dentro de formA y contrólala. A continuación se muestra el código de VBA para formA. Al hacer clic en un botón en formA, crea una nueva instancia de formB y le da enfoque. Al mismo tiempo, puede establecer propiedades para sus controles. Puede usar este enfoque para establecer la imagen correcta en su control en el formulario B. Espero que esto ayude.

Ejemplo:

Option Compare Database 

Dim fB As Form_FormB 

Private Sub btnA_Click() 
    Set fB = New Form_FormB 
    fB.SetFocus 
    fB.tbxB.Text = "Some text sent from A to B!" 
End Sub 

Si desea ambas formas sean visibles todo el tiempo, se sugiere emplear un subformulario con la lista de todos los vehículos o simplemente detalles de la que el usuario ha seleccionado.

0

Puede hacer referencia a los formularios de esta manera! FormName! ControlName. Una vez que vea cómo funciona esto, podrá engañarlo para que funcione con su configuración existente. Usemos 3 controles de un cuadro de texto en el Formulario A, una imagen en el Formulario B y un cuadro de texto en el Formulario-B. El cuadro de texto en Form-A se denominará txtVehicle, la imagen en Form-B se denominará imgVehicle y el cuadro de texto en Form-B se denominará txtVehicleName. Puede establecer el nombre de un control dentro de las propiedades. Al hacer clic en imgVehicle, pondrá el valor de txtVehicleName en txtVehicle.

Tendrá que hacer un pequeño código, aunque es fácil si no lo ha hecho antes. Debajo de las propiedades de la imagen, verá los eventos. Si hace clic en el evento "Al hacer clic" obtendrá una lista desplegable. Una de las opciones será [Procedimiento de evento]: elija eso. Un pequeño botón con 3 puntos aparecerá también al final de la fila. Haz clic y deberás acceder a una ventana de código con un código como este.

Private Sub imgVehicle_Click() 

End Sub 

Aquí es donde pone su código. Algo como esto debería funcionar. Esto es en su forma más simple.

Private Sub imgVehicle_Click() 
    Forms!Form-A!txtVehicle=forms!Form-B!txtVehicleName 
End Sub 

Ahora bien, aunque eso funcionará, hay algunas cosas que deberíamos hacer en este método que no hacemos. Deberíamos referirnos directamente al Formulario B ya que estamos en él, debemos verificar que el Formulario A sea de hecho abierto.

Private Sub imgVehicle_Click() 
    If currentproject.allforms(“Form-A”).isloaded then 
      Forms!Form-A!txtVehicle=me!txtVehicleName 
    End if 
End Sub 

Espero que ayude

+0

Esto no funciona, ya que solo se puede hacer referencia a los elementos enfocados. –

+0

El foco no es necesario para hacer referencia a un elemento o un formulario. Los formularios deben estar abiertos, pero ni siquiera necesitan ser visibles. Los subformularios se deben referenciar explícitamente como se describe arriba. Hay ciertas propiedades que solo están disponibles con el foco, como la propiedad de texto en un cuadro de texto, pero son minoría. – Praesagus

+0

¿por qué esta respuesta está desestimada? – Praesagus

Cuestiones relacionadas