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

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

ただいまの
回答率

89.85%

プレイリストがうまく行けなくなりました。

解決済

回答 2

投稿 編集

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

退会済みユーザー

前回質問させていただいた物です。
すいません、実は去年から作ってたものですが
プレイリストがうまくいけなくなりました。

原因

1、プレイリストは再生出来る
2、リストボックスから選択しても一番上になる

ソースコード

form1
 Dim strFileName As String
  Private Sub Playlists_Click(sender As Object, e As EventArgs) Handles playlists.Click
 AxWindowsMediaPlayer1.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

        End If
’1
        For Each strFilePath As String In OpenFileDialog1.FileNames
            strFileName = IO.Path.GetFileName(strFilePath)
            ListBox2.Items.Add(strFileName)

     AxWindowsMediaPlayer1.currentPlaylist.appendItem(AxWindowsMediaPlayer1.newMedia(strFilePath))
        Next
        TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)

    End Sub
 Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
        Try
’2
            For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1
                If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then
                    ListBox2.SelectedIndex = Str(i)
’ここまで
                End If
            Next
            MetroProgressbar1.Value = 0
        Catch ex As Exception
        End Try

        Select Case e.newState
            Case WMPLib.WMPPlayState.wmppsPlaying '再生中
                TextBox3.Text = AxWindowsMediaPlayer1.currentMedia.durationString
               Timer3.Start()
                title.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Title")
                artist.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Artist")
                Albam.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Album")
                Janru.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Genre")
                MetroProgressbar1.Maximum = AxWindowsMediaPlayer1.currentMedia.duration
                MetroProgressbar1.Value = 0
            Case e.newState = WMPLib.WMPPlayState.wmppsMediaEnded '再生終了
                Timer3.Stop()
                MetroProgressbar1.Value = 0
            Case WMPLib.WMPPlayState.wmppsMediaEnded
                ' 再生が全て終了した時()
                AxWindowsMediaPlayer1.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
’3
            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)
        End If
    End Sub
end crass

試した結果

’1,2では問題なく再生出来るんです。
ただ、3の方に
AxWindowsMediaPlayer1.URL=listbox2.selectedIndex

AxWindowsMediaPlayer1.URL=strFileName As(listbox2.selectedIndex)
など追加して試してみてもできませんでした。

解決したい事

恐れ入りますが申し訳ございません。
listboxから曲を選択後、再生出来るようにしたい事
一曲目が終わり後に次の曲に再生

申し訳ございませんお願い申し上げます。
使っている環境は前回と同じVistula Studio 2017 VBです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

Imports System.IO
Imports System
Imports WMPLib

Public Class Music00b

    Dim IntSelectIndexPre As Integer = 0

    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
        'AxWindowsMediaPlayer1.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
        MetroProgressbar1.Value = 0
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer1.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(AxWindowsMediaPlayer1.currentMedia.duration.ToString, 0)


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

        current = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition

        MetroProgressbar1.Value = current
        MetroProgressbar1.Maximum = length

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

    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
        TextBox2.Text = TimeSpan.FromSeconds(AxWindowsMediaPlayer1.Ctlcontrols.currentPosition).ToString("mm\:ss")
    End Sub

    Dim Open00a() As String
    'Dim Open00a As String()
    Dim file As String()


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

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

        AxWindowsMediaPlayer1.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
        AxWindowsMediaPlayer1.Ctlcontrols.pause()
    End Sub

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

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

        lb2.Text = "" & HScrollBar1.Value
    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
            AxWindowsMediaPlayer1.Ctlcontrols.previous()
            AxWindowsMediaPlayer1.Ctlcontrols.play()
            MetroProgressbar1.Value = 0
            Timer1.Start()
            Timer2.Start()

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

    End Sub

    Dim strFileName As String
    Dim ListMusicPath As String

    Private Sub Playlists_Click(sender As Object, e As EventArgs) Handles playlists.Click
        AxWindowsMediaPlayer1.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

        End If
        '1
        For Each strFilePath As String In OpenFileDialog1.FileNames
            strFileName = IO.Path.GetFileName(strFilePath)

            ListBox2.Items.Add(strFileName)

            AxWindowsMediaPlayer1.currentPlaylist.appendItem(AxWindowsMediaPlayer1.newMedia(strFilePath))
        Next
        TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)

    End Sub
    Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
        Try
            '2
            For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1
                If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then
                    'ListBox2.SelectedIndex = Str(i)
                    'ここまで
                End If
            Next
            MetroProgressbar1.Value = 0
        Catch ex As Exception
        End Try

        Select Case e.newState
            Case WMPLib.WMPPlayState.wmppsPlaying '再生中
                TextBox3.Text = AxWindowsMediaPlayer1.currentMedia.durationString
                Timer3.Start()
                title.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Title")
                artist.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Artist")
                Albam.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Album")
                Janru.Text = AxWindowsMediaPlayer1.currentMedia.getItemInfo("Genre")
                MetroProgressbar1.Maximum = AxWindowsMediaPlayer1.currentMedia.duration
                MetroProgressbar1.Value = 0
            Case e.newState = WMPLib.WMPPlayState.wmppsMediaEnded '再生終了
                Timer3.Stop()
                MetroProgressbar1.Value = 0
            Case WMPLib.WMPPlayState.wmppsMediaEnded
                ' 再生が全て終了した時()
                AxWindowsMediaPlayer1.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
            '3

            TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)

            If IntSelectIndexPre = ListBox2.SelectedIndex Then
                Exit Sub
            End If
            IntSelectIndexPre = ListBox2.SelectedIndex

            AxWindowsMediaPlayer1.Ctlcontrols.playItem(AxWindowsMediaPlayer1.currentPlaylist.Item(ListBox2.SelectedIndex))
            AxWindowsMediaPlayer1.Ctlcontrols.play()

        End If
    End Sub
End Class

こんな感じだと思う...
あ、答え出てた...

たぶん
AxWindowsMediaPlayer1.Ctlcontrols.playItem(AxWindowsMediaPlayer1.currentPlaylist.Item(ListBox2.SelectedIndex))
を追加するだけでいいはず

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/05 18:44

    syameimaruさん
    コードを追加したものです。

    ```
    Dim IntSelectIndexPre As Integer = 0
    Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
    If ListBox2.SelectedItem <> "" Then
    TextBox1.Text = System.IO.Path.GetFileName(ListBox2.SelectedItem)

    If IntSelectIndexPre = ListBox2.SelectedIndex Then
    Exit Sub
    End If
    IntSelectIndexPre = ListBox2.SelectedIndex AxWindowsMediaPlayer1.Ctlcontrols.playItem(AxWindowsMediaPlayer1.currentPlaylist.Item(ListBox2.SelectedIndex))
    AxWindowsMediaPlayer1.Ctlcontrols.play()

    End If
    End Sub
    End Class
    ```
    無事解決いたしました。
    ありがとうございました。

    キャンセル

0

現状ですと、AxWindowsMediaPlayer1.currentPlaylistとlistbox2に情報があるかと思います。
listbox2にはファイル名の情報はありますが、パス情報がない為、ここの情報だけでは再生できません。
そして、AxWindowsMediaPlayer1.currentPlaylistとlistbox2の内容は連動するように作成されていると
思います。
ですので、listbox2で選択された項目のindexを取得し、currentPlaylistからそのindexの内容を取得、再生する形になるかと思います。

Controls.playItem
Playlist.item
を参照してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/05 18:46

    YAmaGNZさん
    回答ありがとうございます。
    確かにその通りでした。
    参考通り無事解決することが出来ました
    ありがとうございました。

    キャンセル

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

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