getcollection の使い方No.08123
h-tom さん 13/12/10 23:58
 

h-tom です。

秀丸エディタ Ver.8.33β14

getcollection の使い方で質問があります。

.NET Framework のArrayList が WSH から使えたので、秀丸マクロでも使って
みました。
追加した内容を取り出すのに、コレクションなので、getcollection関数を
使ってみましたが、うまく取り出せません。
(3個しかないのに、それ以上読み出せる。)

そもそも、getcollection の戻り値を文字列で受け取るのが間違っている?
getcollectionで取り出せるのは、オブジェクトだけなんでしょうか?

//サンプルマクロ ここから
#array = createobject("System.Collections.ArrayList");
callmethod #array, "Add", "a";
callmethod #array, "Add", "c";
callmethod #array, "Add", "b";
#n = 0;
$ret = "";
while(1){
    $item = getcollection(#array);
    #result = getresultex(10);
    $ret = $ret + str(#n) + ":" + $item + "-->" + str(#result) + "\n";
    if($item == "")break;
    //リミッター
    #n = #n + 1;
    if(#n == 4) break;
}
releaseobject #array;
message $ret;
endmacro;
//サンプルマクロ ここまで

出力結果
---------------------------
秀丸エディタ
---------------------------
0:a-->1
1:c-->1
2:b-->1
3:0-->1 ← 本当は""を期待したけど"0"が帰ってきて、止めないとずっと出力される

---------------------------
OK  
---------------------------

実際には、以下のように、"Count"と"Item"使って、読み出しは可能です。
#max = getpropnum(#array, "Count");
#cnt = 0;
while(#cnt < #max){
    message getpropstr(#array, "Item", #cnt);
    #cnt = #cnt + 1;
}

[ ]
RE:08123 getcollection の使い方No.08125
秀丸担当 さん 13/12/11 09:10
 

バグ情報ありがとうございます。
確かにうまくできていないことが確認できました。

getcollectionが文字列として取得できるかどうかについては、取得はできるよ
うに作られています。

getresultex(10)とgetresultex(11)の判定は、getcollectionについてはうまく
できていませんでした。
すみません。
次のβ版でできるように修正させていただきます。

修正された後では、サンプルマクロで試してみてわかったのですが、このオブジ
ェクトに対するgetresultex(10)では、成否では成功として返るようです。
getresultex(11)で、S_FALSEかどうか(数値で言うと1かどうか)で、真偽の判
定でやる必要があるようです。
ちょっとややこしいですが、成功だけど、真偽は偽(値は1)の場合にbreakする
ようにマクロを作る必要があるようです。

[ ]
RE:08125 getcollectionの使い方No.08129
h-tom さん 13/12/11 22:34
 

h-tom です。

>バグ情報ありがとうございます。
>確かにうまくできていないことが確認できました。
<省 略>
>次のβ版でできるように修正させていただきます。
お願いします。

> getcollectionが文字列として取得できるかどうかについては、取得はできるよ
> うに作られています。
了解です。

>修正された後では、サンプルマクロで試してみてわかったのですが、このオブジ
>ェクトに対するgetresultex(10)では、成否では成功として返るようです。
>getresultex(11)で、S_FALSEかどうか(数値で言うと1かどうか)で、真偽の判
>定でやる必要があるようです。
>ちょっとややこしいですが、成功だけど、真偽は偽(値は1)の場合にbreakする
>ようにマクロを作る必要があるようです。
確認ありがとうございます。
COM操作する場合には、HRESULT も確認したほうがよさそうですね。

[ ]