自作クラスのメンバを「For each」で回せるようにするときに、
「New_Enum」を実装しますが、結局「VBA.Collection」型の
プライベートメンバ等にアクセスする事になります。
しかし、「VBA.Collection.Item」の戻り値は「Variant」型
なので、特定のデータ型を持ったコレクションオブジェクトを
自作したいと思うのですが、どうやったら出来るのか検討も
付きません。何か特別なインターフェースを実装する必要が
あるのでしょうか。どなたか御存知でしたら教えて頂けると幸いです。
仕様としましては、「VBA.Collection」型と同様、「New_Enum」
の参照等により「For each」ループが可能、インデックス又は
キーを指定し、任意の要素へのアクセスが可能な既定メンバを
持つクラスという事です。
宜しく御願い致します。
VB6 ヘルプの下記の作成方法に従うのが一般的かと。
[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[プログラミング ガイド]
└[Visual Basic を使ってできること]
└[オブジェクト]
└[コレクションの作成方法]
└[独自のコレクション クラスの作成]
御回答頂き有難う御座います。
御提示頂いたドキュメントを拝見致しました。
やはり、プライベートメンバにCollection クラスを使う事は
避けられないのでしょうか。
理想では、プライベートメンバ自体も任意の型の配列変数で
保持し、Collection クラスは実装せずに、Collection クラス
と同じような動作をするクラスを作りたいのですが。
VB.NET なら List(Of T) で簡単に実装できますが、VB6 においては
IEnumVARIANT インターフェイスを独自に実装できない限りは無理でしょう。
試しに、内部配列をそのまま返却する方向でも実験してみましたが、
それでもやはり無理なようです。
---------------
'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
わざわざ実験までして頂き、有難う御座います。
実は、当方も同じように実験を行いましたが、
やはりこのような結果でした。
それで、いつもやむなくCollection クラスを
使っていました。
これはvb6の仕様とあきらめるしか無さそうですね。
一応解決とさせて頂きます。
ツイート | ![]() |