MS Access如何将焦点设置在特定的多个报表实例上

时间:2016-06-03 11:35:16

标签: ms-access report multiple-instances setfocus

我的问题是将焦点设置在打开的特定报表实例上。我复制一个功能,它完美适用于表单对象,但不适用于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 例程中,以下命令会生成错误消息

  1. obj.Visible:错误438
  2. obj.SetFocus:错误2465
  3. 感谢您的帮助

3 个答案:

答案 0 :(得分:1)

解决方案

一般部分模块:

Public Declare Function BringWindowToTop Lib "user32" (ByVal hWnd As Long) As Long

在区块代码中:

BringWindowToTop obj.hwnd

感谢Dirk Goldgar

答案 1 :(得分:0)

我不确定为什么这适用于表格,但我看到了两个可能的原因,为什么这不起作用。

您将obj声明为Object。这是一种通用数据类型,在实例化之前没有任何属性(Set obj = New Report)。如果您使用bang(!)obj.txtdate / obj!visible / obj!Setfocus通过后期绑定引用它可能会有效。

还需要为object.visible分配一个值(True / False)。除非你正在处理多种类型的对象,否则我会将obj obj作为Access.Report。

答案 2 :(得分:0)

我想我想通了,clsReport不是一个集合,它是一个Dictionary对象。当你设置oReport = Nothing时,你将它从范围中取出,因为字典没有保留对象的副本,只是对它的引用。

集合存储一个完整的副本,这就是为什么在存储复杂对象时字典速度更快,更少膨胀。

同样,为什么它适用于我不知道的表格,你可能没有像报道一样复制表格。

如果你不确定在'Créationdunouveau formulaire

之前加上这一行
Msgbox Typename(clsReport)

如果它说Dictionary有你的答案,当你破坏对象(oReport)时,Dictionary中的引用指向什么。它不会删除Dictionary项,这就是为什么在For Each循环中引用集合(字典)项时没有出现错误的原因,只有当您尝试访问不再存在的对象属性时才会出现错误。

将相同的Msgbox行放在obj.Visible

之上
Msgbox TypeName(obj)

它应该回来“空”。