PilotMAG을 이용한 Palm Programming

PilotMAG을
이용한 팜프로그래밍

작성자: 이희용
마지막 수정일: 2002-5-8
문서버전: 1.00

이 메뉴얼은 PilotMAG를
이용해 팜용 프로그램을 개발하는 분들께 도움이
되고자 작성한 것입니다.
페이지 레이아웃은 1024*768사이즈를 기준으로
하였으며, PilotMAG을 설치하고 실행하기 위한
최소한의 설정에 대해서만 언급했습니다. 부족한
점은 차차 보완해 나가도록 하겠습니다.

이 웹문서에 대한
조언은
crystal@chol.net으로 해주시면
감사하겠습니다. 참고로 저는 직업적이고,
전문적인 프로그래머가 아닌 왕초보이므로, 팜
프로그래밍상의 로직이나 알고리즘 등의
프로그래밍 솔루션에 대한 질문은
KPUG.net
개발자 개시판을 이용해 주시면 고맙겠습니다.


1. 개요

Palm 프로그램을 제작하는데 있어
사용되는 프로그래밍 툴에는 여러가지가 있는데
(자세한 내용은 www.palmos.com/dev/tools를 참조), 그
중 C언어를 사용하는 개발자라면 통상 CodeWarrior나
PRC-Tools 등을 사용할 것이다. 그러나 CodeWarrior는
막강한 통합개발환경을 제공하는 장점이 있는
반면, 덩치가 크고 가격이 비싼 점이 단점이라 할
수 있다. 한편, PRC-Tools는 무료로 배포되는 반면,
Comand-line방식의 환경을 가지고 있기에 프로그램
작성과 컴파일 과정에서 불편한 점이 있다. 물론
PRC-Tools를 이용한 프로그래밍을 도와주는 PilRC라는
리소스 에디터가 있긴 하지만 이것만으로는
완전한 통합개발환경이라고 말하긴 어렵다.
여기서 소개하는 PilotMAG은 비교적
저렴한 가격($20)으로 위와 같은 PRC-Tools와 PilRC의
단점을 보완하고, Windows 상에서
통합개발환경을 구현해주는 프로그래밍 툴이다
(참고로 PilotMAG는 CodeWarrior처럼
독립된 개발툴이 아니며, PRC-Tools와 PilRC를 필요로
한다)
.

2. 설치

PilotMAG를 실행하기 위해선 PC에 이미
다음과 같은 프로그램들이 설치되어 있어야 한다.

Cygwin b20.1
PRC-Tools 2.0
PilRC for Win 32
Palm OS SDK
Palm OS Emulator

위의 프로그램들의 자세한
다운로드 및 설치방법은
팜사의 개발자 관련
홈페이지
를 참조하기 바란다.
노파심에서 말하건데, Windows 사용자는
Installing with CygWin 항목만 선택하여, 이대로
따라하면 되며
, 이외의 설치방법인
Installing with RPMs와 Building from Source는 리눅스나
유닉스 사용자를 위한 PRC-Tools설치법이므로
따라할 필요가 없다.
참고로 PilRC는 버전 2.8을 권한다. 2.9 버전은 아직
안정적이지 않은 듯하다.

참고로 간단하게나마 위의
프로그램들의 설치과정을 요약하면 다음과 같다.
다음과 같이 하면, PilotMAG프로그램 실행시 에러
없이 보다 확실한 작동을 보장한다.

  1. Cygwin을 인스톨한다. 인스톨이
    끝난 뒤, C드라이브의 Autoexec.bat 파일의
    마지막에 다음과 같은 내용을 추가한다.
    set Path="C:\Program Files\PRC-Tools\H-i586-cygwin32\bin;c:

    \CYGNUS\CYGWIN~1\H-I586~1\BIN;%PATH%"
    그리고 나서 Cygwin이 설치된 디렉토리(일반적으로
    c:\cygnus\cygwin-b20이다)에 들어가 보면, cygnus.bat파일이
    있을 것이다. 그 파일의 내용 중 path를
    지정하는 부분을 주석문으로 다음과 같이
    바꿔놓는다.
    rem SET PATH=c:\CYGNUS\CYGWIN~1\H-I586~1\BIN;%PATH%

  2. PRC-Tools를 인스톨한다. Path지정은
    이미 위에서 끝났으므로 별도의 조작이
    필요없다.
  3. PilRC를 인스톨한다. PilRC의
    경로는 나중에 PilotMAG에서 설정해주므로
    별도의 조작이 필요없다.
  4. Palm OS SDK를 설치한다. 3.5를
    권장한다. 보편적으로 사용하는 OS이기
    때문이다.
    인스톨이 끝나면, 링크를 시켜줘야 하는데,
    이때 Cygwin이 필요하다. "시작"->"프로그램"->"Cygnus
    Solution"->"Cygwin b20"을 선택하여
    Cygwin을 실행시킨다. 실행 시킨 후 bash
    프롬프트가 뜨면 다음과 같은 명령을
    입력한다.
    cd /PalmDev
    rm sdk
    ln -s sdk-3.5 sdk
  5. Palm OS Emulator를 C:\Palm
    디렉토리에 인스톨시킨다.
  6. 설치가 끝난 후, C:\cygnus\cygwin-b20\H-i586-cygwin32\bin
    안의 cygwin1.dll파일을 C:\Windows디렉토리에
    복사해두면, 컴파일과정에서의 에러를
    방지할 수 있다.

PRC-Tools와 PilRC를 설치했다면, PilotMAG를
아래와 같은 사이트에서 다운로드 하여 설치한다.
최신 버전은 4.3이다.

http://www.users.cg.yu/montesoft
http://montesoft.tripod.com
http://www.geocities.com/montesoft

다음은 PilotMAG의 실행화면이다.

그런데, 위와 같이 PilotMAG을 제대로
사용하기 위해서는 몇가지 설정을 해주어야 한다.
메뉴상의 "Tools"항목 중 "Environment
Options"를 선택해보면 환경을 설정할 수
있는데, Environment Options 가운데, 중요한 설정값은
아래 그림들을 참고로 하여 설정하면 된다.

참고로 위의 그림 중 PilRC Edit라는
프로그램은 필자가 개인적으로 리소스 파일(.rcp)을
읽어들일때 사용하는 Java 프로그램이며, PilotMAG의
부속화일이 아님을 밝힌다.

이제 PilotMAG를 사용하기 위한
환경설정이 다 끝났다.

3. 메뉴구성

PilotMAG는 아래와 같은 메뉴를
가지고 있다.

각각의 메뉴에 대한 보다 자세한
설명은 "Help"의 "Documentation"을
참고하기 바란다.

이제 간단한 프로그램을 하나
만들면서 PilotMAG의 기능을 익혀보자. 지금부터
만드는 프로그램을 간단히 설명하면, Hello라는
폼에서 OK라는 버튼을 누르면 I love you라는 다른
폼으로 이동하고, 그 폼에서 다시 OK를 누르면
Hello라는 폼으로 다시 돌아오는 프로그램이다. 이
프로그램으로 폼 사이의 이동에 관한 기법을
익할 수 있을 것이다.

4. 프로그램 제작

메뉴 가운데 "File"항목 중
"New Project"를 누르면, 프로젝트 이름과
경로를 지정하라고 한다.
(여기서는 "sample"이라는 이름으로
프로젝트 이름을 정하겠다.)
프로젝트 이름과 경로를 지정하면 메인 폼이
하나 만들어지고 왼쪽에는 프로젝트 이름과
속성을 나타내는 창이 하나 생긴다.
(이 창을 앞으로 "속성창"이라 부르겠다.)

왼쪽에 있는 속성창의 세부항목에 대한 개괄적인
설명은 다음과 같다.

Application : Application에 대한
기본적인 정보를 포함, 프로그램 설명과 개발자
ID, 프로그램 아이콘을 설정할 수 있음.
Forms : 프로그램에서 사용되는 Form에 대한 정보를
표시
Units : 프로그램의 C소스를 나타냄
Resource : 프로그램의 헤더와 리소스 파일에 대한
정보를 표시

가. 폼 제작

폼은 속성창 위에 어디든지
마우스를 올려놓고 마우스 오른쪽 버튼을 눌러
나오는 팝업메뉴에서 New Form을 선택하거나, 아이콘을
클릭함으로써 만들 수 있다.

만들어진 폼에는 원하는 리소스를 배치할 수
있으며, 각각의 속성값은 각 리소스를 클릭하여
선택한 뒤, "Properities"탭을 선택하여
변경할 수 있다. 예를 들어 폼의 제목을 바꾸고
싶다면 다음 그림과 같은 순으로 하면 된다.

① 폼을 눌러 활성화시킨 후, ②
Properities를 눌러 아래와 같은 화면이 나오면, Label
text의 값을 변경해주면 폼의 제목이 바뀌는 것을
알 수 있다. 이처럼 폼이면 폼, 버튼이면 버튼을
먼저 선택하고 Properities탭을 누르면, 각각의
속성값을 변화시킬 수 있다.

마찬가지로 "Object Identifier"
항목을 다른 이름으로 변경하는 것도 가능하다.

여기서는 Form의 Label Text를 Hello로
바꿔 보자. Hello라고 입력한 뒤 엔터키를 치면
아래와 같이 리소스창에 폼 타이틀이 "Hello"로
바뀌는 것을 볼 수 있다.

그리고 ① 메뉴바의 Grid 아이콘을
눌러 그리드를 On 시키고, ② button을 옮긴 후, ③
Button의 라벨을 OK로 바꾼다.

자 이제 두번째 I love you라는 폼을
만들 차례이다.

아이콘을 눌러 폼을 또 하나 만든다. Object
ID가 Form1006인 새로운 폼이 하나 만들어졌다.

① 버튼 아이콘을 눌러 폼에 버튼을
추가하고, ② 위치를 잡은 후, ③ Button의 라벨을
OK로 바꾼다.

만들어진 폼을 확인하려면,
속성창의 Project 탭을 누른 후, Forms 왼쪽의 +를
눌러 노드를 확장시킨 후, 해당 폼 이름을
마우스로 클릭하면 된다. 이렇게 하면 각 폼에
해당되는 내용이 리소스창에 뜬다.

자, 이제 Hello폼과 I love you 폼,
서로간의 이동을 위해 C소스를 직접 만져줄 때가
됐다.

나. 프로그래밍

① Units의 노드를 확장시키면 sample.c라는
소스 파일이 나타날 것이다. 이 소스파일을
더블클릭하면 편집기 창에 sample.c라는 소스
파일이 편집가능한 상태로 불러진다. 이 소스
파일은 프로젝트를 만들면 자동으로 생성된다.
이렇게 만들어지는 소스 파일은 기본적인 내용을
포함하고 있기 때문에, 필요한 기능을 추가하고
변경하는 방식으로 프로그램을 짜나가면 된다.

② 소스 파일의 내용을 보자면,
프로그램이 SDK 3.5를 사용하고 있을 경우에는

#include <PalmOS.h> 와 #include <PalmCompatibility.h>라는
명령을 통해 헤더파일을 지정하고, SDK 1.0 ~ 3.1을
사용하는 경우에는 #include <Pilot.h>라는
명령을 통해 헤더파일을 지정함을 알 수 있다.
자신이 현재 사용하는 SDK에 맞게 변경해 주면
된다. 사용하지 않는 명령어 앞에는 "//"를
붙여 주석으로 만들어 주자.
다음으로 #include "@IncludeFile@.h"를 자신의
프로젝트 이름에 맞게 고쳐준다. 여기서는
프로젝트 이름이 sample이므로 #include "sample.h"라고
하면 되겠다. 참고로 속성창의 Resource항목에 이미
sample.h라는 파일이 있는데 이것은 단지 이름만
있는 파일일 뿐 아무 내용이 없는 파일이다(나중에
설명하게 되겠지만, 컴파일 단계에서 Generate
Resource명령을 내리면 비로소 sample.h가 생성된다).

이제 Hello 폼과 I love you 폼의 버튼을
눌렀을 때(이벤트가 발생했을 때), 어떻게
처리할지를 추가해주면 된다.
아래 소스파일 중 추가하거나 변경한 내용은
붉은 글씨로 나타냈다. 그러므로 붉은 글씨로 된
부분만 추가/변경해주면 된다.

//—————————————————————————
// PilotMAG Main
//
//
// (c) John Smith 01/01/99
//—————————————————————————
// This file is only start up code, it is not generated by
PilotMAG.
// You can edit this file by your self, to made your own
start up file.
// Originally located at: c:\Programs Files\Monte Soft\PilotMAG\PilotMAG.ptr
//—————————————————————————

// Main Include file for SDK 3.5
#include <PalmOS.h>
#include <PalmCompatibility.h>

// Main Include file for SDK 1.0, SDK 2.0, SDK 3.0, SDK 3.1
//#include <Pilot.h>

#include "sample.h" // Change this to: #include "YourProjectName.h"

static int StartApplication(void);
static void EventLoop(void);
static void StopApplication(void);
static Boolean frmMainEventH(EventPtr event);
static Boolean Form1006EH(EventPtr
event);

//—————————————————————————
DWord PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags)
{
int error;

if (cmd == sysAppLaunchCmdNormalLaunch)
        {
        error =
StartApplication(); // Application start code
        if (error)

                return
error;
        EventLoop();
// Event loop
        StopApplication
(); // Application stop code
        }
        return 0;
}

//—————————————————————————
static int StartApplication(void)
{
FrmGotoForm(Form1004);
return 0;
}

//—————————————————————————
static void EventLoop(void)
{
short err;
int formID;
FormPtr form;
EventType event;

do
        {
        EvtGetEvent(&event,
200);
        if (SysHandleEvent(&event))

                continue;
        if (MenuHandleEvent((void
*)0, &event, &err))

                continue;
        if (event.eType
== frmLoadEvent)

                {

                formID
= event.data.frmLoad.formID;

                form
= FrmInitForm(formID);

                FrmSetActiveForm(form);

                switch
(formID)

                        {

                        case
Form1004:

                                FrmSetEventHandler(form,
(FormEventHandlerPtr) frmMainEventH);

                                break;

                        case Form1006:
                           

     FrmSetEventHandler(form, (FormEventHandlerPtr)
Form1006EH);
                           

     break;

                        }

                }
        FrmDispatchEvent(&event)

;
        }
        while(event.eType
!= appStopEvent);
}

//—————————————————————————
static void StopApplication(void)
{
//Insert stop code here
FrmSaveAllForms();
FrmCloseAllForms();
}

//—————————————————————————
static Boolean frmMainEventH(EventPtr event)
{
FormPtr form;
int handled = 0;

switch (event->eType)
        {
        case
frmOpenEvent:

                form
= FrmGetActiveForm();

                FrmDrawForm(form);

                handled
= 1;

                break;
        case
ctlSelectEvent:

                if
(event->data.ctlEnter.controlID == Button1005 )

                        {

                        FrmGotoForm(Form1006);

                        handled
= 1;

                        }

                break;
        case nilEvent:

                handled
= 1;

                break;
        }
return handled;
}

//—————————————————————————
static Boolean Form1006EH(EventPtr event)
{
FormPtr form;
int handled = 0;

switch (event->eType)
        {
        case frmOpenEvent:
                form = FrmGetActiveForm();
                FrmDrawForm(form);
                handled = 1;
                break;
        case ctlSelectEvent:
                if (event->data.ctlEnter.controlID
== Button1007 )
                        {
                        FrmGotoForm(Form1004);
                        handled = 1;
                        }
                break;
        case nilEvent:
                handled = 1;
                break;
        }
return handled;
}

다. 컴파일과 링크

이제 남은 것은 컴파일과 링크인데,
PilotMAG에서는 전과정을 한번에 처리할 수 있다.
바로 Build Pilot Application의 단축키인 <F8>키를
누르기만 하면 된다. 물론 각 부분별로 나누어
진행하는 것도 가능하다. 다음 그림은 <F8>을
눌러, 팜상에서 실행 가능한 .prc파일을 한번에
만드는 것을 보여준다.

중간에 컴파일과 링크를 멈추려면 아이콘(평상시에는
안보이며, 컴파일하는 동안만 나타남)을 누르면
되는데, 이때 남게되는 임시 파일들은 지워주는
것이 좋다(Project 메뉴 중 Clean Project를 이용하면
된다).

라. 팜에 프로그램을 설치

자 이제 sample.prc파일이 생성되었다.
팜에 프로그램을 설치하는 것은 아이콘을
눌러 Install Tool을 실행시킨 후 핫싱크 버튼을
누르면 된다.

5. 몇가지 팁

  • 팜 프로그래밍을 처음 하는
    사람이라면 C:\Program Files\Monte Soft\PilotMAG\Samples
    아래에 있는 샘플 프로그램들을 분석해
    보는 것도 의미가 있다. 이 샘플
    프로그램들은 팜 프로그램들에서 사용되는
    기초적인 동작들(가령 폼 간의 이동,
    팝업메뉴의 제작)을 포함하고 있기 때문에
    프로그래밍을 공부하는데 좋은 자료라고
    생각한다.
  • 웬만한 기능들은 모두 오른쪽
    마우스 팝업 메뉴에 포함되어 있기때문에
    오른쪽 마우스 버튼을 사용하면 편하다.
  • 상하 화살표등의 특수문자는
    리소스 중 Label을 이용하면 된다. 속성 중
    폰트를 Symbol7으로 하고, Label Text에 \001에서
    \004까지 넣으면 된다. 폰트를 바꿔가며
    시험해 보면 더 많은 특수문자를 사용할 수
    있을 것이다.
  • 팝업메뉴를 작성할 때, Menu의
    속성 중 Item Caption항목에 -를 입력하면
    메뉴사이를 구분하는 선이 생길 것이다.
  • "Project" – "Create from
    Template"메뉴를 사용하면 기존에 많이
    쓰이는 리소스 형태를 템플릿으로 만들어
    놓은 것을 알 수 있다. 이를 가져다가
    조금씩 변경해서 사용하면 보다 편하게
    폼을 디자인 할 수 있을 것이다. 또한 아래
    그림과 같이 자기가 만든 폼 디자인을
    템플릿으로 저장할 수도 있다.

6. 맺음말

지금까지 간단하게나마 PilotMAG의
기능을 살펴보았다. 사용자에 따라서 더 많은
기능을 활용할 수 있으리라 생각한다. 이 문서가
팜 프로그래밍에 처음 입문하는 분들께
조금이나마 도움이 되기를 바란다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image