none
コントロールの配列 RRS feed

  • 質問

  • プログラミング初心者ですがよろしくお願いいたします。

    現在、3このLabelと2つのButtonを持つFofmを作成しております。

    この3このLabelはすでに生成されておりますが、

    配列にいれられないものかと考えています。

    public Form1()

    {

         InitializeComponent();

    }

    の直後に

    Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    そしてButton押下のフィールドで、初期化をしようとしています。

    しかし、配列の宣言部分にエラーが発生してしまいました。

    フィールド初期化子は静的でないフィールド、メソッド、またはプロパティ’field’を参照できません。

    とのこです。これはなにが間違っているのでしょうか?

    ご回答よろしくお願い申し上げます。

     

    2006年11月2日 0:22

回答

すべての返信

  • liri さん、こんにちは。

     liri さんからの引用
    そしてButton押下のフィールドで、初期化をしようとしています。
    しかし、配列の宣言部分にエラーが発生してしまいました。

    その初期化、宣言部分とは

    Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    のことでしょうか?

    問題ないと思いますが。

    2006年11月2日 0:52
  • ありがとうございます。

    宣言部分は

    Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    です。

    初期化は

    private void startButton_click(objext sender, EventArgs e)

    {

           foreach(Label lb in messageLabel)

               lb.Text = "メッセージ";

    }

    です。エラーが出るのは宣言の{Label1, Label2, Label3}の部分です。

    2006年11月2日 1:04
  • InitializeComponent();の後ろに new Label[]{Label1, Label2, Label3}; を入れてみてはどうでしょうか?

    つまり、宣言部は
    private Label[] messageLabel;
    として、
    public Form1()
    {
        InitializeComponent();
        messageLabel = new Label[]{Label1, Label2, Label3};
    }
    とする。

    2006年11月2日 1:13
  • Form1で宣言してしまうと他のフィールドで使えなくなってしまい、悩んでおりました。

    なるほど、分ければいいのですね。

    private Label [] messageLabel;

    はpublic Form1(){}より前に宣言するということですか??

    2006年11月2日 1:27
  •  liri さんからの引用

    private Label [] messageLabel;

    はpublic Form1(){}より前に宣言するということですか??


    実際に試してみてはどうでしょうか?
    (手元にVS2005がないので私は試せないので、、、)
    2006年11月2日 1:47
  • たぶん、こう書かれたんだと思います。

    public Form1()

    {

        InitializeComponent();

    }

    Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    しかし、このような書き方はできません。なぜなら、インスタンスフィールドは他のインスタンスフィールドを使って、直接初期化することができないからです。
    次のようにすればコンパイルが通ります。

    public Form1()

    {

        InitializeComponent();

        Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    }

    が、これではmessageLabelがローカルになってしまいますので、蒼の洞窟さんが書かれているような形で、一般的にはコンストラクタやメソッド内で初期化します。

    2006年11月2日 1:51
    モデレータ
  •  蒼の洞窟 さんからの引用
     liri さんからの引用

    private Label [] messageLabel;

    はpublic Form1(){}より前に宣言するということですか??


    実際に試してみてはどうでしょうか?
    (手元にVS2005がないので私は試せないので、、、)

     

    図々しい質問をして申し訳ございませんでした。

    早速試してみましたら見事エラーが消えました!

    Formが生成される前に配列を宣言するのですね。

    根拠のない違和感を勝手に感じてしまいました。

    失礼いたしました。

    2006年11月2日 1:57
  •  trapemiya さんからの引用

    public Form1()

    {

        InitializeComponent();

        Label[] messageLabel =  new Label[]{Label1, Label2, Label3};

    }

    が、これではmessageLabelがローカルになってしまいますので、蒼の洞窟さんが書かれているような形で、一般的にはコンストラクタやメソッド内で初期化します。

    おっしゃる通りです。ローカルになってしまうという悩みでした。

    蒼の洞窟さんが書かれているような形でエラーが消えました。

    ありがとうございます。

    1つだけ質問をしてもよろしいでしょうか?

    「一般的にコンストラクタやメソッド内で初期化」というのは今回の場合どこで初期化をすることに当てはまるのでしょうか?知識不足で本当に申し訳ございません。

    2006年11月2日 2:01
  •  liri さんからの引用

    「一般的にコンストラクタやメソッド内で初期化」というのは今回の場合どこで初期化をすることに当てはまるのでしょうか?知識不足で本当に申し訳ございません。

    蒼の洞窟さんが示されたように、今回の場合はコンストラクタで初期化しています。場合によっては、初期化専用のメソッドを用意しておいて、コンストラクタからそれを呼ぶということもあります。コンストラクタが複数存在するのだが、初期化の処理は一箇所でまとめたいというような場合です。
    2006年11月2日 2:14
    モデレータ
  • なるほど。今回はFormのコンストラクタでFormで使う配列の初期化をするのですね。

    ご親切にありがとうございました。

    2006年11月2日 2:39