MS Access 如何将焦点集中在特定的多个报表实例上
Posted
技术标签:
【中文标题】MS Access 如何将焦点集中在特定的多个报表实例上【英文标题】:MS Access how set focus on a particular multiple report instance 【发布时间】:2016-06-03 11:35:16 【问题描述】:我的问题是将焦点设置在打开的特定 Report 实例上。我复制了一个非常适用于表单对象但不适用于报表对象的函数。我的功能:
Function mInstanceReportCA(varYear As Variant)
Dim oReport As Access.Report
Dim obj As Object
' Création du nouveau formulaire
For Each obj In clsReport
If obj.txtYear = varYear Then
obj.Visible 'Error 438
obj.SetFocus 'Error 2465
Exit Function
End If
Next obj
Set oReport = New Report_rptCaMois
' Activation du nouveau formulaire
With oReport
If varYear = "1999" Then
.txtYear = "1999"
.Caption = "Rapport toutes années confondues"
.Filter = "Year(dateFacture) > 1999 "
Else
.txtYear = CStr(varYear)
.Caption = "Rapport pour l'année " & CStr(varYear)
.Filter = "Year(dateFacture) = " & varYear
End If
.FilterOn = True
.Visible = True
End With
' Ajout du formulaire à la collection globale
clsReport.Add Item:=oReport, Key:=CStr(oReport.Hwnd)
Set oReport = Nothing
end function
在 For Each obj In clsReport 例程中,以下命令会生成错误消息
-
obj.Visible:错误 438
obj.SetFocus:错误 2465
感谢您的帮助
【问题讨论】:
什么是 clsReport?似乎不是 report.objects 数组 clsReport 是一个集合对象 检查debug.print TypeName(obj)
是否是报告对象。
报表无法获得焦点,只有它的控件。如果你想把它放在前面,你可以使用DoCmd.SelectObject acReport, obj.name
【参考方案1】:
解决办法
一般部分模块:
Public Declare Function BringWindowToTop Lib "user32" (ByVal hWnd As Long) As Long
在代码块中:
BringWindowToTop obj.hwnd
感谢Dirk Goldgar
【讨论】:
【参考方案2】:我不确定为什么这适用于表单,但我看到了 2 个可能的原因导致这不起作用。
您将 obj 声明为 Object。这是一种在实例化之前没有任何属性的通用数据类型(Set obj = New Report)。如果您通过后期绑定使用 bang (!) obj.txtdate / obj!visible / obj!Setfocus 引用它可能会起作用。
还需要为 object.visible 分配一个值(真/假)。除非您要处理多种类型的对象,否则我会将 obj 调暗为 Access.Report。
【讨论】:
你是对的 object.visible,它需要分配真/假值。我更正了我的代码,现在没有更多错误消息了。但是对于obj.setFocus,还是报错“Run-time error 2465 - Application-defined or Object-defined error”【参考方案3】:我想我明白了,clsReport 不是一个集合,它是一个 Dictionary 对象。当您设置 oReport = Nothing 时,您将其超出范围,因为字典不保留对象的副本,仅保留对它的引用。
集合存储了一个完整的副本,这就是为什么字典在存储复杂对象时速度更快且不那么臃肿的原因。
同样,我不知道为什么它适用于表单,您可能没有像制作报告那样复制表单。
如果您不确定将这一行放在 ' Création du nouveau formulaire 之前
Msgbox Typename(clsReport)
如果它说字典有你的答案,当你销毁对象(oReport)时,字典中的引用指向任何东西。它不会删除 Dictionary 项目,这就是为什么当您在 For Each 循环中引用 collection(dictionary) 项目时不会出现错误的原因,只有当您尝试访问不再存在的对象属性时。
把同样的 Msgbox 行放在 obj.Visible 上面
Msgbox TypeName(obj)
它应该返回“空”。
【讨论】:
在 VBA 编辑器间谍窗口中,我检查了 obj 是否已很好地实例化。没问题。另一个证明,测试 'If obj.txtYear = varYear Then' 完美运行 我认为我们需要查看更多代码。你能发布实际的表单代码和集合声明吗?以上是关于MS Access 如何将焦点集中在特定的多个报表实例上的主要内容,如果未能解决你的问题,请参考以下文章