Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 在MS Access中在窗体之间传递参数_Forms_Ms Access_Vba_Parameters - Fatal编程技术网

Forms 在MS Access中在窗体之间传递参数

Forms 在MS Access中在窗体之间传递参数,forms,ms-access,vba,parameters,Forms,Ms Access,Vba,Parameters,我已经创建了一个名为login的登录表单,其中用户名被输入到txtEmployee文本框中,我需要在MS Access的第二页中以另一个表单显示相同的用户名。允许您传递任意值作为最后一个参数。此值可以通过以下新形式访问: (代码示例未经测试。)在打开表单时,我个人会通过打开参数传递它们。例如,从表格A中,您可以编写 DoCmd.OpenForm "frmB", , , , , acDialog,”Badger” 然后在表单B的OnOpen事件中,您可以像这样捕获您发送的内容 Me.txtSom

我已经创建了一个名为login的登录表单,其中用户名被输入到txtEmployee文本框中,我需要在MS Access的第二页中以另一个表单显示相同的用户名。

允许您传递任意值作为最后一个参数。此值可以通过以下新形式访问:


(代码示例未经测试。)

在打开表单时,我个人会通过打开参数传递它们。例如,从表格A中,您可以编写

DoCmd.OpenForm "frmB", , , , , acDialog,”Badger”
然后在表单B的OnOpen事件中,您可以像这样捕获您发送的内容

Me.txtSomething=Me.OpenArgs
您只能传递一件事,但我经常做的是在开放参数中传递管道分隔字符串,然后将其拆分。

一些想法

使用登录用户名字段上的AfterUpdate事件将名称写入全局变量,然后使用OnLoad事件填充第二页上的字段


或者,如果您计划让登录表单始终处于打开状态,则可以将字段的默认值直接设置为=[Forms]![登录信息]![用户名]

为什么不创建一个公共函数来存储和/或检索执行第一个表单后存储的全局变量?这将允许您不仅在一个或多个表单上使用它,还可以作为查询中的条件(例如,返回与存储的用户名匹配的记录)

我同意这是“假”安全,但有时它也足以满足您的需要。我以前实现过这个,我将环境字符串用户名与用户表中的一个条目相匹配

顺便说一句,我将此功能称为个性化,而不是安全性


只是想一想。

您可以传递一个带分隔符的字符串作为OpenArgs参数:

DoCmd.OpenForm FormName:="miscForm", OpenArgs:=paramstring
下面是一个例程,用于处理作为参数传递给DoCmd.OpenForm的管道分隔字符串:

Dim Pstring As Variant

If Len(Me.OpenArgs) > 0 Then
   Pstring = Split(Me.OpenArgs, "|")
   var1 = Pstring(0)
   <etc..>
End If
Dim Pstring作为变型
如果Len(Me.OpenArgs)>0,那么
Pstring=Split(Me.OpenArgs,“|”)
var1=Pstring(0)
如果结束

用户名是否与windows登录用户名相同?如果是这样,您可以从以下位置获取名称:另外,为什么需要显示用户名,用户肯定知道他们是谁?如果你出于其他原因需要这个名字,你应该这样说,因为传递信息的方式不止一种。例如,如果名称用于过滤记录,OpenForm方法的Where参数可能是最好的。这听起来像是您构建了一个具有假安全性的系统。为什么要这样做,而不是使用Jet ULS或Windows NTFS安全或Active Directory?为什么要用acDialog打开?这个例子是从弹出式表单中选取的,所以我希望它是模态的,如果OP只是想要一个普通的formI,当然可以删除它。我永远不会为此使用全局。相反,我会在返回值的函数中使用一个静态变量,如果没有设置,它会打开表单来收集信息。这意味着它既能自我修复,又不会在代码的其他地方被修改。我通常认为这样做的必要性表明了设计问题。也就是说,如果你必须向表单传递那么多信息,你基本上应该使用某种结构化的方式来传递。@David,你指的是
struct
类型变量吗?在我当前的Access应用程序中,我只对一个表单使用此选项,这样我就不必在打开表单之前,以及在表单中时,将内容放入数据库中。我愿意接受一个更好的想法,我不是表格专家。有很多方法可以做到这一点。一种是从调用上下文将数据插入被调用的表单中。这可以通过同时使用acHidden和acDialog打开表单来实现,当您将数据获取到被调用的表单中后,您可以使其可见,从而使其成为模态,并停止调用上下文中的代码执行。我一般不这么做。我更倾向于使用类模块,但只有当您需要传递多个属性时(例如在多个条件上进行过滤时),这才是有利可图的。
Dim Pstring As Variant

If Len(Me.OpenArgs) > 0 Then
   Pstring = Split(Me.OpenArgs, "|")
   var1 = Pstring(0)
   <etc..>
End If