2017-02-07 7 views
0

私は非常に迷惑な問題に巻き込まれました。MSAccess(2007) - ポップアップとモーダルフォーム - VBA経由のインスタンス化

クラスモジュール内でフォームを開き、そのフォーム自体をフォームに渡して、フォームがすべてのクラスプロパティとメソッドを使用できるようにする必要があります。 私はフォームについて話していますが、ユーザーに関するものではありません。 (問題はこの2番目のケースでは存在しないだろう)。 フォームはポップアップとモーダルの両方でなければなりません。

それでは、フォームを開き、呼び出し元クラスのメソッドで、このコードを仮定してみましょう:

sub OpenFormMethodOfTheCallingClass 
    set MyForm = new [Form_FormToBeOpened] 
    with MyForm 
     set .MyFatherClass = Me 
     .SetFocus ' ... this opens the form 
     MsgBox "Ok, user has closed the form ..." 
    end with 
end sub 

この方法では、コードの流れは、フォーム内「STOP」しません。 開いたフォームの「手前」に、「OK、ユーザーがフォームを閉じました...」というメッセージがすぐに表示されることを意味します。 そして、明らかに、このメソッドは終了し、フォームは閉じるメソッドのインスタンスであるため、(やはり明らかに)消えます。

デザインビューでは、ポップアップとモーダルの両方のフォームがTRUEに設定されています。 「POPUPことができます - MODALは、コード流動挙動 には影響しません - :

with MyForm 
    .Modal = True 
    .PopUp = True 
    (...) 

...のように、全く役に立ちません:

呼び出し元の手順で、このように2つのプロパティを設定します設定する(!):実行時エラーを返します。

私は私の目標は、このよう開いている達成するために見つけた唯一の方法:

DoCmd.OpenForm "FormToBeOpened", WindowMode:=acDialog 

この方法で、フォームにコードフロー「stucks」を、そしてユーザーがフォーム自体の流れを閉じたときにのみ呼び出し元のプロシージャとその次の命令に戻ります。 しかし、問題は、フォームに呼び出し側のクラスを渡すことができないことです。 OK、誰かが私のフォームがMODALであるため、フォームの複数の同時インスタンスをユーザーが開くことができないため、呼び出しクラスのプロパティをフォームにいくつかの方法で渡すことができます( " public-variables "、またはOpenArgsのJSONなど)。しかし、それは...本当に恐ろしいです。

私は恐怖です、なぜか、これは非常にばかげた質問であり、簡単な答えで分かりません。 :)

見てみましょう。

Thks、設計によってだ

FL

答えて

1

。アクセスは単一のスレッドを実行するので、ダイアログはダイアログを意味します。

OpenArgsを使用して静的な値をダイアログフォームに渡すことはできますが、開いたときに呼び出しフォームからデータとプロパティをプルすることもできます。

そのコードは醜い必要はありません。

.NETおよびVisual StudioのWinFormsがニーズに合っている可能性があります。

+0

申し訳ありません、はい、私はダイアログを意味しました。修正されました。 – Gustav

+0

ありがとうございましたGustav:私はあなたに「哲学的」な発言(私は構造化されたコーディングのための正しい環境ではないAccessについて言います)について完全に同意します。 しかし、私の問題は、呼び出し側のフォームからデータとプロパティを引き出す必要はなく、呼び出し側のクラスからでした。 もう一度私の質問を読んでください(それはしないでください:D:哲学的な提案が勝ちます)、コールされたフォームを呼び出しクラスを正しい "クリーン"私はDoCmdで開くことしかできません。それは、呼び出し側のクラスからの私とのやり取りを妨げてしまいます。 – Fil

+0

それでは、残っている唯一のオプションは、ModalとPopUpがTrueに設定されているフォームを保存することです。 – Gustav

0

.Modalと.Popup = TrueのフォームクラスForm_Popupを作成します。

Form_Popupのモジュールで

  • プロパティ変数を追加し、タイプのpropFils_Class Fils_Class(またはバリアント、許可されていない場合)
  • propFils_Class
    • 私は」を設定し、取得するためPublic Sub Let Fils_Class (inputFils_Class as Variant)Public Sub Get Fils_Class (inputFils_Class as Variant)手順を追加します。あなたが入力変数をバリアントにする必要があると仮定して、Fils_Class型として渡すことができるかもしれません。 Form_Popupを必要とするコードで
  • Dim frm as Form, varFils_Class as Fils_Class 
    
    '<set up varFils_Class here> 
    
    Set frm = New Form_Popup 
    'or Docmd.OpenForm "Popup" hidden etc., then you need to directly reference the form, e.g. Set frm = Forms("Popup") 
    
    frm.Fils_Class = varFils_Class 
    
    frm.Visible = True 
    
    Do While frm.Visible 
        Sleep 1 
        DoEvents 
        '<at some point actions on Form_Popup set .Visible to False> 
    Loop 
    
    varFilsClass = frm.FilsClass 
    
    '<do other actions with frm as needed> 
    set frm = Nothing 
    
+0

あなたは正しいusncahillです。私の質問では、私は実際にこの問題を解決するために "do-loop approach"を実際に使うことを忘れていましたが、実際にはリソースが浪費されているので本当に好きではありません。 – Fil

関連する問題