クラスの渡し値の配列について

解決


Hero  2006-06-08 00:08:19  No: 131758

VB6ユーザの初心者です。宜しくお願い致します。

現在、クラスの勉強をしておりますが、、以下ご教授願えませんでしょうか?

メインフォームからクラスに対して変数やオブジェクト(コントロール)を渡す際に、
変数の配列やオブジェクトの配列(コントロール配列)を渡すことはできるのでしょうか?
もしできるのであれば、どのようにすればよいのでしょうか?

以上、宜しくお願い致します。


魔界の仮面弁士  2006-06-08 01:06:21  No: 131759

> 変数の配列やオブジェクトの配列(コントロール配列)を渡すことはできるのでしょうか?
できますが、ひとつ認識が違っているかも。

> オブジェクトの配列(コントロール配列)
そもそも、「コントロール配列」は「オブジェクトの配列」ではありません。
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)


Hero  2006-06-08 18:28:11  No: 131760

魔界の仮面弁士さん
いつも助けて頂きありがとうございます。

ご指摘の通り、「コントロール配列(オブジェクト・コレクション)」と
「コントロールの配列(配列変数)」をきちんと理解しておりませんでし
た。親切なご説明により、理解することができました。

ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、以下の通りで宜しいのでしょうか?

========== 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)

よろしくお願い致します。


Hero  2006-06-08 18:30:48  No: 131761

すみません。一部修正させて下さい。

========== 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)

よろしくお願い致します。


魔界の仮面弁士  2006-06-08 18:37:28  No: 131762

> ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、
> 以下の通りで宜しいのでしょうか?
質問文か、コード例のいずれかが間違っているようです。

>  Dim TextBox(2) As String
これだと、質問と逆のコーディングになっていますよね。
これは『コントロール配列』ではなく、『配列変数』ですから。

とりあえず、今回のコードでいえば、呼び出し側は String 配列なので、
クラス側の引数定義は ByRef Items() As String にするのが良いでしょう。


Hero  2006-06-08 19:16:43  No: 131763

度々、すみません。

>> ご教授頂いた例で、配列変数ではなく、コントロール配列(コレクション)の場合は、
>> 以下の通りで宜しいのでしょうか?
>質問文か、コード例のいずれかが間違っているようです。

ご指摘の質問の内容は、コントロール配列(コレクション)の場合です。
以下のような感じになるのでしょうか?

========== 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)

よろしくお願い致します。


魔界の仮面弁士  2006-06-08 19:43:29  No: 131764

> ご指摘の質問の内容は、コントロール配列(コレクション)の場合です。
であれば、呼び出し側は、
>  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


Hero  2006-06-08 22:07:01  No: 131765

魔界の仮面弁士さん
お手数をお掛け致しました。

コントロール配列を宣言するのかと大きな勘違いをしておりました。
お恥ずかしい(^^;次第ですが、本当に勉強になりました。

また、何かありましたらご相談させて下さい。
本当にありがとうございました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加