Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 窗体  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1702240
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何在窗体间传递(包括发送、接收、回传)参数

作者:cg1  摘自:access911.net  :cg1  更新日期:2004-7-6  浏览人次:

 

如何在窗体间传递(包括发送、接收、回传)参数。
这是一个 ACCESS 开发者经常碰到的问题。多数 ACCESS 开发者应掌握以下几种参数传递的方式。
由于我们需要讲述的是参数的来回传递,所以在讲述各种方式的时候我们需要从两个方面来讲述,一方面是发送参数的窗体,一方面是接收参数的窗体。

1、直接对指定窗体进行操作,比如:
发送参数的窗体的代码如下:
'窗体 FormNameA 发送参数
'窗体 FormNameB 接收参数

Function ParameterSend1()
    DoCmd.OpenForm "FormNameB"
    If IsLoaded("FormNameB") = True Then
        Forms("FormNameB").Controls("ControlInTheForm").Value = "Value"
    End If
End Function

Function IsLoaded(ByVal strFormName As String) As Boolean
 ' 如果指定窗体在窗体视图或数据表视图中打开,返回 True。
    Dim oAccessObject As AccessObject
    
    Set oAccessObject = CurrentProject.AllForms(strFormName)
    If oAccessObject.IsLoaded Then
         If oAccessObject.CurrentView <> acCurViewDesign Then
            IsLoaded = True
        End If
    End If
End Function


接收参数的窗体无需任何代码。

如果接收参数的窗体在将数据处理后需要回传该如何呢?
代码如下:
Function ParameterResponse1()
    If IsLoaded("FormNameA") = True Then
        Forms("FormNameA").Controls("ControlInTheForm").Value = "Value"
    End If
End Function

优点:代码直接;参数不易丢失;回传对象确定简单明了
缺点:没有主、从关系;回传对象确定简单不利于重用

2、可以使用全局变量来传递参数
在模块中用 PUBLIC 申明一个变量
Public strParameter2 As String

发送参数的窗体代码如下:
Function ParameterSend2()
    strParameter2 = "Value"
    DoCmd.OpenForm "FormNameB"
End Function

接收参数的窗体需要在“打开”事件中编程
Private Sub Form_Open(Cancel As Integer)
    'Function ParameterSend2()
    '接收方主动去全局变量中询问,然后赋值给窗体上的控件
    Me.ControlName.Value = strParameter2 = "Value"
End Sub

如果需要回传,则代码类似方法1
Function ParameterResponse2()
    If IsLoaded("FormNameA") = True Then
        Forms("FormNameA").Controls("ControlInTheForm").Value = "Value"
    End If
End Function


优点:代码直接;有主从关系;回传对象确定简单明了
缺点:参数容易丢失,特别是出现未处理错误时所有变量将被重置;回传对象确定简单不利于重用


3、使用Docmd.OpenForm 的一个参数 OpenArgs 来传递参数,并使其回传可以通用。
OpenArgs说明请参考帮助:

OpenArgs     可选 Variant 型。字符串表达式,用于设置窗体的 OpenArgs 属性。而后该设置可用于窗体模块中的代码,例如 Open 事件过程。OpenArgs 属性也可以在宏和表达式中引用。

例如,假定打开的是一个客户列表的连续窗体。如果希望当窗体打开时焦点移到特定的客户记录上,则可以使用 openargs    参数指定客户名称,然后使用 FindRecord 方法,将焦点移到指定的客户名称的记录上。

该参数仅在 Visual Basic 中才可用。


但是为了满足可重用的条件,在生成参数时需要特殊处理一下:
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"


以 "参数值;窗体名;控件名;" 这样的字符串格式发送 OpenArgs 参数,这里取的是当前窗体的当前控件,实际操作中也可以更改。
发送参数的窗体代码如下:
Dim strParameter as String
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"
DoCmd.OpenForm "FormNameB", , , , , , strParameter

接收参数的窗体则需要对窗体的OpenArgs属性进行处理
sub command1_click()
    If IsNull(Me.OpenArgs) = False Then
        Dim strA() As String
        strA = Split(Me.OpenArgs, ";")
        If strA(0) = "Return" Then
            Forms(strA(1)).Controls(strA(2)).Value = Me.TypeName.Value
            DoCmd.Close acForm, Me.Name
        End If
    End If
end sub

这样,接收方窗体既可以接收参数,也可以处理参数,还能够按照发送方(主控方)窗体的要求回传数据到指定位置。

优点:有主从关系;回传对象可由主控方定义;利于窗体的重复调用
缺点:代码相对复杂;参数不能永久保存

4、使用AccessObjectProperty对象的自定义属性来传递、存储参数
在AccessObjectProperties 集合中就包含了某个ACCESS对象的自定义属性。读者可以使用AccessObjectProperties集合中AccessObjectProperty对象的Add方法来给特定对象(如:Form对象)来添加用户自定义属性。Add方法的语法如下:
expression.Add(PropertyName, Value)

发送参数的窗体的代码如下:
Dim strParameter as String
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"
CurrentProject.AllForms("FormNameB").Properties.Add "Parameter4", strParameter
DoCmd.OpenForm "FormNameB"

接收参数的窗体的代码如下:
sub command1_click()
    On Error Resume Next
    If IsNull(CurrentProject.AllForms(Me.Name).Properties("Parameter4")) = False Then
        Dim strA() As String
        strA = Split(CurrentProject.AllForms(Me.Name).Properties("Parameter4"), ";")
        If strA(0) = "Return" Then
            Forms(strA(1)).Controls(strA(2)).Value = Me.TypeName.Value
            DoCmd.Close acForm, Me.Name
        End If
    End If
end sub


有点:有明确的主从关系;回传对象可由主控方定义;利于窗体的重复调用;参数可以永久保存
缺点:代码更复杂,需掌握的对象较多;

5、还有其他方法,比如:使用窗体的既有属性:Caption、Tag 等属性传递参数关于其他方法;将参数存储在表中等等,基本优缺点类似上述方法这里就不再叙述了。


附注:其实大家已经注意到,窗体 FormNameB 其实是一个公用窗体,他可以被其他多个窗体调用,处理数据后返回数据给发送方窗体(比如窗体 FormNameA)


以下有一个做好的 MDB 数据库,用于演示上述1-4种参数传递的方法:
请依次打开 1_FormNameA 2_FormNameA 3_FormNameA 4_FormNameA 然后单击上面的按钮
http://access911.net/down/eg/FormSendAndReturn.rar

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     新手来看:如何将窗体得筛选条件应用在对应得报表中?如何打印当前记录?如何打印指定记录?
     T-SQL、VBA、JET SQL中参数的构建
     如何在连续窗体中反白显示获得焦点的记录
     如何将一个窗体重复打开2遍,并且每一遍打开的窗体显示不同的数据?
     如何构建参数查询?
     如何在主窗体中显示子窗体中相关数据的汇总值
     如何调用sql server后台的存储过程加快效率?
     如何隐藏或最小化access数据库窗口
     ado构建参数一例
     如何禁止Access主窗体右上角的退出按钮?(用代码使ACCESS主窗体上的"X"失效)
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利