愚者の経験

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

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

マルチインスタンス利用時のOpenArgs-無理っぽい

前回の投稿

マルチインスタンス利用時のOpenArgsの実装について仕様をまとめます。
1.フォームのOpen時イベントで利用できる。
2.別のフォームが開いていても各々OpenArgsが利用できる。
3.フォーム内の変数でOpenArgsを保持しない。
4.マルチインスタンス利用時でも各々OpenArgsが利用できる。

これらを妥協することなく実現する方法を考えていきます。
まず1ですがこれは以下のようなコードのことです。

'標準モジュール
Public Argument As Variant
Private frm As Form
Public Function Test() As Long
    Set frm = New Form_フォーム1
    Argument = Array(1, 2, 3)
    frm.Visible = True
End Function

Testプロシージャの2行目でフォーム1のOpenイベントが始まるため、これは却下です。
ではこれはどうでしょう。

'標準モジュール
Public Argument As Variant
Private frm As Form
Public Function Test() As Long
    Argument = Array(1, 2, 3)
    Set frm = New Form_フォーム1
    frm.Visible = True
End Function

'フォーム1のコード
Private Sub Form_Open(Cancel As Integer)
    If (IsArray(Argument) = True) Then
    End If
End Sub

これもだめです。2に抵触します。
後から別のフォームが開いた時、OpenArgsの代わりのグローバル変数「Argument」の
内容が上書きされるので、Open時はOKですがその後がダメです。
かと言ってフォーム内に変数を持つのは3に抵触することになります。

これらの要求を満たすにはまずグローバル変数「Argument」はコレクションである
必要があるということになります。

というわけで標準モジュールに宣言したグローバル変数「Argument」は
「Arguments」コレクションに直します。

'標準モジュール
Public Arguments As New Collection
Private frm As Form
Public Function Test() As Long
    Arguments.Add Array(1, 2, 3), "フォーム1"
    Set frm = New Form_フォーム1
    frm.Visible = True
End Function

'フォーム1のコード
Private Sub Form_Open(Cancel As Integer)
    If (IsArray(Arguments(Me.Name)) = True) Then
    End If
End Sub

だいぶ良くなりました。これでフォーム側の変数が不要になりました。
別のフォームを開いても各々「Arguments(Me.Name)」でそれぞれの値が
取得できます。

しかし更に問題がありました。4つめの実現です。
マルチインスタンスを利用すると「同じフォームが複数」開けます。
つまりフォーム名をキーに出来ないのです。

では何をキーにするか…オブジェクトポインタでもキーにするかってあれ?
Objptrは「Newしたオブジェクト」に有効です。しかしNewした瞬間にOpenイベントが
入ります。ウィンドウハンドルも同様です。

「Newする前にNewした後に取得できる値をキーにする」必要がありそうです。詰みましたorz

広告