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

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

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

Re[6]: メディアプレイヤーでClearした時にエラーが出ます。


(過去ログ 171 を表示中)

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

■98576 / inTopicNo.1)  メディアプレイヤーでClearした時にエラーが出ます。
  
□投稿者/ アン (7回)-(2021/12/04(Sat) 18:08:44)

分類:[.NET 全般] 

こんばんは。

メディアプレイヤーで再生中にClearボタンを押すとエラーがでます。

エラー名
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'

コード名

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
        Try
            Dim i As Integer
            For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1
                ’ここでエラーメッセージ出ます。’A
                If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then
                    ListBox1.SelectedIndex = Str(i)

                End If
            Next

            MetroProgressbar1.Value = 0
        Catch ex As Exception

        End Try
'省略
end sub

原因は
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        '全てクリアされる
AxWindowsMediaPlayer1.Ctlcontrols.stop()
        AxWindowsMediaPlayer1.currentPlaylist.clear()’←原因はこれなんです。
'これがあるとエラーになる
’コメントアウトしてみるとエラーはでません。
’Clearされていない。
end sub

1,ファイルを開き、そのまま再生しないでClearは出来ました。
2,ファイルを開き、再生した後、Clear押すとAでインスタンスに設定されていませんというメッセージが出ます。
AxWindowsMediaPlayer1.currentPlaylist.clear()でClearしたい場合、すいませんが
教えてください。よろしくお願いいたします。

環境:Visual Studio 2022 VB.NETです。

引用返信 編集キー/
■98580 / inTopicNo.2)  Re[1]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ ロッテモナ王 (2回)-(2021/12/05(Sun) 00:52:44)
No98576 (アン さん) に返信

currentMediaがnullか、もしくは、currentPlaylistがnullなのだと思います

currentPlaylistがnullだと仮定するとこの行でエラーになるはず
> For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1

しかし、この行ではエラーになってないので仮定は誤りと考えるとcurrentMediaがnullなんじゃないですかね

nullチェックを入れれば良いと思います
引用返信 編集キー/
■98581 / inTopicNo.3)  Re[2]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ アン (9回)-(2021/12/05(Sun) 16:02:38)
No98580 (ロッテモナ王 さん) に返信
> ■No98576 (アン さん) に返信

回答ありがとうございます。
> currentPlaylistがnullだと仮定するとこの行でエラーになるはず
>>For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1
すいません下のコードです。
If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then

デバックで「続行」を押すとClearされたメッセージは出ます。

詳細
System.NullReferenceException
HResult=0x80004003
Message=オブジェクト参照がオブジェクト インスタンスに設定されていません。
Source=Music_Player
スタック トレース:
at Music_Player.Form1.AxWindowsMediaPlayer1_PlayStateChange(Object sender, _WMPOCXEvents_PlayStateChangeEvent e) in パス

次からスローされた場合を除くにチェック入れた所「出力」に
例外がスローされました: 'System.NullReferenceException' (***.exe の中)
と出ます。

1,ファイル開いてそのままClearするだけならスローされました…は出ません。
2,ファイルを再生後、Clearボタンを押すとスローされました…が出ます。

どうしたら解決するんでしょうか?


引用返信 編集キー/
■98582 / inTopicNo.4)  Re[3]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ ロッテモナ王 (3回)-(2021/12/05(Sun) 18:13:07)
No98581 (アン さん) に返信

> If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then

この行のオブジェクトのどれかがnullなので、まずはそれを特定するのが良いと思います
デバッガで確認するなり

Debug.WriteLine(AxWindowsMediaPlayer1.currentMedia)
こういったデバッグプリントを一時的に仕込むなりで確認できるんじゃないかと思います

nullになってるオブジェクトを特定したうえで、そのオブジェクトがnullになってるのが正しい動作ならば

If とあるオブジェクト IsNot Nothing Then
……
End If

みたいに条件を追加すれば良いです
引用返信 編集キー/
■98583 / inTopicNo.5)  Re[3]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ くま (35回)-(2021/12/05(Sun) 18:48:20)
アンさん落ち着いて、ロッテモナ王さんの回答をよく読んでください。
1. System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'
が発生する可能性がある所は2カ所
  a. AxWindowsMediaPlayer1.currentPlaylist
  b. AxWindowsMediaPlayer1.currentMedia

2. エラーが発生した箇所が
If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then
なので その前で正常に通過したa.の可能性がなくなる。

3. よって
  b. AxWindowsMediaPlayer1.currentMedia
に対して null判定を行えばよいのでは?
と発言されています。

それを踏まえて修正するなら以下の通り

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
        If AxWindowsMediaPlayer1.currentMedia IsNot Nothing Then    '←追加
          Try
                Dim i As Integer
                For i = 0 To AxWindowsMediaPlayer1.currentPlaylist.count - 1
                    ’ここでエラーメッセージ出ます。’A
                    If AxWindowsMediaPlayer1.currentMedia.isIdentical(AxWindowsMediaPlayer1.currentPlaylist.Item(i)) Then
                        ListBox1.SelectedIndex = Str(i)
                    End If
                Next
                MetroProgressbar1.Value = 0
           Catch ex As Exception
           End Try
        End If     '←追加
'省略
end sub

これで「エラー」は発生しません。

で理由は
AxWindowsMediaPlayer1.currentPlaylist.clear();
これが何をするかというと「MediaPlayer」で現在使用しているプレイリストを削除(クリア)します。
そうするとリストがないので当然何のメディアを再生している(いたか)は不明となります。
そうなれば、AxWindowsMediaPlayer1.currentMediaも現在のメディアは不明の為null(Nothing)になりますよね。

なぜstop()の後にclear()しているのかはアンさんのプログラムの仕様の話なので
判断できませんのでそれに合わせて修正してみてください。

引用返信 編集キー/
■98584 / inTopicNo.6)  Re[4]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ くま (36回)-(2021/12/05(Sun) 18:49:27)
ロッテモナ王 さん 失礼しまいた。
回答が被ってしまって申し訳ないです。

引用返信 編集キー/
■98585 / inTopicNo.7)  Re[5]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ ロッテモナ王 (4回)-(2021/12/05(Sun) 19:17:22)
全然かまわないですよ、みんなであーでもないこーでもないと言うのが掲示板の醍醐味だったりするじゃないですか
引用返信 編集キー/
■98586 / inTopicNo.8)  Re[6]: メディアプレイヤーでClearした時にエラーが出ます。
□投稿者/ アン (10回)-(2021/12/05(Sun) 19:58:13)
No98585 (ロッテモナ王 さん) に返信
くまさん、ロッテモナ王さん

指示通り修正した所エラーも無くなりました。

解決しましたので、ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -