본문 바로가기

언어/delphi

델파이에서 동적으로 Package (bpl) 이용하기 (MDI Child)

출처: http://minooya.blogspot.kr/2016/03/package-bpl-mdi-child.html


매번 느끼는 거지만, 뭐가 좋다고 내가 델파이를 이리도 가까이 두는지 모르겠다.
궁금증을 달래줄 자료도 부족하고, 툴이 무료도 아닌데 말이지!!

이번에도 특별한 문제거릴 하나 만났는데, 'bpl을 동적으로 활용하는 방법' 이었다.

대형 MDI 폼을 만들다 보면 수많은 Child 폼을 만들때가 있는데, 하나의 exe 파일에 모든 폼을 다 등재하기엔 좀 무리가 있지 않겠는가? 그래서, 대안이 dll사용인데, 그보다 bpl로 활용하면 여러 잇점이 있다.
델파이 자체형 dll 격이기 때문에, 호환성 측면에서 좋다고나 할까?
여튼, 그 문제는 차치하기로 하고 프로그램 분할에 있어서 bpl을 사용하면 여러모로 신경쓸게 적어져서 좋다.

이번에도 사용자 폼을 bpl로 만들어서 MDI 폼에서 Child로 활용하려고 예제를 하나 만들었는데, 좀처럼 해결이 되지 않았던 부분이 있었다. 그래서 경험을 토대로 기록을 남긴다.

아, 그리고... 이 예제는 XE10 최신 버전을 가지고 활용했다.
인터넷에 널린 '예제들', '설명들' 이것들은 죄다 예전버전이라 설명이 그럴듯해 보이긴 해도, 최신 버전에 적용하면 여지없이 오류난다.

그럼 이제 작업시작
먼저, 이 예제 포스팅의 최종 목적은 이러하다.
-
두개의 폼이 있는데, 하나는 MDIForm, 또 하나는 MDIChild로 구성한다.
MDIForm의 버튼을 클릭하면, MDIChild를 호출하여 불러온다.

-

간단한 예제인 만큼, 신경쓸일도 적다. 근데, 이거 하나 최신개발버전에 맞게 명쾌하게 알려주는 이 없어 답답하더라.

1. 폴더구성.
-main폴더는 mdiform
-child폴더는 mdichild 만 담아둘것이고
-output폴더는 최종 컴파일된 산출물 파일들을 담을곳이다




2. MDIForm 만들기
-폼 만들고, 폼스타일 변경하고, 버튼 하나 올리자
-main폴더에 저장한다



3. MDIChild 만들기

-Project Manager View에서 projectGroup1 을 선택하고 새 프로젝트 - package를 추가한다.
-패키지에 Contains 폴더 하위에 새폼 하나 생성하고 child 폴더에 저장한다.
-이 폼은 child폼으로 쓸거니까, 폼 스타일을 child로 바꾼다.
-ProjectGroup은 상위 폴더인 '테스트'에 바로 보이게 하는게 낫겠죠?




4. 각 프로젝트의 산출물의 결과는 output 폴더로 지정하려 한다.
-각 프로젝트의 옵션에서 output 폴더를 새로 지정하자



이렇게 한건 별거 없다.
결과물을 같은 폴더내에 두어서, 찾기 쉽게 하려고 하기 위함이다.

5. 이제 패키지 프로젝트를 컴파일 하자


패키지 등록창이 뜨면 OK

6. 이제 메인프로젝트로 가서 옵션-package-runtime packages에서 link with runtime package를 true로 전환한다. - 실행중에 패키지 이용한다는 뜻이니까!





----------딱 여기까지가 인터넷에 알려진 정보임

 
//..메인폼에 코드 작성
unit unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    pckmodule : HMODULE;  <==
    tmpclass : TPersistentClass;  <==

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  pckmodule := LoadPackage('search.bpl');  <==활용할 bpl 파일을 로딩.

  tmpclass := GetClass('TForm2');  <==클래스 따야겠죠?

  with TComponentClass(tmpclass).Create(Application) as TCustomForm do
  begin
    Show;
  end;

end;

end.


//..child폼에 코드 작성
unit unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}


initialization  <==초기화. 클래스 등재 해야겠죠?
  RegisterClass(TForm2);


finalization  <==
  UnRegisterClass(TForm2);



end.	  


9. 전체적으로 컴파일 해서 메인프로그램 구동 시키기. 완성-끝



전체적으로 빠른 실행결과물을 뽑기 위해 작성하긴 했는데 이 단순 방법 말고도 여러방법으로 응용이 가능하다.
다만, bpl처음 실행하는 분들을 위해 어려움 최소화 하라고 경험포스팅 해 보았다.

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

유닛 참조와 uses 절 #3  (0) 2018.04.27
유닛의 구조와 문법  (0) 2018.04.27
Package의 폼을 메인 폼으로  (0) 2018.04.22
TPaingBox Canvas to Bitmap  (0) 2018.03.30
ZXing.Delphi (Reading QRCode)  (0) 2018.03.30