PocketStudio Professional/Standard 1.1 と CodeWarrior との比較

■ PocketStudio の周辺情報

PocketStudio が採用している「Pascal」はご存知の通り Niklaus Wirth によって設計され、以来「構造化」言語として現在のオブジェクト指向の基を築いています。また Macintosh の QuickDraw ルーチンは全て Pascal で記述されているなど、Macintosh の開発における母国語として知られています。「MPW Pascal」とか「Lightspeed Pascal」とかありましたね。MS-DOS 環境で動作する Turbo Pascal が現在の Delphi の基礎を作ったことも有名です。「Pascal」はアプリケーション開発の現場では、C に取って代わられてしまいましたが、プログラミング教育の場では積極的に取り入れられています。日本ではそれほど普及していませんが、欧米では教育に利用されたり、ホビー プログラマ達に人気のあった Turbo Pascal などのことと相まって、結構身近な存在のようです。

PocketStudio のニュースグループなどを見ていても、「VisualBasic と Delphi を使っていたけれど、Palm のアプリケーションが作りたくて PocketStudio を購入した」という人や、「AppForge や Satellite Forms から PocketStudio へ乗り換えた」という人が見られます。
しかしどうも CodeWarrior は使ったことがなさそうで、出てくる質問も Palm API に関することだったり、Delphi などと同じように書いたコードがコンパイルできない、というものです。これらは PocketStudio が Delphi のような IDE を持ち、同じ Pascal を使っていることからくる誤解、つまり勝手に Delphi と同じものだと思ってしまっていることから起きるのではないでしょうか。またオンライン ヘルプと簡単なチュートリアルがあるのみで詳細なドキュメントが用意されているわけでもなく、VisualBasic に慣れた人にとっては、資料が少ないと感じることと思います。
PocketStudio はクラスやオブジェクトをサポートしていないため、Delphi 関連の書籍でも Object Pascal に焦点を合わせているようなものは、混乱の元になるので避けた方がよいそうで、むしろ普通の Pascal の書籍の方が向いているとのことです。でも最近そんな書籍はほとんど見かけなくなりましたけどね。

■ PSLibrary のこと

前回も少し触れましたが、Palm API のラッパーである PSLibrary には次のようなものがあり、簡単な記述でそれぞれの機能が使えるようになっています。

   PSButton
   PSField
   PSLabel
   PSString
   PSCheckBox
   PSFormBitmap
   PSList
   PSTable
   PSControl
   PSFormObject
   PSScrollBar
   PSTypes
   PSDatabase
   PSGadget
   PSSlider
   PSUtils

例えば PSButton を利用するとこのように記述でき、あたかも Delphi や VosualBasic を使っているのと同じように Palm OS API が利用できます。

    PSButton.SetCaption(Button1, 'Hello, world!');
    PSButton.Show(Button1);
    PSButton.SetEnabled(Button1, True);
    PSButton.SetLeft(Button1, PSButton.Left(Button1) + 10);

しかし、あくまでも『同じように』扱えるだけであり、オブジェクトをサポートしているわけではありません。ここを間違うと

    PSField1.Text := 'Hello, World!';

とやってしまい、コンパイル時に怒られます。

■ サンプルアプリケーションを作る

それでは、簡単なアプリケーションを作ってみます。そして CodeWarrior で同じアプリケーションを作り、両者の比較をしてみましょう。作るのは『単位変換アプリケーション』です。華氏と摂氏、センチメートルとインチの変換をします。

画面と動作:
   ・上に数値入力のフィールドがある
   ・真中にリストがあり変換の方法を選択できる
   ・下に変換の結果を表示するフィールドがある
   ・下のボタンをタップすると、上のフィールドにある数値を変換して、下のフィールドに表示する

必要な処理:
   ・ボタンがタップされた時に一括して処理する
   ・上のフィールドの文字を数値に変換して、変数に格納する
   ・選択されたリストのアイテムのナンバーを取得する
   ・格納した数値を、選択された変換処理をする
   ・変換した数値を文字にして、下のフィールドに表示する

PocketStudio を立ち上げて新規プロジェクトを作成します。次にリソース デザイナー ウィンドウを開きます。 リソース デザイナーで「Label」「Field」「Button」「Shiftインジケータ」を配置します。

下のフィールドは表示のみなので、プロパティから「Editable」のチェックをはずします。リストのプロパティから「items」を選択し、「TString」の右をクリックするとアイテム編集のボックスが現れるので、次のように入力します。

  celsius -> fahr // 摂氏から華氏
  fahr -> celsius // 華氏から摂氏
  cm -> inch // センチメートルからインチ
  inch -> cm // インチからセンチメートル

この状態で他の部分のコードは PocketStudio が自動的に生成してくれるので、後はボタンをタップした時のコードを書けばよいだけです。

次にボタンをダブルクリックして次のように、コードを追加します。

procedure Button1_OnCtlSelect(var Handled: Boolean; ControlID: UInt16; Control: ControlPtr; On: Boolean);
var
  fieldText, showText, p: array[0..128] of Char;
  // フィールドの文字を格納するための変数
  s, i: Integer;
  // List の item を格納する整数型変数
  d, answer: FlpDouble;
  // 小数計算のための実数型変数
begin
    PSField.Text(Field1, fieldText, 128);
    // 上のフィールドを取り出す
    d := FlpAToF(fieldText);
    // 取り出した文字を数値に変換
    s := PSList.SelectionIndex(List1);
    // List の item のナンバーを取り出す
    // item のナンバーは「0、1、2、3」となる
      case s of
      // 「s」の数値によって分岐
      0:
      answer := d * 9 / 5 + 32;
      // 摂氏から華氏への変換
      // 結果を「answer」に格納
      1:
      answer := 5 * (d - 32) / 9;
      // 華氏から摂氏への変換
      // 結果を「answer」に格納
      2:
      answer := d / 2.54;
      // センチメートルからインチへの変換
      // 結果を「answer」に格納
      3:
      answer := d * 2.54;
      // インチからセンチメートルへの変換
      // 結果を「answer」に格納

      else
      end;

    FlpFToA(answer, p);
    // 浮動小数点型の変数を文字に変換
    PSField.SetText(Field2, p);
    // フィールドに文字を表示
    Handled := True;
    end;
  end.

コードの量としては NSBasic などとそれほど変わらないようです。それでは試してみましょう。「Run」メニューから「Run」を選択します。コンパイルされて POSE が立ち上がります(事前に POSE へのパスが設定されていなければなりません)。

英語入力モードにして、上のフィールドに「2」を入れ、リストから「inch -> cm」を選択します。下のボタンをタップすると、下のフィールドに「5.0800000e00」と表示されます。変換された数値をそのまま文字にしているため、このような表示になりました。できあがったバイナリのサイズを見てみると、4,303 Byte と小さめです。

■ 同じアプリケーションを CodeWarrior で作る

さて同じアプリケーションを CodeWarrior で作るとどうなるでしょう。
同様に Constructor for Palm OS で画面をデザインし、IDE でコードを追加します。変数などは比較のために同じ名前を使っています。

static Boolean MainFormHandleEvent(EventPtr eventP)
{
Boolean handled = false;
FormPtr frmP;  switch (eventP->eType)
    {
    case frmOpenEvent:
      frmP = FrmGetActiveForm();
      MainFormInit( frmP);
      FrmDrawForm ( frmP);
      handled = true;
      break;     case ctlSelectEvent:
      if ( eventP->data.ctlSelect.controlID == MainConvertButton ){
        char fieldText[128],p[128];
        Int16 s; // item number of list1
        FlpDouble d, answer;
// ここから PocketStuido の「PSField.Text(Field1, fieldText, 128);」と同じコード
        {
          char *fldTextPtr;
          fldTextPtr = FldGetTextPtr(GetObjectPtr( MainOriginalField));
          
          if ( fldTextPtr){ // Field have contents?
            StrCopy( fieldText , fldTextPtr);
          } else {     // Field is empty ( User havn't input anything)
            StrCopy( fieldText , "");
          }
        } // ここから PocketStudio の「d := FlpAToF(fieldText);」と同じコード
        d = FlpAToF(fieldText); // fieldText to double
// ここから PocketStudio の「s := PSList.SelectionIndex(List1);」と同じコード
        s = LstGetSelection ( GetObjectPtr( MainConvertMethodList ));
    /*
    case s of
    0:
    answer := d * 9 / 5 + 32;
    1:
    answer := 5 * (d - 32) / 9;
    2:
    answer := d / 2.54;
    3:
    answer := d * 2.54;
    else
    end;
    */
        {
          FlpDouble num9, num5, num32, num254;// First, make constant into FlpDouble
          num9 = FlpAToF( "9");
          num5 = FlpAToF( "5");
          num32 = FlpAToF( "32");
          num254 = FlpAToF( "2.54");
  switch ( s) {
    case 0:
      answer = _d_add( _d_div( _d_mul( d , num9 ) , num5) , num32);
      break;
    case 1:
      answer = _d_div( _d_mul( num5 ,_d_sub (d , num32)) , num9 );
      break;
    case 2:
      answer = _d_div( d , num254) ;
      break;
    case 3:
      answer = _d_mul( d , num254) ;
      break;
  }
}
// ここから PocketStudio の「FlpFToA(answer, p);」と同じコード
        FlpFToA(answer, p);
// ここから PocketStudio の「PSField.SetText(Field2, p);」と同じコード
        {
          char *ptr;
          MemHandle oldHandle, newHandle;
          oldHandle = FldGetTextHandle( GetObjectPtr( MainResultField));
          newHandle = MemHandleNew( StrLen( p ) + 1);
          ptr = MemHandleLock( newHandle);
          StrCopy( ptr, p );
          MemHandleUnlock( newHandle );
          FldSetTextHandle( GetObjectPtr( MainResultField), newHandle);
          if ( oldHandle){
            MemHandleFree( oldHandle);
          }
          FldDrawField (GetObjectPtr( MainResultField));
        }
        handled = true;
      }
      break;
    default:
      break;
    
    }
  
  return handled;
}

■ コードの比較

いかがでしょう。PocketStudio の『PSLibrary』が Palm OS API の扱いを、どれほど簡単にしてくれているのかよく分かります。CodeWarrior の場合 Palm のプログラミングに必要とされる定型の部分やチェックのルーチンを相当な分量、自分で書かなければなりませんが、こと PocketStudio の場合はこの部分も自動的に生成してくれるので、かなり敷居が低くなったといってもいいでしょう。ただバイナリのサイズの比較では CodeWarrior の場合 1,919 Byte と、PocketStudio よりも小さくなっています。しかし CodeWarrior で書かなければならない大量のコードを、大幅に軽減してくれるのは魅力です。簡単であるということはミスを防ぐことにもつながりますし、使いまわしが可能であるということにもなります。

ここまで駆け足で見てきましたが、もちろんよいことずくめではありません。

   ・あまり一般的とはいえない Pascal を採用している
   ・Delphi との違いを頭に入れておかなければならない
   ・オブジェクトはサポートされていない
   ・Palm OS API の知識も必要とされる

などの問題があります。これらを考慮した上で利用するならば、かなり強力な開発環境だと思われるのですが、あなたはいかがですか。



copyright(C)2002 Hacker Dude-san all rights reserved.