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

わんくま同盟

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

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

ツリー一括表示

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


親記事 / ▼[ 94820 ]
■94819 / 親階層)  インデックスが配列の境界外です。が出てしまいました。
□投稿者/ エイ (7回)-(2020/05/21(Thu) 22:51:06)

分類:[VB.NET/VB2005 以降] 

VB.Net(2019)
こんばんは

インデックスが配列の境界外です。このエラーが出てしまいます。

http://libzplay.sourceforge.net/download.html
こちらのサイトから使用して改良しています。

エラーメッセージ

System.IndexOutOfRangeException
HResult=0x80131508
Message=インデックスが配列の境界外です。
Source=libZPlay player
スタック トレース:
場所 libZPlay_player.Form1.ListBox2_SelectedIndexChanged(Object sender, EventArgs e)
(C:\Users\Form1.vb)
場所 System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
場所 System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
場所 System.Windows.Forms.ListBox.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
場所 System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
場所 System.Windows.Forms.Control.WmCommand(Message& m)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
場所 System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
場所 System.Windows.Forms.Control.DefWndProc(Message& m)
場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ListBox.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)





[ □ Tree ] 返信 編集キー/

▲[ 94819 ] / ▼[ 94822 ] ▼[ 94821 ]
■94820 / 1階層)  Re[1]: インデックスが配列の境界外です。が出てしまいました。
□投稿者/ エイ (8回)-(2020/05/21(Thu) 23:08:51)
コード

Imports libZPlay_player
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Data
Imports System.Drawing
Imports System.Diagnostics
Imports System.Windows.Forms
Imports System.Linq
Imports System.Xml.Linq
Imports libZPlay_player.libZPlay

Partial Public Class Form1
Dim a As String()
    Dim file As String()
    Dim IntSelectIndexPre As Integer = 0
    Private ReadOnly history1 As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)

Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
        ' If ListBox2.SelectedItem <> "" Then
        If ListBox2.SelectedItem IsNot "" Then
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        Else
            Exit Sub
        End If

        If IntSelectIndexPre = ListBox2.SelectedIndex Then
            Exit Sub
        End If

        IntSelectIndexPre = ListBox2.SelectedIndex


        player.OpenFile(file(IntSelectIndexPre), TStreamFormat.sfAutodetect)


        showinfo()
        player.StartPlayback()
    End Sub
    Private Sub OpenFileDialog1_FileOk(sender As Object, e As ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk

        Dim files = OpenFileDialog1.FileNames
        Dim conflict = files.Where(AddressOf history1.Contains)

        If conflict.Any() Then
            e.Cancel = True
            Dim fileNames = conflict.Select(AddressOf System.IO.Path.GetFileName)
            MessageBox.Show("同じファイルがあります。" & vbCrLf & String.Join(vbCrLf, fileNames), "競合", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            Array.ForEach(files, AddressOf history1.Add)
        End If
        If LoadMode = 0 Then
            player.Close()
            If Not (player.OpenFile(OpenFileDialog1.FileName, TStreamFormat.sfAutodetect)) Then
                MessageBox.Show(player.GetError(), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            End If
        ElseIf LoadMode = 1 Then
            player.Close()

            Dim format As TStreamFormat = player.GetFileFormat(OpenFileDialog1.FileName)

            Dim fInfo As New System.IO.FileInfo(OpenFileDialog1.FileName)
            Dim numBytes As Long = fInfo.Length
            Dim fStream As New System.IO.FileStream(OpenFileDialog1.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)
            Dim br As New System.IO.BinaryReader(fStream)
            Dim stream_data() As Byte = Nothing

            stream_data = br.ReadBytes(CInt(Fix(numBytes)))
            If Not (player.OpenStream(True, False, stream_data, CUInt(numBytes), format)) Then
                MessageBox.Show(player.GetError(), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If

            br.Close()
            fStream.Close()
        ElseIf LoadMode = 2 Then
            player.Close()

            Dim format As TStreamFormat = player.GetFileFormat(OpenFileDialog1.FileName)
            BufferCounter = 0

            Dim fInfo As New System.IO.FileInfo(OpenFileDialog1.FileName)
            Dim numBytes As UInteger = CUInt(fInfo.Length)
            If br IsNot Nothing Then
                br.Close()
            End If
            If fStream IsNot Nothing Then
                fStream.Close()
            End If

            br = Nothing
            fStream = Nothing

            fStream = New System.IO.FileStream(OpenFileDialog1.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)
            br = New System.IO.BinaryReader(fStream)
            Dim stream_data() As Byte = Nothing
            Dim small_chunk As UInteger = 0
            small_chunk = CType(Math.Min(100000, numBytes), UInteger)
            ' read small chunk of data
            stream_data = br.ReadBytes(CInt(Fix(small_chunk)))
            ' open stream
            If Not (player.OpenStream(True, True, stream_data, CUInt(stream_data.Length), format)) Then
                MessageBox.Show(player.GetError(), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If

            ' read more data and push into stream
            stream_data = br.ReadBytes(CInt(Fix(small_chunk)))
            player.PushDataToStream(stream_data, CUInt(stream_data.Length))

        ElseIf LoadMode = 3 Then
            If Not (player.AddFile(OpenFileDialog1.FileName, TStreamFormat.sfAutodetect)) Then
                MessageBox.Show(player.GetError(), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            End If

        End If


        showinfo()
        player.StartPlayback()


    End Sub
    Private Sub Button5_Click_1(sender As Object, e As EventArgs) Handles Button5.Click
        LoadMode = 3
        OpenFileDialog1.FileName = ""
        OpenFileDialog1.Multiselect = True
        OpenFileDialog1.Title = "開くファイルを指定"
        OpenFileDialog1.Filter = "All Supported Files|*.mp3;*.mp2;*.mp1;*.ogg;*.oga;*.flac;*.wav;*.ac3;*.aac|Mp3 Files|*.mp3|Mp2 Files|*.mp2|Mp1 Files|*.mp1|Ogg Files|*.ogg|FLAC files|*.flac|Wav files|*.wav|AC-3|*.ac3|AAC|*.aac"
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            file = OpenFileDialog1.SafeFileNames
            a = OpenFileDialog1.FileNames
            For b As Integer = 0 To file.Length - 1
                ListBox2.Items.Add(file(b))
                player.StartPlayback()
            Next
            ListBox2.SelectedIndex = 0
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)

        End If
    End Sub

エラーが出る場所は
  player.OpenFile(file(IntSelectIndexPre), TStreamFormat.sfAutodetect)
ここで「インデックスが配列の境界外です。」と出ます。

コードが1万行以上あるのですいません。

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

元のコードをリストボックス追加して1曲目を開きました。
その次の2曲目を開き、2番目のリストボックスをクリックするとインデックスが配列の境界外です。と出ます。
お願い申し上げます。



サイトのダウンロードはDOWNLOAD: http://libzplay.sourceforge.net/download.html
 
libZPlay-2.02-SDK (2.12 MB)を使用しました。

libzplay.dllとlibZPlay.vbが必要です。




[ 親 94819 / □ Tree ] 返信 編集キー/

▲[ 94820 ] / 返信無し
■94822 / 2階層)  Re[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 にはフルパスを渡すように書き換えるのが
望ましいのではないでしょうか。
[ 親 94819 / □ Tree ] 返信 編集キー/

▲[ 94820 ] / 返信無し
■94821 / 2階層)  Re[2]: インデックスが配列の境界外です。が出てしまいました。
□投稿者/ Azulean (1152回)-(2020/05/21(Thu) 23:38:09)
No94820 (エイ さん) に返信
> インデックスが配列の境界外です。と出る場合、どのように修正したらいいんでしょうか?

止まった時に、その「file」と「IntSelectIndexPre」にカーソルを合わせて中身を確認してください。
おそらく、「file」の数と、「IntSelectIndexPre」の数値の関係がおかしくなっていませんか?

そのおかしくなったのはなぜか?でソースコードを見かえしてください。


※今貼り付けられているコードの中であるとすれば、Button5_Click_1 が 2 回以上実行されたときに、Clear してないから、ListBox2 の中身が増え続けること。
[ 親 94819 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -