2010-12-05 3 views
0

Я взял эту ошибку в строке, которую я прокомментировал, в чем проблема? Заранее спасибо.NullReferenceExeption был необработанным

private void pictureBox34_Click(object sender, EventArgs e) 
{ 
    if (pictureBox34.Image == chess9.Properties.Resources.siyahsah2) 
    { 
     f(); 
    } 
} 

public void picarray() 
{ 
    pic[0, 0] = pictureBox54; 
    pic[0, 1] = pictureBox64; 
    pic[0, 2] = pictureBox48; 
    pic[0, 3] = pictureBox42; 
    pic[0, 4] = pictureBox34; 
    pic[0, 5] = pictureBox26; 
    pic[0, 6] = pictureBox18; 
    pic[0, 7] = pictureBox8; 
    pic[1, 0] = pictureBox1; 
    pic[1, 1] = pictureBox2; 
    pic[1, 2] = pictureBox3; 
    pic[1, 3] = pictureBox4; 
    ... 
} 

public void f() 
    { 
     // int i = 0, j = 0; 
     int x = 3; 
     int y = 3; 

     for (int i = 1; i < x; i++) 
     { 
      for (int j = 1; j < y; j++) 
      { 
       pic[i, j] = new PictureBox(); 
       // pic[i, j] = pic[i + 1, j + 1]; 
       pic[i, j].Image =chess9.Properties.Resources.siyahsah2 ; 
      } 
    } 
} 
+0

чек на путь вашего image ... – 2010-12-05 09:54:19

+4

Ваш код isan е. Почему вы назначаете 3 раза одной записи массива сразу друг за другом. Первые два присваивания - нет-ops. И ваша функция «picarray» просто печальна. Почему вы используете 64 предварительно созданных графических ящика вместо того, чтобы просто создавать их в цикле во время выполнения? – CodesInChaos 2010-12-05 09:56:20

+1

И ваш путь относится к рабочему каталогу, а не к каталогу приложений. Это приведет к непредвиденным ошибкам всякий раз, когда ваша программа запускается с рабочим каталогом, отличным от каталога приложения. – CodesInChaos 2010-12-05 10:01:34

ответ

6

Мне довелось прочитать ваш предыдущий вопрос, поэтому, если я правильно понимаю, это реализация для шахматной игры.

Вместо того, чтобы исправить исключение в этом коде, я бы предложил внести некоторые изменения в ваш дизайн.

Основное изменение: отделить представление своего игрового состояния от уровня пользовательского интерфейса. Если я правильно понимаю, вы используете массив объектов PictureBox для представления фигур на доске. Вероятно, вам будет лучше, если вы напишете классы, представляющие плату, куски и все их действия, а затем напишите отдельный код, который может отображать эти классы в окне, и принимать команды от пользователя через пользовательский интерфейс.

Когда вы выполняете кусочки деталей и обновления плат посредством манипулирования объектами пользовательского интерфейса, вы обязаны делать больше ошибок и тратить гораздо больше времени на отладку.

Я надеюсь, что помогает ...

4
  • Убедитесь, что файл указывается на самом деле существует. Кроме того, желательно изменить / на \\ (или \ в строке @"...") в пути к файлу, если вы используете это в системе Windows. (Хотя это не должно быть причиной вашего вопроса.)

    ... = Image.FromFile(@"pic\siyahsah2.jpg");

  • Убедитесь, что индексы i и j являются правильными. Ваши петли for указывают, что они будут представлять собой любую комбинацию из 1 и 2.

Кроме того, внутри for цикла:

pic[i, j] = new PictureBox();   // <-- will get overwritten by (*) 
pic[i, j] = pic[i + 1, j + 1];   // <-- will get overwritten by (*) 
pic[i, j] = new PictureBox();   // <-- (*) 
pic[i, j].Image = Image.FromFile(...); 

То есть, вы можете удалить первые две строки.

1

Я не знаю, почему вы пытаетесь сделать это так сложно, но предполагая, что рыцарь находится в picturebox34 или другими словами на pic[0, 4], и вы хотите, чтобы переместить его вправо и вверх, и, таким образом, в конечном итоге на pic[2, 3] тогда нет ничего более, чем делать это

// Move knight image from 0,4 to 2, 3 
pic[2, 3].Image = pic[0, 4].Image; 

// Make old knight position empty 
pic[0, 4].Image = null; 

Я имею понятия Почему вы делаете для петель и такие ..

Смежные вопросы