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

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

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

Re[5]: 音楽プレイヤーでNextとpreviousがリスト繰り返す


(過去ログ 176 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■101270 / inTopicNo.1)  音楽プレイヤーでNextとpreviousがリスト繰り返す
  
□投稿者/ アリノ (1回)-(2023/01/26(Thu) 23:55:57)

分類:[.NET 全般] 

VB.NET初心者です。
初めまして
VistualStudio2022で音楽プレイヤーを作っています。

「質問内容」
・1、axwindowsMediaPlayerを使っております。
・2、リストボックスでNextとpreviousのボタンを作りました。
リストボックスに音楽ファイルを開き、Nextを押すとリストボックスが最初の1曲目に、previousを押すと一番目になって、一番最後になる現状となっております。
検索などでググって作りました。

「問題となるコード」
MusicAというフォームを作成しました。
Public Class MusicA
Dim strFileName As String 'ファイルを開くとリストボックスに名前が表示される(フルパスではない)

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        AxWindowsMediaPlayer1.settings.autoStart = False
        OpenFileDialog1.FileName = ""
        OpenFileDialog1.Multiselect = True
        OpenFileDialog1.Title = "開くファイルを指定"
        OpenFileDialog1.Filter =
          "Windows Media Audio 形式(.mp3|*.mp3")
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            For Each strFilePath As String In OpenFileDialog1.FileNames
                strFileName = IO.Path.GetFileName(strFilePath)
                ListBox1.Items.Add(strFileName)
                AxWindowsMediaPlayer1.currentPlaylist.appendItem(AxWindowsMediaPlayer1.newMedia(strFilePath))
            Next
            LabelTitle.Text = System.IO.Path.GetFileName(ListBox1.SelectedItem)
            Timer1.Start()
            Timer2.Start()
            ListBox1.SelectedIndex = 0
        End If
    End Sub

ファイルを開く時のコードです。

'リストボックス一覧、繰り返す(index0に戻る)
    Private Sub NextButton_Click(sender As Object, e As EventArgs) Handles NextButton.Click

        If ListBox1.Items.Count >= ListBox1.SelectedIndex + 1 Then
            ListBox1.SelectedIndex -= 1
            AxWindowsMediaPlayer1.Ctlcontrols.next()
            AxWindowsMediaPlayer1.Ctlcontrols.play()
            MetroProgressbar1.Value = 0

        Else
            If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsMediaEnded Then
                MessageBox.Show("曲がありません",
                   "エラー",
                   MessageBoxButtons.OK,
                   MessageBoxIcon.Asterisk)
                AxWindowsMediaPlayer1.Ctlcontrols.stop()
            End If
        End If
    End Sub
    Private Sub PreviousButton_Click(sender As Object, e As EventArgs) Handles previousButton.Click
        If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsMediaEnded Then
            Exit Sub
        End If
        If ListBox1.Items.Count >= ListBox1.SelectedIndex - 1 Then
            ListBox1.SelectedIndex += 1
            AxWindowsMediaPlayer1.Ctlcontrols.previous()
            AxWindowsMediaPlayer1.Ctlcontrols.play()
            MetroProgressbar1.Value = 0
        Else
            If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsMediaEnded Then
                MessageBox.Show("曲がありません",
                   "エラー",
                   MessageBoxButtons.OK,
                   MessageBoxIcon.Asterisk)
                AxWindowsMediaPlayer1.Ctlcontrols.stop()
            End If
        End If
    End Sub
現在のコードになります。

Nextとpreviousのボタンです。

「試した事」
リストボックスにファイルを開いた時、再生してからNextとpreviousを押すと(複数開いた数)一番最後でNext押すと1番目に戻ります。
previousを押すと一番目に行って一番最後になります。

「やりたい事」
Next        リストの最後で止まる、停止(メッセージボックス("曲がありません")したい
previous    リストの一番目で止まる&停止したい

やりたい事は上記になります。
教えてください。お願いします。

引用返信 編集キー/
■101271 / inTopicNo.2)  Re[1]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ 伝説のカレー (66回)-(2023/01/27(Fri) 10:07:23)
No101270 (アリノ さん) に返信

> If ListBox1.Items.Count >= ListBox1.SelectedIndex - 1 Then

この条件が怪しい気がします
仮にリストボックスのアイテム数が3だとした場合
SelectedIndexは0〜2の値を取ると思うんですよ

リストの最後で
If 3 >= 1 Then
になり

リストの最後の次で
If 3 >= 2 Then
になりますからTrueになっちゃいます

If ListBox1.SelectedIndex < ListBox1.Items.Count Then

こんな感じでいんじゃないですかね
引用返信 編集キー/
■101272 / inTopicNo.3)  Re[2]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ アリノ (2回)-(2023/01/27(Fri) 14:08:05)
2023/01/27(Fri) 15:05:58 編集(投稿者)
2023/01/27(Fri) 15:05:57 編集(投稿者)
2023/01/27(Fri) 15:05:55 編集(投稿者)

No101271 (伝説のカレー さん) に返信
> ■No101270 (アリノ さん) に返信

> この条件が怪しい気がします
> 仮にリストボックスのアイテム数が3だとした場合
> SelectedIndexは0〜2の値を取ると思うんですよ
>
> リストの最後で
> If 3 >= 1 Then
> になり
>
> リストの最後の次で
> If 3 >= 2 Then
> になりますからTrueになっちゃいます
>
> If ListBox1.SelectedIndex < ListBox1.Items.Count Then
>
> こんな感じでいんじゃないですかね

伝説のカレー さん、回答ありがとうございます。

NEXTボタンの方は解決しました。あともう一つ

previousボタンで一番目でエラーと一番最後にいっちゃいます。

If ListBox1.SelectedIndex < ListBox1.Items.Count -1 Then '+1に変更しても変わりませんでした。
ListBox1.SelectedIndex += 1 '←ここでエラーになる -1に変更すると一番最後に行き、停止する =0にするとリストが繰り返す
AxWindowsMediaPlayer1.Ctlcontrols.previous()
End If

System.ArgumentOutOfRangeException: ''4' の InvalidArgument=Value は 'SelectedIndex' に対して有効ではありません。
パラメーター名:SelectedIndex

と出ます。

4番目にprevious押すと上記のようにエラー出ます。4個のファイルを開いてます。
nextと同じく最後で停止するようにpreviousも同様、1番目で停止するには何処の部分(コード)を変更するとできますでしょうか。?


デバッグで一つ、一つ確認はしています。

再び申し訳ございません。
よろしくお願いいたします。
引用返信 編集キー/
■101273 / inTopicNo.4)  Re[3]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ 魔界の仮面弁士 (3548回)-(2023/01/27(Fri) 14:46:17)
No101272 (アリノ さん) に返信
> If ListBox1.SelectedIndex < ListBox1.Items.Count -1 Then '+1に変更しても変わりませんでした。

そこで「+1」を試した根拠は何でしょうか?
SelectedIndex は常に、「-1 以上」かつ「.Items.Count - 1 以下」であることが保証されていますよね。


> ListBox1.SelectedIndex += 1 '←ここでエラーになる -1に変更すると一番最後に行き、停止する =0にするとリストが繰り返す

NextButton で「最後まで来たら止める」にしたいなら
 If ListBox1.SelectedIndex = ListBox1.Items.Count - 1 Then
  '最終項目が選択されている
 Else
  'まだ最後ではない
 End If
と判断できますし、PreviousButton で「先頭だったら止める」のなら
 If ListBox1.SelectedIndex <= 0 Then
  '先頭項目が選択されている
 Else
  'まだ先頭ではない
 End If
となるでしょう。


>> Next リストの最後で止まる、停止(メッセージボックス("曲がありません")したい
どのタイミングでメッセージを出したいのでしょうか?

(1) NextButton によって最後の曲が流れたら、曲が終わったところでメッセージボックスを表示
(2) 最後の曲が選択されているときに NextButton を再度押したら、メッセージボックスを表示



> デバックで一つ、一つ確認はしています。
デバック ではなく
デバッグ です。

不具合のことを bug (バグ)と呼び、
それを取り除く作業が debug (デバッグ) です。
引用返信 編集キー/
■101274 / inTopicNo.5)  Re[4]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ アリノ (3回)-(2023/01/27(Fri) 15:51:34)
No101273 (魔界の仮面弁士 さん) に返信
No101271 (伝説のカレー さん) に返信
> ■No101272 (アリノ さん) に返信
魔界の仮面弁士 さん回答ありがとうございます。

>>If ListBox1.SelectedIndex < ListBox1.Items.Count -1 Then '+1に変更しても変わりませんでした。
>
> そこで「+1」を試した根拠は何でしょうか?
デバッグで一つずつ確認をした為です。

>> Next リストの最後で止まる、停止(メッセージボックス("曲がありません")したい
>>どのタイミングでメッセージを出したいのでしょうか?

Next リストの最後で止まる、停止
previous リストの一番目で止まる&停止したい事です。

ご指導いただきありがとうございました。

伝説のカレー さん、魔界の仮面弁士 さん
無事やりたい事が出来た為、解決しました。





解決済み
引用返信 編集キー/
■101275 / inTopicNo.6)  Re[3]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ 伝説のカレー (67回)-(2023/01/27(Fri) 16:04:18)
あ、私はNextとPreviousを間違えてました、申し訳ないです

ソースコードを眺めてたら混乱してきました

曲が3つだった場合

リストボックスの0番目: 最初の曲
リストボックスの1番目: 2つ目の曲
リストボックスの2番目: 最後の曲

で良いですよね?

Nextは

If ListBox1.SelectedIndex + 1 < ListBox1.Items.Count Then
    ListBox1.SelectedIndex += 1;

Previousは

If 0 < ListBox1.SelectedIndex Then
    ListBox1.SelectedIndex -= 1;

でいんじゃないかなと思います

引用返信 編集キー/
■101276 / inTopicNo.7)  Re[5]: 音楽プレイヤーでNextとpreviousがリスト繰り返す
□投稿者/ 伝説のカレー (68回)-(2023/01/27(Fri) 16:05:00)
はわー解決してたー重ね重ね申し訳ない
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -