質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

音楽プレイヤーでリストボックスの前の曲に

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 582
退会済みユーザー

退会済みユーザー

 音楽プレイヤーでリストボックスの曲に戻る時におかしくなります

初めまして質問させていただきます。
音楽プレイヤーを作ってます。
リストボックスで前の曲に戻る時おかしくなりました。

原因となっているコード

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            ListBox2.SelectedIndex += -1
            AxWindowsMediaPlayer2.Ctlcontrols.previous()
            AxWindowsMediaPlayer2.Ctlcontrols.play()
            ProgressBar1.Value = 0
            Timer1.Start()
            Timer2.Start()
        Catch ex As Exception
            MessageBox.Show("曲がありません",
               "エラー",
               MessageBoxButtons.OK,
               MessageBoxIcon.Asterisk)
            AxWindowsMediaPlayer2.Ctlcontrols.stop()
            Timer1.Stop()
            Timer2.Stop()
        End Try
    End Sub

作成中のform全体

Imports System.IO
Imports System
Public Class Music00b

    Private history As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
    Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        Dim files = OpenFileDialog1.FileNames
        Dim conflict = files.Where(AddressOf history.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 history.Add)
        End If
    End Sub
    Private Sub Music00b_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AxWindowsMediaPlayer2.Hide()
        TextBox1.ReadOnly = True
        TextBox2.ReadOnly = True
        TextBox3.ReadOnly = True
        TextBox2.ReadOnly = True
        PictureBox1.Enabled = False
        PictureBox2.Enabled = False
        PictureBox3.Enabled = False
        PictureBox4.Enabled = False
        PictureBox5.Enabled = False
        ListBox2.Hide()
        Label1.Hide()

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.Value = 0
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer2.Ctlcontrols.currentPosition).ToString("mm\:ss")
        Me.Timer1.Enabled = False
        Me.Timer2.Enabled = True
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Dim length As Integer
        Dim current As Integer
        length = If(AxWindowsMediaPlayer2.currentMedia?.duration, 0)
        current = AxWindowsMediaPlayer2.Ctlcontrols.currentPosition

        ProgressBar1.Value = current
        ProgressBar1.Maximum = length

        If ProgressBar1.Value = 100 Then
            ProgressBar1.Value = 0
        End If
    End Sub

    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer2.Ctlcontrols.currentPosition).ToString("mm\:ss")
    End Sub
    Dim Open00a As String()
    Dim file As String()
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        AxWindowsMediaPlayer2.settings.autoStart = False
        OpenFileDialog1.FileName = ""
        OpenFileDialog1.Multiselect = True
        OpenFileDialog1.Title = "開くファイルを指定"
        OpenFileDialog1.Filter = "MP3(*.mp3)|*.mp3|全てのファイル (*.*)|*.*"
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            file = OpenFileDialog1.SafeFileNames
            Open00a = OpenFileDialog1.FileNames
            For b As Integer = 0 To file.Length - 1
                ListBox2.Items.Add(file(b))

                AxWindowsMediaPlayer2.currentPlaylist.appendItem(AxWindowsMediaPlayer2.newMedia(b))

            Next
            ListBox2.SelectedIndex = 0
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        End If
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        '全てクリアされる
        history.Clear()
        ListBox2.Items.Clear()
        TextBox1.Clear()
        TextBox2.Clear()
        TextBox3.Clear()
        Button2.Enabled = True
        AxWindowsMediaPlayer2.Ctlcontrols.stop()
        AxWindowsMediaPlayer2.currentPlaylist.clear()
        Timer1.Stop()
        Timer2.Stop()
        Timer3.Stop()
        ProgressBar1.Value = 0
        MessageBox.Show("リストクリアーしました。",
               "報告",
               MessageBoxButtons.OK,
               MessageBoxIcon.Asterisk)
    End Sub

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click

        AxWindowsMediaPlayer2.Ctlcontrols.play()

        TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        Timer1.Start()
        Timer2.Start()
        Timer1.Enabled = True
    End Sub

    Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
        AxWindowsMediaPlayer2.Ctlcontrols.pause()
    End Sub

    Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click
        AxWindowsMediaPlayer2.Ctlcontrols.stop()
        ProgressBar1.Value = 0
    End Sub

    Private Sub PictureBox4_Click(sender As Object, e As EventArgs) Handles PictureBox4.Click
        Try
            ListBox2.SelectedIndex += -1
            AxWindowsMediaPlayer2.Ctlcontrols.previous()
            AxWindowsMediaPlayer2.Ctlcontrols.play()
            ProgressBar1.Value = 0
            Timer1.Start()
            Timer2.Start()
        Catch ex As Exception
            MessageBox.Show("曲がありません",
               "エラー",
               MessageBoxButtons.OK,
               MessageBoxIcon.Asterisk)
            AxWindowsMediaPlayer2.Ctlcontrols.stop()
            Timer1.Stop()
            Timer2.Stop()
        End Try
    End Sub

    Private Sub PictureBox5_Click(sender As Object, e As EventArgs) Handles PictureBox5.Click
        Try
            ListBox2.SelectedIndex += +1
            AxWindowsMediaPlayer2.Ctlcontrols.next()
            AxWindowsMediaPlayer2.Ctlcontrols.play()
            ProgressBar1.Value = 0
            Timer1.Start()
            Timer2.Start()
        Catch ex As Exception
            MessageBox.Show("曲がありません",
               "エラー",
               MessageBoxButtons.OK,
               MessageBoxIcon.Asterisk)
        End Try
    End Sub
    Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HScrollBar1.Scroll
        AxWindowsMediaPlayer2.settings.volume = HScrollBar1.Value

        Lb2.Text = "" & HScrollBar1.Value
    End Sub
    Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer2.PlayStateChange
        Try
            Dim wa As Integer
            wa = ListBox2.SelectedIndex
            If AxWindowsMediaPlayer2.currentMedia.isIdentical(AxWindowsMediaPlayer2.currentPlaylist.Item(wa)) Then
            End If
            Timer1.Start()
            Timer2.Start()

            ProgressBar1.Value = 0
        Catch ex As Exception

        End Try
        Select Case e.newState
            Case WMPLib.WMPPlayState.wmppsPlaying '再生中
                TextBox3.Text = AxWindowsMediaPlayer2.currentMedia.durationString
                Timer3.Start()
                ProgressBar1.Maximum = AxWindowsMediaPlayer2.currentMedia.duration
                ProgressBar1.Value = 0
            Case e.newState = WMPLib.WMPPlayState.wmppsMediaEnded '再生終了
                Timer3.Stop()
                ProgressBar1.Value = 0
            Case WMPLib.WMPPlayState.wmppsMediaEnded
                ' 再生が全て終了した時()
                AxWindowsMediaPlayer2.Ctlcontrols.stop()
            Case Else
                Debug.Print(e.newState.ToString())
        End Select
    End Sub
    Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
        If ListBox2.SelectedItem <> "" Then
            AxWindowsMediaPlayer2.URL = Open00a(ListBox2.SelectedIndex)
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
            AxWindowsMediaPlayer2.Ctlcontrols.play()
        End If
    End Sub
End Class

試した結果

前の曲に戻ると2回押さないとメッセージボックスが出ます。

教えてほしい事

1回押すだけで前の曲に戻って
メッセージボックスが出るようにするにはどうすればいいでしょうか?
教えていただけますでしょうか、お願い申し上げます。

使ってるバージョン

Visual Studio 2017のVBです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Imports System.IO
Imports System

Public Class Music00b

    Private history As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
    Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        Dim files = OpenFileDialog1.FileNames
        Dim conflict = files.Where(AddressOf history.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 history.Add)
        End If
    End Sub
    Private Sub Music00b_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AxWindowsMediaPlayer2.Hide()
        TextBox1.ReadOnly = True
        TextBox2.ReadOnly = True
        TextBox3.ReadOnly = True
        TextBox2.ReadOnly = True
        'PictureBox1.Enabled = False
        'PictureBox2.Enabled = False
        'PictureBox3.Enabled = False
        'PictureBox4.Enabled = False
        'PictureBox5.Enabled = False
        'ListBox2.Hide()
        'Label1.Hide()

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.Value = 0
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer2.Ctlcontrols.currentPosition).ToString("mm\:ss")
        Me.Timer1.Enabled = False
        Me.Timer2.Enabled = True
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Dim length As Integer
        Dim current As Integer


        '! 変更部分
        length = If(AxWindowsMediaPlayer2.currentMedia.duration.ToString, 0)


        'length = If(AxWindowsMediaPlayer2.currentMedia?.duration, 0)

        current = AxWindowsMediaPlayer2.Ctlcontrols.currentPosition

        ProgressBar1.Value = current
        ProgressBar1.Maximum = length

        If ProgressBar1.Value = 100 Then
            ProgressBar1.Value = 0
        End If
    End Sub

    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer2.Ctlcontrols.currentPosition).ToString("mm\:ss")
    End Sub
    '! 変更部分
    Dim Open00a() As String
    'Dim Open00a As String()
    Dim file As String()
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        AxWindowsMediaPlayer2.settings.autoStart = False
        OpenFileDialog1.FileName = ""
        OpenFileDialog1.Multiselect = True
        OpenFileDialog1.Title = "開くファイルを指定"
        OpenFileDialog1.Filter = "MP3(*.mp3)|*.mp3|全てのファイル (*.*)|*.*"
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            file = OpenFileDialog1.SafeFileNames

            '! 変更部分
            Dim s As Integer
            If Not Open00a Is Nothing Then
                s = Open00a.Length
                ReDim Open00a(s)
                Open00a(s) = OpenFileDialog1.FileName
            Else
                Open00a = OpenFileDialog1.FileNames

            End If
            For b As Integer = 0 To file.Length - 1
                ListBox2.Items.Add(file(b))

                AxWindowsMediaPlayer2.currentPlaylist.appendItem(AxWindowsMediaPlayer2.newMedia(b))

            Next
            ListBox2.SelectedIndex = 0
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        End If
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        '全てクリアされる
        history.Clear()
        ListBox2.Items.Clear()
        TextBox1.Clear()
        TextBox2.Clear()
        TextBox3.Clear()
        Button2.Enabled = True
        AxWindowsMediaPlayer2.Ctlcontrols.stop()
        AxWindowsMediaPlayer2.currentPlaylist.clear()
        Timer1.Stop()
        Timer2.Stop()
        Timer3.Stop()
        ProgressBar1.Value = 0
        MessageBox.Show("リストクリアーしました。",
               "報告",
               MessageBoxButtons.OK,
               MessageBoxIcon.Asterisk)
    End Sub

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click

        AxWindowsMediaPlayer2.Ctlcontrols.play()

        TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        Timer1.Start()
        Timer2.Start()
        Timer1.Enabled = True
    End Sub

    Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
        AxWindowsMediaPlayer2.Ctlcontrols.pause()
    End Sub

    Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click
        AxWindowsMediaPlayer2.Ctlcontrols.stop()
        ProgressBar1.Value = 0
    End Sub

    Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HScrollBar1.Scroll
        AxWindowsMediaPlayer2.settings.volume = HScrollBar1.Value

        Lb2.Text = "" & HScrollBar1.Value
    End Sub
    Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer2.PlayStateChange
        Try
            Dim wa As Integer
            wa = ListBox2.SelectedIndex
            If AxWindowsMediaPlayer2.currentMedia.isIdentical(AxWindowsMediaPlayer2.currentPlaylist.Item(wa)) Then
            End If
            Timer1.Start()
            Timer2.Start()

            ProgressBar1.Value = 0
        Catch ex As Exception

        End Try
        Select Case e.newState
            Case WMPLib.WMPPlayState.wmppsPlaying '再生中
                TextBox3.Text = AxWindowsMediaPlayer2.currentMedia.durationString
                Timer3.Start()
                ProgressBar1.Maximum = AxWindowsMediaPlayer2.currentMedia.duration
                ProgressBar1.Value = 0
            Case e.newState = WMPLib.WMPPlayState.wmppsMediaEnded '再生終了
                Timer3.Stop()
                ProgressBar1.Value = 0
            Case WMPLib.WMPPlayState.wmppsMediaEnded
                ' 再生が全て終了した時()
                AxWindowsMediaPlayer2.Ctlcontrols.stop()
            Case Else
                Debug.Print(e.newState.ToString())
        End Select
    End Sub
    Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
        If ListBox2.SelectedItem <> "" Then
            AxWindowsMediaPlayer2.URL = Open00a(ListBox2.SelectedIndex)
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
            AxWindowsMediaPlayer2.Ctlcontrols.play()
        End If
    End Sub

    '! 変更部分
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If ListBox2.Items.Count = 0 Or ListBox2.SelectedIndex = -1 Then
            Exit Sub
        End If

        If ListBox2.Items.Count >= ListBox2.SelectedIndex + 1 Then
            ListBox2.SelectedIndex -= 1
            AxWindowsMediaPlayer2.Ctlcontrols.previous()
            AxWindowsMediaPlayer2.Ctlcontrols.play()
            ProgressBar1.Value = 0
            Timer1.Start()
            Timer2.Start()

        Else
            MessageBox.Show("曲がありません",
                   "エラー",
                   MessageBoxButtons.OK,
                   MessageBoxIcon.Asterisk)
            AxWindowsMediaPlayer2.Ctlcontrols.stop()
            Timer1.Stop()
            Timer2.Stop()
        End If

    End Sub
End Class

コード汚くてごめんなさい

一応これで動くと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 18:51 編集

    syameimaruさん
    ありがとうございます。コードありがとうございました。
    開いた曲で「再生しようとしているファイルの拡張子(.)が
    ファイル形式と一定しません。」
    が出てしまいました。
    申し訳ございませんがお願い申し上げます

    キャンセル

  • 2018/04/03 08:49 編集

    バグフィックスできてなくてすみませんでした。

    開いた曲で「再生しようとしているファイルの拡張子(.)が
    ファイル形式と一定しません。」というエラーですが、
    色々試した結果、
    1、再生しようとしたファイルが、元々.mp3の規格でないものを.mp3にしたファイルだった時(変換ソフトを使用しないで手動で拡張子を変えた場合)
    2、中身のない.mp3を再生した時(曲の長さが0秒)
    3、.mp3以外のものを取り込んで再生した時(画像データなど)
    4、1~3のものを再生しようとしエラーを表示させた後、別のファイルを再生しようとした時

    以上の場合にそのエラーが発生する可能性が高いことが分かりました(発生しないこともあったため、確証はありません)。

    以下のリンクにて、ファイルの拡張子が正しいものか判断できるようなフリーソフトを紹介していましたので参考にしてください。

    [参考サイト](https://oshiete.goo.ne.jp/qa/1827445.html)

    コードの方を少し修正しましたので、確認よろしくお願いします。

    キャンセル

0

詳しい内容ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる