了解是否在MS Access中打开了几种表单之一

问题描述

我需要遍历表单列表以查看它们是否打开,然后对它们进行一些处理。以下作品:

Public Sub isloadedtester()
    Dim iForm As Variant
    
    For Each iForm In CurrentProject.AllForms
        Debug.Print iForm.name & ": " & CurrentProject.AllForms(iForm.name).IsLoaded
    Next
    
End Sub 

,但它循环遍历所有形式。因此,我认为以下内容应该只能遍历我关心的表单:

Public Sub isloadedtester2()
    Dim iForm As Variant
    Dim list
    
    list = Array(Form_some,Form_another)
    
    For Each iForm In list
        Debug.Print iForm.name
        Debug.Print ".isloaded: " & CurrentProject.AllForms(iForm.name).IsLoaded
        Debug.Print "direct: " & SysCmd(acSysCmdGetObjectState,acForm,iForm.name)
        Debug.Print "by fn: " & IsLoaded(iForm.name)
    Next
    
End Sub
Public Function IsLoaded(FormName As String,Optional aType As AcObjectType = acForm)

    IsLoaded = (SysCmd(acSysCmdGetObjectState,aType,FormName) <> 0)

End Function

但是,无论使用哪种方式读取加载状态,第二个版本始终将表单视为已加载:

.isloaded: True
direct: 1
by fn: True

几乎就像为数组分配表单使VBA加载表单一样。

我应该为此使用数组以外的东西吗?我意识到我可以将其作为一系列的名称来完成,我也可以循环查看这些名称是否合适,但这似乎很尴尬,所以我首先想看看我是否正在做的事情与实际需要的略有不同。

解决方法

如果只需要打开表单,请使用Forms集合。它仅包含打开的表单

Dim intFrm As Integer
  If Forms.Count > 0 Then
  For intFrm = 0 To Forms.Count - 1
     'Debug.Print Forms(intFrm).NAME
      If Forms(intFrm).Name IsInYourList Then
        DoSomething
      End IF
  Next intFrm
End If
,

如果您有表单名称列表,则可以使用SysCmd

以“老式”的方式进行操作
Public Function IsLoaded(FName As String,Optional aType As AcObjectType = acForm)

    IsLoaded = (SysCmd(acSysCmdGetObjectState,aType,FName) <> 0)

End Function

For Each iForm In list
    Debug.Print iForm.Name & ": " & IsLoaded(iForm.Name)
Next

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...