[英]How can I check if an instance of a Access 2010 form is still open?
我需要创建一个搜索表单的多个副本(在Access 2010中 ),该副本将向调用返回一个值(这也是创建表单实例的表单)。
如前所述,这些表单可以并且将同时运行多个副本,例如,用户可能想将公司添加到某项中,因此:
这一切都使用户能够在发现错误时更新和更正数据,从而减少了他们遗忘的可能性,并使速度更快!
现在,大多数操作都很好,但是我遇到了很多问题,例如表单实例无法以“ acDialog”形式打开,从而停止了调用代码的运行,直到完成搜索为止(有关更多信息,请参阅此问题 ),并且我采用的解决方案是通过使用无限循环并检查搜索屏幕瞬间是否仍然可见来模拟调用代码的暂停。 然后,当用户在搜索屏幕上即时选择某项内容时,它将值放在搜索屏幕的隐藏字段中,并隐藏其自身(未关闭)。 然后,调用函数会看到它是隐藏的,它会从隐藏字段中获取值并卸载即时信息。
我可以使用FormInstant.Visable检查表单是否隐藏, 但是如果用户关闭表单,则会导致错误,而我通常用来检查表单是否存在的代码需要表单名称,并且这是表单的瞬间。表格名称相同! 我确实有对表单的引用,因为它存储在本地“表单”对象中...我通常使用的代码是:
CurrentProject.AllForms("FormName").IsLoaded
那么,如何检查表单仍在加载的瞬间?
一个古老的问题,但是以下是什么经验教给我的:如果打开了FormDefn的一个,两个...实例,那么用户关闭了一个(Master(这是唯一可以设计的实例)),Forms(FormName)给出了一个错误,Forms(Form )提供了错误的对象,但Forms(NumberIndex)仍然存在。.Name = FormName!
OpenForm创建Forms(FormName)对象。 一旦关闭,Forms(FormName)将给出错误。 任何“ Set xForm = New Form_xxx”都将在表单集合中创建只能由集合编号索引访问且无法设计的表单。
因此,要稍后找到多实例表单,请使用以下内容:
Dim FormIdx As Integer
Dim lForm As Access.Form
For FormIdx = 0 To Application.Forms.Count - 1
Set lForm = AccessFunc.Appl.Forms(FormIdx)
If lForm.Name = pFormName Then
IsFormOpened = True
Set rForm = lForm
GoTo IsFormOpened_Exit
End If
Next
也尝试一下
Function IsLoaded(strFrmName As String) As Boolean
' Determines if a form is loaded.
Const conFormDesign = 0
Dim intX As Integer
IsLoaded = False
For intX = 0 To Forms.Count - 1
If Forms(intX).FormName = strFrmName Then
If Forms(intX).CurrentView <> conFormDesign Then
IsLoaded = True
Exit Function ' Quit function once form has been found.
End If
End If
Next
End Function
您可以像这样在项目中调用上面的函数
If Not isLoaded("MyForm") Then
MsgBox "MyForm is Not Loaded"
End If
大声笑,我只是在重新阅读我的味精时才意识到,无论表单是否打开,我都有可能捕获该错误以解决问题!
我很快就写了这个,看起来似乎很好:
Public Function IsFormLoaded(ByRef FormToTest As Form, _
Optional ByRef bIsVisable As Boolean = False) As Boolean
Dim lErrorNum As Long
bIsVisable = False
On Error Resume Next
bIsVisable = NewFormClone.Visible
lErrorNum = Err.Number
On Error GoTo 0
If (lErrorNum = 0) Then
IsFormLoaded = True
Else
IsFormLoaded = False
End If
End Function
猜猜只要回答了问题,下一个家伙/女孩就可以使用,回答这个问题的人并不重要。 :)
我将对此开放一段时间,如果没有人找到更好的答案,我将其标记为...
我喜欢你的回答。 至于循环/等待的想法? 更好的方法是始终在每种形式中都包含一个引用。 我通常声明一个名为frmPrevious的表单模块变量。
Create instance of form
Instance.frmPrevious = me
因此,现在关闭窗体时,我们可以使用窗体“调用”某些代码来代替某些“可见” +循环代码设置。
因此,在表单的关闭代码中,我们有:
frmPrevious.FunctionCodeToRun
上面的方法解决了很多问题,但是一个是您不需要对话框(如您所述,它不能使用),并且您还不需要从调用代码中编写“循环+等待”代码。
但是,这确实意味着您的代码将以调用形式在新函数中继续。 因此,我通常将该函数放在调用表单中的调用代码下方。 我也倾向于为该功能使用标准名称。 我发现这种权衡是值得的,而不是像循环/等待和在同一代码例程中继续执行(我确实同意在代码中使用这种“继续”通常是更好的选择,但是再次不得不编写循环并等待代码并不是那么干净) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.