Вопрос

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

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

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

и следующий код, где нажата кнопка ОК:

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/

Это было полезно?

Решение

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

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

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

  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

Диалоговое окно имеет две командные кнопки, продолжайте >> и отменить. Кнопка «Отмена» устанавливает тег формы для «Отмена» и устанавливает форму. Невидимое свойство false. Кнопка «Продолжить» >> ничего не делает, кроме как установить форму. Недвижимое свойство false. Нажав на любую из этих кнопок позволяет коду продолжаться в строке после того, как форма открыта с помощью переключателя ACDialog.

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

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

Другие советы

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

«В то время как VBA поддерживает прививку / Raiseevent, нет никаких причин, чтобы получить этот сложный здесь».

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

  1. Если вы вызываете немодальную WinForm в VBA с приступителями / Raiseevent. Он должен работать нормально, как ожидалось. Ни один важный обходной путь не требуется
  2. Если вы вызываете модальную WinForm в VBA. Приспособлены / Raiseevents могут не функционировать согласно требованию. Быстрый обходной путь - передавать данные с использованием общественных переменных, объявленных в файле модуля.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top