2011-12-01 29 views
3

问题

我有一个复杂的搜索表单,我需要多次打开(同时)以允许用户同时执行多个搜索。我发现用于打开窗体的实例(因为它是一类)的能力:如何创建表单类的新实例,然后将其作为acDialog框打开(暂停其他代码)?

Option Compare Database 
Option Explicit 

'Array to hold Form Instances 
Private MyFormCollection(1 To 4) As Form_frmTest 

Private Sub cmd_CloneMe_Click() 
    Dim intCounter As Integer 

    For intCounter = 1 To 4 
     Set MyFormCollection(intCounter) = New Form_frmTest 
     MyFormCollection(intCounter).Caption = "Form #" & intCounter 
     MyFormCollection(intCounter).Visible = True 
    Next intCounter 

    Forms!frmTest.SetFocus 
End Sub 

这是打开而不是形式的多个实例的例子我会使用的最终代码因为我只需要每点击一次就打开一次,但可能会有其他已经打开!

但我不能找出一种方法来重复其中一个acDialog(所以调用函数暂停,直到你隐藏或关闭新的对话框形式)。下面是我通常会打开一个正常形态的方式(不是副本):

Call DoCmd.OpenForm("SomeForm", acNormal, , , , acDialog) 

问题

我怎样才能打开窗体的一个新实例作为对话框(因此调用函数暂停,直到新窗体关闭或隐藏)?

感谢

+0

您是否尝试将窗体的模态属性设置为true? – Fionnuala

+0

但是,只是停止用户点击任何其他形式,它不会停止调用代码运行,直到新窗体关闭/隐藏像对话框一样。 :( – GazB

回答

1

您可以使用此代码来检查的形式是可见的:

Private Function IsVisible(intObjType As Integer, strObjName As String) As Boolean 
    Dim intObjState As Integer 
    intObjState = SysCmd(acSysCmdGetObjectState, intObjType, strObjName) 
    IsVisible = intObjState And acObjStateOpen 
End Function 

如果是的话,做什么,但等待:

Do While IsVisible(acForm, "frmInfo") 
    DoEvents 
Loop 

===== =============

好吧,另一个想法:你可以选择打开对话框模态a nd停止调用函数中的代码,或者使用更多的对话框并让调用函数运行。

我认为解决这个的唯一方法是对话框开放的柜台,并拒绝做在调用函数中的任何时候计数仍> 0

+0

Yer我已经有一个这个选项的工作,但真的不喜欢不断的外观运行。可能有4-5打开在同一时间。PC的将哭!) – GazB

+0

哦,只是意识到这一个需要的形式名称..对于有几个实例的表单来说这是行不通的。 :( – GazB

+0

这几乎是我最后做的,谢谢。您的版本的“IsVisible()”(如前所述)不起作用,但是这里有一个:http://stackoverflow.com/questions/8354927 /并使用它和你的想法的其余部分我得到了我想要的!:) – GazB

0

您可以在名为写一个公共职能形式,直到该函数返回(通过关闭表单)调用方法被阻止。在下面的示例中,单击“完成”按钮可能会设置返回值

Option Explicit 
Private m_dlgResult As VbMsgBoxResult 

Public Function ShowDialog() As VbMsgBoxResult 

    m_dlgResult = vbCancel 
    Me.Show vbModal 
    ShowDialog = m_dlgResult 

End Function 

Private Sub Done_Click() 

    m_dlgResult = vbOK 
    Unload Me 

End Sub 
+0

谢谢,但再次莫代尔是不一样的对话。模型在用户打开表单时阻止用户与其他表单交互。 Dialog暂停调用函数代码,直到关闭它。 – GazB

+0

@ Zasurus对不起,我误解了,仍然很容易 - 看到修订后的答案 – jac

+1

@Zasurus在VB6中'显示'与vbModal标志完全符合你所说的,它阻塞(暂停)调用Show的代码直到表单被解散。 – tcarvin

相关问题