New Page 1
本 书 经
典 内 容 赏 析 |
|
如何实现左右移动项目的列表框 |
如何实现通用的Office Xp按钮界面效果 |
|
如何编写传递多个参数给窗体和报表的函数 |
如何设计可定定义流程图的程序 |
|
如何读取使用插入对象插入的OLE字段的内容 |
通用的窗体页眉与页脚 |
书中其它经典内容 |
|
|
|
|
|
125
|
如何编写传递多个参数给窗体和报表的函数 |
适用版本:97、2000、2002、2003 |
| 人气 95% |
难度系数 ***** |
|
|
问题详述 |
| 在Access中,打开窗体和报表时可以传递一个参数给窗体和报表,然后在窗体和报表的代码中通过Me.OpenArgs就可以获取这个参数进行相应的处理,但如果需要传递多个参数给窗体和报表,直接使用上述的方法就实现不了,只能使用间隔符将多个参数合并成一个参数再传递过去,然后在窗体和报表中再拆分这些参数。能否编写一个通用的模块来实现上述的功能呢? |
|
专家解答(详细代码请参见本书内容) |
| Access提供了instr函数用于字符串搜索,可以使用它以及Mid()、Left()等字符串函数来共同实现这个功能,代码如下。
|
'===============================================================================
'-函数名称: gt_TmUpdateParaItem
'-功能描述: 更新参数中指定参数项的值
'-输入参数说明: 参数1:rstrParaItemKey String 参数项的名称
' 参数2:rvarValue Variant 指定参数项的值
' 参数3:rstrPara String 参数
'-返回参数说明: String 更新后的参数值
'-使用语法示例: gt_TmUpdateParaItem "Para1",25,"Para1:=22;Para2:=55"
'- 返回 Para1:=25;Para2:=55
'-参考: 微软帮助
'-使用注意: rvarValue是变量类型,但处理时会按字符串处理,如果你指定的值无法转换
' 成字符串类型的话,则会出错
'-兼容性: 97,2000,XP compatible
'-作者: 王宇虹,改进:王宇虹
'-更新日期: 2003-08-26
'===============================================================================
|
Public Function gt_TmUpdateParaItem(rstrParaItemKey As String, rvarValue As Variant, rstrPara As String) As String
'定义变量
Dim lngCnt As Long '长度
lngCnt = Len(rstrPara) '取参数的字符串长度
Dim lngKeyStart As Long '存储参数项名称的开始位置
Dim lngKeyEnd As Long '存储参数项名称的结束位置
Dim lngValueStart As Long '存储参数项值的开始位置
Dim lngValueEnd As Long '存储参数项值的结束位置
Dim strPara As String '存储参数字串
strPara = ";" & rstrPara '在参数前面加上;号便于后面搜寻处理
lngKeyStart = InStr(1, strPara, ";" & rstrParaItemKey & ":") '找到参数项名称的开始位置
If lngKeyStart > 0 Then '如果有此参数项
lngValueStart = InStr(lngKeyStart + 1, strPara,
"=") + 1 '获取参数项值的开始位置
lngValueEnd = InStr(lngKeyStart + 1, strPara,
";") - 1 '获取参数项值的结束位置
If lngValueEnd < 1 Then
lngValueEnd = lngCnt + 1
End If
'如果有此参数项,则更新参数项的值
gt_TmUpdateParaItem = Left(strPara, lngValueStart - 1) & rvarValue & Mid(strPara, lngValueEnd + 1)
Else
'如果没有此参数项,则添加此参数项及它的值
gt_TmUpdateParaItem = strPara & ";" & rstrParaItemKey & ":=" & rvarValue
End If
'如果参数长度大于0,则删除前面为了方便处理而添加的;号
If Len(gt_TmUpdateParaItem) > 1 Then
gt_TmUpdateParaItem = Mid(gt_TmUpdateParaItem, 2)
End If
End Function
|
'===============================================================================
'-函数名称: gt_TmGetParaItem
'-功能描述: 更新参数中指定参数项的值
'-输入参数说明: 参数1:rstrParaItemKey String 参数项的名称
' 参数2:rstrPara String 参数
'-返回参数说明: String 返回指定的参数项的值
'-使用语法示例: gt_TmGetParaItem "Para1","Para1:=22;Para2:=55" 将返回22
'-参考: 微软帮助
'-使用注意: 如果没有此参数项的话,会返回空字符,需要对返回值进行判断
'-兼容性: 97,2000,XP compatible
'-作者: 王宇虹,改进:王宇虹
'-更新日期: 2003-08-26
'===============================================================================
|
Public Function gt_TmGetParaItem(rstrParaItemKey As String, rstrPara As String) As String
'定义变量
Dim lngCnt As Long '长度
lngCnt = Len(rstrPara) '取参数的字符串长度
Dim lngKeyStart As Long '存储参数项名称的开始位置
Dim lngKeyEnd As Long '存储参数项名称的结束位置
Dim lngValueStart As Long '存储参数项值的开始位置
Dim lngValueEnd As Long '存储参数项值的结束位置
Dim strPara As String '存储参数字串
strPara = ";" & rstrPara '在参数前面加上;号便于后面搜寻处理
lngKeyStart = InStr(1, strPara, ";" & rstrParaItemKey & ":") '找到参数项名称的开始位置
If lngKeyStart > 0 Then '如果有此参数项
lngValueStart = InStr(lngKeyStart + 1, strPara, "=") + 1 '获取参数项值的开始位置
lngValueEnd = InStr(lngKeyStart + 1, strPara, ";") - 1 '获取参数项值的结束位置
If lngValueEnd < 1 Then
lngValueEnd = lngCnt + 1
End If
'如果有此参数项,则返回参数项的值
gt_TmGetParaItem = Mid(strPara, lngValueStart, lngValueEnd - lngValueStart + 1)
Else
'如果没有此参数项,则返回空
gt_TmGetParaItem = ""
End If
End Function
|
'===============================================================================
'-函数名称: gt_TmRemoveParaItem
'-功能描述: 删除参数中指定参数项及它的值
'-输入参数说明: 参数1:rstrParaItemKey String 参数项的名称
' 参数2:rstrPara String 参数
'-返回参数说明: String 返回删除后的参数的值
'-使用语法示例: gt_TmRemoveParaItem "Para1","Para1:=22;Para2:=55" 将返回"Para2:=55"
'-参考: 微软帮助
'-使用注意: 如果没有此参数项的话,会返回原来的参数
'-兼容性: 97,2000,XP compatible
'-作者: 王宇虹,改进:王宇虹
'-更新日期: 2003-08-26
'===============================================================================
|
Public Function gt_TmRemoveParaItem(rstrParaItemKey As String, rstrPara As String) As String
'定义变量
Dim lngCnt As Long '长度
lngCnt = Len(rstrPara) '取参数的字符串长度
Dim lngKeyStart As Long '存储参数项名称的开始位置
Dim lngKeyEnd As Long '存储参数项名称的结束位置
Dim lngValueStart As Long '存储参数项值的开始位置
Dim lngValueEnd As Long '存储参数项值的结束位置
Dim strPara As String '存储参数字串
strPara = ";" & rstrPara '在参数前面加上;号便于后面搜寻处理
lngKeyStart = InStr(1, strPara, ";" & rstrParaItemKey & ":") '找到参数项名称的开始位置
If lngKeyStart > 0 Then '如果有此参数项
lngValueStart = InStr(lngKeyStart + 1, strPara, "=") + 1 '获取参数项值的开始位置
lngValueEnd = InStr(lngKeyStart + 1, strPara, ";") - 1 '获取参数项值的结束位置
If lngValueEnd < 1 Then
lngValueEnd = lngCnt + 1
End If
'如果有此参数项,则删除此参数项及它的值
gt_TmRemoveParaItem = Left(strPara, lngKeyStart - 1) & Mid(strPara, lngValueEnd + 1)
Else
'如果没有此参数项,则返回原来的参数
gt_TmRemoveParaItem = strPara
End If
'如果参数长度大于0,则删除前面为了方便处理而添加的;号
If Len(gt_TmRemoveParaItem) > 1 Then
gt_TmRemoveParaItem = Mid(gt_TmRemoveParaItem, 2)
End If
End Function
|
'===============================================================================
'-函数名称: gt_TmCheckParaItem
'-功能描述: 检查参数中指定参数项是否存在
'-输入参数说明: 参数1:rstrParaItemKey String 参数项的名称
' 参数2:rstrPara String 参数
'-返回参数说明: String 如果存在则返回True,否则返回False
'-使用语法示例: gt_TmRemoveParaItem "Para1","Para1:=22;Para2:=55" 将返回True
'-参考: 微软帮助
'-使用注意:
'-兼容性: 97,2000,XP compatible
'-作者: 王宇虹,改进:王宇虹
'-更新日期: 2003-08-26
'===============================================================================
|
Public Function gt_TmCheckParaItem(rstrParaItemKey As String, rstrPara As String) As Boolean
'定义变量
Dim lngCnt As Long '长度
lngCnt = Len(rstrPara) '取参数的字符串长度
Dim lngKeyStart As Long '存储参数项名称的开始位置
Dim lngKeyEnd As Long '存储参数项名称的结束位置
Dim lngValueStart As Long '存储参数项值的开始位置
Dim lngValueEnd As Long '存储参数项值的结束位置
Dim strPara As String '存储参数字串
strPara = ";" & rstrPara '在参数前面加上;号便于后面搜寻处理
lngKeyStart = InStr(1, strPara, ";" & rstrParaItemKey & ":") '找到参数项名称的开始位置
If lngKeyStart > 0 Then '如果有此参数项
'如果有此参数项,则返回真
gt_TmCheckParaItem = True
Else
'如果没有此参数项,则返回假
gt_TmCheckParaItem = False
End If
End Function
|
|
|
|
专家点评
|
| 上述代码考虑到了参数项名称的各种可能性,所以可以处理各种字符包含的情况,例如gt_TmCheckParaItem("d","dd:=;yy:=99")返回的结果为False,而不是True,虽然“dd”包含了字符“d”,但参数项“d”并不等同参数项“dd”。 |
|
|
|