オープンファイルダイアログで開いた音楽ファイルの名前をListBoxに表示する方法 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 neptune  (社会人) 投稿日時 2011/2/14 14:28:05
ものすごく大雑把な流れですけど、一体何がわからないのですか?

どうも、最初から読んでいると、ご自分でほとんどコードを書いてないようですが。。。

自分のやりたいことに使っているコントロールの1つ1つのhelpもみましょう。

取り敢えず、Listboxの使い方を理解しましょう。・・これは知らないものを使う時、基本です。
h ttp://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox(v=VS.80).aspx
をよく読んだら時間はかかりますがなんとなくわかりますし、実験しながら読むともっと
よくわかります。

>2、表示させた音楽ファイルをダブルクリックしたら再生されるようにする。
はdoubleclickイベントの時に、
・選択されているファイル名を取得
・再生処理
すればよいだけですから、listboxの基本的な使い方を理解すれば、これまで頂いているソースのごく簡単な応用でできますよ。

さらに言うとこのサイトでは
ht tp://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm
に丁寧なサンプルも書いてくれてますから、このサンプルを利用させて頂かない手はありません。
投稿者 友哉  (高校生) 投稿日時 2011/2/14 14:02:18
shuさん同じです。
すいません間違えて漢字に変換してしまいましたorz
読み返してみます。

パールマンさん
全体の流れは、
1、リストボックスに音楽ファイルが入っているファイルを表示させる。
2、表示させた音楽ファイルをダブルクリックしたら再生されるようにする。
3、音楽ファイルをえらんで再生ボタンをクリックしたら再生するようにする。
4、停止ボタンを押せば再生している音楽が停止する。

全体の流れです。
投稿者 shu  (社会人) 投稿日時 2011/2/14 07:46:32
名前が漢字になっているけど最近のいくつかのスレと
同じ方ですよね?

たぶんわからないのはファイル名のフルパスを渡すところかと
思うのですが、OpenFileDialogで取得して再生出来たときのファイル名と
リストボックスから再生しようとしたときに再生出来ないファイル名の違いを
比較して一覧のスレの内容をよく読み返してみてはどうでしょう?
投稿者 パールマン  (社会人) 投稿日時 2011/2/14 00:55:18
友哉さんが作っていらっしゃるものが、実用のソフトウェアのものなのか習作なのかは判りませんが、少なくても‘仕様’を決めましょう。

この掲示スレッドの冒頭に、
>
> 開いたmp3のファイル名をListBoxに表示して表示したmp3ファイルをダブルクリックしたら
> 音楽が再生するようにしたいです。
>

とあって、
最新の返信には、

>
> リストボックスに表示させた曲を選んでボタン1をクリックすると再生するようにしたいです。
>

と書かれています。

これではアドバイスする皆さんも、困ってしまいます。
‘仕様’という表現が難しいようでしたら、まず‘全体の流れ’を考えてください。

音楽ソースがあって、誰が何時何をどのように操作したら再生されるのか。
ソフトウェアに音楽ソースが呼ばれる:これがインプットです。
ソフトウェアによって、スピーカなど出力デバイスから音楽が流れるのがアウトプットです。
インプットからアウトプットまでの順序が流れです。
投稿者 友哉  (高校生) 投稿日時 2011/2/13 18:46:14
るきおさんのおかげでリストボックスに曲を表示させることは出来ました。
リストボックスに表示させた曲を選んでボタン1をクリックすると再生するようにしたいです。
投稿者 るきお  (社会人) 投稿日時 2011/2/13 18:08:11
>開いたmp3のファイル名をListBoxに表示
これもできてないですか?

何ができていて、何ができていなくて、何をききたいかはっきりさせましょう。
…とYuOさんも言っております。

ListBoxに表示させる件は私ならこう書きます。

  
Private Sub Mp3形式ToolStripMenuItem_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Mp3形式ToolStripMenuItem.Click

    Dim dialog As New FolderBrowserDialog

    If dialog.ShowDialog = Windows.Forms.DialogResult.OK Then
        For Each FilePath As String In IO.Directory.GetFiles(dialog.SelectedPath, "*.mp3")
            ListBox1.Items.Add(IO.Path.GetFileName(FilePath))
        Next
    End If

    dialog.Dispose()

End Sub
投稿者 YuO  (社会人) 投稿日時 2011/2/13 12:35:37
どうも,やりたいことをちゃんと分解できていないように見えます。

> 開いたmp3のファイル名をListBoxに表示して表示したmp3ファイルをダブルクリックしたら
> 音楽が再生するようにしたいです。
やりたいことは分解して箇条書きで書くようにしてはどうでしょうか。
今回だと,
・OpenFileDialogを使ってファイル名を得る
・ListBoxにオブジェクトを追加して表示する
・ListBoxのダブルクリックイベントへ応答する
・ListBoxから選択中のオブジェクトを取得する
・指定したファイルを再生する
の5つができればよいわけです。

最初の項目が出来ていて,最後の項目が出来かけなわけですが,残り3つの項目はどこまで解っていますか。
最後の項目が出来かけ,というのはFileNameフィールドを使っているためです。
これでは最後に開いたファイルしか開けません。
FileNameフィールドを使わないようにしてみてください。

References)
MSDN: ListBox.Items プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.items.aspx
MSDN: ListBox.ObjectCollection.Add メソッド (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.objectcollection.add.aspx
MSDN: Control.DoubleClick イベント (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.doubleclick.aspx
MSDN: ListBox.SelectedItem プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.selecteditem.aspx
MSDN: ListControl.DisplayMember プロパティ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listcontrol.displaymember.aspx
投稿者 友哉  (社会人) 投稿日時 2011/2/13 02:32:10
オープンファイルダイアログで開いたmp3ファイルを再生することは出来ました。

開いたmp3のファイル名をListBoxに表示して表示したmp3ファイルをダブルクリックしたら
音楽が再生するようにしたいです。

現在はファイルを開いて再生ボタンを押せば再生され、音楽が進むにつれHScrollBarが自動的に進んでいくようにしています。

HScrollBarは動かせばその時間帯の音楽が流れます。

言葉じゃよくわからないのでコードを載せます。

前ここの掲示板で教えてもらったコードです。

Imports System.Runtime.InteropServices
Imports System.Text
Imports System.IO

Public Class Form1

    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function mciSendString( _
        ByVal command As String, _
        ByVal buffer As StringBuilder, _
        ByVal bufferSize As Integer, _
        ByVal hwndCallback As IntPtr) As Integer
    End Function

    Dim FileName As String
    Private Sub Mp3形式ToolStripMenuItem_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Mp3形式ToolStripMenuItem.Click
      
        Me.OpenFileDialog1.Filter = "MP3形式サウンド(*.mp3)|*.mp3"
        Me.OpenFileDialog1.InitialDirectory = Application.StartupPath
        If Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            FileName = Me.OpenFileDialog1.FileName
            Me.ListBox1.Text = Path.GetFileName(FileName)
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        If File.Exists(FileName) Then
            Dim Command As String
            Command = String.Format("open ""{0}"" alias {1}", FileName, "MySound")
            mciSendString(Command, Nothing, 0, IntPtr.Zero)
            Command = String.Format("status {0} {1}""MySound""length")
            Dim Res As New StringBuilder(256)
            mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
            HScrollBar1.Maximum = Integer.Parse(Res.ToString)
            Command = "play MySound"
            mciSendString(Command, Nothing, 0, IntPtr.Zero)
            Me.Timer1.Interval = 500
            Me.Timer1.Start()
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()
        Dim Command As String
        Command = String.Format("stop {0}""MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = String.Format("close {0}""MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Command As String = String.Format("status {0} {1}""MySound""position")
        Dim Res As New StringBuilder(256)
        mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
        Me.HScrollBar1.Value = Integer.Parse(Res.ToString)
    End Sub

    Private Sub HScrollBar1_Scroll(ByVal sender As ObjectByVal e As System.EventArgs) Handles HScrollBar1.Scroll
        Dim HScrollBar1 As HScrollBar = DirectCast(sender, HScrollBar)
        Dim Command As String
        Command = String.Format("seek {0} to {1}""MySound", HScrollBar1.Value)
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = String.Format("play {0}""MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
    End Sub


このコードに付け足してもらったり修正して頂きたいです。