愚者の経験

「また今度」はほとんどこない

日別アーカイブ: 6月 28, 2012

マルチインスタンス利用時のOpenArgs-プロローグ

「Accessクラスオブジェクト」をNewしてオブジェクト変数に格納することで
同じフォームやレポートを複数開く「マルチインスタンス」という小技があります。

Private frm As Form
Public Function Test() As Long
    Set frm = New Form_フォーム1
    frm.Visible = True
End Function

フォーム1の「コード保持」プロパティを「はい」に設定していれば
このコードでフォーム1が開きます。オブジェクト変数を複数にして、それぞれNewしてやると
フォーム1が複数開きます。これが「マルチインスタンス」です。

Private frm() As Form
Public Function Test() As Long
    ReDim frm(1)
    Set frm(0) = New Form_フォーム1
    Set frm(1) = New Form_フォーム1
    frm(0).Visible = True
    frm(1).Visible = True
End Function

「Docmd.OpenForm」と違う点は当然複数開けることが大きな違いになるわけですが、
ここで疑問がありました。それが「OpenArgsは?」です。
「OpenArgs」は読み取り専用であるため、Newした後で代入できません。
フォーム側のPublic変数に代入しようにもNewした時点でフォームのOpenイベントやLoadイベントが始まりますので
Open時のイベントでOpenArgsを使っている場合はダメになります。そしてこのパターンはかなり多いです。

一番簡単なのがグローバル変数に代入することなのですが、各フォームのOpenイベントで
グローバル変数に値を退避する必要があり結構面倒くさいです。

フォーム側のイベントに何も書かずに統一的な参照方法でそのフォーム固有の変数にアクセスしたいですね。
どうしようかな…。

広告