前提・実現したいこと
私は現在.NET Frameworkを使用してc#で簡単なサウンドプレイヤーを作成しています。
今回は作成途中に以下の問題が発生しているのでどうすればいいか分からず困っています。
実現したいことは、項目を選択した後、再生・停止ボタンをクリックしてもラベルの内容が変更されず、選択した音楽ファイルが正しく再生されるようにすることです。まだまだ初心者の私ですが、教えていただければ幸いです。
###発生する問題
リストボックスの中身を2つ以上にした時に,どれか1つの項目を選択するとラベルには選択した項目のファイルの名前が表示される。しかし、再生・停止ボタンをクリックすると、ラベルにリストボックスの最後の項目のファイルの名前が表示され、リストボックスの最後の項目の音楽ファイルが再生されてしまう。
<コンパイルしたファイルを実行したときの状態>
'a.wav'がデフォルトで表示されている
<'b.wav'をクリックし選択したときの状態>
'b.wav'(選択した項目の名前)が正しく表示されている
<'再生'ボタンをクリックしたときの状態>
'b.wav'を選択していたのに勝手に'c.wav'になりc.wavの音楽ファイルが再生されてしまう
ソースコード
Formクラスを使用し、以下のようにソースコードを書きました。
//コード using System; using System.Windows.Forms; class part05 { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Player()); } } class Player : Form { Label label = new Label(); ListBox listbox; Button Play; Button Stop; System.Media.SoundPlayer soundplayer; string[] paths; string[] safepaths; public Player() { label.Location = new Point(115, 20); label.AutoSize = true; this.FormBorderStyle = FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.Size = new Size(750, 600); this.Location = new Point(100, 50); soundplayer = new System.Media.SoundPlayer(); paths = new string[]{ /*音楽ファイルのパス*/ }; listbox = new ListBox(){ Location = new Point(375, 10), Size = new Size(300, 500), DrawMode = DrawMode.OwnerDrawFixed, }; safepaths = new string[]{ /*音楽ファイルの名前*/ }; listbox.Items.AddRange(safepaths); listbox.DrawItem += new DrawItemEventHandler(DrawPlaylist); this.Controls.Add(listbox); this.Controls.Add(label); Play = new Button(){ Location = new Point(20, 50), Text = "再生", }; Play.Click += new EventHandler(PlayClick); Stop = new Button(){ Location = new Point(100, 50), Text = "停止",}; Stop.Click += new EventHandler(StopClick); this.Controls.AddRange(new Control[]{ Play, Stop } ); } void DrawPlaylist(object sender, DrawItemEventArgs e){ e.DrawBackground(); string text = (sender as ListBox).Items[e.Index].ToString(); Brush fb = new SolidBrush(e.ForeColor); e.Graphics.DrawString(text, e.Font, fb, e.Bounds); e.DrawFocusRectangle(); PlaySoundChange(e.Index, text); } void PlaySoundChange(int index, string text){ soundplayer.Stop(); //X Console.WriteLine(index); label.Text = text; soundplayer.SoundLocation = paths[index]; soundplayer.Load(); } void PlayClick(object sender, EventArgs e){ soundplayer.Play(); } void StopClick(object sender, EventArgs e){ soundplayer.Stop(); } }
試したこと
リストの項目が3つのときにPlaySoundChange()のXの部分に、'Console.WriteLine(index);' を記述し、実行しました。結果は次のようになりました。
0
0
0
0
0
0
0
1
2
0 <<実行した瞬間にここまで表示された
0
0
0
0 <<1つ目の項目を選択した瞬間にここまで表示された
0
1
2 <<再生ボタンをクリックした瞬間にここまで表示された
自分でもググって調べて見たのですが、初心者の私にはどのサイトがこの現象について書かれているのかが分かりませんでした。自分が分かったのは、再生ボタンをクリックすると最終的にe.Indexの部分が最大の数になるということだけでした。回避方法として2回連続でe.Indexが同じ値だったときだけPlaySoundChange()を呼び出すという方法も思いつきましたが、もっと簡単に実装できる方法がないか知りたいです。
補足情報
C:/Windows/Microsoft.NET/Framework\v4.0.30319\csc.exeを利用してコンパイルしています。
Visual Studio は使用していません。
回答2件
あなたの回答
tips
プレビュー