Pregunta

Tengo un formulario en MS Access que tiene una imagen. La imagen tiene un evento Click que se abre un formulario modal. El formulario modal tiene una Aceptar y Cancelar. Al hacer clic en el botón Aceptar, un evento que se supone que el fuego que le dice a la forma principal que se hizo clic en el botón. (Esto es para simular la funcionalidad DialogResult en C #). Sin embargo, el código del controlador de eventos nunca se agota.

La forma modal tiene la siguiente en las declaraciones generales:

Public Event OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)

y el siguiente código donde se hace clic en el botón Aceptar:

RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)

La forma principal tiene la siguiente en las declaraciones generales:

Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate

y el controlador de eventos siguiente:

Private Sub RespondQuickAddClose_OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)

    MsgBox "Responding to closing of the dialog box" 'Never happens
    Me.Requery

End Sub

Puede alguien explicar por qué el controlador de eventos está nunca llamó? Gracias!

Antecedentes:

El propósito de todo esto es permitir que un cuadro de diálogo modal para añadir una entrada, y devolver el ID de la parte posterior de entrada a la forma principal para establecer el valor de los controles. Por ejemplo, imagine que está rellenando un formulario de seguro, y es necesario seleccionar una marca de coche este no está allí. Hace clic en un icono, que aparece con el cuadro de diálogo modal para permitirle añadir la marca de coches. A continuación, al hacer clic en OK, lo lleva de vuelta a la forma de seguros y selecciona la marca de coche que acaba de crear.

Esto sigue un ejemplo que encontré aquí: http://database.itags.org/ms-access-database/80292/

¿Fue útil?

Solución

Usted está haciendo su camino la vida demasiado complicada por la aplicación de los conceptos de un entorno de desarrollo diferente para acceder a VBA. Mientras que VBA hace WithEvents de apoyo / RaiseEvent, no hay razón para conseguir que complica aquí.

La forma habitual de trabajo con los cuadros de diálogo de acceso es que en lugar de cerrarlas, las oculta. Esto permite que el código después de la forma estaba abierta para funcionar, dejando los valores en forma disponible para su uso en dicho código.

Código de ejemplo en el caso de OnOpen de un informe que abre un formulario de recogida de valores para filtrar el informe:

  Private Sub Report_Open(Cancel As Integer)
    DoCmd.OpenForm "dlgDateRange", , , , , acDialog, "ThisYear"
    If IsLoaded("dlgDateRange") Then
       With Forms!dlgDateRange
         If .Tag = "Cancel" Then
            Cancel = True
         Else
            Me.Filter = "[InvoiceDate] Between #" & !txtStart & "# AND #" & !txtEnd & "#"
            Me.FilterOn = True
            Me!lblDateRange.Caption = StrConv(Trim(("from " + varZLStoNull(Format(!txtStart, "mm/dd/yyyy"))) _
                & (" to " + varZLStoNull(Format(!txtEnd, "mm/dd/yyyy")))), vbProperCase)
         End If
       End With
       DoCmd.Close acForm, "dlgDateRange"
    End If
  End Sub

La forma de diálogo tiene dos botones de comando, y continuar >> CANCELAR. El CANCELAR grupos de botones etiqueta del formulario a "Cancelar" y conjuntos de propiedades .Visible de la forma en Falso. El botón CONTINUAR >> no hace más que establece la propiedad .Visible de la forma en Falso. Al hacer clic en cualquiera de esos botones permite que el código para continuar en la línea después de que el formulario está abierto con el interruptor acDialog.

Mi filosofía es hacer que los diálogos tan estúpida como sea posible. El código de llamada tiene que saber lo que está buscando en las formas (es decir, lo que necesita saber los nombres de los controles que está leyendo datos fuera de), pero que se podía obtener mediante la adición de alrededor de propiedades de clientes a la forma. Pero entonces usted tiene que saber los nombres de las propiedades, por lo que acaba de moverse la pelota.

También han implementado este tipo de cosas, envolviendo la forma dailog en un módulo de clase, y luego el contexto llamar simplemente inicializa una instancia de la clase y luego tira los valores fuera de él en el momento apropiado. Pero que en realidad es más complicado que el enfoque anterior.

Otros consejos

bien no estoy de acuerdo a

"Mientras que VBA hace WithEvents de apoyo / RaiseEvent, no hay razón para llegar tan complicado aquí ".

He trabajado en varios proyectos VB6 y VBA. Recientemente codifiqué VBA en Excel donde provoca un evento de WinForm. Pocas cosas a tener en cuenta antes de hacerlo.

  1. Si está llamando WinForm no modal en VBA con WithEvents / RaiseEvent. Se debe trabajar normalmente como se esperaba. No hay Major solución que se necesita
  2. Si está llamando WinForm modal en VBA. WITHEVENTS / raiseevents puede no funcione según el requisito. Una solución rápida es la transferencia de datos utilizando variables públicas declara en el archivo del módulo.

Se tendrá que utilizar la solución y creo que va a funcionar absolutamente bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top