研究所入口  研究日誌  アプリ  データベース  掲示板
iziBasic について
iziBasic → aldweb  palmgear.com

iziBasic iziBasic とは、パーム上で開発できる Basic コンパイラです。
パームウェアとして独立させられるのが特徴です。

このページを一通り読むと、iziBasic の大まかな使い方が見えてくるでしょう。

iziBasic 6.0インストール
試用版の制限
表記について
画面について
ソースコード
ラベルについて
命令文の制限
定数について
論理演算子
既知のバグ

Hello World
Tutorial - my first iziBasic program
メモ帳のタイトルリストを表示する
ToDoを表示する
ToDoを表示する(2バイト文字対応)
CALLPP$ と CALLPPARM$

iziBasic 6.1命令・関数について
ViziBasicについて

サンプルコード
PP Applets 紹介
iziBasic 関連リンク

マイ・アプリ
  Hit And Blow
  Fuwafuwa
  Maze
  Maze 2D
  Fight
  Pick Up Stones
  利益率向上計画
  Cellular Automaton
  KeyState
  CountryPref




マイ・アプリは、他のサイトでもダウンロードできるようになっています。

PalmGear.com
Software Store - PalmZone.net
mypalm.ru
hpc.ru



aldweb はアプリケーションをバージョンアップすると、今まで購入した人に正規版をプレゼントしてくれます。











iziBasic Programming Technique










インストール

前のバージョンをアンインストールしておく必要があります。



iziBasicのトップへ












試用版の制限

(1)起動するたびにメッセージを表示します。
(2)一部の機能はコンパイルできません。
(3)About画面ではiziBasicで作成されたことを表示します。

プログラム開発用アプリケーションなので、試用期限が設定されていないのは素晴らしいです。



iziBasicのトップへ












表記について

表記意味備考
n
数値または数値定数32 bit float IEEE 754互換
v
数値変数(配列変数を含む)32 bit float IEEE 754互換
f
数値関数 
c
文字変数(配列変数を含む)63文字までの文字列
t
文字列63文字までの文字列
s
文字関数 

v|nは、数値・数値定数・数値変数のどれか、という意味です。
c|t|sは、文字変数・文字列・文字関数のどれか、という意味です。

数値は、整数、小数、指数で指定できます。


マニュアルに緑の文字で書かれている命令・関数は、試用版では利用できません。


iziBasicのトップへ












画面について

iziBasic 【メイン画面】

iziBasicを起動すると、左の画面になります。

メモ帳内のiziBasic用ソースコードをチェックしているため、
一番上の「▼Hello.iBAS」と「Editor」ボタンが表示されるまで
少し時間が掛かります。

ソースコードの「Hello.iBAS」が選択された状態です。

「Editor」ボタンをタップすると、メモ帳が起動します。
編集用ソフトは変更できます。

「Build it」ボタンをタップすると、コンパイルが始まります。

□Verboseにチェックを入れると、
コンパイルの進行状況を表示します。

ショートカット一覧(アルファベットのみでOKです)
文字動作
A
About画面を開きます
B
「Build it」を押します
E
「Editor」ボタンを押します
O
About画面、オプション画面で「OK」ボタンを押します
P
About画面でオプション画面を開きます
R
「Run it」ボタンを押します
V
「Verbose」のチェックを変更します


iziBasic 【オプション画面】(iziBasic 6.0)

ソースエディタを選択できます。
・Memo Pad
・PIAF
・QED
・SiEd
・SrcEdit
・ViziBasic

□Pause when CHAINing
チェインする時に、一時停止します。

iziBasic 6.1 iziBasic 6.1で、2つのオプションが追加されました。

□ 常にターゲットファイルを置き換える
□ コンパイル後に自動実行する

ちょっと修正しただけのコードをコンパイルする時などは、
置き換えるのは当たり前で、実行するのも当然です。

わずらわしい確認メッセージが出なくなって、
使いやすくなりました。

iziBasic 【ソースコードスケルトン】

ソースコードの設定を補助してくれます。

ソースコード上で直接設定できるので、
無理にこの機能を使う必要はありません。


アプリ名とクリエイターIDは必須項目です。

設定しなかった項目は、
コメント行の形でソースコードに追加されます。

生成ボタンをタップすると、新規にメモが作られます。


iziBasicのトップへ












ソースコード

ソースコードは、標準搭載のメモ帳かDOCファイルに記述します。

メモ帳は4096文字までに制限されています。
CHAIN命令で、10回まで別のプログラムにジャンプできます。

DOCエディタを利用すると、大きなソースコードも扱えます。

■CHAIN t
  tでプログラム名を指定します。
  「***.iBas」の形式です。   コードスタックとメガストリングは初期化されます。
  メガストリングの内容を引き継ぎたい場合は、テンポラリファイルを利用します。
  変数の内容は保持されますが、初期化する場合はCLEAR命令を使います。

■CLEAR [ v-v | c-c ]
  初期化したい変数名を指定します。
  数値変数は0、文字変数はemptyになります。



iziBasicのトップへ












ラベルについて

iziBasic version 5.0からラベルの文字は、大文字と小文字を区別しなくなりました。
LABELとLabelとlabelは全て同じラベルです。
1つのソースコードには、255個までラベルを設定できます。
ラベルの文字は初めの20文字までが有効です。

ラベルの名前は、予約語ではじめると誤動作の原因になるので、
_(アンダースコア)で始めるようにした方がいいでしょう。

iziBasicのトップへ












命令文の制限

1つの命令文は、61文字以下でなければいけません。
大文字と小文字を区別しません。

iziBasicのトップへ












定数について

名前
EXP2.718281828
FALSE0
MAYBE0.5
PI3.141592654
TRUE1
VERSIONiziBasic version, format is M.m (Major.minor)


iziBasicのトップへ












論理演算子

iziBasic には、AND、OR、XOR の3つの論理演算子が用意されています。

ABA AND BA OR BA XOR B
0
0
0
0
0
0
1
0
1
1
1
0
0
1
1
1
1
1
1
0

XOR は面白い結果を返してくれるので、一番好きな論理演算子です。

iziBasicのトップへ












既知のバグ

Bug #1
  Palm OS 5 で、メニューを開いた時にメニューイベントが反応しないようです。
  (よくわかりません)

Bug #2
  マイナスの値をべき乗すると、間違った答えを返します。
  「(-5)^3」や「POWER(-5,3)」と書いてはいけません。
  「(-5)*(-5)*(-5)」と書けば大丈夫です。

Bug #3
  式の先頭で、変数にマイナス記号をつけるとコンパイルエラーになります。
  「A=-C」ではエラーになってしまうので、「A=0-C」と書きます。

これらのバグは、次以降のバージョンで解決する予定だそうです。

iziBasicのトップへ












Hello World

マニュアルのWhat is iziBasic?に書いてある簡単なソースコードをコンパイルします。

' Hello.iBAS
{CreatorID "HELO"}
{Version "1.0"}

BEGIN
  SETFONT 7
  LABEL #1,"Hello World",48,23
  A=WAITEVENT
END

行の先頭の「'」はコメント行を表します。
1行目のコメントは、プログラム名にもなります。

{CreatorID "HELO"}「HELO」というクリエイターIDでアプリケーションをビルドします。
クリエイターIDは重要です。
設定には細心の注意が必要です。
BEGINここからプログラムがスタートします。
SETFONT 7フォントを指定します。
「7」の意味は下に掲載しました。
LABEL #1,"Hello World",48,23左から48、上から23の位置にラベルを置きます。
ラベルの内容は「Hello World」で、ラベルに識別用の番号「1」を付けています。
A=WAITEVENTボタンや画面タップのイベントがあるまで待ちます。
イベントが起こると、変数Aにどんなイベントが起こったかを表す値を返します。
戻り値の意味は下に掲載しました。
ENDプログラムの実行を終了してラウンチャーに戻ります。



iziBasic □Verboseにチェックを入れて、
進行状況を表示させてコンパイルします。

コンパイルが終わると、右下に「Run it」と表示されます。
タップして、作ったばかりのアプリケーションを実行できます。

エミュレータでチェックしてから実行するのが、
アプリケーション作成時の鉄則ですが、
パーム上でビルドするという性格上、
事前のチェックができません。

念のため、ホットシンクやMS Backupなどの作業をして、
データを保護しておいた方が良いでしょう。

どんなに簡単なプログラムでも、
ウッカリすることがありますので…。

iziBasic アプリケーションを実行すると、
いきなりAbout画面になります。

試用版では強制的に表示します。

iziBasic About画面の「OK」ボタンをタップすると、
いよいよ実際にコーディングした部分を実行します。

ラベル「Hello World」を表示して、
ボタン入力(または画面タップ)が行われるまで待ちます。

入力があるとアプリケーションの実行を終了します。

iziBasic 作成したアプリケーションの情報を、FileZで確認してみました。


ラベルを表示しているだけなので、
難しいことは何もありませんね。



【SETFONTの設定値の意味】
valueComment
0stdFont
1boldFont
2largeFont
3symbolFont
4symbol11Font
5symbol7Font
6ledFont
7largeBoldFont
8..127some of the newer devices have additional fonts installed, and even though they are not standard, you may access them
128iziBasic console low resolution font
129iziBasic console high resolution font
130any personalized low resolution font that you put in a resource file
131any personalized high resolution font that you put in a resource file

8〜127は将来の拡張用ですね。


【DOEVENTSの戻り値の意味】(【WAITEVENT】も同じ)
Return valueCommentKEYEVENTS required
-24, -23, -22, -21App Key #4, #3, #2, #1ON
-13HotSync Button on CradleON | PARTIAL
-12Page Down ButtonON | PARTIAL
-11Page Up ButtonON | PARTIAL
-10Power On/Off ButtonON | PARTIAL
-1ExitAppRequest
0No event
#v|n in [1..999]Object that was clicked (Button, CheckBox, ListChoice, PopupChoice, PushButton, ScrollBar or TextSelector)
1000Pen event (get related information from the PENDOWN, PENX and PENY functions)
1001Menu event (get related information from the MENUITEM function)
1002ABOUTBOX event (for information back to your program)

表を見る限りでは、アプリケーションボタンや電源ボタンなどは簡単に検出できそうです。
メニュータップやアプリ終了も簡単にできそうです。
画面には最大999個のオブジェクトを置けるようです。

オブジェクトの種類も、ボタン、チェックボックス、リスト選択、ポップアップ選択、
プッシュボタン、スクロールバー、テキストセレクターと豊富に用意されているようです。


iziBasicのトップへ












Tutorial - my first iziBasic program

マニュアルのAppendix #1: Tutorial - my first iziBasic programに書いてあるコードを実行してみましょう。

' MyFirstPgm.ibas
{CREATORID "MyFP"}

BEGIN
  LABEL #1,"Input some text:",10,40
  TEXTFIELD #2,"",0,85,40,65,14
  BUTTON #3,"Show my Text",40,70,80,14
  REPEAT
    E=DOEVENTS
    IF E=3 THEN
      T$="You wrote:"+CHR$(10)+FIELD$(#2)
      M=MESSAGEBOX(T$,0)
    ENDIF
  UNTIL E=-1
  M=MESSAGEBOX("OK, bye bye then!",0)
END

LABELとTEXTFIELD、BUTTONの3つのオブジェクトを置きます。
それぞれのオブジェクトに1〜3の識別コードを割り振ります。

REPEATとUNTILの間を変数Eが「-1」になるまで(アプリ終了がリクエストされるまで)繰り返し実行します。

DOEVENTSでイベントをチェックして、値が「3」ならボタンがタップされたので、
文字定数にテキストフィールドの内容を足して、メッセージボックスで表示します。
改行コードは「CHR$(10)」だけで良いようですね。

ループを抜けた時は、メッセージを表示して終了します。


iziBasic クリエイターIDが「MyFP」になっていますが、
あまり意味のないIDを乱発したくないので、
1個目のコードと同じ「HELO」にして、
コンパイルしました。

なんと、クリエイターIDが重複して、
エラーになってしまいました。

コンパイルは中止されています。
素晴らしい配慮ですね。

Hello.prcを削除して、再度コンパイルしました。

iziBasic実行画面です。

テキストを入れて「Show my Text」ボタンをタップすると、
入れたテキストがそのまま表示されます。

iziBasic

試しに日本語を入れてみましたが、問題なく表示されました。

このアプリケーションは、ホームをタップするか、
ハードボタンを押すまで終了しません。



TEXTFIELD #v|n , c|t , 0|1 , x , y , w , h
  v|n:識別番号を指定します。
  c|t:初期値を設定します。(2バイト文字を入れると、文字化けします。)
  0|1:0なら1行、1なら複数行のフィールドにします。
  x,y:表示位置を指定します。
  w,h:幅と高さを指定します。

BUTTON #v|n , c|t , x , y , w , h
  c|t:ラベル(ボタンに表示する文字)を設定します。

FIELD$(#v|n)
  識別番号で指定したテキストフィールドの内容を返します。

MESSAGEBOX(c|t1 [+ c|t2] [+ c|t3] , v|n)
  メッセージをポップアップ・ウィンドウで表示します。
  c|tは3個まで設定できますが、文字数は186文字までに制限されます。
  v|nの値によって、ボタンの種類や数が変わります。
  戻り値は、1なら1個目のボタン、2なら2個目のボタン、…と対応しています。
valuebuttons
0
Done
1
OK
2
OK|Cancel
3
Yes|No
4
1|2
5
1|2|3
6
1|2|3|4
7
1|2|3|4|5
8
1|2|3|4|5|6
9
1|2|3|4|5|6|7

iziBasicvalue=3

iziBasicvalue=9



iziBasicのトップへ












メモ帳のタイトルリストを表示する

サンプルプログラムの「MemoTitles.ibas」を試してみます。

'' MemoTitles.ibas
{CREATORID "ReMT"}
{VERSION "1.0"}

BEGIN
E$=CHR$(10)
OPEN "MemoDB" FOR INPUT AS #1
N=LOF(#1)
FOR I=1 TO N
  A$=""
  INPUT #1, A$
  IF A$<>"" THEN
    L=LEN(A$) : B$="" : C=0
    FOR J=1 TO L
      C$=CHAR$(A$,J)
      IF C$=E$ LET C=1
      IF C=0 LET B$=B$+C$
    NEXT
    PRINT B$
  ENDIF
NEXT
CLOSE #1
WAIT
END




変数E$に改行コードを入れます。

メモ帳のデータが格納されている、
ファイル「MemoDB」を読み込みモードで開きます。

変数Nにレコード数(メモの数)を入れます。
FOR文で変数Iを1から始めて変数Nになるまで、処理を繰り返します。

  変数A$を空にします。
  変数A$にメモデータを1件読み込みます。
  変数A$が空ではないなら、タイトル部分を表示(する準備を)します。
    変数L(メモの文字数)に変数A$の文字の数を入れます。
    変数B$(タイトル文字が入ります)を空にします。
    変数C(改行フラグ)に0を入れます。
    FOR文で変数Jを1から始めて、変数Lになるまで
    (A$の文字の数だけ)、処理を繰り返します。
      変数C$に、A$の中の先頭からJ番目の文字を
      1文字だけ入れます。
      C$の文字が改行コードなら、変数Cに1を入れます。
      変数Cが0なら、B$にC$を足します。
    変数B$を表示します。
  A$の中の文字を全てチェックするまで繰り返します。
全てのメモを表示するまで繰り返します。

ファイルを閉じます。
WAIT命令で「Enter」ボタンをタップするまで、待ちます。
プログラムを終了します。

iziBasic 実行画面です。

私のパームにはメモが大量に保存されていますので、
ここでは10個だけ表示するように改造しています。

「FOR I=1 TO N」を「FOR I=1 TO 10」に変更して、実行しました。

2バイト文字が正しく表示されません。
日本語を扱うには工夫が必要なようです。

試しに、PRINT命令をGPRINT命令に変えてみましょう。


'' MemoTitles.ibas
{CREATORID "ReMT"}
{VERSION "1.0"}

BEGIN
E$=CHR$(10)
OPEN "MemoDB" FOR INPUT AS #1
N=LOF(#1)
FOR I=1 TO 10
  A$=""
  INPUT #1, A$
  IF A$<>"" THEN
    L=LEN(A$) : B$="" : C=0
    FOR J=1 TO L
      C$=CHAR$(A$,J)
      IF C$=E$ LET C=1
      IF C=0 LET B$=B$+C$
    NEXT
    Y=I*11+4
    GPRINT B$,0,Y

  ENDIF
NEXT
CLOSE #1
WAIT
END
iziBasic

太い文字の部分を変更しました。

GPRINT命令は表示する位置を指定しなければいけないので、
変数Yに座標を入れています。
横の位置は0で固定しています。

多くのデータを扱う場合には、スクロールなどの画面の制御が必要になります。

GPRINT命令で実行したところ、無事に日本語も表示されました。
メモ帳を先頭から読み込む操作は、簡単に実現できました。


■CHR$(v|n)
  指定した数値をアスキーコードとする文字を、1文字返します。


■LEN(c|t)
  指定した文字列の文字数(バイト数)を返します。


■CHAR$(c|t , v|n)
  文字列の指定した位置(バイト)の文字を1文字返します。


■WAIT
  [Enter]ボタンを表示して、そのボタンが押されるまで待ちます。


■OPEN c|t FOR INPUT|OUTPUT|APPEND|RANDOM AS #v|n
  ファイルを開きます。
  INPUT:INPUT #命令で、1行目から順番に読み込みます。
  OUTPUT:PRINT #命令で、順番に書き出します。
  APPEND:PRINT #命令で、ファイルの最後に追加して書き出します。
  RANDOM:ランダムアクセスで読み込み・書き出しできます。


■CLOSE #v|n
  ファイルを閉じます。


■LOF(#v|n)
  ファイルのレコード数を返します。


■INPUT #v|n , v|c
  ファイルから1レコード読み込んで、カレントレコードを次のレコードに移動します。


■SCREEN v|n
  色数を指定します。

スクリーンモード
0
for black & white
1
for 4 grays
2
for 16 grays
3
for 256 colors
4
for 65536 colors


iziBasicのトップへ












ToDoを表示する

サンプルプログラムの「ToDos.ibas」を試してみます。

' ToDos.ibas
{CREATORID "ReTD"}
{VERSION "1.2"}
{PARSER ON}

BEGIN
F$=CHR$(255)+CHR$(255)
OPEN "ToDoDB" FOR INPUT AS #1
N=LOF(#1)
FOR I=1 TO N
  A$=""
  INPUT #1, A$
  IF A$<>"" THEN
    L=LEN(A$)-3
    B$=RIGHT$(A$,L)
    PRINT B$
    D$=LEFT$(A$,2)
    IF D$=F$ THEN
      B$="no deadline - "
    ELSE
      B$=""
      D$=CHAR$(A$,1)
      J=256*ASC(D$)
      D$=CHAR$(A$,2)
      J=J+ASC(D$)
      D$=BIN$(J)
      Y=0 : M=0 : D=0
      FOR J=1 TO 6
        K$=CHAR$(D$,J) : K=VAL(K$)
        Y=Y+(2*K)^(7-J)
      NEXT
      K$=CHAR$(D$,7)
      Y=Y+VAL(K$)+1904
      FOR J=8 TO 10
        K$=CHAR$(D$,J) : K=VAL(K$)
        M=M+(2*K)^(11-J)
      NEXT
      K$=CHAR$(D$,11)
      M=M+VAL(K$)
      FOR J=12 TO 15
        K$=CHAR$(D$,J) : K=VAL(K$)
        D=D+(2*K)^(16-J)
      NEXT
      K$=CHAR$(D$,16)
      D=D+VAL(K$)
      IF D<10 LET B$="0"
      B$=B$+STR$(D,0)+"/"
      IF M<10 LET B$=B$+"0"
      B$=B$+STR$(M,0)+"/"
      IF Y<10 LET B$=B$+"0"
      B$=B$+STR$(Y,0)+" - "
    ENDIF
    B$=B$+"priority "
    D$=CHAR$(A$,3)
    J=ASC(D$)
    IF J>128 THEN
      J=J-128
      B$=B$+STR$(J,0)+CHR$(10)+SPACE$(6)+"done"
    ELSE
      B$=B$+STR$(J,0)+CHR$(10)+SPACE$(6)+"to do"
    ENDIF
    B$=SPACE$(6)+B$
    PRINT B$
  ENDIF
NEXT
CLOSE #1
WAIT
END
簡単に説明します。


F$=CHR$(255)+CHR$(255)
レコードの先頭の2文字と比較するために
準備しています。

データの先頭の2バイトがF$と同じなら、
期限なしです。

(16進数のFFFFなら、
ToDoに期限が設定されていません。)


FFFF以外なら、期限が設定されています。

【ビットの意味】
YYYYYYYMMMMDDDDD

YYYYYYYは西暦を7ビットで表します。
この数値に1904を足すと西暦になります。

MMMMは月を4ビットで表します。
1〜12です。

DDDDDは日を5ビットで表します。
1〜31です。


実際にビットを取り出して年、月、日に
変換する手順は、コードを見てください。


データの先頭から3バイト目には、
優先度などの情報が入っています。

左端のビットが1なら、実行済みのToDoです。
(コードを見る限りでは)
そのビットを0にすると、優先度になります。

3バイト目の内容が、
1〜5なら実行前のToDoで、
その値が優先度です。
129〜133なら実行済みのToDoで、
その値から128を引いたものが優先度です。


日付を表示する時に、
フォーマットを整えて見やすくしています。


ビット操作があるので、
細かな処理が続きますが、
一つ一つ見ていけば理解できると思います。


さて、このコードも表示に
PRINT命令を使用していますので、
2バイト文字は文字化けしてしまいます。



■{PARSER ON|OFF}
  計算の優先順位を考慮するかどうかを設定します。

  {PARSER ON}なら1+2*3の計算結果は7です。計算の優先順位が考慮されています。
  {PARSER OFF}なら1+2*3の計算結果は9です。左から順番に計算します。電卓と同じです。

【計算の優先順位】
Priority内容
#1
parenthesis
#2
functions
#3
^ (exponentiation)
#4
* / \ MOD
#5
+ -
#6
<= = <> = > >=
#7
AND OR XOR

#6の比較演算子の記述が少しおかしいですが、細かいことは気にしないでおきましょう。


■RIGHT$(c|t , v|n)
  文字列を、右側から指定した文字数だけ取り出します。


■LEFT$(c|t , v|n)
  文字列を、左側から指定した文字数だけ取り出します。


■BIN$(v|n)
  数値を二進数表記の文字列に変換します


■STR$(v|n1 , v|n2)
  数値を文字列に変換します。
  VAL()の逆の命令です。
  第2引数が「0」なら、整数部分のみ変換します。マイナスなら小数点以下も対象のようです。


■ASC(c|t)
  文字列の先頭の文字のアスキーコードを返します。


■VAL(c|t)
  文字列を数値に変換します。
  STR$()の逆の命令です。


■SPACE$(v|n)
  スペース(空白文字)を指定した数だけ返します。




iziBasicのトップへ












ToDoを表示する(2バイト文字対応)

ページ切り替え方式で表示します。
10行表示するたびにキー入力を待って、押されたら画面をクリアして、再度、画面上から表示します。

' ToDos.ibas
{CREATORID "ReTD"}
{VERSION "1.2"}
{PARSER ON}

_PrintMSG:
  IF Z=10 THEN
    WAIT:Z=0:CLS
  ENDIF
  V=Z*11+15:GPRINT Z$,0,V:INC Z
RETURN


BEGIN
F$=CHR$(255)+CHR$(255)
OPEN "ToDoDB" FOR INPUT AS #1
N=LOF(#1)
FOR I=1 TO N
  A$=""
  INPUT #1, A$
  IF A$<>"" THEN
    L=LEN(A$)-3
    B$=RIGHT$(A$,L)
    Z$=B$:GOSUB _PrintMSG
    D$=LEFT$(A$,2)
    IF D$=F$ THEN
      B$="no deadline - "
    ELSE
      B$=""
      D$=CHAR$(A$,1)
      J=256*ASC(D$)
      D$=CHAR$(A$,2)
      J=J+ASC(D$)
      D$=BIN$(J)
      Y=0 : M=0 : D=0
      FOR J=1 TO 6
        K$=CHAR$(D$,J) : K=VAL(K$)
        Y=Y+(2*K)^(7-J)
      NEXT
      K$=CHAR$(D$,7)
      Y=Y+VAL(K$)+1904
      FOR J=8 TO 10
        K$=CHAR$(D$,J) : K=VAL(K$)
        M=M+(2*K)^(11-J)
      NEXT
      K$=CHAR$(D$,11)
      M=M+VAL(K$)
      FOR J=12 TO 15
        K$=CHAR$(D$,J) : K=VAL(K$)
        D=D+(2*K)^(16-J)
      NEXT
      K$=CHAR$(D$,16)
      D=D+VAL(K$)
      IF D<10 LET B$="0"
      B$=B$+STR$(D,0)+"/"
      IF M<10 LET B$=B$+"0"
      B$=B$+STR$(M,0)+"/"
      IF Y<10 LET B$=B$+"0"
      B$=B$+STR$(Y,0)+" - "
    ENDIF
    B$=B$+"priority "
    D$=CHAR$(A$,3)
    J=ASC(D$)
    IF J>128 THEN
      J=J-128
      B$=B$+STR$(J,0)+CHR$(10)+SPACE$(6)+"done"
    ELSE
      B$=B$+STR$(J,0)+CHR$(10)+SPACE$(6)+"to do"
    ENDIF
    B$=SPACE$(6)+B$
    Z$=B$:GOSUB _PrintMSG
  ENDIF
NEXT
CLOSE #1
WAIT
END
太い文字のところを追加または変更しました。

_PrintMSG:が、画面表示のモジュールです。

ラベルに小文字を混ぜた方が、
ラベルだと分かりやすいと思います。


【変数の意味】
Z:表示した行数
V:画面の縦の表示位置
Z$:表示する文字


このサブルーチンを呼ぶ時は、
Z$に表示したい文字を入れます。
ZとVは操作しません。


変数Zが10なら、既に10件表示されているので、
キー入力を待って、キーが押されたら、
行数のカウントを0にして、画面をクリアします。

変数Vに表示位置を計算して、
GPRINT命令で文字を表示します。
行数に1を足します。

サブルーチンから戻ります。


初めに10行表示したか確認するのは、
ちょうど10行表示して終了する場合に、
WAIT命令を2回連続で実行するのを
防ぐためです。


サブルーチン内で変数ZとVを使っているので、
他のところではこの2つの変数を
操作してはいけません。

Vはサブルーチンの外で
一時的に利用しても大丈夫です。
ただし、値を保持しなければいけないときに
このサブルーチンを呼ぶと、
Vの内容は変わってしまいます。

トラブルを防ぐためにも、サブルーチンの外では
利用しない方が良いでしょう。


このサブルーチンは万能ではありません。

・画面右からはみ出た文字は表示されません。
・PRINT命令で「;」(セミコロン)や「USING」を
使っている場合に、置き換えできません。

この点にも注意が必要です。

iziBasic サブルーチンを組み込んで実行した画面です。

重要度の数字の次にヘンな四角が表示されてしまいます。

私のパームには、ToDoが9件登録されていて、
これは2ページ目です。

右端にゴミが表示されていますが、
1ページ目に長いToDo項目があって、
それが画面からはみ出した時の残骸です。

CLS命令では、完全に消去されない部分があるようです。

オリジナルのプログラムでは、
ほとんど役に立たない状態でしたが、
日本語が表示されるようになって、利用しやすくなりました。

■CLS
  クリアスクリーン。画面上の文字を消します。


■INC v
  指定した変数の内容に1を足します。


iziBasicを購入すると、{CONSOLEFONT OFF}の一文で済んでしまいます。
ここでは試用版でコンパイルする方法を紹介しました。


iziBasicのトップへ












CALLPP$ と CALLPPARM$

パスカルで開発されたプログラムを呼び出します。

iziBasicはパスカル言語で開発されたそうです。
パスカルはあまり馴染みが無いですが、
教育用のプログラミング言語らしいので、すぐに覚えられそうです。

サンプルプログラムのiBHelloPPを見てみました。

' iBHelloPP.ibas
{CREATORID "LDIH"}
{VERSION "3.0"}

BEGIN
A$=CALLPP$(100,"Hello World from PP Code")
A=FILEERROR
IF A=0 THEN
  A$="PP Code replied: '"+A$+"'"
ELSE
  A$="PP Code was not found!"
ENDIF
LABEL #1,A$,2,50
B$=CALLPPARM$(100,"Hello World from PP ARMlet")
B=FILEERROR
IF B=0 THEN
  B$="PP ARMlet replied: '"+B$+"'"
ELSE
  C$=GETOSVER$ : C$=CHAR$(C$,1)
  IF C$="5" THEN
    B$="PP ARMlet was not found!"
  ELSE
    B$="Your device does not support ARMlets!"
  ENDIF
ENDIF
LABEL #2,B$,2,110
REPEAT : A=DOEVENTS : UNTIL A=-1
END
CALLPP$でPP Codeを呼び出します。
文字を引数で渡します。

呼び出されたプログラムから返される文字を
A$に入れています。

FILEERRORでエラーをチェックします。
値が「0」なら成功、それ以外なら失敗です。


CALLPPARM$でPP ARMletを呼び出します。
PP ARMletはPalmOS5以上でサポートされています。



{$code appl,LDIH,code,100}
program iBHelloPP;
type iBasFunType=function(S:string):string;
var iBasCallPP:iBasFunType;

type
  Int16=-32768..32767;
  UInt16=0..65535;

procedure WinDrawChars(const chars:string;len:Int16;
x,y:UInt16); inline($4E4F,$A220);

function CallPP(S:string):string;
begin
  WinDrawChars(S,Length(S),2,30);
  CallPP:='Hello dear iziBasic';
end;

begin
  iBasCallPP:=CallPP;
end.
PP Codeのソースコードです。

{$code appl,LDIH,code,100}
  「LDIH」はクリエイターIDです。
  「code」はリソースのタイプです。
  「100」はコードのIDです。

program iBHelloPP;
  作成するプログラムの名前をiBHelloPPにします。
  ファイルが既にある場合は、リソースを付け足します。

「type」でiBasFunTypeを定義しています。
関数の引数は文字型で、戻り値も文字型です。

{$armlet appl,LDIH,armp,100}
program iBHelloPP;

var iBasStr:string;

type
  Int16=-32768..32767;
  UInt16=0..65535;

procedure WinDrawChars(const chars:string;len:Int16;
x,y:UInt16); systrap $220;

procedure CallPParm;
begin
  WinDrawChars(iBasStr,Length(iBasStr),2,90);
  iBasStr:='Hello dear iziBasic';
end;

begin
  CallPParm;
end.
PP ARMletのソースコードです。

リソースのタイプは「armp」です。

iziBasic 実行画面です。

iziBasicから渡された文字を表示して、
別の文字を返しています。



独自に機能を拡張して、
iziBasicで出来ないことも実現できます。

■CALLPP$(v|n , [c|t])
  PPコードを呼び出します。
  文字列を引数として渡すことができます。
  PPコードからの戻り値は、文字型です。

  IDは100〜999です。(0〜99はiziBasicが使います。)
  PPコードの呼び出しが成功したかどうかは、FILEERROR関数で調べます。

■CALLPPARM$(v|n , [c|t])
  PP ARMletを呼び出します。
  CALLPP$と同様の設定方法です。
  PalmOS5以上でサポートしています。

■FILEERROR
  最後のファイル操作がエラーなら真を返します。(1=true / 0=false)


iziBasicのトップへ

































研究所入口  研究日誌  アプリ  データベース  掲示板