首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Subforms中引用具有全局变量的表单并对其执行操作?

如何在Subforms中引用具有全局变量的表单并对其执行操作?
EN

Stack Overflow用户
提问于 2019-01-17 18:01:47
回答 2查看 934关注 0票数 0

我从来没有使用过英语访问版本,所以如果我解释得很糟糕,请原谅我。我正在开发一个旧的access vba应用程序。它有一个名为Form_GUI的主表单。Form_GUI有多个选项卡,每个选项卡都有自己的“主表单”和几个不同的子表单。这些构建了FrontEnd。它们都与来自不同数据库的各种BackEnd表相连接。

当我想在另一个表单(如p_FrmZuordnung )中对Form1Form2做一些更改时,如何全局地声明变量Form3,并以一种可以引用它的方式来声明变量

根据这个变量的值,我希望子表单的反应是不同的。

下面是我想用p_FrmZuordnung做的事情的例子。

我试过的事情:

我尝试将其声明为字符串,并简单地将其添加到代码中。

代码语言:javascript
复制
Public p_FrmZuordnung As String 

我试着把它当成这样的形式:

代码语言:javascript
复制
Public p_FrmZuordnung As Form

然后像这样设置它:

代码语言:javascript
复制
Set p_FrmZuordnung = Forms!Form1 

在另一种形式(如Form3 )中像这样使用它

代码语言:javascript
复制
p_FrmZuordnung!somecontrolelement.requery 

我为标识主表单中的页面而编写的代码工作正常。我为将变量引用到表单而编写的代码没有。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
Private Sub btnCancel_Click()

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

Exit Sub
End Sub
代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-01-17 18:30:41

全局变量必须在模块中定义,而不是在表单中定义。您在哪个模块中定义它并不重要。声明全局变量后,它是静态的,可以从任何形式访问。

使用窗体上的控件时出现问题的原因是,我们是因为z_FrmZuordnung只是一个泛型表单,编译器不能按名称解析控件。您需要从Controls集合中获取控件。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-01-24 10:55:26

正如您现在告诉我们的,表单Form1Form2在寄存器控制页的子表单控件中。

所以您不能通过Forms("Form2")引用它们,因为它们不是“独立的”形式。

相反,您必须知道每个子窗体控件的名称,该控件包含这样一个子窗体。因此,存储在每个控件中的表单的名称并不重要。

因此,我的建议是,将这些子窗体控件命名为与包含页面的名称相同的子窗体控件,但添加一个静态后缀,如SubFormControl (或您喜欢的任何其他后缀)。

因此,例如,页面pgeVerbMassnahmen上的子窗体控件应该命名为pgeVerbMassnahmenSubFormControl

然后,可以通过页面名称和静态后缀引用子窗体控件。

所以我想这就是你需要的:

Form_GUI中声明一个表单变量(只要您只是从Form_GUI内部的代码中引用该变量,它就可以是私有的):

代码语言:javascript
复制
Private p_FrmZuordnung As Form

我希望p_ErmittleFrmZuordnung也位于表单Form_GUI中,所以您可以使用Me引用Form_GUI

代码语言:javascript
复制
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

编辑:

如果所有页都包含子窗体控件,则可以缩短它:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54241749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档