iziBasic のトップへ

サンプルコード


フォント
コンソールフォント
ファイルの検索
配列変数の操作
メモ帳内を検索
円を描く
Flood Fill Routine
Filled-In Triangles
For drawing on screen with a pen in high res
スクロールバー
16進数を10進数に変換する
ボタンの移動
Tiny BASIC
配列変数のサンプル
配列変数の大きさ
window.ibas






フォント

'Character.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
B=COLOR(0):F=COLOR(1)
BUTTON #1,"0-A",10,140,20,10
BUTTON #2,"0-B",35,140,20,10
BUTTON #3,"3",60,140,10,10
BUTTON #4,"4",75,140,10,10
BUTTON #5,"5",90,140,10,10
BUTTON #6,"6",105,140,10,10
BUTTON #9,"Quit",120,140,30,10
GOSUB _Font0A

REPEAT
M=DOEVENTS
IF M>0 THEN
 COLOR B
 BOXFILLED 0,15 TO 160,139
 COLOR F
 SELECT CASE M
  CASE 1
   GOSUB _Font0A
  CASE 2
   GOSUB _Font0B
  CASE 3
   GOSUB _Font3
  CASE 4
   GOSUB _Font4
  CASE 5
   GOSUB _Font5
  CASE 6
   GOSUB _Font6
  CASE 9
   M=-1
 END SELECT
END IF
UNTIL M=-1
END

_Font0A:
SETFONT 0
GPRINT "FONT 0-A",70,15
FOR I=0 TO 7
 FOR J=0 TO 15
  X=J*8:Y=I*10+40
  C=I*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN

_Font0B:
SETFONT 0
GPRINT "FONT 0-B",70,15
FOR I=0 TO 7
 FOR J=0 TO 15
  X=J*8:Y=I*10+40
  C=(I+8)*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN

_Font3:
SETFONT 0
GPRINT "FONT 3",70,15
SETFONT 3
FOR I=0 TO 5
 FOR J=0 TO 15
  X=J*10:Y=I*10+40
  C=I*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN

_Font4:
SETFONT 0
GPRINT "FONT 4",70,15
SETFONT 4
FOR I=0 TO 5
 FOR J=0 TO 15
  X=J*10:Y=I*10+40
  C=I*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN

_Font5:
SETFONT 0
GPRINT "FONT 5",70,15
SETFONT 5
FOR I=0 TO 5
 FOR J=0 TO 15
  X=J*10:Y=I*10+40
  C=I*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN

_Font6:
SETFONT 0
GPRINT "FONT 6",70,15
SETFONT 6
FOR I=0 TO 3
 FOR J=0 TO 15
  X=J*10:Y=I*20+40
  C=I*16+J:C$=CHR$(C)
  GPRINT C$,X,Y
 NEXT
NEXT
RETURN
フォントごとにどんなキャラクタが登録されているか、チェックしてみます。

フォントはサイズが違うだけでなく、登録されている文字も違います。
TJ25で実行した画像です。


stdFont(0〜127)

stdFont


stdFont(128〜255)

stdFont


symbolFont

symbolFont


symbol11Font

symbol11Font

symbol7Font

symbol7Font
ledFont

ledFont



コンソールフォント

コンソールフォントを確認してみました。
何に使うのか分からない記号がたくさんあります。

iziBasic
'CONSOLEFONT.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT ON}

BEGIN
FOR I=0 TO 15
 FOR J=0 TO 15
  C=I*16+J:C$=CHR$(C)
  PRINT C$;
 NEXT
 PRINT
NEXT
WAIT
END



ファイルの検索

' FindFiles.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
C=0
F$=FINDFIRST$("TEXt","")
WHILE F$<>""
 PRINT F$
 F$=FINDNEXT$("TEXt","")
 C=C+1
WEND
I$="("+STR$(C,0)+" ファイルありました。)"
PRINT I$
WAIT
END
DOCデータを検索します。

「TEXt」タイプのファイルを検索します。
クリエイターIDは、条件を指定していません。

iziBasic 初めの方のファイル名はスクロールして消えています。


配列変数の操作

'SortInteger.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
DIM A(36)
FOR I=27 TO 36
 R=RND(1000):A(I)=R
NEXT
RSORT A,27,36
FOR I=27 TO 36
 J=A(I):I$=STR$(J,0)+":":PRINT I$;
 IF I=31 PRINT
NEXT
PRINT:PRINT
A=MAX A(27,36):A$="MAX:"+STR$(A,0):PRINT A$
B=MIN A(27,36):B$="MIN:"+STR$(B,0):PRINT B$
C=MEAN A(27,36):C$="MEAN:"+STR$(C,2):PRINT C$
D=SUM A(27,36):D$="SUM:"+STR$(D,0):PRINT D$
WAIT
END
iziBasic

数値型配列変数の中身を並べ替えます。
RSORTで、降順(大きい順)に並べ替えます。

1000までの数をランダムに選んでいますが、偶然に3桁の数だけになりました。
ついでに、最大値・最小値・平均値・合計を求めています。


'SortString.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
DIM A$(36)
FOR I=27 TO 36
 R$=""
 FOR J=1 TO 3
  R=RND(25)+65:R$=R$+CHR$(R)
 NEXT
 A$(I)=R$
NEXT
SORT A$,27,36
FOR I=27 TO 36:I$=A$(I):PRINT I$:NEXT
WAIT
END
iziBasic

文字型配列変数の中身を並べ替えます。
SORTで、昇順(小さい順)に並べ替えます。

アルファベットをランダムに3文字組み合わせて、文字列を作ってみました。




メモ帳内を検索

' MemoSearch.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
OPEN "MemoDB" FOR INPUT AS #1
N=LOF(#1)
C=0:E$=CHR$(10)
FOR I=1 TO N
 F$="":INPUT #1,F$
 IF F$<>"" GOSUB _Search
NEXT
CLOSE #1
I$="("+STR$(C,0)+" 個ありました。)"
PRINT I$
WAIT
END

_Search:
P=INSTRING(F$,"iBAS",1)
IF P>0 THEN
 C=C+1
 GOSUB _GetTitle
 PRINT T$
END IF
RETURN

_GetTitle:
P=INSTRING(F$,E$,1)
IF P>0 THEN
 P=P-1
ELSE
 P=LEN(F$)
END IF
T$=LEFT$(F$,P)
RETURN
INSTRING関数を利用して、
「iBAS」を含むデータを検索してみました。


iziBasic

1行目にも、すぐに改行するメモデータが表示されています。

' MegaSearch.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
OPEN "MemoDB" FOR INPUT AS #1
N=LOF(#1)
C=0:E$=CHR$(10)
INPUT "キーワード>",S$
FOR I=1 TO N
 INPUT$$ #1
 L=LEN$$:S=LEN(S$)
 IF S>0 IF L>0 GOSUB _Search
NEXT
CLOSE #1
I$="("+STR$(C,0)+" 個ありました。)"
PRINT I$
WAIT
END

_Search:
E=0 '終了フラグ(-1:なし 1以上:キーワードの位置)
P=1 'メモの文字位置(ベース)
F=P 'メモの文字位置
T=1 'キーワードの文字位置
WHILE E=0
 P$=GETCHAR$$(F):T$=CHAR$(S$,T)
 IF P$=T$ THEN
  F=F+1:T=T+1
  IF T>S LET E=P
 ELSE
  P=P+1:F=P:T=1
 END IF
 IF E=0 IF F>L LET E=-1
WEND

IF E>0 THEN '一致した
 C=C+1
 GOSUB _GetTitle
 IF R=0 LET R=L
 R$="":IF R>20 LET R=20:R$="..."
 M$=STR$(E,0):M$=R$+" ("+M$+")"
 IF R>0 LET M$=GETSTRING$$(1,R)+M$
 PRINT M$
END IF
RETURN

_GetTitle:
F=0:R=0:U=0
WHILE U=0
 F=F+1:P$=GETCHAR$$(F)
 IF P$=E$ LET U=1:R=F-1:IF R=0 LET R=-1
 IF F>L LET U=1:R=0 '改行なし
WEND
RETURN
文字変数に読み込んだ場合は、
63文字を越える部分は切り捨てられてしまいます。

それをメガストリングを使って解決します。

せっかくなので、キーワードの入力を求めて、
そのキーワードを検索するようにしました。

メガストリングを検索する命令がないので、
1文字ずつチェックしています。


iziBasic

タイトルの横のカッコには、
何バイト目に見つけたかも表示しています。

ただ、この画面の例だと、
メガストリングを使った意味が全くありません。

そして、致命的な問題があります。
それは実行速度が遅いということです。

「iBAS」と書くところを「iBA5」と間違えて検索すると、
メモデータを全て調べるので時間が掛かります。

メモの初めでキーワードと一致すると、そこでチェックをやめるのでガマンできるスピードですが、
一致するキーワードがない場合は、とても時間が掛かります。

ここでは、検索効率を上げる工夫をしていないので、もう少し早くなる可能性があると思いますが、
絶対的なスピードが遅いので、あまり期待できないでしょう。

この方法は無理があるようですね。



円を描く

'Circle.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}

BEGIN
PSET 120,55

PSET 154,55:J=2*PI
FOR I=0.04 TO J STEP 0.02
 X=COS(I)*35+120:Y=SIN(I)*35+55
 LINE TO X,Y
NEXT

FOR I=0.04 TO J STEP 0.02
 X=COS(I)*15+120:Y=SIN(I)*15+55
 IF I=0.04 PSET X,Y
 LINE TO X,Y
NEXT

J=2*PI+0.1
FOR I=0.04 TO J STEP 0.1
 X=COS(I)*35+40:Y=SIN(I)*35+100
 IF I=0.04 PSET X,Y
 LINE TO X,Y
NEXT

J=2*PI+0.1
FOR I=0.04 TO J STEP 0.1
 X=COS(I)*15+40:Y=SIN(I)*15+100
 IF I=0.04 PSET X,Y
 LINE TO X,Y
NEXT

J=2*PI+0.1
FOR I=0.04 TO J STEP 0.1
 X=COS(I)*55+40:Y=SIN(I)*55+100
 IF I=0.04 PSET X,Y
 LINE TO X,Y
NEXT

WAIT
END
iziBasic

サイン、コサインを使って円を描く方法です。
iBClock のソースコードが参考になりました。

X=COS(I)*35+120:Y=SIN(I)*35+55

「35」は円の大きさです。
「120」と「55」は円の中心の位置です。

2個目以降の円では、描き始めの位置を計算するようにしました。
3個目の円から、STEPの値を「0.02」から「0.1」に変更してみました。

そのままでは隙間ができてしまうので、
Jに0.1を足して、1回多くループさせました。

線がなめらかになりました。


Flood Fill Routine

  aldweb のフォーラムで紹介されています。
  指定した領域を塗りつぶすようです。

  iziBasic で利用できるスタック領域や配列変数は小さいので、
  その代わりにメガストリングをスタック領域として利用するアイデアを紹介しています。

BEGIN
S=0
REPEAT
Z=DOEVENTS
IF Z=1000 THEN
  Z=PENDOWN
  IF Z=1 THEN
    X=PENX : Y=PENY
    IF S=0 V=X : W=Y : PSET X,Y
    LINETO X,Y
    S=1
  ELSE
    S=0 : LINETO V,W
  ENDIF
ENDIF
UNTIL Z=-1

REPEAT
Z=DOEVENTS
Z=PENDOWN
UNTIL Z=1

X=PENX
Y=PENY

GOSUB _FloodFill

REPEAT
Z=WAITEVENT
UNTIL Z=-1

END


_FloodFill:
Z=PGET(X,Y) ' Get colour to fill
V=160 : W=160 ' Set to resolution of screen
S=0 : T=0
GOSUB _AddToStack

REPEAT
GOSUB _GetFromStack

INC X : IF X DEC X : INC Y : IF YDEC Y : DEC X : IF X>=0 GOSUB _AddToStack
INC X : DEC Y : IF Y>=0 GOSUB _AddToStack

UNTIL S=T
RETURN

_AddToStack:
IF S=-1 RETURN
U=PGET(X,Y) ' Get colour of point
IF U<>Z RETURN ' Exit if not the correct colour to fill
PSET X,Y ' Otherwise fill it

' Increase pointer and add coordinate to stack
INC S : IF S=1024 S=0
IF S=T S=-1 : T=-1 : RETURN

U=X/256 : U=INT(U) : Z$=CHR$(U)
U=S*4+1 : PUTCHAR$$ Z$,U
U=X MOD 256 : Z$=CHR$(U)
U=S*4+2 : PUTCHAR$$ Z$,U

U=Y/256 : U=INT(U) : Z$=CHR$(U)
U=S*4+3 : PUTCHAR$$ Z$,U
U=Y MOD 256 : Z$=CHR$(U)
U=S*4+4 : PUTCHAR$$ Z$,U

RETURN

_GetFromStack:
' Increase pointer and get coordinate from stack
INC T : IF T=1024 T=0
U=T*4+1 : Z$=GETCHAR$$(U)
U=ASC(Z$) : X=U*256
U=T*4+2 : Z$=GETCHAR$$(U)
U=ASC(Z$) : X=X+U

U=T*4+3 : Z$=GETCHAR$$(U)
U=ASC(Z$) : Y=U*256
U=T*4+4 : Z$=GETCHAR$$(U)
U=ASC(Z$) : Y=Y+U

RETURN




Filled-In Triangles

  aldweb のフォーラムで紹介されています。
  三角形を塗りつぶすようです。

  Garfield さんによる詳しい解説もあります。
  iziBasic の次のバージョンで、このグラフィック命令を追加する予定だそうです。

BEGIN
  A=30 : B=30 ' Coordinate 1
  C=150 : D=50 ' Coordinate 2
  E=50 : F=150 ' Coordinate 3

  ' Call Draw Triangle Routine
  GOSUB _DrawFilledTriangle

  ' Pause so we can see our triangle!
  REPEAT : Z=WAITEVENT : UNTIL Z<0
END

_DrawFilledTriangle:

' Sort coordinates in order of height
IF DIF BIF D
' Calculate Mid-Point G
X=D-F : Y=B-F : Z=E-A : Z=ABS(Z)
G=Z*X/Y : G=ROUND(G)
IF E>A THEN
  G=E-G
ELSE
  G=E+G
ENDIF

' Jump to Fill Routines
I=A : J=B
GOSUB _DrawHalfTriangle ' Bottom Half
I=E : J=F
GOSUB _DrawHalfTriangle ' Top Half

' Draw Outline to tidy sharp corners
LINE A,B TO C,D
LINETO E,F
LINETO A,B
RETURN

_DrawHalfTriangle:
IF J=D RETURN ' Return if flat top or bottom

IF J>D THEN
  Z=J-D : V=1 ' Bottom Half
ELSE
  Z=D-J : V=-1 ' Top Half
ENDIF

X=I-G : X=X/Z ' Calculate x-axis steps
Y=I-C : Y=Y/Z

FOR W=0 TO Z
  I=X*W+G : I=ROUND(I)
  J=Y*W+C : J=ROUND(J)
  H=W*V
  H=D+H
  LINE I,H TO J,H
NEXT

RETURN




For drawing on screen with a pen in high res

  aldweb のフォーラムで紹介されています。
  ペン入力をチェックして、絵を描くことができます。

BEGIN
R=HIGHRES(1)
REPEAT
  E=DOEVENTS
  IF E=1000 THEN
    p=PENDOWN
    IF p=1 IF q=0 LET x=PENX*2 : y=PENY*2 : PSET x,y
    IF p=1 IF q=1 LET x=PENX*2 : y=PENY*2
    LINETO x,y
    q=p
  ENDIF
UNTIL E=-1
R=HIGHRES(0)
END


スクロールバー

BEGIN
LABEL #3,"Nothing",15,40
SCROLLBAR #1,1,150,50,9,110
REPEAT
 E=DOEVENTS
 IF E=1 THEN
  C=SCROLLBAR(#1)+40
  UPDATEPOS #3,15,C
 END IF
UNTIL E=-1
END
aldweb のフォーラムで紹介されていました。

スクロールバーの使い方の参考になります。

ボタンやフィールドの表示位置を変更して、
スクロールを実現するようです。




16進数を10進数に変換する

iziBasic では、16進数を数値として扱うことができません。

(10進数の)値を HEX$() を使って16進数の文字列に変換することはできます。
でも、一般的な Basic のように「&H」や「$」で始まる数字を、16進数として理解してくれません。

そこで、16進数の文字を数値に変換する方法を考えました。


(1) Maze.iBas では、エラー文字が入ることが無いので、細かいチェックをしていません。

L=VAL(I$):IF I$>"9" LET L=ASC(I$)-ASC("A")+10

I$ に入っている文字コードが「9」より大きいなら、
文字コードから「A」の文字コードを引いて10を足しています。

「ASC("A")+10」の部分は定数ですが、
直接数字を書くと後で思い出すのが大変なので、式にしています。


(2) INSTRING() を使って変換する

A=INSTRING("0123456789ABCDEF",A$,1)-1

A$ に入っている文字の位置を調べて、その値から1を引きます。
「0」〜「9」、「A」〜「F」以外の文字の場合は「-1」が返ります。

A$ に小文字が入る可能性がある場合は、UCASE$() を使って大文字に統一してから変換します。


(1)の方法は、ちょっと強引で、あまり美しくありません。
エラーチェックが簡単で、1つの命令で変換できる、(2)の方法が優れていますね。


サブルーチンを PUSH と POP で囲めば、変数の値を保持することができます。

'HexToDec.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
A$="5":PRINT A$;:PRINT ":";
GOSUB _HexToDec:PRINT A USING 0

A$="a":PRINT A$;:PRINT ":";
GOSUB _HexToDec:PRINT A USING 0

A$="F":PRINT A$;:PRINT ":";
GOSUB _HexToDec:PRINT A USING 0

A$="G":PRINT A$;:PRINT ":";
GOSUB _HexToDec:PRINT A USING 0

WAIT
END

_HexToDec:
PUSH A$
 A$=UCASE$(A$)
 A=INSTRING("0123456789ABCDEF",A$,1)-1
POP A$
RETURN
サブルーチンの _HexToDec では、
小文字を大文字に置き換えてから10進数に変換します。

その処理を PUSH と POP で挟んで、
変数の内容を元に戻しています。

サブルーチン内で一時的に使う変数を保存しておけば、
呼び出し側でどんな変数を使っていても
気にしないで使うことができます。

iziBasic

左が16進数の文字、右が変換後の値です。

「G」は16進数ではないので、
エラーを表す「-1」が返っています。




ボタンの移動

iziBasic
'Move.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
M$="iziBasic"
X=62:Y=160
BUTTON #1,M$,X,Y,35,10
REPEAT
 REPEAT:DEC Y:UPDATEPOS #1,X,Y:UNTIL Y=20
 REPEAT
  E=DOEVENTS
  U=(E=1)+(E<0)
 UNTIL U>0
 REPEAT:INC Y:UPDATEPOS #1,X,Y:UNTIL Y=161
UNTIL E<0
END


ボタンの表示位置を続けて変更する実験をしてみました。

ウェイトを入れていないので動くスピードが早すぎますが、
限界のスピードが分かるのでそのままにしてあります。

実験ではテキストのボタンで作りましたが、
イメージボタンに変更すると何かの演出に使えるかも知れません。

iziBasic のバージョンアップの予定に、
イメージボタンの枠を表示しないオプションを考えているということです。

実現されれば、更に応用ができると思います。



Tiny BASIC

Tiny BASIC は iziBasic のサンプルプログラムです。
いくつかの命令をサポートしています。

命令動作
BYE
tinyBasic を終了します。
CLEAR
A〜Zの変数に0を代入します。
CLS
クリアスクリーンです。
END
実行中のプログラムを終了して「Ready」のプロンプトを表示します。
GOTO [expression]
指定した行番号にジャンプします。
行番号は変数で指定することもできます。
うまく使えば、サブルーチンのようにも使えます。
HELP
命令や関数の説明を確認できます。
IF [expression] THEN [statement]
条件が真なら、THEN以降の命令を実行します。
INPUT [variable]
ユーザからの入力を変数に入れます。
LET [variable]=[expression]
変数に計算結果を代入します。
LIST [expression]|PAUSE
プログラムを表示します。
PAUSE を書くと、スクロールする前に一時停止します。
行番号を指定すると、その行を表示します。
LOAD [expression]
事前に保存してある、指定した番号のプログラムを読み込みます。
番号0のプログラムは、tinyBasic 起動時に自動実行されます。
MEM
プログラムをあと何行登録できるかを返すようです。
NEW
プログラムを削除します。
PRINT [expression]|[string],[expression]|[string]...;
式や文字列をカンマで区切って、複数表示できます。
文字列は変数に入れられないので、クォートマークで囲みます。
REM [anything]
コメントを書けます。
RUN
全ての変数に0を代入して、プログラムの最初の行から実行します。
SAVE [expression]
プログラムをファイルに保存します。
プログラムが無い状態で、既に保存されている番号を指定すると、そのファイルを削除します。
TICKS
(関数)TICKS 値を返します。
TICKSPERSEC
(関数)1秒間に増える TICKS 値を返します。

変数はA〜Zまでの26個です。
整数と小数を代入できます。

計算の式は、<=,<,=,>,>=,+,-,*,/,\ の記号を使えます。
\ は整数の割り算です。
優先順位は * / \ > + - > <= < = > >= です。
()で囲むこともできます。

命令は「:」で区切れば、1行に何個でも書けます。
行番号なしで命令を書くと、その場で実行します。

行番号を付けると、プログラムとして格納します。
同じ行番号があれば、新しい行の内容で置き換えられます。
行番号の後に何も書かないと、その行のプログラムは削除されます。

1行に書けるのは63文字までです。
最大で99行までプログラムできます。


昔の Basic 言語です。
行番号が懐かしいですね。

サンプルとして、Hello World 、Matches 、Numerus があるようです。
この少ない命令だけで、ゲームも作れるようですね。

TinyBasic は規格があるようです。
メモリが2KB位しかないコンピュータ向けに考えられたようです。
iziBasic では GOTO 命令で変数を使えるようにして、GOSUB と RETURN をなくしています。



配列変数のサンプル

'Arrays.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
DIM A(50)
B=100:C=200:Y=300:Z=400

FOR I=27 TO 50
 A=RND(100):A(I)=A
NEXT

FOR I=1 TO 50
 A=A(I):A$=STR$(A,0)+" ":PRINT A$;
 A=I MOD 10:IF A=0 PRINT
NEXT

WAIT
END
配列変数の要素の1〜26は、A〜Zに対応しています。

初めのループでは、配列変数にランダムな値を代入しています。
A〜Zを避けるために、27〜50までの要素に限っています。

もし A(9) に50以上の数を入れると、ループが終了してしまいます。
A(9) は I と同じです。


サンプルを改善しました。
・配列変数に乱数を代入するのをやめて、添字をそのまま代入しています。
・表示する位置を整えて見やすくしました。

「24」と「25」が違う数に変わっていますが、これは変数 X と Y の値です。

iziBasic
'Arrays.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{PARSER ON}
{CONSOLEFONT OFF}

BEGIN
DIM A(50)

FOR I=1 TO 50
 IF I<>9 LET A(I)=I
NEXT

FOR I=1 TO 50
 A=A(I):A$=STR$(A,0)
 X=((I-1) MOD 5)*32+32-FONTWIDTH(A$,0)
 Y=((I-1) \ 5)*10+20
 GPRINT A$,X,Y
NEXT

WAIT
END



配列変数の大きさ

'FRE.iBAS
{CreatorID "HELO"}
{Version "1.0"}
{MINOSVERSION "5.0"}
{PARSER ON}
{CONSOLEFONT OFF}
BEGIN
A=FRE(4)
PRINT A USING 0
WAIT
END
数値型の配列変数は、通常、230個ほどの要素しか使えません。

どの程度の要素を扱えるかは、FRE(4) で確認できます。
FRE(4) は、ナンバースタックの最後のアドレスを返す関数です。

必要とする Palm OS のバージョンを大きくすると、要素数を簡単に増やせます。
{MINOSVERSION "5.0"}によって、要素を約12000まで増やせます。

左のコードで FRE(4) の値を確認できます。

実際に使える要素数は、表示される値よりも20ほど少ないのですが、
その領域は iziBasic の内部で使っているようです。

{MINOSVERSION "5.0"}とすると、当然、Palm OS 5.0 以上の機種でしか実行できなくなります。
できるだけ多くの人に使ってもらうために、OS のハードルは低く設定した方がいいと思います。



window.ibas

aldweb のフォーラムで、 Nate Weil さんが「window.ibas」を紹介していました。

' window.ibas

' Listing generated by ViziBasic v2.1
' 05/02/2005 @ 14:33:11

{CREATORID "wndw"}
{VERSION "1.0"}
'{MINOSVERSION "3.0"}
'{PARSER OFF}
'{KEYEVENTS OFF}
'{SECUREFILES ON}
'{CONSOLEFONT ON}

DIM %EVT%,%P1%,%P2%,%P3%,%X%
DIM %P1$,%P2$,%P3$,%A%,%Y%
DIM %E%

BEGIN
GOSUB _OnAppStart
GOSUB _GenerateGUI
GOSUB _EventsLoop
GOSUB _OnAppExit
END

_GenerateGUI:
%E%=%X%/14
A=I+%E%
%E%=%Y%/2.8
B=J+%E%
%E%=%X%/2
C=I+%E%
%E%=%Y%/1.7
D=J+%E%
%E%=%X%/14
E=I+%E%
%E%=%X%/1.3
F=J+%E%
G=I
%E%=%X%/3.5
H=J+%E%
K=I+%X%
L= H+%Y%
M=I+%X%
%E%=%Y%/3.5
N=J+%E%
%E%=%Y%/35
O=I+%E%
%E%=%Y%/17.5
P=J+%E%
%E%=%Y%/1.2
U=I+%E%
%E%=%Y%/14
V=J+%E%
LABEL #7,"Window 1",O,P

%P1$="1"
SETFONT 0
BUTTON #3,%P1$,A,B,20,12
%P1$="2"
SETFONT 0
BUTTON #4,%P1$,C,D,20,12
%P1$="3"
SETFONT 0
BUTTON #5,%P1$,E,F,20,12
%P1$="x"
SETFONT 0
BUTTON #6,%P1$,U,V,10,10
%E%=%Y%/35
U=I+%E%
%E%=%Y%/0.9
V=J+%E%
%P1$="-"
SETFONT 0
BUTTON #8,%P1$,U,V,10,10
%E%=%Y%/4.3
U=I+%E%
%E%=%Y%/0.9
V=J+%E%
%P1$="+"
SETFONT 0
BUTTON #9,%P1$,U,V,10,10
%P1$="New Window"
SETFONT 0
BUTTON #10,%P1$,70,1,90,11

COLOR R
BOX I,J TO M,N
COLOR R
BOX G,H TO K,L
RETURN

_EventsLoop:
REPEAT
%EVT%=DOEVENTS
SELECT CASE %EVT%
CASE 3
GOSUB _BUTTON_3
CASE 4
GOSUB _BUTTON_4
CASE 5
GOSUB _BUTTON_5
CASE 6
GOSUB _BUTTON_6
CASE 8
GOSUB _BUTTON_8
CASE 9
GOSUB _BUTTON_9
CASE 10
GOSUB _BUTTON_10
CASE 1000
GOSUB _BUTTON_1000
END SELECT
UNTIL %EVT%=-1
RETURN

_BUTTON_3:
R=0
GOSUB _GenerateGUI
RETURN

_BUTTON_4:
R=16711680
GOSUB _GenerateGUI
RETURN

_BUTTON_5:
R=255
GOSUB _GenerateGUI
RETURN

_BUTTON_6:
FOR Z=1 TO 7
DESTROY #Z
NEXT
CLS
%A%=1
RETURN

_BUTTON_8:
%X%=%X%-5
%Y%=%Y%-5
CLS
GOSUB _GenerateGUI
RETURN

_BUTTON_9:
%X%=%X%+5
%Y%=%Y%+5
CLS
GOSUB _GenerateGUI
RETURN

_BUTTON_10:
%A%=0
GOSUB _GenerateGUI
RETURN

_BUTTON_1000:
IF %A%=0 THEN
X=PENX
Y=PENY
IF X > I THEN
IF X < M THEN
IF Y > J THEN
IF Y < N THEN
I=X-35
J=Y-10
COLOR 16777215
BOXFILLED 0,0 TO 160,160
OPENFORM 0
GOSUB _GenerateGUI
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN

_OnAppStart:
I=50
J=50
%X%=70
%Y%=70
RETURN

_OnAppExit:
RETURN
window.ibas

コンパイルして実行すると、
Window が1つ表示されます。

「1」、「2」、「3」の各ボタンで、色を変更できます。
「+」、「-」の各ボタンで 、Window の大きさを変更できます。
「×」ボタンで、Window を閉じます。

「New Window」ボタンで、新しい Window を開きます。
今のところ、同時に開ける Window は1つだけです。

ウィンドウ名をドラッグすると、位置を変更できます。



window.ibas

「-」ボタンで、小さくしてみました。



window.ibas

「+」ボタンで、大きくしてみました。



window.ibas

ウィンドウを動かして、青くしてみました。




うまく応用して、面白いことができるかもしれません。