none
変数名を変更する RRS feed

  • 質問

  • こんにちは、プログラム中困ったことがあったので、質問させていただきました。

    開発環境は「Visual Studio 2005」で、プロジェクトはC#の「windous アプリケーション」です。

     

    いきなりソースコードを張るのですが

                touka(pictureBox_ban, pb_masu_1_1);
                touka(pictureBox_ban, pb_masu_2_1);
                touka(pictureBox_ban, pb_masu_3_1);

             ・・・・

    (※このpb_masu_1_1等はPictureBoxの名前です)

    この様な処理をできればforループでやりたいのです。

     

    恥ずかしながら、自分は学生でプログラム初心者ですので、少し初心者向けの回答にしていただけるとありがたいです。

    お返事お待ちしております。

     

     

     

    2009年2月7日 22:16

回答

  • SE_lain の発言:

                touka(pictureBox_ban, pb_masu_1_1);
                touka(pictureBox_ban, pb_masu_2_1);
                touka(pictureBox_ban, pb_masu_3_1);

             ・・・・

    (※このpb_masu_1_1等はPictureBoxの名前です)

    この様な処理をできればforループでやりたいのです。

     

    恥ずかしながら、自分は学生でプログラム初心者ですので、少し初心者向けの回答にしていただけるとありがたいです。

    そんなときは配列を作りましょう。
    PictureBox[] pictureBoxes = new PictureBox[]{ 
      pb_masu_1_1, 
      pb_masu_2_1, 
      pb_masu_3_1, 
    }; 
    これならforeachループにも使えます。
    コンストラクタのInitializeComponent()より後であれば、任意のタイミングで作成可能です。
    何度も参照するなら、クラスのインスタンスフィールドにしてもいいかも。

    ついコピー&ペーストに頼りがちですが、冗長に見えるコードを減らしていくのは大切なことです。
    がんばってください。
    • 回答としてマーク SE_lain 2009年2月9日 0:04
    2009年2月8日 0:02

すべての返信

  •  windous → Windows です。

    あるコントロール上に配置されているコントロールはControlsプロパティを使って以下のように参照することができます。
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.controls.aspx

    Hoge.Controls["fuga"]

    "fuga"は参照したいコントロールの名前です。

    2009年2月7日 23:23
  • SE_lain の発言:

                touka(pictureBox_ban, pb_masu_1_1);
                touka(pictureBox_ban, pb_masu_2_1);
                touka(pictureBox_ban, pb_masu_3_1);

             ・・・・

    (※このpb_masu_1_1等はPictureBoxの名前です)

    この様な処理をできればforループでやりたいのです。

     

    恥ずかしながら、自分は学生でプログラム初心者ですので、少し初心者向けの回答にしていただけるとありがたいです。

    そんなときは配列を作りましょう。
    PictureBox[] pictureBoxes = new PictureBox[]{ 
      pb_masu_1_1, 
      pb_masu_2_1, 
      pb_masu_3_1, 
    }; 
    これならforeachループにも使えます。
    コンストラクタのInitializeComponent()より後であれば、任意のタイミングで作成可能です。
    何度も参照するなら、クラスのインスタンスフィールドにしてもいいかも。

    ついコピー&ペーストに頼りがちですが、冗長に見えるコードを減らしていくのは大切なことです。
    がんばってください。
    • 回答としてマーク SE_lain 2009年2月9日 0:04
    2009年2月8日 0:02
  •  

    PictureBox の数が動的に変わるとか、後で追加する必要があるとかで、配列の
    サイズが決められない場合は List<T> や ArrayList クラスを使用するという手
    もあります。(List<T> がお勧め)

    List ジェネリック クラス
    http://msdn.microsoft.com/ja-jp/library/6sh2ey19(VS.80).aspx

    検討ください。

    2009年2月8日 5:46
  • もう少し背景を書いてもいいと思いますよ。
    画面にいくつPictureBoxがあるのか、そしてそれに対して何をしたいのかというところです。

    多分何かしらの処理があって、それを一行一行毎回かくのが手間になるので、ループで記述したいのだと思いますが、それの実現と
    変数名の変更という件名がいまいちよくわかりません。

    このtoukaというメソッドでは具体的にどんな処理をしていますか?
    例えば、toukaという処理が画面の上に3つあるPictureBoxの画像に対して透過処理を行う処理だとすれば、
    そもそもpb_masu_1_1、pb_masu_2_1というようにパラメータを渡す必要はないと思うのです。


    参考に、もし画面上にPictureBoxが複数配置(3つでも4つでも)されていて、そのPictureBoxの背景色を変えるソースコードを記載しますね。
    もしSE_lainさんがやりたい処理が、画面にはってあるPictureBox全部に対して何らかの処理をしたいということであれば、下記のコードで
    背景色を変えている部分だけをSE_lainさんがやりたい処理に変えるだけです。

    foreach (Control control in this.Controls)  
    {  
        if (control is PictureBox)  
        {  
            PictureBox targetPictureBox = control as PictureBox;  
     
            targetPictureBox.BackColor = Color.AliceBlue;  
        }  















    • 編集済み CrimsonPork 2009年2月8日 6:00 .NET 2.0なのにvarキーワードを使ってしまっていたため訂正。
    2009年2月8日 5:55
  • >>佐祐理さん
    お返事ありがとうございます。そのようなプロパティがあったのですね。参考にさせていただきます
    2009年2月8日 23:58
  • >>佐祐理さん

    お返事ありがとうございます。
    なるほど、このような配列を作るとまとめて管理できたんですね。
    おかげさまで解決できました。
    2009年2月9日 0:02
  • <<SurferOnWwwさん
    お返事ありがとうございます。

    なるほど、リストを使うと動的に確保ができるのですね。
    参考にさせていただきます。
    2009年2月9日 0:06
  • <<CrimsonPorkさん

    <<もう少し背景を書いてもいいと思いますよ。
    そうですね。自分でも少し簡単に書きすぎたと思います。申し訳ありません。


    このようなやり方があったのですね。これを基にいろいろ調べてみたいと思います。
    お返事ありがとうございます。
    2009年2月9日 2:08