본문 바로가기
Application/Delphi Lecture

activex 쉽게 만들기

by 현이빈이 2008. 8. 13.
반응형

안녕하세요? 김영진입니다.
그동안 '도련' 이라는 아디로 활동하다 본명으로 활동하려 합니다.

그동안 ActiveX 를 만들면서 항상 느껴 왔던게 '실행' 과 '디버깅' 이었습니다.
코드 열심히 만들어서 한번 볼려고 하면 일반 Application 에서는 F9 만 누르면 되었었는데 ActiveXForm 은 Deploy 를 해야 하고, Browser 로 URL 을 치고 확인을 해야 하는 불편함이 었었죠. 또한 Debuging 도 힘들어서 Break Point 를 걸고 하는 작업이 불가능 했습니다. 나름대로 잘 만들었다 생각되지만 사실 어디서 메모리 누수가 일어나는지도 정확히 catch 할 수 없고.. 에러가 나면 Browser 가 죽어 버리는등 상황이 발생하기도 합니다.

1. 프로그램은 Application 으로 만들자!

힘들게 ActiveXForm 위에서 코딩하지 마십시오. 그냥 Application 으로 프로그램을 다 만드세요. 실행해서 확인하기도 쉽고, 디버깅하기도 편리 합니다.
혹자는 Application 으로 만든다음에 ActiveXForm 으로 소스를 변경하거나 Control 및 소스코드의 이전을 하시는 분도 계신데 그렇게 하지 마십시오.

2. 이제 ActiveX Form 을 하나 간단하게 만듭니다.

Form 위에는 아무것도 올려 놓지 마세요. 그냥 순수한 ActiveXForm 자체면 됩니다.

3. Application 으로 만들었던 .pas 파일을 ActiveX Project 에 Add 합시다

ActiveX 이름이 'test' 라고 가정했을때 다음과 같은 트리 구조가 나옵니다.


ProjectGroup1
  testProj1.ocx
     testImpl1
        testImpl1.pas
        test <- 요게 ActiveXForm 이겠죠.. TActiveForm 을 상속받은..
     testProj1_TLB.pas <- 요곤 타입 라이브러리임돠..
     Unit1
        Unit1.pas
        Form1  <- 요게 일반 Application 으로 만들었던 MainForm 입니다.



4. testImpl1.pas 에서 Unit1 를 uses 문에 추가하세요.

5. test(ActiveXForm) 폼의 OnCreate 이벤트에 다음과 같이 코딩하세요.

var
 Fomr1: TForm1;
begin
 Form1 := TForm1.Create(Self);
 with Form1 do
 begin
   Parent := Self; // <- Parnet 를 바꿔줍니다.    
   Show;
 end;

이런식으로 하면 프로그램은 Application 으로 만들고 ActiveXForm 에서는 아무일도 안해도 마치 ActiveX 처럼 보이게 됩니다.

위처럼 따라 하시고.. Deploy 하신후 확인을 하면.. 짜잔!!! 될줄 알았는데...

안됩니다. -.-;;; Applicaton 에서는 이런 식으로 Parent 를 바꿔주면 새 폼이 기존 폼안에 쏙 들어와서 박히는데 ActiveX 는 안됩니다.

그런 어떠게 해야 하느냐..

Unit1 의 TForm 의 상속 클래스를 바꾸어 줘야 합니다. <- 중요!!!

Unit1.pas 의 소스를 보면..

type
 TForm1 = class(TForm)
 ..

이렇게 되어 있습니다. TForm 대신 TActiveForm 을 상속받도록 수정합니다.

 TForm1 = class(TActiveForm)

참, TActiveForm 은 AxCtrls unit 에 포함되어 있습니다. 상단 uses 에 AxCtrls 를 추가해 주세요.

그리고 Deploy 를 하면..

Form1 에서 어떤 프로퍼티를 찾을 수 없다는둥.. 하는 에러 메세지가 나오면서 또 안됩니다.

없다고 하는 프로퍼티.. 그냥 추가해 줍시다.

 published
   property Align;
   property BorderStyle;
   property ClientHeight;
   property ClientWidth;
   property OnClose;
 end;

이런식으로요.. 어차피 TActiveForm 이나 TForm 이나 TCustomForm 에서 부터 상속받아 만들어진 Class 입니다.

그리고 다시 컴파일, Deploy 하시고 웹에서 보면.. 짜잔!!

기존에 만들었던 프로그램이 ActiveX Form 안으로 쏙 들어가 있는 모습을 발견하실 수 있을겁니다. 이와 같은 방법으로 매우 간편하게 ActiveXForm 을 만들수가 있습니다. ^-^



[추가 팁]

메모리에 관련해서.. ActiveX 가 Loading 이 되고 나면 메모리 해제는 언제 될까 생각해보고 테스트 해 봤습니다. Browser 가 종료될때? 당연히 메모리 해제가 되겠죠..
그럼 URL 이 변경될땐? 메모리 해제가 될까요? 제가 테스트해본 바로는...
메모리 해제가 안되더군요 ㅡ.ㅡ;; 흠.. 이에 관련해서 자세히 아시는 분 추가 설명 좀 부탁 드립니다.

그래서 이 강좌에 첨부한 sample 소스에서 OnDestloy 이벤트에 ShowMessage 를 걸어
확인을 해 봤습니다..
참 신기하게.. ActiveXForm 은 페이지가 변경되거나 Browser 가 종료될 때 까지도
ShowMessage('Destloy1'); <- 이 문장을 실행하지 않더라는 겁니다. 어찌된 영문인지는 모르겠습니다. 아시는 고수님 설명좀 부탁드립니다. ㅠ.ㅠ 제대로 Destloy 는 되는건지.. 흠.. 혹시 Itest 인터페이스에서 그냥 release 하는건지 ㅡ.ㅡ;;
확실한건.. Browser 가 종료되거나, 페이지가 바뀌는 순간에.. 위 처럼 만든 Form1 은
반드시 Destloy 이벤트가 발생한다는 겁니다. 즉, 확실히 메모리 해제를 할 수 있습니다.


AxBorderStyle 와 폼의 BorderStyle 을 bsNone 으로 하시면 테두리가 사라집니다. 하나의 ocx 안에 여러개의 activex 폼이 있어도 상관 없습니다.





아랫분이 Application을 만들고 Form의 Parent를 바꾸는 방식을 쓰신 것 같은데..

저는 이렇게 합니다.


1. Application 작성

2. ActiveForm 생성

3. ActiveForm에 Application의 Mainform Docking...

그러면 다른 절차 없이 그냥 된다는... 전설이... 있습니다...

예)


procedure TDockX.ActiveFormCreate(Sender: TObject);
 begin
   Form1 := TForm1.Create(nil);
   Form1.ManualDock( Self, nil, alTop );

   Form1.show();
 end;


출처 : 델마당

반응형