LazarusCompleteGuide:4.1

From 흡혈양파의 번역工房
Revision as of 12:18, 19 February 2013 by Onionmixer (talk | contribs) (LCG 4.1 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

GUI 애플리케이션

1980년대 GUI 애플리케이션이 도입된 이후 GUI(그래픽 사용자 인터페이스)는 완벽하게 수용되었다. 사실상 GUI는 오늘날까지 유일하게 명령 행으로 작업하는 시스템 관리자라 할 수 있다. 플랫폼 독립적인 사용자 인터페이스는 플랫폼 독립적 GUI 라이브러리로 인해 발전했는데, 라이브러리 중 일부는 심지어 유니코드(Unicode)를 지원하여 많은 언어로 표시된 텍스트의 지원도 가능케 한다. 표 4.2는 Pascal을 이용한 프로그래밍에 이용할 수 있는 최신 GUI 라이브러리를 몇 가지 소개한다.

라이브러리 파스칼에 바인딩 Win 32 Win 64 Linux, BSD Mac OS X native WinCE
라자루스 LCL 파스칼로 작성됨
KOL-CE 파스칼로 작성됨 - - -
fpGUI 파스칼로 작성됨 -
MSEgui 파스칼로 작성됨 - - -
Qt 4.5+
Delphi VCL 파스칼로 작성됨 - - - -
Gtk+2.x - -
표 4.2: 파스칼 GUI 라이브러리


라자루스에서 위를 각각 이용해 애플리케이션을 작성할 수 있지만 (Delphi의 VCL 제외) LCL 애플리케이션만큼은 라자루스의 GUI 디자이너, 오브젝트 인스펙터, 컴포넌트 팔레트로 설계할 수 있다. 물론 본 저서에서도 라자루스 컴포넌트 라이브러리(LCL)의 작업에 관해 논할 것이다.


해당 라이브러리를 기반으로 새 GUI 프로그램에서 작업을 시작하기 위해선, File ⇒ New 메뉴에서 New... 대화창이 열리면 Application 을 선택한다. Form1 이란 이름의 새 메인창이 열리고, 컴포넌트를 수락할 준비가 되어 있다.

그림 4.3: File ⇒ New를 이용해 새 GUI 애플리케이션 생성하기


새 (GUI) Application 을 선택하면 필요한 모든 파일이 생성되며, 디자이너와 소스 에디터 창이 열린다. 이후 File ⇒ New Unit 을 이용해 원하는 파스칼 유닛을 에디터에 새 소스 창으로서 추가할 수 있다. 필요한 추가 폼은 File ⇒ New Form 를 선택하거나, File ⇒ New 를 선택해 열린 창에서 모듈 헤드(Module heading) 아래의 적절한 항목을 선택하여 추가한다. 애플리케이션이 하나 이상의 창을 포함한 경우, Project ⇒ Project Options 를 이용해 Project Options 대화창이 열리면 메인 창을 선택할 수 있다.


Options for Project:project1 대화창에 Project Options 라는 헤드(heading)는 Forms 섹션을 포함하여 메인 폼을 명시하도록 해준다 (Forms 페이지를 열려면 Forms 를 클릭). 프로젝트 파일에서 생성된 첫 번째 창은 항상 메인 창이 된다. (Auto-create forms: 리스트상자의 최상위에 표시된다.) 메인 창이 닫히면 GUI 애플리케이션도 중단된다.


콘솔 애플리케이션의 경우, 라자루스는 편안한 소스 코드 에디터의 역할을 할 뿐이다. 반면 LCL 프로그램에 대한 IDE의 통합은 오히려 제공할 것이 많다. 라자루스 IDE는 사용자의 애플리케이션이 필요로 하는 꽤 많은 소스 코드를 자동으로 생성해준다. 예를 들어, 컴포넌트가 폼으로 추가될 때 그에 해당하는 코드 유닛이 소스 코드 내의 uses 문으로 자동으로 추가된다 (사용자가 아직 추가하지 않았을 시). 폼 클래스 정의 또한 자동으로 관리된다. 사용자가 이벤트를 더블 클릭하면 (오브젝트 인스펙터의 Events 탭에 열거된) 이벤트 핸들러의 본체가 자동으로 소스 코드 내에 삽입된다. 심지어 BEGIN 에 상응하는 END 가 자동으로 삽입되기도 한다 (귀찮다면 비활성화 할 수도 있음).


라자루스 프로젝트는 단일 프로그램 파일로 구성되는 것이 아니며, 다른 많은 파일들을 필요로 한다. 메인 프로젝트 파일은 .lpi 확장자를 가지며 XML 포맷으로 되어 있다. 주로 IDE에서 프로젝트를 여는 데에 사용된다. 메인 프로그램 루프(loop)는 .lpr 파일에 위치한다 (Delphi의 .엑 파일에 해당). 프로젝트는 라자루스 IDE에서 해당 .lpr 파일을 선택하여 열 수도 있다.


각 프로젝트에는 .lpi 확장자로 된 파일 하나와 .lpr 확장자로 된 파일 하나만 포함되어 있다.


라자루스 프로그램은 그 외 많은 파일을 포함한다. 그에 관한 개요는 표 4.3을 참고한다. 라자루스는 XML 포맷을 이용해 메인 프로젝트 파일을 (.lpi) 작성하고 제어한다. 수동으로 편집할 수도 있지만 편집해선 안 된다. 이 파일은 프로젝트와 디렉터리 경로에 비표준 옵션 설정들을 모두 포함하여 프로젝트를 다른 사용자의 계정이나 심지어 다른 운영체제로 이동을 가능하게 한다. 이와 관련해 문제가 발생하는 경우는 드물다. 프로젝트를 이동 시 문제가 발생할 경우, .lpi 파일에서 저장된 경로를 삭제할 수 있다.

파일 설명
Project1.ico Windows 아이콘 포맷으로 된 메인 프로젝트 아이콘.
Project1.lpi 보통 프로젝트를 여는 데 사용되는 메인 프로젝트 파일.
프로젝트에 속한 파일 및 다른 프로젝트 관련 정보를 모두 포함한다. IDE 설정이 만일 구분된 .lps 파일에 저장되지 않는다면 여기에 저장할 수 있다.
Project1.lpr 메인 프로그램의 소스 코드. 일반 파스칼 소스 코드로서, 특수 파일명 확장자로 저장된다 (델파이의 .dpr 프로젝트 파일에 해당).
Project1.manifest 윈도우 특정적 파일로서, 의무는 아니지만 exe-file과 함께 사용할 수 있다. 이 파일은 컨트롤이 Windows XP 테마 스타일로 표시되도록 명시한다. Windows XP 이전 버전의 윈도우에는 영향을 미치지 않는다.
Project1.rc 윈도우 리소스 파일. 실제 소스 파일이다 (델파이의 .res 파일처럼 바이너리 파일이 아닌). 해당 리소스 정보는 메인 프로그램 아이콘과 함께 윈도우의 exe-file로 컴파일된다.
Form1.pas Form1 창에 대한 파스칼 소스 코드. 메인 폼 유닛의 소스 코드와 클래스 정의를 포함한다. .pas 를 확장자로 한 다른 파일들은 다른 폼과 다른 소스 코드를 포함한다. .pas 확장자 외에 .pp 또한 파스칼 소스 파일의 확장자로 허용된다. 이는 델파이 소스 파일과 헷갈릴 염려가 없으므로 좋은 선택이다.
Form1.lfm 이 파일은 Form1 창 내에 소스 코드가 참조하는 모든 컴포넌트에 관한 정보를 포함한다 (델파이의 .dfm 파일에 해당).
Form1.lrs 라자루스 리소스 파일. 이는 .lfm 파일로부터 자동으로 생성된다.
표 4.3: 일반 라자루스 프로젝트에서 찾을 수 있는 파일 타입


아래 리스트는 .lpi 파일에서 찾을 수 있는 일반적 섹션이다:

<?xml version = "1.0" ?>
<CONFIG>
  <ProjectOptions>
    <Version Value = "7" />
    <General>
    <Flags>
      <AlwaysBuild Value = "False" />
    </Flags>
  <SessionStorage Value = "InProjectDir" />
</CONFIG>


lfm 파일 또한 매우 단순한 구조를 가진다. 그 레이아웃과 구문은 델파이의 .dfm 파일의 것과 매우 유사하다:

object Form1: TForm1
  Left = 369
  Height = 240
  Top = 156
  Width = 320
  Caption = 'Form1'
  ClientHeight = 240
  ClientWidth = 320
  Menu = MainMenu1
  LCLVersion = '0.9.31'
  object Button1: TButton
    Left = 16
    Height = 25
    Top = 72
    Width = 75
    Caption = 'Button1'
    OnClick = Button1Click
    TabOrder = 0
  end
  object MainMenu1: TMainMenu
    left = 10
    top = 10
  end
end


.lrs 파일은 .lfm 파일의 바이너리 형태로, 프리 파스칼 컴파일러 버전 2.2.x 에서 (그리고 그보다 이전 버전) 바이너리 리소스 파일을 지원하지 않기 때문에 필요한 파일이다.


IDE는 .lrs 파일을 자동으로 생성하므로 소스 코드에 따로 저장하거나 소스 코드 배포를 위해 SVN, CVS 혹은 Git Repository에 포함시킬 필요가 없다. 단, 프로젝트 인스펙터에 모든 유닛을 열거하기만 하면 된다. 라자루스 IDE 0.9.28 이상 버전에서는 .ppu 파일이 생성되는 출력 폴더와 동일한 폴더에 .lrs 파일을 생성한다.


열거된 파일은 사용자의 소스를 배포할 경우에만 필요하다. 실행 파일의 배포를 위해선 실행 파일만 전달해야 한다 (Unix 또는 그에 상응하는 운영체제 확장자 없이. 단, 윈도우 버전에서는 .exe 확장자 포함). 라자루스와 프리 파스칼 컴파일러는 프로젝트의 컴파일 중에 엄청난 양의 중간파일(intermediate file)을 생성한다. 이러한 파일들은 절대로 배포할 이유가 없으며, 디스크 용량을 줄이기 위해 삭제하기도 한다. “.o, .ppu, .res, .or, .lrs, .rc, .compiled” 를 확장자로 하는 모든 파일이 여기에 포함된다. 컴파일러는 .manifest 파일도 생성하는데, 이는 프로그램을 윈도우 XP(또는 Vista 또는 Windows7)에서 사용할 때 해당 플랫폼에 컨트롤의 테마 모양을 표시할 때만 필요하다. GUI의 모양이나 프로그램의 기능에는 필요하지 않다. 그리고 .o와 .or 파일은 컴파일러가 작성한 객체 파일이다. .rc 파일은 리소스 파일의 소스 코드이며, .res 파일은 그것을 컴파일한 결과이다.


프리 파스칼 2.4 부터 프로젝트는 프리 파스칼에 의해 자동으로 컴파일되는 .rc 파일을 포함하거나, 선컴파일된(precompiled) .res 파일을 포함할 수 있다.


이를 실행하려면 컴파일러 지시어 {$R MyResource.rc}를 설정한다. 델파이와 반대로 .ppu 파일은 컴파일된 유닛의 바이너리가 아니다 (라자루스에선 .o 파일이 바이너리에 해당한다). 오히려 컴파일된 유닛에 필요한 추가 기술 파일(description file)에 속한다. 소스 코드가 전혀 없다면 해당 유닛을 이용해 컴파일을 컴파일하는 데에 .o 파일과 .ppu 파일 둘 다 필요하다. 아래는 폼 유닛에서 발견되는 initial 코드이다 (기본 이름: unit1.pas):

unit Unit1;
{$mode objfpc}{$H+}
interface

uses Classes, SysUtils, FileUtil, LResources, Forms, Controls,
                                              Graphics, Dialogs;

type
  TForm1 = class(TForm)
  private
{ private declarations }
  public
{ public declarations }
  end;
var Form1; TForm1;

implementation

initialization
{$I unit1.lrs}
end.


GUI 애플리케이션의 개발은 위의 소스 코드와 빈 폼 창으로 시작된다. 창 클래스의 정의 및 필수 유닛의 가져오기(import)는 이미 준비되어 있다. 새 GUI 애플리케이션을 위한 프로그램 파일은 (기본 이름: project1.lpr) 준비된 창을 자동으로 시작한다. 보통은 이 파일의 내용을 수동으로 변경할 필요가 없다:

program project1;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.