2016-05-12 6 views
1

すでに存在するピクチャボックスを取り出して配列に追加すると、Visual Studioではこれで問題ありません。たとえば、trees[64].BringToFront();と言うことができます。そして、その絵文字はすべて前面に表示されます。C#オブジェクト参照がオブジェクトのインスタンスに設定されていない - ループ内でピクチャボックス配列を使用する場合のみ

しかし、配列内のすべてのピクチャボックスを最初から最後まで前面に持っていくためにループを使用すると、エラーが発生します。私がどこで始まり、終わるかは関係ありません。ループの仕方に関係なく、私には例外が与えられます。

しかし、intの代わりに数字を使用すると、ループ内にあっても問題ありません。私は1つの任意の数で開始と終了をループするように指示することもできますが、例外がスローされますが、ピクチャボックス(trees[])の配列に全く同じ番号を書き込むと問題ありません。

私がしたいことは、ループを使ってすべてのピクチャボックスを前面に表示することだけです。これは不可能なことですか? try/catch文はそのように見えるなぜあなたは迷っている場合にはpictureboxesは11×11のグリッドに

(TA0, TB0, TC0 ... 
    TA1, TB1, TC1 ... 
    TA2, TB2, TC2 ... 
    .  . . 
    .  . . 
    .  . . )
public partial class Form1 : Form 
{ 
    int[] Cell = new int[121]; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Generate(); 
    } 

    private void Generate() 
    { 
     var trees = new PictureBox[121]; 
     Random rnd = new Random(); 
     int n; 

     for (int i = 0; i < 10; i++) 
     { 
      try 
      { 
       trees[i] = (PictureBox)Controls.Find("TA" + (i).ToString(), true)[0]; 
       trees[i + 11] = (PictureBox)Controls.Find("TB" + (i + 1).ToString(), true)[0]; 
       trees[i + 22] = (PictureBox)Controls.Find("TC" + (i + 1).ToString(), true)[0]; 
       trees[i + 33] = (PictureBox)Controls.Find("TD" + (i + 1).ToString(), true)[0]; 
       trees[i + 44] = (PictureBox)Controls.Find("TE" + (i + 1).ToString(), true)[0]; 
       trees[i + 55] = (PictureBox)Controls.Find("TF" + (i + 1).ToString(), true)[0]; 
       trees[i + 66] = (PictureBox)Controls.Find("TG" + (i + 1).ToString(), true)[0]; 
       trees[i + 77] = (PictureBox)Controls.Find("TH" + (i + 1).ToString(), true)[0]; 
       trees[i + 88] = (PictureBox)Controls.Find("TI" + (i + 1).ToString(), true)[0]; 
       trees[i + 99] = (PictureBox)Controls.Find("TJ" + (i + 1).ToString(), true)[0]; 
       trees[i + 110] = (PictureBox)Controls.Find("TK" + (i + 1).ToString(), true)[0]; 
      } 
      catch (IndexOutOfRangeException) 
      { 
       MessageBox.Show("pictureBox does not exist!"); 
      } 
     } 

     for(int idx = 0; idx <= 120; idx++) 
     { 
      n = rnd.Next(1, 3); 
      Cell[idx] = n; 
      trees[idx].BringToFront(); 
     } 
    } 
} 
+2

エラーが発生した行はありますか。 – Steve

+1

最初のループは 'for(int i = 0; i <11; i ++)'でなければなりません。 – Ripple

答えて

2

が配置されているので、

はまた、それはあなただけの配列に110 PictureBoxesを設定しているのですあなたの最初のforループは1回以上反復する必要があります。つまり、終了条件はでなく、i < 10でなければなりません。

あなたのコードは、配列位置10,21,32,43,54,65,76,87,98,109、および120を「スキップ」します。あなたのコードの直前にブレークポイントを設定すると2番目のループが実行され、配列を調べると、これらの位置にヌル値が表示されます。

エラーは2回目のループで正しくスローされます(idx = 10)。その位置にはPictureBoxが存在しないため、NullReferenceException

0

あなたは配列にギャップを残しています。ループは、その後iしながら実行でき、インデックス0、11、22、33、44、55、66、77、88、99における配列要素のpictureboxesを設定し、110:

i0であるときに何が起こるかについて考え(ただし、ではありません)10.最後の値は9で、配列要素のピクチャボックスは9,20,31,42,53,64,75,86,97,108,119に設定されています。

このあなたがを変更することによって問題を解決することができる位置10、21、32、43、54、65、76、87、98、109、および120

でアレイ内のギャップを残します〜<=に変更するか、またはを11に変更してください。

0

ありがとうございました!うん、これは間違いなくかなり難しい。私はまた、可能な限り単一の最も効率の悪い方法でコードを書いていました。私はちょうどレター/ナンバー座標系の代わりに0から120までの数字を通って、左から右、上から下に番号システムを変更しました。より少ないコードでシステムをより多くのことを行うことができます。 (T0、T1、T2 ... T119、T120)次に、新しいシステムで行われた変更の基本的な考え方を示すGenerate()メソッドのサンプルを示します。

これは完全に更新されたシステムを反映するものではないので、コードをかなり更新しました。ここでは、ピクチャボックスを重ねて、次に.BringToFront()を使用してアニメーションを作成していました。各ピクチャボックスを表示させる関数です。現在のところ、121のPictureBoxes時間がある代わりに多くの画像がある代わりに、私は121のPictureBoxes総計を使用し、それぞれの画像を変更します。そうすれば、私は本当の理由のために不敬な量の記憶を使い切っていないでしょう。

var trees = new PictureBox[121]; 
    Random rnd = new Random; 

    for(int idx = 0; idx <= 120; idx++) 
    { 
    try 
    { 
    trees[i] = (PictureBox)Controls.Find("T" + (i).ToString(), true)[0]; 
    } 
    catch(IndexOutOfRangeException) 
    { 
     MessageBox.Show("pictureBox does not exist!"); 
    } 

    Cell[idx] = rnd.Next(1,3) 

    if(Cell[idx] == 1) 
    { 
    trees[idx].BringToFront(); 
    } 
    } 

実際のコードでは、二番目の配列と一緒に121個の細胞の121枚の画面が存在し得るように[]の代わりにアレイセルの2次元アレイ(Temp_Record [、]新しいINT = [121、121])を使用しMaster_Record [、]と呼ばれる同じサイズのファイルで、永続的な値がファイナライズされた後に格納されます。 Generate()は、各エントリに番号を割り当てます。このとき、エントリを通過するDraw()という非公開のvoidを呼び出し、数値を読み取り、長いif文を使用します(これはswitch文私は物事をきれいにする)各番号を調べ、そのセルに対応するピクチャボックスに適切なイメージを適用します。私が呼び出すデフォルトの 'screen'は60で、11行11列のグリッドのそれぞれ11行11列のグリッドを想像すると、その中心になります。もし誰かが最初から最後まで完全なコードを望むなら、私はそれを投稿します、それはちょうどこの時点ではかなり長くなります。 (これは単純なトップダウンのオープンワールドゲームです)

関連する問題