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