ロゴ(青) 擬似からの脱却 ロゴ(緑)

  【 擬似からの脱却 】  [ Breakthrough in the Pseudo-Control Arrays ]

[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はこちら]

  ====================================================================
  §7  クラスからフォーム内の情報を操作
  ====================================================================

(前節より‥‥‥)
      擬似コントロール配列で、フォーム内の他の資源を処理する方法

  イベントを受けて何らかの処理をする場合、自コントロールのプロパティ操作だけで済む事も
ありますが、普通は
      ・UserForm内の他のコントロールのプロパティ
      ・UserForm内の変数
      ・サブルーチンの呼び出し
を操作する機会も多いですね。

  5節の最後の方で、「クラス内でControlsコレクションを使うには」という解説で
      [ Me.Controls ( xxxx ) ]という書き方では利用元のコントロールを参照できないと
      いうだけです。[ Userform オブジェクト.Controls ( xxxxx ) ]と書くならば使えます。
      つまり、Cmd プロパティでCommandButton オブジェクトを受け取ったのと同じよう
      に、UserForm オブジェクトを受け取るプロパティを組み込んでやれば良い訳です。

という事を書きました。例えば
      Private MyForm As MsForms.UserForm
      Public Property Let Caller (NewForm As MsForms.UserForm)
          Set MyForm = NewForm
      End Property
と、UserFormオブジェクトをクラス内に引き継ぐプロパティを用意すれば、
    --- UserForm側 ---
          xxx.Caller = Me
    --- クラス側 ---
          MyForm.TextBox1.Value = yyyyy
          MyForm.Controls("TextBox" & 番号).Value = yyyyy
という風に、フォーム内の他のコントロールを操作できます。ただし、クラスモジュールのコーディング
時点では「MyFormが指すフォームが何か」が不定ですから、MyForm.とパンチしても、TextBox1
等の自動メンバ表示はされません。

  ところで、[MsForms.UserForm]でプロパティを作成した場合でも、MyFormを使って
        ・ MyForm.Name  ‥‥‥  フォームのオブジェクト名
        ・ MyForm.変数   ‥‥‥  変数はフォーム内のPublic変数
        ・ Call  MyForm.Subroutine  ‥‥‥  フォーム内のPublic Sub
という使い方は出来ません(後の2つは兎も角も、Nameプロパティが取れないというのは驚きです)。
これは、かなり不便ですね。

  ただし、この不都合は、プロパティをMsForms.UserForm 型ではなく、汎用のObject 型で作る
により回避できます(何故、MsForms.UserForm型では出来ないのかという疑問は残りますが‥‥)。
      Private MyForm As Object
      Public Property Let Caller (NewForm As Object)
          Set MyForm = NewForm
      End Property

Object型という事であれば、敢えて、フォームオブジェクトを受け取るプロパティを用意しなくても、
      Private MyForm As Object
      Private MyCtrl As MsForms.CommandButton
      Public Property Let Item (NewCtrl As MsForms.CommandButton)
          Set MyCtrl = NewCtrl
          Set MyForm = NewCtrl.Parent
      End Property
という風に[Parent]プロパティを利用する事でも充分に対応できます。

  ただし、Frame/MultiPage に載っているコントロールの場合には、Parent がUserFormではなく、Frame/MultiPage を指しますので注意が必要です。これを考えれば、やはり、UserFormオブジェ
クトを引き継ぐプロパティを用意した方が、どのようなレイアウトのUserFormでも問題なく処理でき
ますから確実でしょう。

  (補)VBAのUserFormで利用できるコンテナコントロールは[Frame および MultiPage ]
        ですので、この2つを判定して【Parent 】を繰り返し求める事も可能です。
          Private MyForm As Object
          Private MyCtrl As MsForms.CommandButton
          Public Property Let Item (NewCtrl As MsForms.CommandButton)
          Dim wkParent As Object
              Set MyCtrl = NewCtrl
              Set wkParent = MyCtrl.Parent
              Do
                  Select Case TypeName (wkParent)
                      Case "Frame", "MultiPage", "Page"
                          Set wkParent = wkParent.Parent
                      Case Else
                          Exit Do
                  End Select
              Loop
              Set MyForm = wkParent
              Set wkParent = Nothing
          End Sub



それでは、いよいよ、擬似コントロール配列を一歩進めて、VB並みのイベントコーディングを実現する
方法について考えてみましょう。

  ====================================================================
  次節 : §8  擬似から先ず1歩踏み出す
  ====================================================================

[ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はこちら]


[ Home へ戻る ]

ロゴ(ゴールド) ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved.