|
상도 님이 쓰신 글 :
: <문제점>
: SDI형식의 Project를 MDI형식으로 변환하다가,
: 이전 프로그램이 각폼끼리 서로 Control, 변수, Method를 다른 폼에서 접근하여
: 사용, 변환하고 있습니다.
:
: <전제조건>
: 1. MDI에서는 필요할때만 Child를 New하여 사용하고,
: New가 된 Child는 반드시 화면에 나타난다.
: 2. 만약 New가 되지 않은 Child의 Control, Method,변수를 사용할때는 반드시
: 에러가 생긴다.
: 3. MDI에서는 Show된 Child는 Hide()를 사용하여 감출수 없다.
:
: 그러므로, 임의의 Form의 Control, Method,변수 에 접근하기 위해서는 반드시
: New를 해야하고,
: 반드시 화면에 보여지고, 감출수 없다.
:
: <상황>
: ParentForm,
:
: ChildForm1,
: {
: Form1_Method1();
: }
: ChildForm2
: {
: Form2_Method1();
: Form2_Method2();
: }
:
: Form1_Method1()
: {
: if(임의의 상황이 되면)
: {
: ChildForm2->Form2_Method1();
: }
: }
:
: Form2_Method1()
: {
: 아무일이나 하다가...;
: Form2_Method2();
: }
: Form2_Method2()
: {
: 아무일이나 한다;
: }
:
: 1. 위에서 Parent가 ChildForm1의 New하여 사용하다가 Form1_Method1을
: 사용하려고 할때,
: ChildForm2가 New되어 있지 않다면 에러메세지가 나옵니다.(접근에러)
: ---> 아마도 ChildForm2를 New한후에 사용하라는것 같습니다.
: 2. 화면에는 ChildForm2가 보여지면 안되는 상황이어서,
: ChildForm2를 New하지 못하고 Form2_Method1()만을 ChildForm1에 선언하여
: 사용하려고하지만,
: Form2_Method1()에서는 내부에서 Form2_Method2()를 사용하므로 역시
: 에러메세지가 나옵니다.(접근에러)
: --->역시 ChildForm2를 New한후에 사용하라는것 같습니다.
:
:
: <문제점 정리>
: 1. MDIChild class의 내부변수나 함수를 New하지 않고 사용할수는 없을까?
: 2. (1)이 불가능하다면 New한후에 MDIChild가 화면에 보이지 않게 할수 없을까?
:
:
: 나름대로 열심히 설명은 하였지만 이해가 되셨는지 모르겠군요...--;
: 답변을 꼭 부탁드립니다....
:
: [분당에서 상도가]
:
임펠리테리입니다.
가장 좋은 것은, 차일드폼들과 패어런트폼간의 관계를 잘 설계해서, 차일드폼이 생성되지 않은 상태에서도 호출될 필요가 있는 함수는 폼클래스의 멤버로 만들지 않는 것입니다. 그러나 정말로 불가피하다면...
클래스가 생성되지 않은 상태에서도 언제나 호출되어야 하는 함수는 static으로 선언하면 됩니다. 일반적인 클래스 멤버함수는 자신을 가진 클래스가 객체로 생성되어있고, 그 객체의 멤버로서 호출되어야만 정상적인 호출이 됩니다만, static으로 선언된 멤버함수는 클래스의 인스턴스가 생성되거나 말았거나에 관계없이 프로그램이 처음 실행이 시작된 직후 초기화 과정에서 인스턴스화됩니다. 다시 말해서, static으로 선언된 함수는 소속된 클래스와 관계없이 언제나 호출이 가능합니다.
그런데, 생성된 객체가 없으므로 객체이름->함수이름() 이런 식으로 호출할 수가 없습니다. 그러므로 static 함수는 클래스이름->함수이름() 이렇게 호출할 수도 있게 되어있습니다.
한가지 주의할 점이 있습니다. 조금만 생각해보면 당연한 거지만, static 함수는 클래스 자체가 생성되었는지 아닌지에 관계없이 호출이 가능해야 하므로 클래스 내에서 똑같이 static이 아닌 멤버는 억세스할 수 없습니다. static 데이터가 아닌 데이터는 읽거나 쓸 수 없으며 static 멤버함수가 아닌 함수는 호출할 수 없습니다.
그럼 참고하시길...
|