데브피아 윤성님의 팁입니다.
저는 보통 폼끼리 참조하여 사용해왔는데.. 이쪽이 훨씬 마음에 드네요.. :)
------------------- 이하 원문
이글을 적게되는 이유의 하나는 지속되는 질답란의 질문들이며
또 하나의 이유는 아래의 허접한 하나의 폼 생성에 대해서 감사 댓글이 달렸기 때문이다.
사실상 이걸 적어볼까 하고 생각한지가 일년은 훌쩍 넘은듯 싶다.
귀찮기도 하고 별게 아닌거라서 뭐하자는 이야기인지 허접스럽기도 하고 말이다.
사실상 아래의 "하나의 폼 생성"인지..의 글에 대략 이건 옳지 못합니다. 클래스 생성이 낭비됩니다등의 댓글이 달릴것이라 예측했다.
또는 openform의 비교가 아닌 indexer적인 접근으로 null 비교를 하지 않는가 하는 의문이 달리지 않을까 했는데.. 적어놓은 시간이 짧아서인지 그런글은 없는듯싶다.
-------------------------------
Form collection이 존재한다는 사실을 알고 있는이는 다 알고 있는데도 불구하고
사람들은 이것을 이용하지 않는듯 싶다.
왜(?)인지는 뭐 익숙하지 않아서 그런것이라.
MS에서는 FromCollection과 ControlCollection을 Indexer까지 구현해서 잘 만들어 두었음에도
대부분의 경우 무식하게 Indexer를 사용하지 않고 Loop를 돌리거나 해서 찾는경우가 많다.
아래의 글(폼 하나생성) 또한 그런 오류를 범한것중 하나이다.
(과연 그럴까?.... 나름 이유가 있을까? 이유는 뭐 게을러서? 이지 않을까 싶다만.. 곧 죽어도 잘난척이란..)
Form Collection이 있다는 사실 또는 이것을 이용할줄 모르는 사태로 인해서 가끔식은 FrameWork이라고 만든것들은 임의로 자신의 FormCollection을 구현하고 이로인해서 오히려 쉬운길을 두고 어렵게 가기도 한다.
기초적인것이면서 한줄짜리? 지식이라
사실 이렇게 글을 적는게 오히려 민망하기도 하고 황망스럽기도 하나..
몰라서 저지르는 실수들이 너무 많아서 이렇게 펜을 들어본다( 그러는 나는 알고 있을까나?)
일단.. 기초과정을.. 밟아 보도록 하자..
1. Indexer이용하기.
이렇게.. 폼을 두개를 만들자.
이런식으로.. 두개의 폼을.. 만들도록 하자.
Form2를 닫게 하려면 어떻게 하는가?
Form2를 닫지를 못하는 사람?은 자진납세하자.(댓글함 적어다오 얼마나 많은지 파악이 안된다.)
문제의 시작은 이것이다. Form2를 생성했는데 어떻게 하질 못하겠다는것이다.
Form2의 생성은 이렇게 했다.
결국 이 문제를 해결하기 위해서.. 어떤이는?...
Form1의 클래스의 변수로.. Xx를 선언한다. 일종의 전역변수같은거 말이다.
또 다른경우는 프로젝트의 자체 컬랙션에서 처리한다.
두가지 다 나쁜 방법은 아니다.
단지.. 내가 의문을 지니는것은 왜 그럴까? 하는것뿐이다.
Form2를 닫는건 이렇게 적으면 된다.
그렇다. 내가 그랬지… 한줄짜리 지식이라고..
한줄 적어주고 어지간히 아는척이 많다.
자.. 이제는 FW의 경우를 살펴보자.(FW는 FrameWork의 준말로 사용한다. )
솔류션을 이렇게 만들고 FW에서 기준폼으로 MyForm을 만들고
Form3는 Myform을 상속받았다고 치자.
요렇게 상속받음..
Myform은 볼 필요도 없지만.. 행여나 보여주자면..
이런식이라고 보자.
즉 이런식이 될때 FormCollection은.. 과연 Form3를 가질까 하는것이다.
대답은.. 모든 Form개체 를 상속받은것들은.. 무조건 Show할때.. FormCollection에 들어간다.
그럼 반대로 Hide하면 어떻게 될까? 사라질까?
대답이 뭐일것 같은가? 귀찮아서 그냥 알려준다만.. 사라지기 전까지는 들어가 있다.
즉 hide는 여전히 존재한다. Close가 호출되어야 사라진다.
다시 강조해서 말하자면.. Show할때 들어가고..(그냥 생성한다고 들어가진 않는다.)
(여유되시면 reflection으로 show좀 까보면 좋겠다만.. 이 귀차니즘의 끝은 어디에 있는지 누가 좀 해다오)
하여간.. 위의 예제에서 말하고자 하는 이야기는
FW를 만들더라도 굳이 폼 컬랙션을 만들지 마라.. 피곤하다.
(말은 이렇게 하지만 대부분의 FW에서 필요하긴 하다. Form의 경우 특정 영역성이 필요하게 되는데 일반적으로 기준 Form(위에서 말한 Myform) 에서 Show메세드의 오버로딩을 통해서 영역을 설정하곤 한다. / 또한 대부분의 경우 Dictionary같은 지네릭타입으로 해서 "as"을 적지 않고 처리하길 원한다.)
이제는 FW를 사용하는 이들은 또 의문을 가질것이다. 그럼 Myform을 상속받은것은 어떻게 구분하냐고?
"is" 란 녀석은 그냥.. 있는게 아니다. 사용하면 될꺼 아닌가
한줄이지만. 굳이 예제를 만들기도 귀찮은 관계로.. 패스다. 모른다고 누가 손든다면... 너무한거 아냐? 라고 말하고 싶다.
정 안되면 확장메서드 하나 만들어 버리던지..
자. 이제 본론에 들어가야 하는데 폼에게 특정한 메시지를 전송한다는것 자체가 무의미한 수준까지 왔다.
뭐 이미 눈치 코치 다 알아버렸듯이 할것이 없다.
그래도 행여나 하는 맘으로 몇자 더 적어보자.
나같은 경우는 Form에서 Form으로 특정메세지나 무시기를 전달하기 위해서 SendMessage같은 API를 써본적은 없다. 물론 Domain이 다른 Application이라면 어쩔수 없겠지만..
그런경우만..WinProc를 override해서 처리하면 된다.
이럴때도 광역인지 뭔가 방법이 있을법도 하다만.. 내가 모르는덕분에.. 이건 더 배워야 할듯 싶다.
계속 주제를 어긋나는데 주제에 집중하자.
하여간 나의 경우는 Interface를 정의해서 사용한다.
심풀하게 설명해서 이렇게 인터페이스를 만들어 보자.
자 그럼.. 이걸 가지고.. Form2에게 이녀석을 구현하도록 해보자.
이렇게 구현하고 나서..
이지의 좌측 아래에 있는 버튼을 누르면.. 이렇게 실행이 된다.
즉.. Form2 에게 궁극적으로 메시지를 보냈다.(물론 헛소리다.)
즉.. From2의 매서드를 단지 실행한것에 불과하다 args넣어서.
소스야 앞서 이야기 했듯이 is를 사용하면 된다.
이렇게.. 물론 이것의 응용(?)으로 앞서 이야기 했듯이 Indexer로 입력받아 바로.. Is로 인터페이스 체크하고 실행하는 방법도 있겠다. (업무에 따라서..)
뭐 응용은 알아서 하길 바란다. 계속 곁가지로 나가면.. 사실 적을게 너무 많다.
위와 동일한 형태지만.. Myform 에서 가지고 하는걸 보자.
(이건 볼 필요 없을것 같다..... 그냥 대충 대충 진행하자.. 생략해도 좋다.)
FW의 경우에는 이렇게 해야될것이다.
우리가 사용할 녀석에게 당연히 상속을 받아 구현하게 해야할것이다.
자 여기서 주의깊게 봐야 하는것은 상속받고 구현하고.. 그리고 Virtual이라고 적어두는것이다.
그래야… 이녀석을 다시 상속받는 녀석들에게.. Override를 할수 있도록 하기 위함이다.
아차차.. 또 virtual앞에 public을 붙쳐야되는데 얼른 적다보니 또 빠뜨렸다. 알아서 넣자.
하여간..
한줄짜리 기초가 왜 이렇게 많은 글을 적어야 되는지는 .. 당연히 설명하는 능력의 부재이겠지만..
이게 나름 적기 시작하면 무지 적을게 많기도 하다.(다 뻥이다. 귀찮아서 적지 않을뿐이다.)
여하튼 인터페이스에 정의하는것들로는 Clear같은거라든지.. 여타 몇몇개는 고정적으로 사용되는것들이 있는데 그런것들도 알아서 하도록 하자..