2

特定の状況で、別のフォームを開いてそのフォームをフォーカスしたままにしておく必要がある状況があります (モーダル = true)。それらがドントで閉じられると、親フォームのコントロールが変更された可能性のあるデータで更新されます。 .

もともと私はDoEvents、子フォームが開いている間にメソッドを持っていましたが、データ入力/編集のためにいくつかの子フォームが使用できなくなりました (フォームレベルでデータバインドされていませんでした)。

ShowForm メソッド - 元々

Public Sub ShowForm(par As Form, nm As String, _
                    Optional whr As String = "", _
                    Optional args As String = "", _
                    Optional mode As AcFormOpenDataMode = acFormPropertySettings)
    DoCmd.OpenForm nm, acNormal, , whr, mode, , args
    
    While IsOpen(nm)
        DoEvents
    Wend
End Sub

While...Wend子フォームを一貫して使用できるようにするために、ループをコメントアウトする必要がありました。

このメソッド内または呼び出し元のコントロールの OnClick 内で使用できる別のロジック パターンはありますか?

4

4 に答える 4

0

自体をロックするのではなくFORM、 の一部であるコントロールをロックする必要がありFORMます。以下に、コントロールのロックダウンを行うための私の推奨方法を説明します。目標は、すべてのユーザー編集可能なコントロールを読み取り専用にすることです

親の VBA コードで、FORMこのサブを作成します。

public sub LockControls_[Enter Form Name Here]()

  ME.txt1.Locked = True
  ME.txt2.Locked = True
  ME.txt3.Locked = True
...

end sub

テキスト ボックス、コンボ ボックス、ボタンなどをロックできます。

コントロールが上で概説したような命名構造に従っている場合、次のようにして実際にこれをループできます。

public sub LockControls_[Enter Form Name Here]()

  Dim s_ctrl As String
  Dim s_obj As String
  Dim i as Int

  i = 0
  s_ctrl = "txt"
  s_obj = s_ctrl & i

  do while me(s_obj).Name <> ""

      Me(s_obj).Locked = True
      i = i+1
      s_obj = s_ctrl & i

  loop
end sub

子フォームを起動するアクションからこのメソッドを呼び出します。ユーザーがフォームにアクセスできるようにしながら、フォーム上のすべてのコントロールをロックします (読み取り専用にします)。

FORMこれと同じメソッドを使用して、子フォームの終了イベントから呼び出されたときに親のロックを解除できます。使用しないでMe(s_obj).Locked = Falseください。代わりに、次の構文を使用してフォームを完全修飾します。

public sub UnLockControls_[Enter Parent Form Name Here]()

  Dim s_ctrl As String
  Dim s_obj As String
  Dim i as Int

  i = 0
  s_ctrl = "txt"
  s_obj = s_ctrl & i

  do while me(s_obj).Name <> ""

      FORMS![form_name](s_obj).Locked = False
      i = i+1
      s_obj = s_ctrl & i

  loop
end sub
于 2012-09-06T19:11:09.323 に答える
0

私は今あなたの問題を理解していると思います。残念ながら、あなたが望むことを行う簡単な方法はありません。次のアルゴリズムをお勧めします。

'Grandparent/parent form module
Dim ChildForm As String

Private Sub ShowFormBtn_Click()
    DoCmd.OpenForm "MyForm"
    ChildForm = "MyForm"
End Sub    

Private Sub ShowOtherFormBtn_Click()
    DoCmd.OpenForm "OtherForm"
    ChildForm = "OtherForm"
End Sub

Private Sub Form_Activate()
    On Error Resume Next
    Forms(ChildForm).SetFocus
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    Forms(ChildForm).SetFocus
    If Err.Number = 0 Then Cancel = True
End Sub

基本的に、親フォームに切り替えようとするたびに、ユーザーを子フォーム (存在する場合) に送信しようとします。子がない場合は、警告なしで無視されるエラーが生成されます。子が存在する場合は、そのフォームに切り替えます。

これにより、複数のレベルもサポートされます。たとえば、子フォームを生成する親フォームを生成する祖父母フォームがあるとします。3 つのフォームはすべて開いています。子フォームにフォーカスを送信する親フォームにフォーカスを送信する祖父母フォームをクリックします。

于 2012-09-06T18:53:23.270 に答える
0

元の質問のメソッドの最終的な形式は次のとおりです。 @Remou と @mwolfe02 に感謝します。

最終フォーム - もちろん暫定版

'@frm - String value, Name of the form to Open
Public Sub OpenForm(frm As String, _
                    Optional vw As AcFormView = acNormal, _
                    Optional whr As String = "", _
                    Optional mode As AcFormOpenDataMode = acFormPropertySettings, _
                    Optional args As String = "")
    If FormExists(frm) Then
        DoCmd.OpenForm frm, vw, , whr, mode, acDialog, args
    Else
        RaiseError "Form ( " & frm & " ) does not exist!" & vbCrLf & vbCrLf & _
                    "Alert your IT Support for further assistance."
    End If
End Sub
于 2012-09-06T19:28:10.387 に答える