分享

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs

 风韵犹存_度娘 2017-07-03
 

在Access中有一个“OpenForm”的操作,其功能是打开窗体,它到底可以使用几个参数?很多教材中讲是6个参数,可是在实际使用中却出现了第7个参数(如下图)。这究竟是怎么一回事?其实,这里有个使用环境问题。在Access系统中和它的帮助菜单里都可以得到解决。

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

“OpenForm”的操作在实际使用中出现第7个参数

在一般情况下,如果只是打开窗体,只使用属性设置来解决问题,不涉及在窗体之间传递数据,不使用VBA编程,那么“OpenForm”的操作使用的参数是6个。你可以在Access界面点击“宏”-“新建”的操作参数中得到答案。先如图-1所示:

 

 

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

 

图-1

再在宏的窗口,第一个操作就从下拉菜单中选取“OpenForm”,这时可以看到下方可以设置6个操作参数:“窗体名称”、“视图”、 “筛选名称”、“Where条件”、“数据模式”、 和“窗口模式”,如图-2所示:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-2

如果根据提示按F1键,就可获得此操作的帮助信息,其中详细列出这6个参数的使用方法,如图-3所示:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-3

上述说明中未涉及窗体间的参数传递,也就是说,如果不想编程,不利用Visual Basic,仅仅依靠属性设置是无法实现数据在窗体间的传递的。但是,如果在Access的VBA代码窗口键入并选中“OpenForm”后按动F1键,或者直接在代码窗口的帮助栏的搜索窗口键入“OpenForm”进行搜索,都可以得到“OpenForm”的方法的提示说明,其中就出现了第7个参数“OpenArgs”。在“OpenArgs”的说明中最后强调指出“该参数仅在Visual Basic中才可用”。重要的是“OpenArgs”在“OpenForm”使用的参数中排行第7位,如图-4所示:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-4

关于“OpenArgs”的说明也可在帮助菜单查到,如图-5所示:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-5

使用“OpenForm”中的“OpenArgs”的属性值来实现窗体间的数据的传递,这一功能可以通俗地用打电话的方式来比喻:可以把需要数据的一方窗体可以看成为主叫方,被要求产生数据的一方窗体可以叫作被叫方。首先第一步,主叫方要发出需求信息,即要拨通被叫方的电话号码,在这里就是要注明准备打开的窗体名称,同时要将索求的数据回传到的该窗体中的控件名称字符串用“OpenForm”中的第7个参数“OpenArgs”的属性值通知对方,相当于使对方可以看到来电显示,这是第一个程序,不妨叫索要程序。第二步,被叫方确定数据后,按照主叫方的窗体名称及其中索要数据的控件,将数据回传,这是第二个程序,不妨叫回传程序。这两个程序相辅相成,建立了一个准确的信息交互的通道,有了清晰的来龙去脉,信息的传递就不会迷路。

举一个实际例子加以说明。

用Access设计一个图书馆借阅业务数据库时,需要有日期输入,为了方便可以利用系统中的ActiveX控件中的“日历控件”完成日期的输入,如果一个窗体中有多个日期需要输入,或多个窗体都需要日期输入,可以在一个数据库中只建立一个日历窗体,根据不同的索要日期的索要程序的请求,在这个公用的日历窗体中获得的确定的日期,利用回传程序,将该日期赋值置入到发出索取请求的窗体中的相应控件所代表的字符串中去。

先解决被叫方,也就是建立一个公共的日历窗体Calendar,只有这个被叫方先搭起架子了,才能被人家呼叫,至于不完善处可以事后完善,关键是先要有这个窗体。在设计视图中创建一个窗体,单击“插入”,在下拉菜单中选择“ActiveX控件”,在弹出的“插入 ActiveX控件”对话框中选择“日历控件11.0”(最后的序号视版本不同而异)。按确定后日历控件即插入窗体的主体之中,为了参数传递的便利,设此窗体的主体为“Cal”,此时可调整日历的位置、边框颜色、粗细等属性。增加“关闭”与“确定”两个按钮,“关闭”按钮按照按钮向导指示进行,“确定”按钮可以先建立,它的名称是Command2,点击它应执行一个程序Command2_Click(),这个程序作为一个悬念,留待一会儿再详细完成编制。将该窗体以“Calendar”为名保存。如图-6所示:

 

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

 

图-6

在模拟图书馆借阅业务数据库中有一个“输入借阅新记录”的窗体,窗体名为“J2Form-InputNew”,其中准备输入借阅日期的控件名为“StartDate”,在它边上设置了一个按钮,这个命令按钮名为“Command20”,点击这个按钮,就将执行一段程序Command20_Click(),为了一会儿的参数传递不至于“迷路”,它不仅是要打开日历窗体“Calendar”,而且要“告诉”日历窗体“Calendar”:这次操作指令是将要向哪个控件返回数据,记住以后,等一会儿,待日期确定时,可以将选择的日期准确回传到指定的窗体、指定的控件中去。这段代码主要内容是:

Private Sub Command20_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'StartDate'

End Sub

上述代码中使用了 “OpenForm”的操作,其功能是打开窗体,由于是在VBA中,于是就使用了第7个参数。其中,因为只用了7个参数中的第一个“窗体名称”和最后一个“OpenArgs”,中间省略的参数之间均以英文半角的逗号分开,这些逗号一个都不能少。从上述代码中可以看到:要打开的窗体名称为'Calendar'即日历窗口,而“OpenArgs”的属性值为'StartDate',即表示在日历中选择的日期将要回传到“J2Form-InputNew”窗体的'StartDate'中去。可参阅图-7与图-8所示。

在日历窗口选择日期后,这个日期就在当前日历窗体的主体(Me![Cal])——Cal是刚才建立日历窗体时对日历窗体的主体的命名。按动“确定”按钮Command2,应该执行一段将日期返回传递到刚才发出需求指令的窗体的控件中去的回传程序,刚才建立这个按钮时,并未编制,留下一个悬念,现在就要解决它。由于日历窗体中的“确定”按钮是Command2,这个点击“确定”触发回传的程序为Command2_Click(),主要代码如下:

Private Sub Command2_Click()

If Me.OpenArgs = 'StartDate' Then

    Forms('J2Form-InputNew')![StartDate] = Me![Cal]

End If

DoCmd.Close

End Sub

它首先判定当前窗体对象的OpenArgs 所获得的参数值是不是预先关照了的发出日期需求的控件名称'StartDate',然后根据判断结果,将日历窗体的主体的值即日期赋值给需要回传的发出指令的窗体的控件,Forms('J2Form-InputNew ')表示将回传到该窗体,惊叹号后面表示将回传到上述窗体的控件名[StartDate]。当然,最后加了一句传递完以后关闭窗体的语句DoCmd.Close。两个程序的传递过程直观示意,可见图-7:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-7

示意性的框图还可以参阅图-8所示:

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

  

图-8

以上是一个窗体的一个控件的例子。其实多个窗口的多个控件需要日期赋值,基本思路也是一样的。假如在模拟数据库中连同刚才的控件一起,总共有4 个窗体6个控件准备启动日历窗体索要日期赋值,主叫方索要程序的代码分别列出如下:

J2Form-InputNew窗体中的:

Private Sub Command20_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'StartDate'

End Sub

 

J4Form-InputEnd窗体中的:

Private Sub Command26_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'EndDate'

End Sub

 

J3Form-Edit窗体中的

Private Sub Command22_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'StartDate-Edit'

End Sub

 

J3Form-Edit窗体中的

Private Sub Command23_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'EndDate-Edit'

End Sub

 

J3Form-Edit窗体中的

Private Sub Command15_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'StartDate-Edit-2'

End Sub

 

J3Form-Edit窗体中的

Private Sub Command16_Click()

    DoCmd.OpenForm 'Calendar', , , , , , 'EndDate-Edit-2'

End Sub

日历窗口被主叫方指令打开并获得OpenArgs属性值之后,可以选择日期,然后,按动“确定”按钮,可以分别将日期返回传递到刚才发出需求指令的窗体的控件中去,可以将上面那段点击“确定”触发回传的程序Command2_Click()加以扩充,以适应多窗体多控件的需要。它由6组判断语句组成,每组都首先判定OpenArgs 所获得的参数值,就是判读是上述6个按钮中的哪一个传递过来的,是哪一个控件名称发出日期需求的,然后根据判断结果,将日历窗体的主体的值Me![Cal](即选定之日期)赋值给需要回传的发出指令的窗体的控件,Forms('窗体名')表示将回传到该窗体,惊叹号后面表示将回传到的控件名。当然,最后加了一句传递完以后关闭窗体。回传程序的简略的代码如下:

Private Sub Command2_Click()

If Me.OpenArgs = 'StartDate' Then

    Forms('J2Form-InputNew')![StartDate] = Me![Cal]

ElseIf Me.OpenArgs = 'EndDate' Then

    Forms('J4Form-InputEnd')![EndDate] = Me![Cal]

ElseIf Me.OpenArgs = 'StartDate-Edit' Then

    Forms('J3Form-Edit')![StartDate-Edit] = Me![Cal]

ElseIf Me.OpenArgs = 'EndDate-Edit' Then

    Forms('J3Form-Edit')![EndDate-Edit] = Me![Cal]

ElseIf Me.OpenArgs = 'StartDate-Edit-2' Then

    Forms('J16Form-Edit-InputID')![StartDate-Edit-2] = Me![Cal]

ElseIf Me.OpenArgs = 'EndDate-Edit-2' Then

    Forms('J16Form-Edit-InputID')![EndDate-Edit-2] = Me![Cal]

 

End If

DoCmd.Close

 

End Sub

代码示意图见图-9 。

窗体间数据传递的方式甚多,代码设计的思路和形式各异,上面只是众多方法之一。长久不用,日益淡漠,被友问及,借此作答,摘以笔录,以备后忘。

 

Access:在窗体间传递数据的OpenForm的第7参数OpenArgs - OldShu - OldShu的博客

 

图-9


如欲了解在Access中插入日历窗体的基本方法,请见《关于Access中使用ActiveX日历控件输入日期》,地址是:
http://shuchonghui.blog.163.com/blog/static/151156320111029111755644/
http://blog./oldshu/Efp_Bl_1005521777.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多