본문 바로가기
프로그래밍/delphi

DELPHI 패널위에 폼 또는 DLL폼 올리기 최종..

by 메르세데쓰 2017. 3. 22.
반응형


안녕하세요 메르세데스입니다.


델파이로 패널위에 DLL폼올리는 문제로 거의 2년 가까이 고민했었는데 이제 완전히 해결하여 정리차원에 포스팅을 남겨봅니다.


결국엔 도와주는 이가 없이 스스로 해결하였습니다. 사실 이런저런 프로젝트개발에 서버관리에 혼자서 해야 할 일이 많다보니 한곳에 집중할 시간이 없어 차일 피일 미뤄진 것이지요..




소스를 공유하여 관리하는 그룹프로젝트라면  폼올리는 것이야 그리 어려운 일은 아닙니다만..


그럴수 없는 환경이라면  차후 유지관리측면을 위해서라도 또한 재사용성을 높이기 위해서 이런 시도는 앞으로를 위한 좋은 방향이라 생각합니다.


 


예전에도 언급하였지만 Panel위에 올리는 방법은 2가지가 있습니다.


1.Create(nil) 후..  Windows.SetParent( ..  )



2.CreateParented(ParentHandle)로 적용하는 방법..


패널위에 내가 갖고있는 소스를 올리는 방법은  SETFOCUS와 같은 코딩을 하지 않는이상에야..포커스를 잃을 염려가 없기 때문에  두 방법 모두 무방합니다.


근데 방법을 제가 잘못 이해하고있어 그동안 문제가 있었습니다. 




패널위에 폼을 올리는 안전한 방법을 위해선


1)해당Panel을 갖고있는 form 또는 메인프로그램의form 또는 Handle값,  그리고 2)올리고자하는 위치(Panel 또는 그것의 handle)값이 필요합니다.



아래그림을 예로든다면..


출처:나


1.소스폼을  올리는 방법.


uses BFormT1;



...

begin

        BFormS1          := TBFormS1.Create ( AFormS1 );

        BFormS1.Parent := BPanel;

        BFormS1.Align   := alClient;

        BFormS1.Show;

...

        


이렇게 처리하면 됩니다. 그럼 안전하게 올라갑니다.  메인폼A를 종료하고 다시 열어도  code:1400과 같은 보기싫은 에러가 안뜹니다.




2.dll폼을  패널에 올리는 방법.


dll은 저희 사이트에선 100% SHOWMODAL로 띄워 사용하고 있었는데요 장점도 있지만 단점도 있습니다.  창을 닫아야 다른작업을 할 수 있어 통계나 조회용도 이외엔 큰 제약을 받았습니다.  닫고 열기를 반복해야하니 효율이 떨어지죠.. 


하지만 올리는 방법은 그리 어렵지 않습니다. 1의 방법을 그대로 따라 하면되는 것이지요.. 따라서.. 


DLL을 호출하는 파라미터에  소스폼을 Panel에 올리는데 필요한  AFormS1 , BPanel 의 정보를  추가로 전달해주면 됩니다.


그리고 DLL쪽에서 폼을 생성하는 부분을 위의 방법 그대로 구현해주면 됩니다.



구현부분:

.....

     FreeAndNil( DLLFORM );


     if DLLFORM = nil then

     DLLFORM :=   TDLLFORM .CreateParented( form_hwnd );  //form_hwnd :파라미터로 전달받은 폼의 Handle

                                        //CreateParented를 이용하면.. 포커스를 잃어버리는 문제를 해결할 수 있음.


     DLLFORM .BorderStyle := bsNone;    //테두리 없애고..

     Windows.SetParent(DLLFORM.Handle, parent_hwnd);       //parent_hwnd :파라미터로 전달받은 A폼내 패널의 Handle


     DLLFORM .Align       := alClient;      


     DLLFORM .Show;

....



종료부분:

procedure TDLLFORM FormClose(Sender: TObject; var Action: TCloseAction);

begin

   action := cafree;

   DLLFORM := nil;

end;




혹시 비슷한 문제로 고민하시는 분들께 도움이 되었으면 좋겠습니다.




반응형

댓글