C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■94822 / 2階層)  インデックスが配列の境界外です。が出てしまいました。
□投稿者/ 魔界の仮面弁士 (2724回)-(2020/05/21(Thu) 23:47:39)
No94820 (エイ さん) に返信
> コードが1万行以上あるのですいません。
> サイトのダウンロードはDOWNLOAD: http://libzplay.sourceforge.net/download.html

ダウンロードはしていませんし、投稿いただいたコードを斜め読みしただけですが…。


投稿されたコードの場合、Button5 が押されたら、
OpenFileDialog で選択されたファイル名が、
ListBox2 に記録されるようになっているようですね。

これって、Button5 を押すたびに、ListBox2 のファイル名がどんどん積み重なっていきませんか?

それにも拘わらず、フィールド変数 file は
「最後に Button5 で選択されたファイル群だけ」しか保持されていません。

そのため、file の要素数よりも ListBox2 の要素数が多くなり、
IndexOutOfRangeException「インデックスが配列の境界外です。」
が生じているのではないでしょうか。


> インデックスが配列の境界外です。と出る場合、どのように修正したらいいんでしょうか?

修正案1)Button5 の処理で .Items.Add のループに入る前に、
 .Items.Clear() を呼び出して、ListBox2 を空にしておく。

修正案2)Button5 のコードはそのままにしておき、OpenFile のコードを
 player.OpenFile(file(IntSelectIndexPre), TStreamFormat.sfAutodetect)
 ではなく
 player.OpenFile(CStr(ListBox1.SelectedItem), TStreamFormat.sfAutodetect)
 に変更してみる。

などが考えられます。

Button5 を最後に押したときに選んだファイル一覧のみを対象としたいなら前者、
Button5 を押すたびにファイル一覧が増えていく(重複もありえる)方が良ければ後者です。


ただし実際は、
>  file = OpenFileDialog1.SafeFileNames
>  a = OpenFileDialog1.FileNames
の扱いに問題があるので、実際にはどちらも問題があるでしょう。

SafeFileNames が「パスを含まないファイル名」で、
FileNames が「ファイルのフルパス」を表すものなので、
ListBox2 にはファイル名のみを記録しておき、
player.OpenFile にはフルパスを渡すように書き換えるのが
望ましいのではないでしょうか。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: インデックスが配列の境界外です。が出てしまいました。 /エイ 返信無し
 
上記関連ツリー

インデックスが配列の境界外です。が出てしまいました。 / エイ (20/05/21(Thu) 22:51) #94819
Re[1]: インデックスが配列の境界外です。が出てしまいました。 / エイ (20/05/21(Thu) 23:08) #94820
  ├ インデックスが配列の境界外です。が出てしまいました。 / 魔界の仮面弁士 (20/05/21(Thu) 23:47) #94822 ←Now
  └ Re[2]: インデックスが配列の境界外です。が出てしまいました。 / Azulean (20/05/21(Thu) 23:38) #94821

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信