MS Access Определенная форма Form_Load () вызывается только в первый раз, когда пользователь просматривает указанные формы, но не может быть вызвана в будущих просмотрах - PullRequest
0 голосов
/ 30 октября 2019

У меня очень элементарное понимание Microsoft Access и VBA Code. На рабочем столе у ​​меня есть Microsoft Office Professional Plus 2013 Access, мне было поручено создать приложение MS Access с Access DB.

В файлах Visual Basic у меня есть псевдокод для файлов дляразличные формы MS Access.

Большинство моих файлов форм MS Access имеют подпрограмму, подобную следующей:

 Private Sub Form_Load()

     Dim db As DAO.Database
     Dim qdfSelectQuery As DAO.queryDef
     Dim argumentsStringArray() As String

  If Len(Me.OpenArgs) > 0 Then

     argumentsStringArray = Split(Me.OpenArgs, "|")

    …...Blah blah initialize some variables using the argumentsStringArray Blah blah …..;
  End If

 End Sub

Теперь «Навигация» в приложении может перемещаться между различнымиформ, и он может вернуться к более ранней форме, которая уже была видна / использовалась пользователем приложения.

Подпрограмма Form_Load () конкретной формы запускается в самый первый раз, когда указанная форма запускается внутриконтекст конкретного выполнения указанного приложения MS Access. Однако, если приложение вернется к определенной форме, которую пользователь уже видел, оно будет Не выполнять указанную подпрограмму Form_Load ().

Может кто-нибудь сказать, какие модификации кода япридется сделать, чтобы подпрограмма Form_Load () конкретной формы выполнялась независимо от того, сколько раз ее видел пользователь?

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Обработчик Load запускается один раз за время существования объекта.

Если вам нужно запустить его несколько раз, не используйте один и тот же объект повторно. DoCmd.OpenForm работает с экземпляром формы по умолчанию , поэтому, если вы не выгружаете или иным образом не уничтожаете экземпляр, он остается загруженным, и в следующий раз, когда он отображается, он сохраняет то состояние, в котором он находился на момент последнего закрытия.

Если форма доступа поддерживает выгрузку (не знакома с Access и не может проверить ATM), то Unload MyForm должен ее выгрузить, что вызовет событие Load снова при следующей ссылке на форму.

Если вы можете New создать форму и Show, как вы могли бы с помощью UserForm, сделайте это - формы являются объектами со своими собственными правами, и этот глобальный экземпляр по умолчанию скрывает object его природа ... сбой основных предположений (например, ожидается, что обработчик Load будет запускаться каждый раз, когда отображается форма).

В качестве альтернативы, переместите код Load вновый обработчик для события Open, который будет вызываться всякий раз, когда форма открыта , а не просто загружена .

2 голосов
/ 30 октября 2019

Мое решение будет следующим:

Вместо:

Private Sub Form_Load()
     Dim db As DAO.Database
     Dim qdfSelectQuery As DAO.queryDef
     Dim argumentsStringArray() As String

  If Len(Me.OpenArgs) > 0 Then

     argumentsStringArray = Split(Me.OpenArgs, "|")

    …...Blah blah initialize some variables using the argumentsStringArray Blah blah …..;
  End If
 End Sub

Вы используете:

Public Sub InitializeForm(SomeArgs As String)
     Dim db As DAO.Database
     Dim qdfSelectQuery As DAO.queryDef
     Dim argumentsStringArray() As String
  If Len(SomeArgs) > 0 Then
     argumentsStringArray = Split(SomeArgs , "|")
    …...Blah blah initialize some variables using the argumentsStringArray Blah blah …..;
  End If
 End Sub

И вместо

DoCmd.OpenForm "MyForm", OpenArgs := "Something"

Вы делаете

DoCmd.OpenForm "MyForm"
Forms!MyForm.InitializeForm "Something"

Это обеспечивает большую гибкость, чем использование OpenArgs, например, вы можете передавать объекты и строго типизированные значения, возвращаемые значения и т. Д.

...