2011-08-17 9 views
0

에는 개체 범위에 대한 몇 가지 문제가 있습니다. 나는 양식 선언에 일부 패널을 정의C# Scope across methods

 public Form1() 
    { 
     InitializeComponent(); 

     Panel[] panels = new Panel[10]; 

     for (int i=0;i<10;i++) 
     { 
      //Panel newPanel = new Panel(); 
      panels[i] = new Panel(); 
      panels[i].Size = new Size(40, 37); 
      panels[i].BackgroundImage = imageList1.Images[0]; 
      panels[i].Location = new Point(i * 20, i * 20); 
      this.Controls.Add(panels[i]); 
     } 

    } 

을하지만, 내가 (이미지를 변경하거나 이동), 내가

이름 '패널을 얻을 틱 방법이 패널을 사용하려고하면 '현재 컨텍스트 여기

에 존재하지 않는 것은 오류 메시지

 private void PanelMoveTimer_Tick(object sender, EventArgs e) 
    { 
     if (panels[0].Location.X >= 0) 
을 받고 선입니다

내가 그들을 불러야합니까? 공개로 선언 할 수 있습니까? 내가 그들을 어떻게 접근 가능하게 만드나요?

+0

공개로 설정하면 실제로 문제가 발생합니다. :) –

답변

4

패널을 생성자가 아닌 클래스의 클래스에 선언하십시오. 생성자, IE 그 Form1에() 메소드의 범위에서

Panel[] panels = new Panel[10]; 

당신이 거기 패널 배열을 정의하고 있기 때문에, 그에만 사용할 수 있습니다 :

private Panel[] _panels = new Panel[10]; 

public Form1() 
    { 
     InitializeComponent();    

     for (int i=0;i<10;i++) 
     { 
      //Panel newPanel = new Panel(); 
      _panels[i] = new Panel(); 
      _panels[i].Size = new Size(40, 37); 
      _panels[i].BackgroundImage = imageList1.Images[0]; 
      _panels[i].Location = new Point(i * 20, i * 20); 
      this.Controls.Add(_panels[i]); 
     } 

    } 
0

문제는이 라인입니다.

Panel[] panels = new new Panel[10]; 

public Form1() 
{ 
    InitializeComponent(); 
    ... 

이런 식으로, 패널이 그 클래스의 모든 비 정적 방법으로 사용할 수 있습니다 :

당신이해야 할 일은, 최소한의에서이입니다.

1

지역 변수는 메소드에 대해 로컬이며 다른 변수에서 사용할 수 없습니다. 개체의 여러 메서드에서 값을 사용하려면 가장 쉬운 방법은 필드로 만드는 것입니다.

class Form1 { 
    Panel[] panels; 

    public Form1() { 
    this.panels = new Panel[10]; 
    ... 
    } 
} 
0

간단한 방법은 범위를 변수 선언을 묶는 가장 가까운 중괄호로 보는 것입니다. 변수는이 중괄호 사이의 아무 곳에 나 액세스 할 수있게됩니다.

그래서 생성자에서 'panels'을 선언하면 생성자에서만 액세스 할 수 있습니다. 클래스에 선언하면 모든 클래스 메서드에서 액세스 할 수 있습니다.

public class Form1 : Form 
{ //Beginning of the 'panels' scope 
    Panels[] panels; 

    public Form1() 
    { 
    InitializeComponent(); 
    panels = new Panel[10]; // initialization in constructor 
    } 

    private void PanelMoveTimer_Tick(object sender, EventArgs e) 
    { 
     if (panels[0].Location.X >= 0) // usage in method 
     .. 
    } 
}