「VBA.Collection」のようなクラスを自作するには?

解決


58  2011-03-11 21:52:31  No: 102804

自作クラスのメンバを「For each」で回せるようにするときに、
「New_Enum」を実装しますが、結局「VBA.Collection」型の
プライベートメンバ等にアクセスする事になります。
しかし、「VBA.Collection.Item」の戻り値は「Variant」型
なので、特定のデータ型を持ったコレクションオブジェクトを
自作したいと思うのですが、どうやったら出来るのか検討も
付きません。何か特別なインターフェースを実装する必要が
あるのでしょうか。どなたか御存知でしたら教えて頂けると幸いです。

仕様としましては、「VBA.Collection」型と同様、「New_Enum」
の参照等により「For each」ループが可能、インデックス又は
キーを指定し、任意の要素へのアクセスが可能な既定メンバを
持つクラスという事です。
宜しく御願い致します。


魔界の仮面弁士  2011-03-12 05:09:49  No: 102805

VB6 ヘルプの下記の作成方法に従うのが一般的かと。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
  └[プログラミング ガイド]
    └[Visual Basic を使ってできること]
      └[オブジェクト]
        └[コレクションの作成方法]
          └[独自のコレクション クラスの作成]


58  2011-03-14 20:51:52  No: 102806

御回答頂き有難う御座います。
御提示頂いたドキュメントを拝見致しました。

やはり、プライベートメンバにCollection クラスを使う事は
避けられないのでしょうか。

理想では、プライベートメンバ自体も任意の型の配列変数で
保持し、Collection クラスは実装せずに、Collection クラス
と同じような動作をするクラスを作りたいのですが。


魔界の仮面弁士  2011-03-15 05:50:09  No: 102807

VB.NET なら List(Of T) で簡単に実装できますが、VB6 においては
IEnumVARIANT インターフェイスを独自に実装できない限りは無理でしょう。


魔界の仮面弁士  2011-03-15 10:28:34  No: 102808

試しに、内部配列をそのまま返却する方向でも実験してみましたが、
それでもやはり無理なようです。

---------------
'Class1
Option Explicit
Private x() As Class2
Public Function GetInternalArray() As Class2()
    GetInternalArray = x
End Function

---------------

' 正常に列挙できる
  Dim v As Variant
  For Each v In objClass1.GetInternalArray()
  Next

' コンパイルエラー
  Dim v As Class2
  For Each v In objClass1.GetInternalArray()
  Next

---------------

以下、GetInternalArray の DispID を DISPID_NEWENUM にした場合
(プロシージャID を -4 にした場合)

' GetInternalArray が呼ばれた後で実行時エラー451
  For Each v In objClass1
  Next

---------------

以下、GetInternalArray の DispID を DISPID_DEFAULT にした場合
(プロシージャID を (既定値) にした場合)

' GetInternalArray が呼ばれる前に実行時エラー438
  For Each v In objClass1
  Next


58  2011-03-15 17:55:35  No: 102809

わざわざ実験までして頂き、有難う御座います。

実は、当方も同じように実験を行いましたが、
やはりこのような結果でした。
それで、いつもやむなくCollection クラスを
使っていました。

これはvb6の仕様とあきらめるしか無さそうですね。
一応解決とさせて頂きます。


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

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






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