2014-10-16 2 views
1

У меня есть метка в Form1, которую я пытаюсь изменить. Вот мой код:Создание объекта Form1 вызывает переполнение стека

namespace asst5 
{ 
    public partial class Form1 : Form 
    { 
     Robot robot1 = new Robot(); 
     public Form1() 
     { 
      InitializeComponent(); 
      label2.Location = new Point(100,100); 
      label1.Text = label2.Location.ToString(); 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      label2.Text = "↑"; 
      robot1.direction = 1; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      label2.Text = "↓"; 
      robot1.direction = 2; 
     } 

     private void east_Click(object sender, EventArgs e) 
     { 
      label2.Text = "→"; 
      robot1.direction = 4; 
     } 

     private void west_Click(object sender, EventArgs e) 
     { 
      label2.Text = "←"; 
      robot1.direction = 3; 
     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      robot1.speed = 1; 
      robot1.move(); 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      robot1.speed = 10; 
      robot1.move(); 
     } 
    } 

    public class Robot 
    { 
     Form1 frm1 = new Form1(); 
     public int direction = 1; //1 = north, 2 = south, 3 = west, 4 = east 
     public int speed = 1; 

     public void move() 
     { 
      if (direction == 1) 
      { 
       frm1.label2.Location = new Point(frm1.label2.Location.Y - speed); 
      } 

      if (direction == 2) 
      { 
       frm1.label2.Location = new Point(frm1.label2.Location.Y + speed); 
      } 

      if (direction == 3) 
      { 
       frm1.label2.Location = new Point(frm1.label2.Location.X - speed); 
      } 

      if (direction == 4) 
      { 
       frm1.label2.Location = new Point(frm1.label2.Location.X + speed); 
      } 
     } 
    } 
} 

Form1 frm1 = new Form1(); где происходит переполнение стека. Я уверен, что это не правильный способ сделать это, но когда я пытаюсь иначе, он говорит мне: «Ссылка на объект требуется для нестатического поля».

+0

случайный комментарий для обзора кода: вместо создания экземпляра новой точки для перемещения меток рассмотрим только изменение оси существующей точки, например: 'frm1.label 2.Location.Y - = speed; ' –

+0

Пробовал это, он утверждает, что это не переменная. «Невозможно изменить возвращаемое значение« System.Windows.Forms.Control.Location », потому что это не переменная». – sirhotalot

ответ

2

У вас есть рекурсивное объявление.

Form1 создает экземпляр Robot ... который создает экземпляр Form1 ... он крутится в кругах, пока вы, наконец, не взорвете стек.

Что вы хотите сделать, это передать экземпляр Form1 на ваш Robot. Во-первых, удалите линию Form1 frm1 = new Form1();. Затем ввести в этом поле:

Form1 frm1; 

Затем создайте конструктор в вашем Robot:

public Robot(Form1 frm) { 
    frm1 = frm; // pass the form in 
} 

Тогда в вашем Form1 класс, экземпляр робота в конструкторе, передавая экземпляр формы :

Robot robot1; 

public Form1() 
{ 
    InitializeComponent(); 
    label2.Location = new Point(100,100); 
    label1.Text = label2.Location.ToString(); 
    robot1 = new Robot(this); // "this" is the Form1 instance   
} 
+0

Я заменил Form1 frm1 = new FOrm1(); с Form1 frm1; и создал конструктор в Robot. Когда я устанавливаю Robot robot = new Robot (this;) в Form1, я получаю сообщение об ошибке «это» недоступно в текущем контексте ». – sirhotalot

+0

@sirhotalot Вам необходимо создать экземпляр робота INSIDE в конструкторе Form(). Вы можете оставить его объявленным там, где он нужен, поскольку он требует глобальной области видимости, но вы не можете его создать, пока не получите экземпляр, который находится в конструкторе (или позже). –

+0

@ Симон Уайтхед Я представил для этого код для вашего кода. –

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