第5回 PilRC の使い方

お詫びと訂正

第2回の開発環境の構築でインストールの手順に一部抜けがありました。そのため、この手順にしたがって構築した環境では、第4回のプログラムのコンパイルで、リンクエラーが発生してしまいます。お詫びするとともに、以下に、追加の手順を示します。

  1. root になります。
  2. /usr/ports/palm/prc-tools に移動し、make を実行します。

        # cd /usr/ports/palm/prc-tools
        # make

  3. 正常に終了したら、続いて make install を実行します。

        # make install

以上で、追加の手順は終了です。これで、第4回のプログラムが正常にコンパイルできるようになります。

PilRC について

さて、いよいよ本題です。

前回は "Hello World" と画面に表示する簡単なアプリケーションを作ってみました。前回のアプリケーションでは、"Hello World" という文字とその表示場所をプログラム中に埋め込んでありました。しかし、Palm のアプリケーションでは、このように画面に表示する文字やアイコンに関する情報は別のリソースとして分離しておくのが一般的です。

このような画面を構成するようなリソースを生成するために CodeWarrior では Constructor と呼ばれるツールがありますが、PRC-Tools には対応するツールがありません。PRC-Tools を使う場合にはリソースの生成には PilRC を使用するのが一般的ですので、この講座でも PilRC を使用することにします。

今回は PilRC のインストール方法と、リソースを使ったプログラムの作成を通じて、PilRC の簡単な使用方法を説明します。

PilRC のインストール

  1. 開発環境のインストールの時と同様に ftp サーバまたは CD-ROM (3枚目) から必要なファイルを入手します。

        pkgconfig-0.8.0.tgz
        glib-1.2.10_5.tgz
        gtk-1.2.10_3.tgz
        pilrc-2.8p5.tgz

  2. root になります。
  3. pkg_add を用いて、これらのパッケージをインストールします。

        # pkg_add pkgconfig-0.8.0.tgz
        # pkg_add glib-1.2.10_5.tgz
        # pkg_add gtk-1.2.10_3.tgz
        # pkg_add pilrc-2.8p5.tgz


準備

クリエータ ID の登録

前回説明しましたように、アプリケーションを作成する際には、使用するクリエータ ID を http://www.palmos.com/dev/ で登録しておく必要があります。

前回同様、今回作成するプログラムにも筆者が登録した 'YS00' を使ってください。

作業ディレクトリの作成

ソースコード、オブジェクトコード等を格納する作業ディレクトリを作り、そのディレクトリに移動します。以下の例では ResourceHelloWorld という名前のディレクトリを作成しています。

    % mkdir ResourceHelloWorld
    % cd ResourceHelloWorld

プログラム作成

新しいファイルをつくり、プログラムを作成します。ファイル名は ResourceHelloWorld.c としてください。

今回作成するプログラムは以下の通りです。この内容を ResourceHelloWorld.c に書き込んでください。

/*
* PRC-Tools 講座 サンプルプログラム 2
*
* Copyright (c) 2002 WATANABE, Yoshiki
*/

#include <PalmOS.h>
#include "ResourceHelloWorldRsc.h"

/*
* StartApplication -- アプリケーションの初期化を行なう
*
* MainForm を開く
*/
static Err StartApplication(void)
{
  FrmGotoForm(MainForm); // MainForm を開く
  return errNone;
}

/*
* MainFormHandleEvent -- MainForm に関わるイベントを処理する
*
* MainForm の初期化に関するイベントを処理する
*/
static Boolean MainFormHandleEvent(EventPtr event)
{
  Boolean handled = false;

  switch (event->eType) {
  case frmOpenEvent: // MainForm が開かれた
    FrmDrawForm(FrmGetActiveForm()); // MainForm を表示する
    handled = true;
    break;
  }

  return handled;
}

/*
* ApplicationHandleEvent -- アプリケーション全体に関わるイベントを処理する
*
* 開かれたフォームをアクティブにしイベントハンドラを設定する
*/
static Boolean ApplicationHandleEvent(EventPtr event)
{
  Boolean handled = false;

  if (event->eType == frmLoadEvent) { // フォームをロードする
    UInt16 formId = event->data.frmLoad.formID; // ロードするフォームの ID
                                 // を取得 (この例では常に
                                 // MainForm)
    FormPtr form = FrmInitForm(formId); // フォームをロードして初期化する

    FrmSetActiveForm(form); // ロードしたフォームをアクティブにする

    switch (formId) {
    case MainForm:
      // このフォームに対するイベントを MainFormHandleEvent で
      // 処理するように設定する
      FrmSetEventHandler(form, MainFormHandleEvent);
      break;
    }
    handled = true;
  }

  return handled;
}

/*
* EventLoop -- イベントを取り込み必要な処理を行なう
*
* イベントを処理する API, 関数を適宜呼び出す
*/
static void EventLoop(void)
{
  EventType event;

  do {
    EvtGetEvent(&event, evtWaitForever); // 次のイベントを取得する
    if (!SysHandleEvent(&event)) { // システム関連のイベントを処理する
      Err error;
      if (!MenuHandleEvent(NULL, &event, &error)) { // メニュー関連のイ
                                   // ベントを処理する
                                   // (この例では処理す
                                   // べきイベントはな
                                   // い)
        if (!ApplicationHandleEvent(&event)) {
          // 現在のフォームでイベントハンドラとして設定されている関数
          // を呼び出す (この例では MainFormHandleEvent が呼ばれる)
          FrmDispatchEvent(&event);
        }
      }
    }
  } while (event.eType != appStopEvent); // 終了のイベントが来るまで繰り返す
}


/*
* StopApplication -- アプリケーションの終了時の処理を行なう
*
* 開いているフォームに frmSave を送り, それらのフォームを閉じる
*/
static void StopApplication(void)
{
  FrmSaveAllForms();
  FrmCloseAllForms();
}

/*
* PilotMain -- このアプリケーションのメイン関数である
*
* このサンプルでは通常の起動方法 (sysAppLaunchCmdNormalLaunch) でのみ動作する
*/
UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
  Err error = errNone;

  switch (cmd) {
  case sysAppLaunchCmdNormalLaunch:
    error = StartApplication();
    EventLoop();
    StopApplication();
    break;
  }

  return error;
}

ResourceHelloWorld.c

ResourceHelloWorld.c をコンパイルするためには、フォームの ID の値を定義したヘッダ・ファイル ResourceHelloWorldRsc.hが必要です。以下のような内容で作成してください。

/* * PRC-Tools 講座 サンプルプログラム 2 * * Copyright (c) 2002 WATANABE, Yoshiki */ #define MainForm 1000
ResourceHelloWorldRsc.h

リソースは ResourceHelloWorld.rcp で定義されます。内容は以下の通りです。フォームの ID の値を読み込むためにヘッダ・ファイル ResourceHelloWorldRsc.hをインクルードしています。

#include "ResourceHelloWorldRsc.h"

// ラウンチャに表示されるアプリケーションの名前
APPLICATIONICONNAME ID 1000 "Hello World"

// アプリケーションのバージョン
VERSION "1.0"

// Hello World を表示するためのフォーム
FORM MainForm AT (0 0 160 160) /* 全画面 (160x160). ID は MainForm */
BEGIN
TITLE "Hello..." /* フォームのタイトル */
LABEL "Hello World" AUTOID AT (CENTER CENTER) /* フォームの中央に表示する */
END

ResourceHelloWorld.rcp

これらのファイルと同じ内容のものが ResourceHelloWorld.zip または ResourceHelloWorld.tgz として置いてありますので、適宜ご利用下さい。

コンパイル
作成したプログラムを gcc を使ってコンパイルしてみましょう。ファイルをつくったディレクトリで以下のコマンドを実行してください。

    % /usr/local/pilot/bin/m68k-palmos-gcc -palmos3.5 -o ResourceHelloWorld ResourceHelloWorld.c


PilRC の使い方
ResourceHelloWorld.rcp を pilrc を使ってコンパイルしてみましょう。ファイルをつくったディレクトリで以下のコマンドを実行してください。

    % /usr/local/bin/pilrc ResourceHelloWorld.rcp

この例では、結果として3個のファイル tAIN03e8.bin、tver0001.bin、tFRM03e8.bin が生成されます。これら一つ一つがリソースとなります。tAIN03e8.bin はラウンチャに表示されるアプリケーションの名前が入っているリソースです。tver0001.bin はバージョン番号が入っています。tFRM03e8.bin はフォームの内容が入っているリソースです。

リソース・データベースの作成
前回と同様に、build-prc を使用して目的のリソース作成します。

    % /usr/local/pilot/bin/build-prc -t appl ResourceHelloWorld.prc "Hello World" YS00 ResourceHelloWorld *.bin

これを実行すると ResourceHelloWorld.prc という名前でリソース・データベースのファイルが作成されます。これでアプリケーションが完成です。

実行
できあがったアプリケーションを、前回と同様に POSE で実行してみましょう。

ラウンチャからアプリケーション "Hello World" を起動すると画面に "Hello..." というタイトルのフォームが表示され、その中央に "Hello World" と表示されます。

Hello World

Applications ボタンをタップするとアプリケーション "Hello World" は終了してラウンチャに戻ります。
次回は、PilRC の定義ファイルの書き方についてもう少し詳しく説明します。



Copyright (c) 2002 WATANABE, Yoshiki