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

  【 擬似からの脱却 】  [ 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 Property
 


それでは、いよいよ、擬似コントロール配列を一歩進めて、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.