Событие не запускается в MS Access VBA - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть форма в MS Access, которая имеет изображение.У изображения есть событие Click, которое открывает модальную форму.Модальная форма имеет кнопки ОК и Отмена.Когда вы нажимаете кнопку OK, должно возникать событие, которое сообщает главной форме, какая кнопка была нажата.(Это для имитации функциональности DialogResult в C #).Однако код в обработчике событий никогда не запускается.

Модальная форма имеет следующие общие декларации:

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

и следующий код, где нажимается кнопка OK:

RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)

Основная форма имеет следующие общие объявления:

Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate

и следующий обработчик события:

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

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

End Sub

Может кто-нибудь объяснить, почему обработчик событияникогда не звонил?Спасибо!

Фон:

Цель всего этого - позволить модальному диалоговому окну добавить запись, а затем вернуть идентификатор записи обратно в основную форму, чтобы установить значениеуправления.Например, представьте, что вы заполняете форму страховки, и вам нужно выбрать марку автомобиля, которого там нет.Вы нажимаете на значок, который появляется в модальном диалоговом окне, чтобы вы могли добавить марку автомобиля.Затем, когда вы нажимаете OK, он возвращает вас к форме страхования и выбирает марку автомобиля, который вы только что создали.

Ниже приведен пример, который я нашел здесь: http://database.itags.org/ms-access-database/80292/

Ответы [ 2 ]

3 голосов
/ 17 сентября 2010

Вы делаете свою жизнь слишком сложной, применяя концепции из другой среды разработки к Access VBA.Хотя VBA поддерживает WithEvents / RaiseEvent, здесь нет причин усложнять.

Обычный способ работы с диалогами в Access состоит в том, что вместо их закрытия вы их скрываете.Это позволяет запускать код после открытия формы, оставляя значения в форме доступными для использования в этом коде.

Пример кода в событии OnOpen отчета, который открывает форму для сбора значений для фильтрацииreport:

  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

Диалоговая форма имеет две командные кнопки, CONTINUE >> и CANCEL.Кнопка ОТМЕНА устанавливает для тега формы значение «Отмена», а для свойства формы .Visible устанавливается значение «Ложь».Кнопка ПРОДОЛЖИТЬ >> ничего не делает, кроме как устанавливает свойство формы .Visible в False.Нажатие любой из этих кнопок позволяет продолжить выполнение кода после того, как форма открыта с помощью переключателя acDialog.

Моя философия - сделать диалоги настолько глупыми, насколько это возможно.Вызывающий код должен знать, что он ищет в формах (т. Е. Вам нужно знать имена элементов управления, из которых вы читаете данные), но это можно обойти, добавив в форму свойства клиента.Но тогда вы должны знать имена свойств, поэтому вы просто переместили шар.

Я также реализовал этот тип, обернув форму dailog в модуле класса, и затем вызывающий контекст просто инициализируетэкземпляр класса, а затем извлекает значения из него в соответствующее время.Но это на самом деле сложнее, чем подход выше.

0 голосов
/ 09 ноября 2016

ну, я не согласен с

"Хотя VBA поддерживает WithEvents / RaiseEvent, здесь нет причин усложнять."

Я работална различных проектах VB6 и VBA.Недавно я написал VBA в Excel, где создал событие из winform.Несколько вещей, которые следует учитывать при этом.

  1. Если вы вызываете немодальную winform в VBA с withevents / Повышение событий.Это должно работать нормально, как и ожидалось.Никакого серьезного обходного пути не требуется
  2. Если вы вызываете модальную winform в VBA.Withevents / повышение ответственности могут не функционировать в соответствии с требованием.Быстрый обходной путь - передача данных с использованием открытых переменных, объявленных в файле модуля.

Вам нужно будет использовать обходной путь, и я считаю, что он будет работать абсолютно нормально.

...