フォームクラスの新しいインスタンスを作成してから、AcDialogボックスとして開くにはどうすればよいですか(他のコードを一時停止)しますか?
-
26-10-2019 - |
質問
問題
複雑な検索フォームがあり、ユーザーが複数の検索を同時に実行できるようにするために(同時に)数回開く必要があります。 (クラスのように)フォームのインスタンスを使用して開く機能を見つけました。
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
これは、フォームの複数のインスタンスを開く例であり、クリックごとに1つのインスタントを開く必要があるため、最終コードに使用するものではありませんが、おそらく他のインスタントを開いている可能性があります。
しかし、私はそれらの1つをAcdialogとして複製する方法を解決することはできません(したがって、新しいダイアログフォームを非表示または閉じるまで、関数は一時停止します)。通常、通常のフォームを開く方法(コピーではありません)は次のとおりです。
Call DoCmd.OpenForm("SomeForm", acNormal, , , , acDialog)
質問
ダイアログボックスとしてフォームの新しいインスタンスを開くにはどうすればよいですか(新しいフォームが閉じたり非表示になるまで関数が一時停止します)。
ありがとう
解決
このコードを使用して、フォームが表示されているかどうかを確認できます。
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
==================
OK、別のアイデア:ダイアログモーダルを開き、呼び出し関数のコードを停止するか、より多くのダイアログでライブして呼び出し関数を実行するかのどちらかがあります。
これを解決する唯一の方法は、カウントがまだ> 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