2017-10-10 12 views
2

Matlab内のCOMコレクションを反復処理する必要があります。 VBで私はFor Each item In Collectionを使うことができました。 Pythonではfor item in Collectionを使うことができました。しかし残念ながら、そのような構築物は、単純なループを使用した、MATLABで利用できない、このような何か:foreachまたは.Item()なしでCOMコレクションを繰り返します。

for index = 1 : Collection.Count 
    item = Collection.Item(index); 
    % now do something useful with the item 
end 

これは、一般的に適しています。しかし、私の特定のコレクションでは、.Item()は数値インデックスではなく文字列(アイテムの名前)のみを受け入れます。したがって、上記のコードスニペットは失敗します。これは、ループを反復処理する前に、項目名がわからないためです。

VBではitem = Collection(index)を実行できましたが、Matlabはこれを「アイテムがコレクション番号インデックス」として認識しているため、これは失敗します。つまり、Collection(2)はCollection内の2番目のアイテムではなく、2番目のコレクションにアクセスしようとします。これがMatlabで通常.Item(index)を使用する理由ですが、私が上で述べたように、Itemが文字列を受け入れる特定のコレクションではこれが失敗します。

私の質問は次のとおりです:foreach構成またはItem(index)メソッドなしでCOMコレクションを繰り返し処理できますか?

答えて

0

COMでそれを行う方法を教えてもらえますが、Matlabがこれを実行できるかどうかはわかりません。

特別なプロパティDISPID_NEWENUMがあります。名前はです。このプロパティを取得すると、IUnknownインターフェイスが取得されます。 QueryInterfaceIEnumVARIANTへのインターフェイスを取得できます。

このインターフェイスを要求してください。その後、Nextメソッドを呼び出し、戻り値がS_OKでなくなるまで列挙からVARIANTによってVARIANTを取り出します。通常、コレクションの終わりに達すると、S_FALSEが返されます。私は次を呼び出すときに常に1のカウントを使用します。

したがって、MatLabがIDispatch以外のインタフェースを使用できる場合は可能です。

+0

あなたの答えをありがとう。これを実装する短いVBコードスニペットを投稿してもよろしいですか?そのVBスクリプトをMatlab –

+0

に変換しようとします。私はC/C++/C#のみをプログラムします。しかし、私は[COMオブジェクト](https://de.mathworks.com/help/matlab/using-com-objects-in-matlab.html)を使用することに関するMATLABサイトのドキュメントを発見しました... – xMRi

+0

残念ながら、IEnumVariantはMatlabでサポートされているので、これは終わりのように見えます –

関連する問題