none
コントロールのイベント処理の中で関数を呼び出すときに渡す引数? RRS feed

  • 質問

  • いつもお世話になっています。

    少し長くなっていますが勘弁願います。

     

    12個のボタンを配列にいれ、3つのボタンイベントを一括処理しています。

                //ボタンコントロール配列を作成
                this.btnArray = new Button[12];
                //ボタンコントロールの配列に代入
                this.btnArray[0] = this.btnEnd;
                this.btnArray[1] = this.btnInp;

         ---------
                this.btnArray[11] = this.btnKosin;
                //イベントハンドラに関連付け
                for (int i = 0; i < this.btnArray.Length; i++)
                {
                    this.btnArrayIdea.Click += new System.EventHandler(this.btnArray_Click);
                    this.btnArrayIdea.MouseLeave += new System.EventHandler

                                                                                  (this.btnArray_MouseLeave);
                    this.btnArrayIdea.MouseEnter += new System.EventHandler

                                                                                  (this.btnArray_MouseEnter);
                }

    3つのイベントの最初に、どのボタンかを特定しています。

         private void btnArray_Click(object sender,EventArgs e)
             {
                  //クリックされたボタンのインデックス番号を取得する
                  int index = -1;
                  for (int i = 0; i < btnArray.Length; i++)
                  {
                      if (btnArrayIdea.Equals(sender))
                      {
                          index = i;
                          break;
                      }
                  }

           --------------

         }

    この緑の部分を関数にして呼び出そうとしています。

            private static int returnIndex(***********)
            {
                //クリックされたボタンのインデックス番号を取得する
                int index = -1;
                for (int i = 0; i < btnArray.Length; i++)
                {
                    if (btnArrayIdea.Equals(sender))
                    {
                        index = i;
                        break;
                    }
                }
                return i;
            }

            private void btnArray_Click(object sender,EventArgs e)
            {
                //クリックされたボタンのインデックス番号を取得する
                int index;

                index=retunIndex(********);
            }

    アとイの「何を渡し、何を受け取るのか」肝心なところがわからずに困っています。

    どうぞよろしくお願いします。

     

    *電球マークのところは、[]です。

     どのように書くと、取れるのでしょう?



     

    2007年9月25日 6:02

回答

  • 青の洞窟さん、お蔭様でうまく関数処理をすることができました。

    staticに関してはご指摘のとおりで、staticでは配列を認識してくれませんでした。

    適切なアドバイスをいただき、お礼申し上げます。

     

    2007年9月25日 7:07

すべての返信

  • そのままでよさそうだけど。

    ア: object sender
    イ: sender

    ところで、

    private static int returnIndex(***********)
    となっていますけど、
    btnArrayはstaticメンバでしょうか?
    載せられたコードだけをみると、static関数にする必要がないように思えますけどどうでしょうか?

    2007年9月25日 6:26
  • 青の洞窟さん、お蔭様でうまく関数処理をすることができました。

    staticに関してはご指摘のとおりで、staticでは配列を認識してくれませんでした。

    適切なアドバイスをいただき、お礼申し上げます。

     

    2007年9月25日 7:07
  • ご存知かもしれませんが Array クラスには指定したオブジェクトのインデックスを返すメソッドが用意されています。
    それを使用すれば次の用に書く事でも同じ結果を取得することができます。

     

    Array.IndexOf メソッドを使用した例
    int index = Array.IndexOf(this.btnArray, (Button)sender);

     

     

    ここからは余談ですが、sender の値がイベントを発生させたボタンになっていると思います。そのためインデックスを取得する必要がないのでは?と思いました。なににインデックスを使用しているかわかりませんが、インスタンスを使用した方がコードを理解しやすく、間違いも少なくなると思います。
    2007年9月25日 13:53