Frage

habe ich ein Formular in MS Access, die ein Bild hat. Das Bild hat ein Click-Ereignis, das eine modale Formular öffnet. Die modale Form hat eine OK und Abbrechen-Taste. Wenn Sie auf die Schaltfläche OK klicken, wird ein Ereignis zu Feuer soll, die die Hauptform erzählt die Schaltfläche geklickt wurde. (Dies ist die Dialog Funktionalität in C # zu simulieren). der Code in den Ereignishandler jedoch nie ausgeführt wird.

Die modale Form hat die folgende in den allgemeinen Erklärungen:

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

und der folgende Code in dem die Schaltfläche OK geklickt wird:

RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)

Die Hauptform hat die folgende in den allgemeinen Erklärungen:

Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate

und die folgenden Ereignishandler:

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

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

End Sub

Kann jemand erklären, warum die Event-Handler nie aufgerufen wird? Dank!

Hintergrund:

Der Zweck des Ganzen ist ein modales Dialogfeld zu ermöglichen, einen Eintrag hinzuzufügen, dann wieder die ID des Eintrags zurück zum Hauptformular den Wert der Kontrollen einzustellen. Zum Beispiel vorstellen, dass Sie füllen eine Versicherung Formular aus, und Sie benötigen eine Marke des Autos wählen diese nicht da ist. Sie klicken auf ein Symbol, das mit dem modalen Dialogfeld erscheint, damit Sie die Automarke hinzuzufügen. Dann, wenn Sie auf OK klicken, gelangen Sie zurück auf die Versicherungsformular und wählt die Marke von Auto, das Sie gerade erstellt haben.

Dies folgt ein Beispiel, das ich hier gefunden: http://database.itags.org/ms-access-database/80292/

War es hilfreich?

Lösung

Sie machen Ihr Leben viel zu kompliziert durch Konzepte aus einer anderen Entwicklungsumgebung für den Zugriff auf VBA-Anwendung. Während VBA-Unterstützung Withevents funktioniert / Raise, gibt es keinen Grund, dass hier kompliziert zu erhalten.

Der üblicher Weg zur Arbeit mit Dialogen in Access ist, dass, anstatt sie zu schließen, können Sie sie zu verstecken. Dies ermöglicht es der Code nach der Form geöffnet war zu laufen, während die Werte in der Form für die Verwendung in diesem Code zu verlassen.

Beispielcode in dem OnOpen Ereignisse eines Berichts, der ein Formular öffnet Werte für das Sammeln zum Filtern des Berichts:

  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

Das Dialogform hat zwei Befehlsschaltflächen, WEITER >> und CANCEL. Die Abbruchtaste setzt das Tag-Formular auf „Abbrechen“ und setzt das .Visible Eigenschaft auf False des Formulars. Die WEITER >> Schaltfläche tut nichts, sondern setzen Sie das .Visible Eigenschaft auf False des Formulars. Durch Klicken auf eine der beiden Tasten kann der Code auf der Linie fortzusetzen, nachdem das Formular mit dem acDialog Schalter geöffnet ist.

Meine Philosophie ist es, die Dialoge so dumm wie möglich zu machen. Der anrufende Code muss wissen, was für sie sucht in den Formen (das heißt, Sie müssen die Namen des Steuerelemente wissen, dass Sie Daten aus dem Lese), sondern dass durch Zugabe von Kunden Eigenschaften zum Formular dazu gekommen sein könnte. Aber dann müssen Sie die Eigenschaftsnamen kennen, so haben Sie gerade den Ball bewegt.

Ich habe auch diese Art der Sache durch Wickeln des dailog Form in einem Klassenmodul implementiert, und dann wird der Aufruf Kontext initialisiert einfach eine Instanz der Klasse und zieht dann die Werte aus ihm zu gegebener Zeit. Aber das ist eigentlich mehr kompliziert, dass der Ansatz über.

Andere Tipps

gut bin ich nicht einverstanden zu

"Während VBA-Unterstützung Withevents funktioniert / Raise, gibt es keinen Grund zu bekommen, dass kompliziert hier. "

Ich habe auf verschiedene VB6 und VBA-Projekt gearbeitet. Kürzlich codierte ich VBA in Excel, wo ich ein Ereignis aus winform angehoben. Nur wenige Dinge in Betracht gezogen werden, wenn dies zu tun.

  1. Wenn Sie nicht-modal winform in VBA fordern mit Withevents / Raise. Es sollte normalerweise funktionieren wie erwartet. keine größeren Abhilfe ist erforderlich
  2. Wenn Sie modal winform in VBA anrufen. Withevents / raiseevents kann nicht funktioniert je nach Anforderung. Eine schnelle Abhilfe ist, die Übertragung von Daten unter Verwendung von öffentlichen Variablen in der Modul-Datei deklariert.

Sie müssen die Abhilfe verwenden, und ich glaube, es wird absolut gut funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top