본문 바로가기

언어/delphi

Package의 폼을 메인 폼으로

출처: http://www.delmadang.com/community/bbs_print.asp?bbsNo=17&bbsCat=0&indx=196712


다음과 같은 어플을 고민하다가 발견하게 되었습니다.

1. 최초에 LOGIN 창이 뜬다.
2. LOGIN이 성공적으로 이루어지면 자동 업그레이드를 수행한다.
3. Main 폼이 뜬다.(예를 들면 MDI Form)
4. Main 폼이 세부 업무에 따라 창을 띄운다.(예를 들면 MDI Child)

------------------------------------------------------------
중요한 점은 반드시 LOGIN이 이루어진 후에 자동 업그레이드가 수행되어야 하고 
Main 폼 마저도 자동 업그레이드의 대상이 된다는 점입니다.
------------------------------------------------------------

따라서 
1. 메인폼을 DLL 혹은 BPL로 분리하고 
2. LOGIN 창이 먼저 떠서 DLL 혹은 BPL을 다운받아 업그레이드 하고 
3. 다음에 DLL 혹은 BPL을 동적으로 로드하여 메인 폼을 띄운다
는 것이 저의 생각이었습니다.

DLL로 여러가지 시도를 해 보았으나 모두 실패하였고요(DLL로는 불가능하다는 것이 잠정적인 결론~!) 
Package(BPL)로는 다음과 같은 결과를 얻었습니다.

우선 메인 폼으로 사용할 폼을 가지는 BPL 패키지를 만들고요(여기서는 "BplMain.bpl") 
로긴폼을 포함하고 있는 프로젝트 파일(dpr)에 다음과 같이 코딩합니다.
------------------------------------------------------------


var
	PackageModule: HModule;
	AClass: TPersistentClass;
	MainFormClass: TFormClass;
	MainForm: TForm;

{$R *.res}

begin

Application.Initialize;

// 로긴폼 먼저 띄우고
LoginForm := TLoginform.Create(Application);
LoginForm.ShowModal;
LoginForm.Free;

// 패키지 동적 로드
PackageModule := LoadPackage('BplMain.bpl');
if PackageModule <> 0 then begin
	AClass := GetClass('TMainForm');
	if AClass <> nil then begin
		// Application의 CreateForm에 의해서 최초로 생성된 폼이 
		// 메인폼이 되므로 다음과 같이 코딩~!
		MainFormClass := TFormClass(AClass);
		Application.CreateForm(MainFormClass, MainForm);
		Application.Run;

		MainForm.Free;
		UnloadPackage(PackageModule);
	end;
end;

end.	  



------------------------------------------------------------

위와 같이 하니 LOGIN폼이 먼저 뜨고 다음으로 BPL의 메인폼이 뜹니다.
Project|Options|Forms...를 보면 
메인폼을 지정하는 콤보박스는 빈칸으로 되어있고 
Auto-create 폼에는 메인폼(여기서는 "MainForm")만이 추가가 되어 있습니다.

참고:로긴폼을 ShowModal로 띄우려면 
1. visible이 false가 되어야하고 
2. 폼스탈이 fsNormal 혹은 fsMDIForm이어야만 
하더군요. 이것땜시 또 무지 헤메고...

------------------------------------------------------------
참고로 저는 주로 C로 프로그래밍했고 VB만 쪼금 해본지라 
델파이는 생소하기 그지 없습니다.
위에서 사용한 meta-class 개념도 참 신기하네요.
CLASS의 인스터스가 아닌 CLASS의 인터페이스를 참조한다는 것이... 쩝
C에서 익숙해서 그런지 이해가 쉽지 않고 제대로 사용했는지 의문입니다.

아직 창을 띄어보는 테스트만 해보고 실제 어플을 만들어 본 것은 아니라서 
혹시 다른 문제점은 없을지 고민되네요. 고수님들의 많은 검토와 조언 부탁드립니다.

그럼. 꾸벅^^

'언어 > delphi' 카테고리의 다른 글

유닛의 구조와 문법  (0) 2018.04.27
델파이에서 동적으로 Package (bpl) 이용하기 (MDI Child)  (0) 2018.04.22
TPaingBox Canvas to Bitmap  (0) 2018.03.30
ZXing.Delphi (Reading QRCode)  (0) 2018.03.30
Delphi QR Code Generator(zxing)  (0) 2018.03.28