如何在模块中使用表单控件
How to use Form Controls in Modules
在我的模块中,我想使用我的表单中的控件。例如:我想将焦点设置在某个 Sub 之后的文本框上。
我目前的解决方案是制作一个子例程,将所有控件设置在一个 public 变量中(见下文)。
我的问题:
- 最佳做法是什么?人们通常是怎么做的?
- 我应该什么时候调用我的子例程? (这是
FORM_LOAD
子中的第一个调用吗?)
Public TBnr As TextBox
Public Sub controlsInitieren()
Set TBnr = Forms("frm_TreeView_Example").pstNr
End Sub
- 最佳做法是仅在表单代码中使用过程。在这种情况下,您以这种方式引用文本框控件:
Me.Textbox1.SetFocus
。如果你想在表单加载期间设置一些控件属性,你可以在 frm_TreeView_Example_Initialize
事件中进行;
- 他们通常按照我在第 1 项中描述的方式进行操作;
- 如果你想使用这样的strange/unusual方式,你可以随时调用子程序。但是,为了设置表单
frm_TreeView_Example
控件的特定 属性 值,您可以简单地使用 frm_TreeView_Example.TextBox1.SetFocus
。您可以在模块过程中使用这种设置方式,甚至在显示表单之前。您可以在最后使用的程序代码中简单地显示它:frm_TreeView_Example.Show
;
嗯,作为一般规则,虽然许多平台将 UI 部分和代码部分分开?好吧,Access 是一种非常不同的方法 - 将所需代码放在表单 "class" 中是标准公平的(Access 中的所有表单都是 "class",您甚至可以有多个实例同一表格打开不止一次)。
所以,一般来说,您的代码应该在表单代码 (class) 模块中。
但是,您可以调用外部例程。
因此在表单中,您可以像这样调用上面的例程:
Call MySetFocus(me, "NameOfControlToSetFocusTo")
你的潜艇看起来像这样:
Sub MySetFocus(f as form, sCtrl as string)
f(sCtrl).SetFocus
End Sub
但是,如前所述,上面的代码量比表单代码模块中的代码要多:
me.ControlName.SetFocus
然而,虽然上面是一个不太理想的示例,但将形式 "instance" (me) 传递给外部子程序或函数允许您引用任何存在的 属性 或方法或功能在外部例程中的形式。
所以代替说
me("LastName") = "Zoo"
在上面的示例例程中,您可以并且可以去;
f("LastName") = "Zoo"
因此,您可以在表单中的任何地方使用 "me",您可以使用从表单传递的表单实例。如前所述,使用 "me" 是个好主意,因为正如我所指出的,Access 确实允许同时打开多个表单副本 - 因此您的代码无法区分您使用的表单实例正在使用,除非您通过当前 "in context" 表格。所以就像在 JavaScript 中一样,使用 "this" ?
在访问中,class 对象的当前实例是 "me",您可以按照上述方式将该实例自由传递给您想要的任何子函数或函数。
在我的模块中,我想使用我的表单中的控件。例如:我想将焦点设置在某个 Sub 之后的文本框上。
我目前的解决方案是制作一个子例程,将所有控件设置在一个 public 变量中(见下文)。
我的问题:
- 最佳做法是什么?人们通常是怎么做的?
- 我应该什么时候调用我的子例程? (这是
FORM_LOAD
子中的第一个调用吗?)
Public TBnr As TextBox
Public Sub controlsInitieren()
Set TBnr = Forms("frm_TreeView_Example").pstNr
End Sub
- 最佳做法是仅在表单代码中使用过程。在这种情况下,您以这种方式引用文本框控件:
Me.Textbox1.SetFocus
。如果你想在表单加载期间设置一些控件属性,你可以在frm_TreeView_Example_Initialize
事件中进行; - 他们通常按照我在第 1 项中描述的方式进行操作;
- 如果你想使用这样的strange/unusual方式,你可以随时调用子程序。但是,为了设置表单
frm_TreeView_Example
控件的特定 属性 值,您可以简单地使用frm_TreeView_Example.TextBox1.SetFocus
。您可以在模块过程中使用这种设置方式,甚至在显示表单之前。您可以在最后使用的程序代码中简单地显示它:frm_TreeView_Example.Show
;
嗯,作为一般规则,虽然许多平台将 UI 部分和代码部分分开?好吧,Access 是一种非常不同的方法 - 将所需代码放在表单 "class" 中是标准公平的(Access 中的所有表单都是 "class",您甚至可以有多个实例同一表格打开不止一次)。
所以,一般来说,您的代码应该在表单代码 (class) 模块中。
但是,您可以调用外部例程。
因此在表单中,您可以像这样调用上面的例程:
Call MySetFocus(me, "NameOfControlToSetFocusTo")
你的潜艇看起来像这样:
Sub MySetFocus(f as form, sCtrl as string)
f(sCtrl).SetFocus
End Sub
但是,如前所述,上面的代码量比表单代码模块中的代码要多:
me.ControlName.SetFocus
然而,虽然上面是一个不太理想的示例,但将形式 "instance" (me) 传递给外部子程序或函数允许您引用任何存在的 属性 或方法或功能在外部例程中的形式。
所以代替说
me("LastName") = "Zoo"
在上面的示例例程中,您可以并且可以去;
f("LastName") = "Zoo"
因此,您可以在表单中的任何地方使用 "me",您可以使用从表单传递的表单实例。如前所述,使用 "me" 是个好主意,因为正如我所指出的,Access 确实允许同时打开多个表单副本 - 因此您的代码无法区分您使用的表单实例正在使用,除非您通过当前 "in context" 表格。所以就像在 JavaScript 中一样,使用 "this" ?
在访问中,class 对象的当前实例是 "me",您可以按照上述方式将该实例自由传递给您想要的任何子函数或函数。