2

WAVファイルを閲覧・再生するフォームアプリケーションをまとめようとしています。現在、2 つのボタンがあります。1 つは WAV を参照して選択するためのもので、もう 1 つは再生するためのものです。参照ボタンを実装しましたが、問題なく動作しています。ご覧のとおり、ボタン内で WAV サウンドを再生して確認しました。

private void Browse_Click(object sender, EventArgs e) {
    OpenFileDialog tarik = new OpenFileDialog();
    tarik.Title = "Browse...";
    tarik.InitialDirectory = @"Desktop";
    tarik.Filter = "Wav files (*.wav)|*.wav";
    tarik.RestoreDirectory = true;
    if (tarik.ShowDialog() == DialogResult.OK) {
        textBox1.Text = tarik.FileName;
        Stream tarik2 = tarik.OpenFile();
        SoundPlayer snd = new SoundPlayer(tarik2);
        snd.Play();
    }
}

私はコードをテストし、動作していますが、別のボタンから 'tarik' を呼び出そうとすると:

private void Play_Click(object sender, EventArgs e) {}

上記のように、これを行うことは許可されていません。

4

3 に答える 3

3

ブラウズ ハンドラーで作成する変数はローカル変数であり (そうあるべきです)、メソッドが終了すると (存在しないため) アクセスできません。

他のメソッドがアクセスできるようにするには、オブジェクトの存続期間全体にわたって存在するインスタンス フィールドを作成する必要があります。

//new instance field.
private string tarikFileName;

private void Browse_Click(object sender, EventArgs e)
{
    OpenFileDialog tarik = new OpenFileDialog();
    tarik.Title = "Browse...";
    tarik.InitialDirectory = @"Desktop";
    tarik.Filter = "Wav files (*.wav)|*.wav";
    tarik.RestoreDirectory = true;
    if (tarik.ShowDialog() == DialogResult.OK) {
        //store value in instance field
        tarikFileName = tarik.FileName;
        textBox1.Text = tarik.FileName;
        Stream tarik2 = tarik.OpenFile();
        using(SoundPlayer snd = new SoundPlayer(tarik2))
            snd.Play();
    }
}

private void Play_Click(object sender, EventArgs e)
{
    if(tarikFileName != null)
    {
        Stream stream = File.OpenRead(tarikFileName);
        using(SoundPlayer snd = new SoundPlayer(stream))
            snd.Play();
    }
}

また、SoundPlayerは使い終わったら破棄する必要があるので、それがusing確実に行われるようにブロックでラップしました。

于 2013-03-11T14:49:24.007 に答える
1

2 つのメソッド間でデータを共有するには、参照を保存する場所が必要です。あなたの場合、からファイル名を取得することをお勧めしますtextBox1.Text。そうすれば、複数の場所でストリームを管理 (開閉) することを心配する必要がなくなります。

private void Browse_Click(object sender, EventArgs e)
{
    OpenFileDialog tarik = new OpenFileDialog();
    tarik.Title = "Browse...";
    tarik.InitialDirectory = @"Desktop";
    tarik.Filter = "Wav files (*.wav)|*.wav";
    tarik.RestoreDirectory = true;
    if (tarik.ShowDialog() == DialogResult.OK) {
        textBox1.Text = tarik.FileName;
    }
}

private void Play_Click(object sender, EventArgs e)
{
        using(Stream tarik2 = File.Open(textBox1.Text, FileMode.Open))
        {
            SoundPlayer snd = new SoundPlayer(tarik2);
            snd.Play();
        }
}
于 2013-03-11T14:50:03.553 に答える
1

次のアプローチをお勧めします。

  1. SoundPLayerを の変数として宣言しますForm
  2. Browseボタンのハンドラーでファイル名を取得し、ストリームを作成して初期化SoundPlayerします。
  3. Playボタンのハンドラで、 のPlay()メソッドを呼び出しますSoundPlayer
于 2013-03-11T14:53:15.527 に答える