MS-Access: заполнить модальную форму из пользовательского типа - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь отобразить форму ошибки, заполненную текстом из объекта нестандартного типа, в виде версии MS-Access для фантастического ответа на этот вопрос Excel .

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

Я попытался найти способ сделать в Access то, что было сделано в Excel;загрузить форму, заполнить форму, а затем отобразить форму, но это не представляется возможным, поскольку порядок событий Access - Open-> Load -> ...

Я также пытался найти способ открытькак обычная форма, заполните и затем «модализируйте» форму, но не смогли найти способ сделать это.

Кто-нибудь знает способ достижения этой функции?Или есть альтернатива модальным формам для приостановки выполнения в ожидании ввода пользователя?

1 Ответ

0 голосов
/ 01 декабря 2018

Модальная форма ОЧЕНЬ отличается от диалоговой формы.

Модальные формы НЕ приводят к остановке вызывающего кода, а диалоговая форма делает.(не путайте два типа форм).

Чтобы «вернуть» ответ пользователя из диалоговой формы, просто установите форму visible = false вместо команды закрытия формы.Это выведет диалоговую форму из диалогового режима, и ваш код вызова теперь продолжится, и код вызова «свободен», чтобы проверить любые значения, введенные пользователем или скажем, из выпадающих списков, или флажков, или чего-либо еще.

Таким образом, ваш блок кода будет выглядеть следующим образом:

Private Sub Command0_Click()

   Dim f       As String
   Dim strT    As String

   f = "formB"
   DoCmd.OpenForm f, , , , , acDialog

   If CurrentProject.AllForms(f).IsLoaded Then
      ' grab any values entered by user, or whatever buttons hit
      strT = Forms(f).Text1
      ' etc. etc. etc. - grab values from that form
      ' don't forget to close the form
      DoCmd.Close acForm, f
   Else
      ' user canceled the form
      ' code goes here for user hitting your cancel button or "x"
   End If

End Sub

И в вашей диалоговой форме кнопка «ОК» или «Закрыть» просто переходит:

Me.visible= False

Если пользователь нажмет вашу кнопку отмены, этот код будет:

Docmd.Close acForm

Так что, если пользователь нажимает «отмена» или даже «X»В верхнем правом углу вы считаете, что пользователь «выручил».Когда они это сделают, форма будет закрыта.

Таким образом, код после диалоговой части просто проверяет, является ли форма ОЧЕНЬ открытой (потому что ваша кнопка «ОК» делает видимым = false).

И поскольку форма ОСТАЕТСЯ открытой, товы можете получить значения ЛЮБОГО элемента управления - скажем, пользовательский текст, введенный в текстовое поле, значения из поля со списком, флажок или что-то еще.

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

Редактировать - 2-е решение, позволяющее "установку" значений.

Этот код будет работать:

Private Sub Command0_Click()

   Dim f       As String
   Dim strT    As String

   f = "formB"

   DoCmd.OpenForm f
   Forms(f).Text1 = "Hello"    ' set values on form

   ' now WAIT for user   
   Do While CurrentProject.AllForms(f).IsLoaded
      If Forms(f).ok = True Then Exit Do
      DoEvents
   Loop

   If CurrentProject.AllForms(f).IsLoaded Then
       If Forms(f).ok = True Then
          MsgBox "value return = " & Forms(f).Text1
       Else
          MsgBox "user cancel"
       End If
       DoCmd.Close acForm, f
   Else
      ' cancel code goes here
      MsgBox "user cancel"
   End If

End Sub

Код для кнопки «ОК» в форме B теперь:

Me.Visible = False
Me.ok = True

И вам нужен общедоступный var «ok» в форме B. Например:

Option Compare Database
Option Explicit

Public ok      As Boolean

Таким образом, кнопка отмены в форме B может просто закрыть форму.(вы можете закрыть форму - но не устанавливайте ok = True)

...