2017-10-07 18 views
1

他のものと同じ大きさではないユーザーにはポップアップフォームをサイズ変更可能にする必要があります - ポップアップとモーダルとBorderStyle Resizableにフォームを設定することには大きな制限があります。ポップアップを起動するフォームは、フォームが戻るのを待つことはありません。ポップアップ、モーダル、サイズ変更可能なフォームを扱う方法

フォームを非表示にするにはどうしたらいいですか?私は睡眠とdoeventsとループを試みたが、それは非常に反応しないポップアップフォームを作成し、CPUサイクルを噛む。私は起動フォームのform.gotfocusイベントを設定しようとしましたが、それは起動しません。つまり、ポップアップフォームが閉じられた後に実行されるコードからポップアップフォームを開いたコードを分割する必要があります。

最適なソリューションは何ですか?

おかげ

答えて

0

あなたはacDialogオプションを指定してフォームを開くことができます。

DoCmd.OpenForm "MyFormName", WindowMode:=acDialog 

フォームが閉じたり隠しするまでは待機します。

+0

しかし、これはフォーム以外のサイズを変更できるようになります。 – Andre

0

ここでの問題はポップアップであり、モーダルフォームは呼び出しコードを停止しません。

しかし、コードを停止する必要があります。それにはダイアログフォームが必要です。

さらに悪いことに、ダイアログ・フォームはリサイズを許可していません。

ここでは3種類のフォームを混同したくありません。

モーダルフォーム - ポップアップフォームとは異なり、ダイアログフォームとは非常に異なります。

ポップアップフォームでも同様です。ダイアログフォームではなく、実際にはモデルでもありません。

アクセスアプリケーションがタブ付きドキュメントを使用するように設定されている場合や、ウィンドウが重なっている場合も考慮する必要があります。 (これにより、あなたの選択肢が再び制限されます)。

タブ付きインターフェイスを使用している場合は、サイズ変更可能な機能が必要な場合はポップアップフォームを使用する必要がありますが、このタイプのフォームは呼び出しコードを停止しません。

ウィンドウが重なっている場合は、モーダルフォームをお勧めします。 (しかし、やはり呼び出しコードは停止しませんが、サイズ変更は可能です)。

2番目のフォームが却下されるのを待っている呼び出しフォームにループコードを採用することができましたが、そのようなループはプロセッサーの塊であり、マウスと入力の点で「不良」な応答を引き起こすことがよくあります。

だから私はあなたのコードのアプローチを変更することをお勧めします。呼び出しフォームがポップアップ(またはタブ付きインターフェースを使用しない場合はモーダル)としてフォームを起動するようにします。

フォームを閉じると、呼び出し元のフォームで実行したいコードがいくつか呼び出されます。つまり、2番目のフォームを閉じた後に実行したいコードを分割し、そのコードを終了フォームのcall +で実行する必要があります。

"一般的な"アプローチでは、フォーム名をハードコーディングしないようにする必要があります。 "多くの"ルーチンとフォームは、2番目のフォームを呼び出すことができ、そのようなフォームを再利用します。

だから、このてみてください:呼び出しの形式は次のようにrefeanceつかむ、上開き、このフォームのイベントをフォームに

Option Compare Database 
Option Explicit 

Dim frmPrevious  As Form 

:このようなモジュールレベルのフォーム変数を作成し、2番目の形式で を

Set frmPrevious = screen.ActiveForm 

今の形に近いイベントは、次の操作を行います。

をfrmPrevious.AfterClose

そして、呼び出し元の形で、だから、最初の形式でパブリック関数では、あなたは、あなたが2番目のフォームを閉じるときに実行したいコードを配置

AfterClose

と呼ばれるパブリック関数を作成します。これは第2のフォームを呼び出し、待っている、そして続行する、「より少なく」理想的な手続き型コードです - しかし、私はまだ最良の選択について考えています。

そして、あなたが閉じる前に、あなたが渡すことができますなどの呼び出しフォームに戻り値を「設定」:あなたがしたい場合は、最初の行の上(呼び出し元の形式でパブリック変数を設定して

frmPreviuos.SomePubicVar = me!LastNameSelected 
frmPrevious!Company = me!CompanySelected 
frmPrevious.AfterClose 

これを行い、最初の形式でモジュールレベルの変数に値を戻します)。そして、次の行は、呼び出し元フォームのコントロールの値を設定します(呼び出し元フォームのいくつかのコントロールに値を戻したい場合)。

3行目は、呼び出し元のフォームでMyCloseコードを実行します。フォームにキャンセルボタンがある場合は、そのようなコードを実行したくないかもしれないので、上記のコードをそのボタンの後ろに移動してください(キャンセルボタンは単純にフォームを閉じます - しかし、最初のフォームで上記のコードを呼び出し+実行しないでください)。また、Xを打つと、キャンセルまたは終了と見なされます。つまり、あなたの「保存」ボタン、「OK」ボタン、または「選択」ボタンには上記のコードがあります。

+0

徹底的な説明をお寄せいただきありがとうございます - 実行可能なソリューションとより良いコーディングでのヒントを提供してくれてありがとうございます。私は、手続き的アプローチがより洗練されたコードに役立つので、睡眠時間を短縮し、応答時間またはCPUサイクリングが高すぎる場合、私はあなたのソリューションを実装します - ありがとう – Charlie

0

DoEvents/Sleep 50ループでこれまでに問題が発生したことはありません。 CPUの負荷は最小限に抑えられ、フォームは応答します。

非常に古いコンピュータでは、おそらくSleep 100を使用します。

サンプルコード:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Sub TestOpenForm() 

    If FormOpenWait("frmPopup") Then 
     MsgBox "Form was hidden.", vbInformation 
    Else 
     MsgBox "Form was closed.", vbInformation 
    End If 

End Sub 

' Open fName, wait until it is 
' - closed : return False 
' - hidden : return True 
Public Function FormOpenWait(fName As String, Optional sOpenArgs As String = "") As Boolean 

    If IsFormLoaded(fName) Then DoCmd.Close acForm, fName, acSaveNo 

    DoCmd.OpenForm FormName:=fName, OpenArgs:=sOpenArgs 

    ' default: signal "closed" 
    FormOpenWait = False 

    ' Wait until form is closed or made invisible 
    Do While IsFormLoaded(fName) 
     If Not Forms(fName).Visible Then 
      ' Signal "hidden" 
      FormOpenWait = True 
      Exit Do 
     End If 

     ' Wait 50ms without hogging the CPU 
     DoEvents 
     Sleep 50 
    Loop 

End Function 

Public Function IsFormLoaded(fName As String) As Boolean 
    IsFormLoaded = (SysCmd(acSysCmdGetObjectState, acForm, fName) And acObjStateOpen) > 0 
End Function 
+0

私は同意しません。それは完璧に正常に動作します。コードを分割するのは方法が面倒です。たとえば、クエリ(データシートビュー)が閉じられるまで待つことを望むなら、それは唯一のオプションです。 @Enigmativity – Andre

+0

私はあなたにこれらの定型文があるのを見ます。 :)しかし、あなたはこの質問がMS-AccessとVBAに関することを知っていますか? C#ではありません。 https://stackoverflow.com/questions/5721564/multi-threading-in-vba – Andre

+0

ああ、良い点はありません。私はそれを逃した。私は誤解を招くようにこれらのコメントを削除するかもしれません。 – Enigmativity

関連する問題