2012-12-13 3 views
0

/* 안녕하세요 저는 Visual Studio에서 첫 번째 C# 응용 프로그램을 만들려고합니다. 내가 클래스의 인스턴스와 그 클래스의 인스턴스를 메인에 만들었고 폼의 클릭 이벤트 내에서 해당 인스턴스의 멤버를 쿼리하려고 시도했지만 인스턴스 이름이 현재 컨텍스트에 존재하지 않는다고 알려주고있다. 어떤 도움이라도 여기에 제 코드가 있습니다. */양식의 메인에서 인스턴스에 액세스

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication10 
    { 

    public class character   // this is my class 
     { 
      public bool hair_black; 
     } 


     static class Program 
     { 
      /// <summary> 
      /// The main entry point for the application. 
      /// </summary> 
      [STAThread] 
      static void Main() 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 
       Application.Run(new Form1()); 

       character deviljin = new character(); // instance of my class 

       deviljin.hair_black = true;  // initiating a member of the instance 


      } 
     } 
    } 

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication10 
    { 


     public partial class Form1 : Form 
     { 

      int cs1 = 0,cs2=0; 


      public Form1() 
      { 
       InitializeComponent(); 


      public void pictureBox1_Click(object sender, EventArgs e) 
      { 

       flowLayoutPanel1.Visible = true; 
       if (deviljin.hair_black == true) // trying to access instance member 
       {         // but getting deviljin does not 
                // exist in the current context 
        pictureBox28.Visible = false; 
       }    

      } 

     } 
    } 
+4

이것은 어디에도 표시되지 않습니다. 정말 책을 읽을 필요가 있습니다. Winforms 프로그래밍은 시행 착오에서 배울 수있는 것이 아닙니다. –

답변

1

인스턴스 변수 deviljin의 주요 방법 로컬 직접 그 방법 밖에 참조 할 수 없습니다.

참조를 사용하려고하는 Form1의 인스턴스 안에 참조를 전달해야합니다. 이 지금 당신은 당신의 클릭 코드

에 예를 건네 사용할 수 있습니다

Application.Run(new Form1(deviljin)); 

및 Form1의 생성자를 변경하는 과정을 Form1

의 생성자를 통해 직접 참조를 통과 할 수있다
public void pictureBox1_Click(object sender, EventArgs e) 
{ 
    flowLayoutPanel1.Visible = true; 
    if (_devReferenceToCharacterPassed.hair_black == true) 
    {         
     pictureBox28.Visible = false; 
    }    
} 

도 기억해 그

Application.Run (새 Form1 (deviljin));

은 차단 호출입니다. 즉, Form1이 열릴 때까지 코드가이 호출을 종료하지 않기 때문에 Run 호출 전에 deviljin 변수의 생성을 이동해야합니다.

편집 : 응용 프로그램에서 전역 가시성을 가진 변수를 사용하는 것에 강력히 반대합니다. 때때로 그것들은 필요하지만, 유지 보수가 불가능한 코드를 매우 빨리 만들어냅니다. 인스턴스는 그것은 범위의

현재 컨텍스트 (양식의 문맥)에 존재하지 않습니다 - 그것은 '더 적은 수의 전역 변수

1

이 때문에 오류의 말씀이다로 프로그래밍하는 법을 배워야합니다 문제 - 선언 한 모든 변수에 범위가 있고 Program 클래스의 Main 메서드의 로컬 범위에서 문자 클래스 인스턴스를 선언하고 있기 때문에 해당 메서드에서만 표시됩니다.

Program 클래스는 정적이기 때문에, 당신은 단지 그 클래스의 예에 정적 멤버를 만들 수 있습니다

namespace WindowsFormsApplication10 
{ 

public class character   // this is my class 
    { 
     public bool hair_black; 
    } 


    static class Program 
    { 
     public static character deviljin; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

편집 : 스티브는 지적 정말이 의지하는 동안,이 통지,하지만하지 않았다 컴파일 할 때 변수를 인스턴스화하기 전에 Application.Run을 호출하면 액세스하려고 할 때 런타임 예외가 발생합니다 (null이 됨). 그래서 Application 전에이 작업을 수행해야합니다.아주 간단한 프로젝트를 위해, 정적 변수 수 -

 public void pictureBox1_Click(object sender, EventArgs e) 
     { 

      flowLayoutPanel1.Visible = true; 
      if (Program.deviljin.hair_black == true) 
      { 
       pictureBox28.Visible = false; 
      }    

     } 
변수 범위, 접근 수정 및 정적/인스턴스 변수에 최대 읽기 가

: 당신이 Program 클래스를 통해 인스턴스에 액세스 할 수 있습니다

  deviljin = new character(); // instance of my class 

      deviljin.hair_black = true;  // initiating a member of the instance 

      Application.Run(new Form1()); 


     } 
    } 
} 

이 방법을 실행 너는 여전히 배우면서이 길을 갈 수있어. 그래야.

+0

아니요 작동하지 않습니다. 이 변수는 Application.Run 호출 후에 인스턴스화되므로 click 이벤트에서 사용될 때 여전히 존재하지 않습니다. – Steve

+0

좋은 지적! 그것을 컴파일하지는 못했지만, 그냥 런타임 예외를 던질 것입니다 – Charleh

+0

트릭을 많이 주셔서 감사합니다 =) – user1902599

1

. 예를 들어, Character를 매개 변수로 사용하도록 Form을 업데이트해야한다.

public partial class Form1 : Form 
{ 
    private Character _character; 
    public Form1(Character character) 
    { 
     _character = character; 
    } 

    public void pictureBox1_Click(object sender, EventArgs e) 
    { 
     If (_character.hair_black) 
     { 
      ... 
     } 
    } 
} 
... 
var deviljin = new Character() 
{ 
    hair_black = true 
}; 
Application.Run(new Form1(deviljin));