Question

J'ai une forme dans MS Access qui a une image. L'image a un événement Click qui ouvre un formulaire modal. Le formulaire modal a un bouton OK et Annuler. Lorsque vous cliquez sur le bouton OK, un événement est censé le feu qui indique la principale forme qui touche a été cliqué. (Ceci est de simuler la fonctionnalité DialogResult en C #). Cependant, le code dans le gestionnaire d'événements ne fonctionne jamais.

Le formulaire modal comporte les éléments suivants dans les déclarations générales:

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

et le code suivant où le bouton OK est cliqué:

RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)

La principale forme a la suivante dans les déclarations générales:

Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate

et le gestionnaire d'événements suivant:

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

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

End Sub

Quelqu'un peut-il expliquer pourquoi le gestionnaire d'événements est jamais appelé? Merci!

Arrière-plan:

Le but de tout cela est de permettre une boîte de dialogue modale pour ajouter une entrée, puis retourner l'ID de l'arrière d'entrée à la forme principale pour définir la valeur des contrôles. Par exemple, imaginez que vous remplissez un formulaire d'assurance, et vous devez sélectionner une marque de voiture ce n'est pas là. Vous cliquez sur une icône qui apparaît avec la boîte de dialogue modale pour vous permettre d'ajouter la marque de voiture. Ensuite, lorsque vous cliquez sur OK, il vous ramène à la forme d'assurance et sélectionne la marque de voiture que vous venez de créer.

Cela fait suite à un exemple que je trouve ici: http://database.itags.org/ms-access-database/80292/

Était-ce utile?

La solution

Vous faites votre chemin de vie trop compliquée par l'application des concepts d'un environnement de développement différent de l'accès VBA. Bien que VBA ne WithEvents support / RaiseEvent, il n'y a aucune raison pour obtenir ce compliqué ici.

La façon habituelle de travailler avec des boîtes de dialogue dans l'accès est qu'au lieu de les fermer, vous les cachez. Cela permet au code après la forme était ouverte à courir tout en laissant les valeurs sous la forme disponible pour une utilisation dans ce code.

Exemple de code dans l'événement OnOpen d'un rapport qui donne une forme de collecte de valeurs pour filtrer le rapport:

  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 forme de dialogue a deux boutons de commande, CONTINUER >> et ANNULER. Les jeux de bouton d'annulation de la balise du formulaire « Annuler » et ensembles propriété .Visible de la forme False. Le bouton >> CONTINUER ne fait rien, mais définie sur False propriété .Visible du formulaire. En cliquant l'un de ces boutons permet au code de continuer sur la ligne après la forme est ouverte avec le commutateur acDialog.

Ma philosophie est de rendre les dialogues aussi stupide que possible. Le code appelant doit savoir ce qu'il cherche dans les formes (à savoir, vous avez besoin de connaître les noms des contrôles que vous lisez des données sur), mais cela pourrait être en ajoutant eu l'occasion de propriétés des clients à la forme. Mais alors vous devez connaître les noms de propriété, de sorte que vous venez de circuler le ballon.

J'ai également mis en œuvre ce genre de chose en enveloppant la forme dailog dans un module de classe, puis le contexte appelant initialisent une instance de la classe et tire alors les valeurs hors de celui-ci au moment opportun. Mais qui est en fait plus complexe que l'approche ci-dessus.

Autres conseils

bien que je ne suis pas d'accord à

  

"Bien que VBA ne WithEvents support / RaiseEvent, il n'y a aucune raison de   obtenir compliqué ici. "

J'ai travaillé sur divers projets VB6 et VBA. Récemment, je VBA dans Excel codé où j'ai soulevé un événement de WinForm. Peu de choses à considérer lors de le faire.

  1. Si vous appelez WinForm non modale dans VBA WithEvents / RaiseEvent. Il devrait fonctionner normalement comme prévu. Aucun grand solution de contournement est nécessaire
  2. Si vous appelez WinForm modal dans VBA. WITHEVENTS / raiseevents peut     fonctionne pas selon l'exigence. Une solution rapide est de transférer des données en utilisant des variables publiques figurant dans le fichier de module.

Vous aurez besoin d'utiliser la solution de contournement et je crois que cela fonctionnera tout à fait bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top