Как мне ссылаться на форму с глобальной переменной внутри Subforms и делать вещи с ней? - PullRequest
0 голосов
/ 17 января 2019

Я никогда не использовал версию на английском языке, поэтому прости меня, если я плохо объясню вопрос. Я работаю над старым приложением доступа VBA. Он имеет основную форму с именем Form_GUI. Form_GUI имеет несколько вкладок, каждая из которых имеет свою собственную «главную форму» и несколько разных подформ. Они создают FrontEnd. Все они связаны с различными таблицами BackEnd из другой базы данных.

Как я могу объявить переменную p_FrmZuordnung глобально и так, чтобы я мог ссылаться на нее, когда я хочу внести некоторые изменения в Form1 или Form2 в другой форме, такой как Form3?

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

Ниже приведены примеры того, что я хочу сделать с p_FrmZuordnung.

То, что я пытался:

Я попытался объявить его как String и просто добавить его в код.

Public p_FrmZuordnung As String 

Я попытался отделить его от формы следующим образом:

Public p_FrmZuordnung As Form

А затем настройте его так:

Set p_FrmZuordnung = Forms!Form1 

И использовать его в другой форме, например Form3:

p_FrmZuordnung!somecontrolelement.requery 

Код, который я написал для идентификации страницы в основной форме, работает. Код, который я написал для ссылки на переменную в форме, не.

Option Compare Database
Option Explicit

Public p_FrmZuordnung As Form
Public Sub p_ErmittleFrmZuordnung()

p_FrmZuordnung = "keine Zuordnung"

Select Case Form_Form_GUI.RegisterStr1.Pages(Form_Form_GUI.RegisterStr1.Value).Name

Case "pgeVerbMassnahmen"

Set p_FrmZuordnung = Forms("Form1")

Case "pgeKVPMassnahmen"

Set p_FrmZuordnung = Forms("Form2")

End Select
End Sub

Моя цель - использовать p_frmZuordnung в других субформах, подобных этому, в Form3:

Private Sub btnCancel_Click()

Me.Undo
DoCmd.Close acForm, "Form3", acSaveYes
p_FrmZuordung.somecontrolelement.Requery

Exit Sub
End Sub

Private Sub btnSaveAndClose_Click()

Me.txt_Kontrolle.Value = 1

If Me.Form.Dirty And Me.txt_Text.Locked = False Then
p_FrmZuordnung.txtHilfstextFokus.SetFocus
p_FrmZuordnung.Form.Dirty = True

Debug.Print p_FrmZuordnung.Form.Dirty
Me.Form.Dirty = False
End If

Me.txt_Kontrolle.Value = 0
DoCmd.Close acForm, "Form3", acSaveNo

Exit Sub
End Sub

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Как вы сказали нам сейчас, формы Form1 и Form2 находятся в подчиненных элементах управления страницами управления регистрами.

Таким образом, вы не можете ссылаться на них по Forms("Form2"), потому что они не являются самостоятельными формами.

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

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

Так, например, элемент управления подчиненной формы, который находится на странице pgeVerbMassnahmen, должен называться pgeVerbMassnahmenSubFormControl.

Затем вы можете ссылаться на элементы управления подчиненной формы по имени страницы и статическому суффиксу.

Так что я думаю, что это то, что вам нужно:

Объявите переменную формы в Form_GUI (если вы просто ссылаетесь на переменную из кода внутри Form_GUI, она может быть закрытой):

Private p_FrmZuordnung As Form

Я ожидаю, что p_ErmittleFrmZuordnung также находится в форме Form_GUI, поэтому вы можете использовать Me для ссылки Form_GUI:

Private Sub p_ErmittleFrmZuordnung()
    Const SUFFIX As String = "SubFormControl"

    Dim currentPagename As String
    currentPagename = Me("RegisterStr1").Pages(Me("RegisterStr1").Value).Name

    Select Case currentPagename
        Case "pgeVerbMassnahmen"
            Set p_FrmZuordnung = Me(currentPagename & SUFFIX).Form
        Case "pgeKVPMassnahmen"
            Set p_FrmZuordnung = Me(currentPagename & SUFFIX).Form
        Case Else
            p_FrmZuordnung = Nothing
    End Select
End Sub

Edit:

Если все страницы содержат элемент управления подчиненной формы, вы можете сократить его:

Private Sub p_ErmittleFrmZuordnung()
    Const SUFFIX As String = "SubFormControl"

    Set p_FrmZuordnung = Me(Me("RegisterStr1").Pages(Me("RegisterStr1").Value).Name & SUFFIX).Form
End Sub
0 голосов
/ 17 января 2019

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

Причина, по которой у вас возникают проблемы с использованием элементов управления в форме, мы, потому что z_FrmZuordnung - это просто общая форма, и компилятор не может разрешить элементы управления по имени. Вам необходимо получить элементы управления из коллекции Controls.

Set z_FrmZuordnung = Forms!Form1
MsgBox z_FrmZuordnung.Name
'MsgBox z_FrmZuordnung.txtHilfstextFocus.Name '<--gives an error
MsgBox z_FrmZuordnung.Controls("txtHilfstextFokus").Name '<--This works
z_FrmZuordnung.Controls("txtHilfstextFokus").SetFocus
...