|
음...
혹 65번 팁
"builder 에서 MDI Child Form을 DLL로 만들어 쓰기..."를 보신 것인가요?
(67번은 다른 내용이던데..)
음...
위 팁에는 꼼수를 사용해서
DLL에서 MDI-Child를 만든것입니다.
제대로 하는 방법은 매우 간단합니다.
[DLL에서 MDI-Child만드는 방법]
방법1 - 제대로 된 방법
1) DLL 및 exe의 프로젝트 옵션에서 Runtime-Packages에 vcl를 넣고 체크하여서 컴파일하세요
2) 그리고 dll에서는 그냥 exe에서 mdi-child 폼 만들듯이 그냥 new 하시면 됩니다.
(파라메터로 Application객체를 넘길 필요가 없습니다.)
방법2 - 꼼수
; Runtime-Package를 사용하지 않고 하는 방법
1) 위 65번 팁 방식과 똑같이 하되 , Application객체뿐만 아니라 Screen객체도 넘겨주세요
그리고 Dll쪽에 Application객체와 Screen객체를 Exe에 걸로 교체합니다.
2) 그런다음 Dll에서 Form을 생성하면 됩니다.
이유
- 모든 TCustomForm은 생성되면서 Screen객체에 Form이 등록됩니다.
Screen->Forms배열에 등록되면 Screen->FormCount 가 증가하죠
- MDIChildCount 나 MDIChilden 배열을 그냥 Screen객체에 등록된 Forms배열에서
Form의 속성이 MDIChild인것만 return해주는 것입니다.
- 그런데 VCL을 Runtime-Package로 사용하지 않으면
EXE쪽의 Screen객체와 Dll쪽의 Screen객체가 다른놈이 됩니다.
문론 Application객체도 마찬가지구요
- 문제는 위 팁에서는 Application객체는 EXE에서 DLL쪽으로 넘겨줬는데..
Screen객체는 넘겨주지 않았네요
그래서 문제가 발생한 것입니다.
권장 방법
위 방법중 그냥 1번 방법을 쓰세요
2번 방법을 쓰면 나중에 Dll을 해제할때도 주의 해야하구
위 문제이외에 매우 많은 다양한 문제가 발생합니다.
1번 방법 그냥 runtime package를 사용하도록 체크만 하면 되는
너무나도 심플하고 문제의 소지를 줄여주는 방법을 사용하는것을 적극 권장합니다.
Runtime Package사용의 불편한점
Runtime Package사용에 딱 하나 불편한점이 있습니다.
그것은 배포할때 exe뿐만 아니라 VCLxx.bpl도 같이 배포해야 하는 것입니다.
저것 간편하게 하려구 엄청난 문제를 안고 있는 방법을 쓰는것보다
그냥 runtime-package를 사용하시길 권장합니다.
문론 dll 이나 BPL을 안쓰면 문제의 발생 가능성이 별루 없습니다.
그럼..
그 아이 님이 쓰신 글 :
: 계시물 팁&트릭의 67번의 글을 이용하여 DLL에서 MDIChild Form을 생성시켰는데
: 이것이 MDIChildren에 등록되지않아 MDIChildCount, ActiveMDIChild 를 사용할 수 없습니다.
: 어떻게 MDIChild를 등록시킬 수 있을 까요?
|