0

C#を初めて使用するため、オブジェクト間で変数がどのように渡されるのかわかりません。このプログラムを実行すると、配列変数「filePaths」がnullに戻ります。これは基本的なウィンドウフォームです。言葉を出して音を出すプログラムを作っています。

具体的なエラーは、「NullReferenceExceptionが処理されませんでした。

これが私の特定のコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;

namespace Kindersect
{
public partial class form1 : Form
{
    string[] filePaths;
    string directpath = "C:\\Users\\Optimus Prime\\Documents\\vocabaudio\\";
    int counter = 0;
    int c = 0;
    public form1()
    {
        InitializeComponent();
    }

    public void button1_Click(object sender, EventArgs e)
    {
        timer1.Enabled = true;
        string[] filePaths = Directory.GetFiles(directpath, "*.wav");
        foreach(string k in filePaths)
        {
            c++;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (counter < c)
        {
            label1.Text = filePaths[counter];
            SoundPlayer simpleSound = new SoundPlayer(filePaths[counter]);
            simpleSound.Play();
            counter++;
        }

    }
}

}

前もって感謝します。

4

5 に答える 5

3

2つの異なる変数を宣言しています...異なるスコープで

グローバルに宣言されたファイルパスにアクセスする場合は、ファイルパスの2番目の宣言からstring[]を削除します

于 2012-07-04T20:08:32.670 に答える
2

変数を参照するときに@を失います。

filePathsまた、 2回宣言しています。クラスに1回(定義されることはありません)、ボタンクリックイベントハンドラーに入ると、そのメソッドのスコープ外になります。クラスで宣言してメソッドに設定するだけなので、メソッドstring[]の行からを削除します。

于 2012-07-04T20:06:46.123 に答える
0

@記号を誤って使用しているようです。文字列または文字列参照の@前にある記号は、円記号()のエスケープ機能を無効にすることを目的としています\。通常、現在のようにバックスラッシュを追加してバックスラッシュをエスケープする必要があります(\\)。

それで...

string directpath = "C:\\Users\\Optimus Prime\\Documents\\vocabaudio\\";

と同等です

string directpath = @"C:\Users\Optimus Prime\Documents\vocabaudio\";

参照:@(at)サインインファイルパス/文字列

于 2012-07-04T20:14:06.210 に答える
0

まず、変数を設定する前にタイマーを開始しないでください。

2: 最初に定義されている場合、変数の型を再定義する必要はありません。

于 2012-07-04T20:09:34.067 に答える
0

コードで確認できる問題は、declare string[] filePaths; です。クラス レベルで、それを timer1_Tick イベントで使用しますが、string[] filePaths; 次の行の button1_Click 内に同様の名前変数があるため、それに割り当てられた値を取得することはありません。ただし、この filePaths 配列のスコープは、button1_Click 内のみです。

So to resolve your issue please change

string[] filePaths = Directory.GetFiles(@directpath, "*.wav");

to 

filePaths = Directory.GetFiles(@directpath, "*.wav");

この方法でメソッドを使用することをお勧めします。変数の少ない、より小さくて明確なコードです。

public void button1_Click(object sender, EventArgs e)
{
    timer1.Enabled = true;
}

    private void timer1_Tick(object sender, EventArgs e)
    {
        filePaths = Directory.GetFiles(directpath, "*.wav");
        if (counter < filePaths.Length)
        {
            label1.Text = filePaths[counter];
            SoundPlayer simpleSound = new SoundPlayer(filePaths[counter]);
            simpleSound.Play();
            counter++;
        }

    }

このように Form_Load イベントで Directory.GetFiles を使用できる場合、一度だけ呼び出されます

于 2012-07-04T20:10:56.147 に答える