VB6ユーザの初心者です。宜しくお願い致します。
現在、クラスの勉強をしておりますが、、以下ご教授願えませんでしょうか?
メインフォームからクラスに対して変数やオブジェクト(コントロール)を渡す際に、
変数の配列やオブジェクトの配列(コントロール配列)を渡すことはできるのでしょうか?
もしできるのであれば、どのようにすればよいのでしょうか?
以上、宜しくお願い致します。
> 変数の配列やオブジェクトの配列(コントロール配列)を渡すことはできるのでしょうか?
できますが、ひとつ認識が違っているかも。
> オブジェクトの配列(コントロール配列)
そもそも、「コントロール配列」は「オブジェクトの配列」ではありません。
VB6における「コントロール配列」は、"配列"という呼び名とは裏腹に、実際には
一種のコレクションであり、いわゆる「コントロールの配列」とは別物となります。
たとえば、Text1(0)、Text1(1) といった『コントロール配列』があった場合、
'これらは「False」を返す
Debug.Print IsArray(Text1) 'TextBoxのコントロール配列は、「配列ではない」
Debug.Print IsArray(Text1(0)) '当然、個々のTextBoxコントロールも配列ではない
'これらは「True」を返す
Debug.Print IsObject(Text1) 'TextBoxのコントロール配列は、一種の「オブジェクト」である(コレクション)
Debug.Print IsObject(Text1(0)) '個々のTextBoxも、一種の「オブジェクト」である(テキストボックス オブジェクト)
のような結果となります。
そして、(『コントロール配列』ではなく)『コントロールの配列』の場合は、
'Text2、Text3を、配列変数に‘TextBoxes’に代入
Dim TextBoxes() As VB.TextBox
ReDim TextBoxes(1)
Set TextBoxes(0) = Text2
Set TextBoxes(1) = Text3
'これらは「False」を返す
Debug.Print IsObject(TextBoxes) '配列は、オブジェクトでは無い
Debug.Print IsArray(Text2) 'Text2自体は、配列ではない
Debug.Print IsArray(TextBoxes(0)) '要素0は Text2 と同じなので、同上の結果になる
'これらは「True」を返す
Debug.Print IsArray(TextBoxes) 'ReDimが使えるので、これは配列である
Debug.Print IsObject(Text2) 'TextBox は、オブジェクトである
Debug.Print IsObject(TextBoxes(0)) '要素0は Text2 と同じなので、同上の結果になる
となるわけです。
> もしできるのであれば、どのようにすればよいのでしょうか?
例えば、Integer 型の配列を渡すなら、このように書けます。
'========== Class1 ==========
Option Explicit
Public Sub Dump(ByRef Items() As Integer)
Dim V As Variant
For Each V In Items
Debug.Print V
Next
End Sub
'========== 呼び出し側 ==========
Dim Samples(3) As Integer
Samples(0) = 123
Samples(1) = 345
Samples(2) = 567
Samples(3) = 789
Dim C As Class1
Set C = New Class1
Call C.Dump(Samples)
魔界の仮面弁士さん
いつも助けて頂きありがとうございます。
ご指摘の通り、「コントロール配列(オブジェクト・コレクション)」と
「コントロールの配列(配列変数)」をきちんと理解しておりませんでし
た。親切なご説明により、理解することができました。
ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、以下の通りで宜しいのでしょうか?
========== Class1 ==========
Option Explicit
Public Sub Dump(ByRef Items() As Integer)
Dim V As Variant
For Each V In Items
Debug.Print V
Next
End Sub
'========== 呼び出し側 ==========
Dim TextBox(2) As String
TextBoxes(0) = "A"
TextBoxes(1) = "B"
TextBoxes(2) = "C"
Dim C As Class1
Set C = New Class1
Call C.Dump(TextBox)
よろしくお願い致します。
すみません。一部修正させて下さい。
========== Class1 ==========
Option Explicit
Public Sub Dump(ByRef Items() As object)
Dim V As Variant
For Each V In Items
Debug.Print V
Next
End Sub
'========== 呼び出し側 ==========
Dim TextBox(2) As String
TextBoxes(0) = "A"
TextBoxes(1) = "B"
TextBoxes(2) = "C"
Dim C As Class1
Set C = New Class1
Call C.Dump(TextBox)
よろしくお願い致します。
> ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、
> 以下の通りで宜しいのでしょうか?
質問文か、コード例のいずれかが間違っているようです。
> Dim TextBox(2) As String
これだと、質問と逆のコーディングになっていますよね。
これは『コントロール配列』ではなく、『配列変数』ですから。
とりあえず、今回のコードでいえば、呼び出し側は String 配列なので、
クラス側の引数定義は ByRef Items() As String にするのが良いでしょう。
度々、すみません。
>> ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、
>> 以下の通りで宜しいのでしょうか?
>質問文か、コード例のいずれかが間違っているようです。
ご指摘の質問の内容は、コントロール配列(コレクション)の場合です。
以下のような感じになるのでしょうか?
========== Class1 ==========
Option Explicit
Public Sub Dump(ByRef Items() As String)
Dim V As Variant
For Each V In Items
Debug.Print V
Next
End Sub
'========== 呼び出し側 ==========
Dim TextBox1() As String
ReDim TextBox1(2)
TextBox1(0) = "A"
TextBox1(1) = "B"
TextBox1(2) = "C"
Dim C As Class1
Set C = New Class1
Call C.Dump(TextBox)
よろしくお願い致します。
> ご指摘の質問の内容は、コントロール配列(コレクション)の場合です。
であれば、呼び出し側は、
> Dim TextBox1() As String
では無いですよね。
これは「コントロール配列」ではなく、「String型の配列」ですから。
> 以下のような感じになるのでしょうか?
先の説明が悪かったでしょうか。
それは、『配列変数』の場合の対処方法ですよ。(^^;
(というか、そのコードではどこにも『コントロール配列』が使われていませんよね)
下記に、『コントロール配列』を使った例を書いておきます。参考になれば。
'==== Class1 ====
Option Explicit
Public Sub Dump(ByVal TextBoxes As Object)
Dim X As VB.TextBox
For Each X In TextBoxes
Debug.Print X.Name & "(" & CStr(X.Index) & ") =";
Debug.Print "『" & X.Text & "』"
Next
End Sub
'==== Form1 ====
Option Explicit
Private Sub Command1_Click()
Text1(0).Text = "A"
Text1(1).Text = "B"
Text1(2).Text = "C"
Dim C As Class1
Set C = New Class1
C.Dump Text1
End Sub
魔界の仮面弁士さん
お手数をお掛け致しました。
コントロール配列を宣言するのかと大きな勘違いをしておりました。
お恥ずかしい(^^;次第ですが、本当に勉強になりました。
また、何かありましたらご相談させて下さい。
本当にありがとうございました。m(_ _)m
ツイート | ![]() |