プログラム制御
対応:
- Win
- Cli
- Let
目次
- _break
- _continue
- await
- break
- case
- continue
- default
- do
- else
- end
- exec
- exgoto
- for
- foreach
- gosub
- goto
- if
- loop
- next
- on
- onclick
- oncmd
- onerror
- onexit
- onkey
- repeat
- return
- run
- stop
- swbreak
- swend
- switch
- until
- wait
- wend
- while
await
一定の時間で待つ
グループ:
プログラム制御命令
パラメーター:
await p1
- p1 = 0〜(0) : 待ち時間(1ms単位)
説明:
プログラムの実行を一定時間だけ中断します。
wait命令と似ていますが、 await命令は前回waitした時間からの待ち時間を指定します。これにより、描画速度の違いなどから時間が早く過ぎることを防止することができます。リアルタイムで更新される画面などの速度を一定に保つ時に使用します。
HSPでは、他のWindowsタスクに処理時間を渡すために長い時間ループが起こる可能性がある場所にはwaitかawait命令を入れることを推奨しています。waitや await命令がない命令の中を長い時間ループするようなプログラムを実行すると、ウィンドウをドラッグしにくくなったり、他のタスクに移るのに時間がかかったりします。
参照:
- wait
exec
Windowsのファイルを実行する
グループ:
プログラム制御命令
パラメーター:
exec "filename",p1,"command"
- "filename" : 対象となるファイル名
- p1=0〜(0) : ファイル実行モード
- "command" : コンテキストメニューの操作名
説明:
execは "filename" で指定したファイル名のアプリケーションを実行します。 拡張子がEXEの場合は、拡張子を省略することができます。 p1で実行時のモードを選ぶことができます。p1を省略した場合は0になります。
- モード0 : HSPノーマル実行
- モード2 : 最小化モードで実行
- モード16 : 関連付けされたアプリケーションを実行
- モード32 : 指定したファイルを印刷する
"command"が指定された場合は、 "filename"で指定したファイルまたはフォルダ名に対するコンテキストメニュー操作名となります。 コンテキストメニュー操作名は、レジストリに登録されているアクションを指定する文字列で、標準で以下のようなものが用意されています。
操作名 | 説明 |
---|---|
edit | エディタを開いて編集する。 |
explore | フォルダを選択して、エクスプローラを起動します。 |
open | 関連付けられたアプリケーションでファイルを開きます。 |
関連付けられたアプリケーションでファイルを印刷します。 | |
properties | ファイルまたはフォルダのプロパティを表示します。 |
"command"が指定された場合は、ファイル実行モードの16、 32は無効になります。また、実行結果を示す値がシステム変数statに返されます。
ノーマル実行は、新しく起動したアプリケーションのウィンドウがアクティブになり、入力フォーカスも移りますが、マルチタスクで、 HSPは終了せずに実行を続けます。
例 :
exec "calc" ; Windows電卓を起動
また、ファイル名に続けてパラメータを書くこともできます。
例 :
exec "notepad hsp.txt" ; ノートパッドでhsp.txtを開く
モード2は指定したアプリケーションを最小化した状態で実行します。 DOSアプリケーションの実行時にHSPの画面を遮ることなくバックで実行させることができます。
モード16は、実行ファイルではなく、データファイルを指定してその拡張子に関連付けられたアプリケーションを実行します。
例 :
exec "hsp.txt",16 ; hsp.txtを関連付けられたアプリケーションで開く
上の例では、「hsp.txt」を関連付けされたアプリケーションで開きます。 (通常は、notepad.exe) また、 モード16ではインターネットのURLを指定することでインターネットショートカットとしても使用することが可能です。
例 :
; インターネットのページを開く
exec "http://www.onionsoft.net/hsp/",16
モード32では、指定したファイルに関連付けされたアプリケーションを経由して、プリンタに印刷をします。 たとえば、
例 :
exec "hsp.txt",32 ; hsp.txtをプリンタで印刷
は、「txt」に関連付けされたアプリケーションで「hsp.txt」を自動的に印刷します。印刷のオプションなどはすべて、関連付けされたアプリケーションで指定されたものになります。
モードは、複数同時に指定することが可能です。 たとえば、モード2とモード16を同時に指定する場合は、それぞれの値を加算して18になります。この場合は、「最小化モードで関連付けされたアプリケーションを実行」になります。
※HSP2.61までサポートされていたモード1(タスク実行待ち)は、HSP3ではサポートしていません。起動したプロセスを監視するか、コンソールアプリケーションの場合はpipeexec命令をご使用ください。
参照:
- pipeexec
対応の補足:
HSPLet時は、HTML ページを表示する目的で使用されます。 第3引数の意味がオリジナルの HSP とは違うため、この命令を直接使用することはお勧めしません。 代わりに letutil.hsp 内に定義されている showPage fileName, target 命令を使用することをお勧めします。
end
プログラム終了
グループ:
プログラム制御命令
パラメーター:
end p1
- p1(0) : 終了コード
説明:
HSPのプログラムを終了します。 end命令はスクリプトのどこにあってもかまいません。 end命令が実行されると、そのアプリケーションは終了します。
アプリケーションの終了コードをパラメーターp1で指定することができます。p1を省略した場合は、0がアプリケーション終了コードとなります。 アプリケーション終了コードは、他のプロセスやバッチファイルへの通知に使用されます。通常は、省略(0)していて問題ありません。
参照:
- stop
gosub
指定ラベルにサブルーチンジャンプ
グループ:
プログラム制御命令
パラメーター:
gosub *label
- *label : ラベル名
説明:
サブルーチンジャンプをします。 gosub命令は、*labelで指定した場所にジャンプをします。 その後、return命令があるとgosub命令の次の行に復帰して実行を続けます。 gosub〜returnはネスティング(入れ子構造)にすることが可能です。 (最大ネスティング数はHSPが持つスタックメモリの量により変動します)
参照:
- goto
- return
goto
指定ラベルにジャンプ
グループ:
プログラム制御命令
パラメーター:
*label *label : ラベル名
説明:
指定したラベルに無条件でジャンプします。 以降は、ラベル名で指定された場所から実行を続けます。
参照:
gosub
if
条件を満たしていればその行の命令を実行
グループ:
プログラム制御命令
パラメーター:
if p1
- p1 : 条件式
説明:
p1の条件式が満たされていれば、それ以降の命令を実行する。満たされていない場合は、次の行に移ります。 BASICと違い、その行の次の命令との間には :(コロン)を入れなければいけないので注意してください。
例 :
a=10
if a=10 : mes "aは10です。"
上の例では、「a=10」の部分が条件式になります。条件式には主に、
- a=b : aとbは等しい
- a!b : aとbは等しくない
- a<b : aはbよりも小さい
- a>b : aはbよりも大きい
- a<=b : aはbよりも小さいか等しい
- a>=b : aはbよりも大きいか等しい
を使います。if+条件式の後は:(コロン)で区切り、それに続いて条件が満たされた場合に実行される部分を書きます。 (C言語やJavaと同じように「=」「!」を「==」「!=」のように記述することも可能です) もし、条件によってプログラムの流れを変えたい場合には、
例 :
a=10
if a>10 : goto *over10
mes "aは10以下です。"
stop
*over10
mes "aは10より大きいです。"
stop
上のように、goto命令で別なラベルに飛ばすことも可能です。 また、else命令を使って条件が満たされなかった場合の処理を同じ行に書くことも可能です。
例:
a=10
mes "aは、"
if a=10 : mes "10です。" : else : mes "10ではありません。"
stop
この場合は、else命令のある部分までは、条件を満たした場合に実行され、else命令以降は、条件を満たされなかった場合に実行されます。 次の行以降は、条件に関わらず通常通りに実行されます。
より複雑な条件判断をするために、論理演算式を使うこともできます。
- a&b : aとbがともに正しい (and)
- a|b : aとbのどちらかが正しい (or)
これによって複数の条件を一度に記述することができます。
例 :
a=10:b=20
if (a=10)|(b=10) : mes "aかbのどちらかが10です。"
上の例では、「a=10」と「b=10」 という条件式を|(or)でつないで、どちらかが正しい場合には、正しいという結果が出るようにしています。 論理演算は、 「|」「&」といった記号の他に「or」「and」という文字列でも記述することができます。
例 :
if (a=10)or(b=10) : mes "aかbのどちらかが10です。"
上のように書いても、結果は同じになります。
if命令の条件が正しい時に実行されるスクリプトを複数行に渡って記述する場合は、
例 :
a=10
if a>5 {
mes "TRUE"
mes "(MULTILINE IF)"
}
のように「{」で始めて「}」で終わる部分までを指定します。 (上の例では、 見やすくするためにC言語風に行の最初にTABを入れてありますが、特に必要なものではありません。ユーザーの見やすいように記述してください)
else命令でも複数行の指定ができます。
例 :
a=10
if a>5 {
mes "TRUE"
mes "(MULTILINE IF)"
}
else {
mes " FALSE"
mes " (MULTILINE IF)"
}
return
ただし、else の後に「{」を記述しなければ複数行にはならないので注意してください。
参照:
- else
loop
ループの始まりに戻る
グループ:
プログラム制御命令
説明:
repeat/foreach命令で指定したループの終わりを指定します。 詳しくはrepeat命令の項を参照してください。
参照:
- repeat
- foreach
onexit
終了時にジャンプ
グループ:
プログラム制御命令
パラメーター:
onexit goto/gosub *label
- *label : ラベル名
説明:
クローズボックス(ウィンドウ右上の終了ボタン)を押した時に、自動的にジャンプする場所を指定します。
onexitの後に続けて、 gotoまたはgosubキーワードを指定してからラベルを記述します。 gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。 goto/gosubキーワードを省略した場合には、gotoキーワードと同等の動作になります。
例 :
onexit gosub *exit_routine ; 終了時呼び出し
通常は、クローズボックスを押すとどのような時でも強制終了してしまいますが、この命令が実行された以降は、クローズボックスを押すとonexit命令で指定したラベルにジャンプし、そこから実行を続けるようになります。
終了時に確認メッセージを表示したい時、終了したらデータを保存するようにしたい時などに使います。
この命令が実行されると、 end命令以外ではスクリプトの実行が止められなくなるので、十分に注意して使ってください。
複数のウィンドウを作成した場合は、いずれかのウィンドウにある終了ボタンで割り込みが発生します。この時、システム変数wparamに終了の通知を受けたウィンドウIDが代入されます。
onexitでジャンプされた直後は、システム変数iparamに終了要因が値として保存されています。 iparamが0の場合は、ユーザーの意思でプログラムを終了。 iparamが1の場合は、 Windowsシャットダウン(再起動または電源OFF)による終了です。Windowsシャットダウン時の終了処理には、await、wait、stop命令などでシステムにアイドルタイム(待ち時間)を発生させた場合には、シャットダ ウン処理を中止します(シャットダウンされません)。 await、wait、stop命令を使わずにend命令で終了した場合には、そのままシャットダウン処理が継続されます。
終了時ジャンプの一時的なON/OFFをすることも可能です。
onexit 0
で一時的に割り込みを停止します。
onexit 1
で一時停止した割り込みを再開させることができます。
参照:
- onkey
- onclick
- onerror
非対応:
- Let
return
サブルーチンから復帰
グループ:
プログラム制御命令
パラメーター:
return p1
- p1 : システム変数代入値
説明:
gosub命令やユーザー定義命令などで呼び出しされたサブルーチンを終了します。return命令により、スタックを戻し呼び出し元に復帰します。 p1を指定することにより、サブルーチンから値をシステム変数に反映させることができます。
- p1に数値を指定した場合には、システム変数statに代入されます。
- p1に文字列を指定した場合には、システム変数refstrに代入されます。
- p1に実数値を指定した場合には、システム変数refdvalに代入されます。
- p1の指定を省略した場合には、システム変数の代入は行なわれません。
参照:
- gosub
- #deffunc
- #defcfunc
- stat
- refstr
- refdval
run
指定したファイルに制御を移す
グループ:
プログラム制御命令
パラメーター:
run "filename","cmdline"
- "filename" : 実行するHSPオブジェクトファイル名
- "cmdline" : システム変数dir_cmdlineに代入される文字列
説明:
別のファイルに書かれたHSPのプログラムを実行します。 指定するファイルはHSPのオブジェクトファイル (拡張子がAX)でなければなりません。 オブジェクトファイルは、スクリプトエディタの「オブジェクトファイル作成」によって作成することができます。
例 :
run "MENU2.AX","-s"
が実行されると、いままでのプログラムはなくなり"MENU2.AX"というファイルのプログラムが最初から実行されます。 画面の状態は維持されますが、変数、メモリバッファの内容はすべて初期化されます。また、「-s」という文字列がシステム変数 dir_cmdlineに代入された状態で実行が開始されます。
"cmdline"パラメーターが省略された場合は、システム変数dir_cmdlineの内容は 空になります。また、システム変数 dir_cmdlineは最大1024文字まで内容が保存されます。
stop
プログラム中断
グループ:
プログラム制御命令
説明:
プログラムの実行を一時中断します。 ボタンがクリックされるまで待つ時などに使用します。
参照:
- end
wait
実行を一定時間中断する
グループ:
プログラム制御命令
パラメーター:
wait p1
- p1(100) : 待ち時間(10ms単位)
説明:
プログラムの実行を一定時間だけ中断します。
p1に待ち時間の長さを指定します。単位は10ミリ秒になります。(1ミリ秒=1/1000秒) CPUの速度に関係なく、どんな機種でも同じ待ち時間になります。 ;p1に0を指定した場合、 または省略をした場合は、前回と同じ時間だけ待ちます。
await命令を使うとwait命令よりも高精度で細かいウエイトが可能ですが、wait命令よりもCPUのタスクを消費します。 リアルタイムに画像を書き換えるなどの処理でなければ、 wait命令を使用した方がCPU(Windows)の負担が軽くなります。 常にデスクトップに配置するようなアクセサリにはwait命令を、ゲームアプリケーションなどにはawait命令を使うといった使い分けをするといいでしょう。
HSPでは、他のWindowsタスクに処理時間を渡すために長い時間ループが起こる可能性がある場所にはwaitかawait命令を入れることを推奨しています。 waitや await命令がない命令の中を長い時間ループするようなプログラムを実行すると、ウィンドウをドラッグしにくくなったり、他のタスクに移るのに時間がかかったりします。
参照:
- await
repeat
ループの始まりの場所を示す
グループ:
プログラム制御命令
パラメーター:
repeat p1,p2
- p1=1〜(-1) : ループ回数
- p2=0〜(0) : システム変数cntのスタート値
説明:
repeat〜loopの間をくり返し実行します。 repeat命令は、くり返しの開始地点を示します。 loop命令は最後に通過したrepeat命令まで戻ります。つまり、
repeat 5
print "やっほー"
loop
のようなプログラムは、「やっほー」を5回表示します。 repeat命令のパラメータ、p1でくり返しの回数を指定することができます。回数の指定を省略、またはマイナス値を指定すると無限ループになります。 繰り返しの回数が0の場合は、繰り返し部分は実行されず対応する loop命令までジャンプします。
repeat〜loopを含む部分をさらにループさせるネスト構造も記述することができます。ただし、正常にloop命令を通ってループしないで抜けたりすると、ネスト構造がおかしくなるのでループから強制的に抜けるような構造にはしないようにしてください。
ループ回数を調べたい時や、カウンターを利用したい時のためにシステム変数cntを参照することができます。cntは通常、0からスタートして、 loop命令でループするたびに1づつ増えていきます。 ただし、repeat命令のp2でカウンタがスタートする数値を変更することも可能です。たとえば、repeat 3,1 のように指定した場合には、変数cntの値は1,2,3の順で変化します。
ループの内部で、強制的にループを抜け出す場合には、 break命令を使用してください。また、次のループに移るためのcontinue命令も用意されています。
参照:
- loop
- break
- continue
- foreach
break
ループから抜ける
グループ:
プログラム制御命令
説明:
repeat〜loop間のループから、強制的に抜け出します。
repeat 5
if cnt=2 : break
mes "繰り返し["+cnt+"]"
loop
上の例では、システム変数が2になった時点、つまり3回目のループになると、if命令の判断によって、break命令が実行されるしくみになっています。 break命令が実行されると、繰り返しの回数がまだ残っていても、 強制的に繰り返しから抜け出し、loop命令の次にある命令から実行を続けます。 break命令以降(上の例では、mes命令)は実行されません。 この命令を使うと、たとえば次のようなスクリプトが作成可能です。
repeat
getkey a,1
if a>0 : break
await 10
loop
上のスクリプトでは、マウスの左ボタンを押すまで待つループになります。 repeat命令の回数指定を省略すると無限ループになるので、それを利用してボタンの状態が 1になるまでは、ずっと同じところを繰り返すようになっています。ボタンが押されると、 break命令が実行され繰り返しから抜け出します。
参照:
- repeat
- loop
- continue
- foreach
continue
ループをやり直す
グループ:
プログラム制御命令
パラメーター:
continue p1
- p1 = 0〜 : 繰り返しカウンタ変更値
説明:
repeat〜loop間のループをやり直します。 continue命令が実行されると、repeat命令まで戻り次の繰り返しを実行します。
repeat 5
if cnt=2 : continue
mes "cnt="+cnt
loop
上の例では、システム変数cntが2になった時点で、continue命令が実行されるしくみになっています。 上のスクリプトが実行されると、
cnt=0
cnt=1
cnt=3
cnt=4
のような表示になり、システム変数cntが2の時だけmes命令が実行されないのがわかります。 最初はわかりにくいかもしれませんが、continue命令は、loop命令の場所ではないが、loop命令と同じ働きをするとも言えます。 繰り返しのカウンタは、continue命令が実行された場合でも、loop命令と同様1つ増加します。 もし、最後の繰り返しでcontinue命令が実行されると、repeat〜loopが終わった状態、つまりloop命令の次の命令から実行を続けます。
さらにもう1つ、continue命令にはパラメータを指定する使い方が存在します。 continueの後に、数値または数値型変数を指定することにより、繰り返しのカウンタを示すシステム変数cntの内容を変更することができます。 たとえば、「continue 1」と指定した場合は、システム変数cntの内容は1になり、その値のままrepeat命令の次から繰り返しを続けます。 パラメータを省略して、ただの「continue」だけの場合はloop命令と同様の処理、数値を指定すると、カウンタの値を変更して繰り返しをやり直すことになります。 ですから、
repeat 1
await 10
getkey a,1
if a=0 : continue 0
loop
このようなスクリプトでは、通常1回だけしか実行されないはずの、 repeat〜loopの繰り返しですが、マウスの左ボタンが押されていない場合は、カウンタが0に戻され無限ループの状態になります。 これで、ボタンを押すまで待つという動作になります。
参照:
- repeat
- foreach
- loop
- break
onkey
キー割り込み実行指定
グループ:
プログラム制御命令
パラメーター:
onkey goto/gosub *label
- *label : ラベル名
説明:
キーボードを押した時に、自動的にジャンプする場所を指定します。
onkeyの後に続けて、gotoまたはgosubキーワードを指定してからラベルを記述します。gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。 goto/gosubキーワードを省略した場合には、gotoキーワードと同等の動作になります。
onkey命令でラベルを指定すると、それ以降はHSPのウィンドウがアクティブな時にキー入力があるたびに*labelで指定したラベルにジャンプします。
割り込みジャンプは、stop命令および、wait、 await命令で停止している時に割り込みを受け付けてジャンプを行います。 また、割り込みによりジャンプを行なった後はシステム変数iparam、wparam、lparamがセットされます。
割り込み要因 | iparam | wparam | lparam
---------------------------------------------------------
onkey | 文字コード | wParam | lParam
システム変数iparamには、割り込み要因ごとのパラメータが代入されます。 また、wparam,lparamはWindowsメッセージとして渡されたパラメータがそのまま格納されています。 イベント割り込み実行の一時的なON/OFFをすることも可能です。
onkey 0
で一時的にキー割り込みを停止します。
onkey 1
で一時停止したキー割り込みを再開させることができます。
参照:
- onclick
- onexit
- onerror
onclick
クリック割り込み実行指定
グループ:
プログラム制御命令
パラメーター:
goto/gosub *label *label : ラベル名
説明:
マウスのボタンを押した時に、自動的にジャンプする場所を指定します。
onclickの後に続けて、gotoまたはgosubキーワードを指定してからラベルを記述します。gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。 goto/gosubキーワードを省略した場合には、gotoキーワードと同等の動作になります。
onclicky命令でラベルを指定すると、 それ以降はHSPのウィンドウ上でマウスクリックがあるたびに*labelで指定したラベルにジャンプします。
割り込みジャンプは、stop命令および、wait、await命令で停止している時に割り込みを受け付けてジャンプを行います。 また、割り込みによりジャンプを行なった後はシステム変数iparam、wparam、lparamがセットされます。
割り込み要因 | iparam | wparam | lparam
-------------------------------------------------------
onclick | マウスボタンID | wParam | lParam
システム変数iparamには、割り込み要因ごとのパラメータが代入されます。 また、wparam,lparamはWindowsメッセージとして渡されたパラメータがそのまま格納されています。 イベント割り込み実行の一時的なON/OFFをすることも可能です。
onclick 0
で一時的に割り込みを停止します。
onclick 1
で一時停止した割り込みを再開させることができます。
参照:
- onkey
- onexit
- onerror
onerror
エラー発生時にジャンプ
グループ:
プログラム制御命令
パラメーター:
onerror goto/gosub *label
- *label : ラベル名
説明:
スクリプトが原因で HSP内部でエラーが発生した時に、自動的にジャンプする場所を指定します。
onerrorの後に続けて、gotoまたはgosubキーワードを指定してからラベルを記述します。gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。 goto/gosubキーワードを省略した場合には、gotoキーワードと同等の動作になります。
通常は、エラー発生時にシステムのエラーメッセージダイアログが表示されますが、そのかわりに指定したラベルにジャンプするように設定されます。ジャンプ後は、以下のシステム変数に情報が代入されます。
- wparam : エラー番号
- lparam : エラー発生行番号
- iparam : 0(なし)
onerror命令によりエラー後の処理を指定した場合であっても、 必要な処理が終わったら、そのままアプリケーションの実行は再開せずに、 なるべくend命令で終了させてください。 onerror命令は、エラーから回復させるものではありません。 エラー発生の原因によっては、 HSPのシステム自体が不安定になったり障害が発生することも有り得ます。 onerror命令を使う場面としては、実行ファイル作成時にエラーが発生した場合にアプリケーション側で独自のエラー表示を行ないたい場合や、特定のエラーが発生する場合にだけデバッグのための表示を行なうなどが考えられます。
終了時ジャンプの一時的なON/OFFをすることも可能です。
onerror 0
で一時的に割り込みを停止します。
onerror 1
で一時停止した割り込みを再開させることができます。
参照:
- onkey
- onclick
- onexit
exgoto
指定ラベルに条件ジャンプ
グループ:
プログラム制御命令
パラメーター:
exgoto var,p1,p2,*label
- var : 比較に使用される変数
- p1 : 比較フラグ
- p2 : 比較値
- *label : ラベル名
説明:
varで指定された変数に代入されている値と、 p2の比較値により指定したラベルに条件でジャンプします。 比較方法は、p1の比較フラグが0以上(正値)の場合は(varの値>=p2)が成立した時にジャンプ、p1が-1以下(負値)の場合は (varの値<=p2)が成立した時にジャンプを行ないます。 varで指定された変数は、整数型である必要があります。別な型で初期化されている場合は、実行時にエラーとなります。 この命令は、 forなど一部のマクロ処理を高速化するために用意された命令です。 exgoto命令を単体で使用することもできますが、スクリプトの視認性からもif命令による通常の条件分岐を行なうことを推奨致します。
参照:
- goto
- if
on
数値による分岐
グループ:
プログラム制御命令
パラメーター:
on p1 goto/gosub ラベル0,ラベル1…
- p1=0〜(0) : 分岐のための値
- ラベル0〜 : 分岐先のラベル名
説明:
on命令は、p1で指定された値が0,1,2…に応じて分岐先を選択します。 「on 数値 goto」または、「on 数値 gosub」 のような書式で、続いて分岐する先のラベルを1つ以上「,」で区切って記述することができます。 指定された数値が0の場合はラベル0が、数値が1の場合はラベル1が分岐の対象になります、 以降2,3,4…と対応したラベルを任意の数だけ記述していくことが可能です。 「on 数値 goto」の場合は goto命令と同じ単純な分岐、「on 数値 gosub」の場合はgosub命令と同じサブルーチンジャンプを行ないます。 数値がマイナス値か、対応したラベルが指定されていない場合は分岐は行なわれずに次の行に進みます。 n88系のBASICと違い最初のラベルが数値0に対応しているのでご注意下さい。(n88系BASICでは数値1が最初のラベルになります)
参照:
- goto
- gosub
例:
a=1
on a goto *a0,*a1,*a2
mes "その他":stop
*a0
mes "A=0":stop
*a1
mes "A=1":stop
*a2
mes "A=2":stop
while
while繰り返し開始
グループ:
プログラム制御マクロ
パラメーター:
while p1
- p1=条件式(1) : 繰り返しを行なう条件
説明:
whileに続く条件が満たされている間だけ、whileからwendまでを繰り返します。 条件が満たされていない場合はwhileからwendまでを実行しません。 whileに続く条件を省略した場合は、無限に繰り返しを行ないます。
a=0
while a<5
a=a+1:mes "A="+a
wend ; aが5以下の間だけwhile以下を繰り返す
また、_continue、_breakマクロによって再開、脱出が可能です。 while〜wend制御は、プリプロセッサのマクロ機能を使って実現されています。 CやJava等に近い記述をしたいような場合にお使い下さい。 初心者の方には、repeat〜loop命令か、if命令による繰り返し記述を推奨します。
参照:
- _continue
- _break
- wend
wend
while繰り返し終了
グループ:
プログラム制御マクロ
説明:
whileで指定した繰り返し区間の終わりを指定します。 詳しくはwhileマクロの項を参照してください。
参照:
while
until
do繰り返し終了
グループ:
プログラム制御マクロ
パラメーター:
until p1
- p1=条件式(1) : 繰り返しを行なう条件
説明:
untilに続く条件が満たされるまで、doからuntilまでの部分を繰り返します。 条件が満たされている場合でも、最低一回はdo〜until内を実行します。 untilに続く条件を省略した場合は、繰り返しを行ないません。
a=0
do
a=a+1:mes "A="+a
until a>5 ; aが5以上になるまでdo以下を繰り返す
また、_continue、_breakマクロによって再開、脱出が可能です。 do〜until制御は、プリプロセッサのマクロ機能を使って実現されています。 CやJava等に近い記述をしたいような場合にお使い下さい。 初心者の方には、repeat〜loop命令か、goto命令とif命令を組み合わせた繰り返し記述を推奨します。
参照:
- _continue
- _break
- do
do
do繰り返し開始
グループ:
プログラム制御マクロ
説明:
untilまでの繰り返し区間の始まりを指定します。 繰り返し条件は、untilマクロによって記述されます。 詳しくはuntilマクロの項を参照してください。
参照:
- until
for
指定回数繰り返し開始
グループ:
プログラム制御マクロ
パラメーター:
for p1,p2,p3,p4
- p1 : 変数名
- p2(0) : 初期値
- p3(0) : 終値
- p4(1) : 増分
説明:
パラメーターとして変数名、初期値、終値、増分などを指定すると、for〜nextの間を指定回数繰り返します。 カッコ内は省略した場合の値です。変数名は省略できません。 指定された変数をカウンターとして使用し、初期値から始まって、1回繰り返すごとに増分を足していきます。終値に達した時点で、繰り返しから抜けます(終値はループに含みません)。 最初から終値の条件が満たされている場合は、繰り返しを実行しません。 また、_continue、_breakマクロによって再開、脱出が可能です。
for a,0,5,1
mes "A="+a
next ; aが0から4の間(5回)繰り返す
この例では、変数aは0,1,2,3,4と5回繰り返してループを終わります。 増分にマイナス値を指定することも可能です。
for a,5,0,-1
mes "A="+a
next ; aが5から1の間(5回)繰り返す
この場合、変数aは5,4,3,2,1と5回繰り返してループを終わります。
forマクロで指定され初期値及び、終値は必ず整数を指定する必要があります。 他の型を指定した場合は、エラーとなります。 また、増分や終値の指定によっては無限ループになる可能性がありますので注意してください。
for〜next制御は、プリプロセッサのマクロ機能を使って実現されています。 CやJava等に近い記述をしたいような場合にお使い下さい。 初心者の方には、repeat〜loop命令か、if命令による繰り返し記述を推奨します。forマクロは、 内部でマクロ展開後に特殊なプログラム制御命令exgotoを生成します。
参照:
- _continue
- _break
- next
- exgoto
next
指定回数繰り返し終了
グループ:
プログラム制御マクロ
説明:
forで指定した繰り返し区間の終わりを指定します。 詳しくはforマクロの項を参照してください。
参照:
- for
switch
比較ブロック開始
グループ:
プログラム制御マクロ
パラメーター:
switch p1
- p1 : 比較元
説明:
switch〜case〜swend は、ブロック内に複数の条件判断と処理をまとめて書くことができる構文です。 p1で指定する比較元のパラメーターは、変数または式を指定することができます。switch以降は、
case 比較値
を置くことで、これ以降に「比較元」が「比較値」と同じだった場合に処理する内容を記述することができます。 caseは、ブロック内に複数記述することができ、それぞれの比較値ごとの処理を指定できます。caseの比較が正しい場合は、 swbreakが存在するまで以降の命令を実行します。また、caseの替わりに
default
を置くと、caseで指定したどの比較値にもあてはまらない条件の場合に以降が実行されます。
switchブロックが終了した場合は、
swend
を必ず最後に書いておく必要があります。 以下は、switchマクロを使用したスクリプトの例です。
a=0
switch a ; aを比較対象とする
case 0 ; aが0だった場合
mes "A=0"
swbreak ; case0の条件実行終了
case 1 ; aが1だった場合
mes "A=1"
default ; aが0以外だった場合
mes "A!=0"
swbreak
swend
この例では、変数aの内容が0か1かそれ以外かで条件分岐を行なっています。 「case 0」以降は、「swbreak」までが実行されますが、「case 1」の場合は、「swbreak」が存在しないため、「default」以降に実行される「mes "A!=0"」も含めて実行されるので注意してください。
参照:
- case
- default
- swbreak
- swend
swend
比較ブロック終了
グループ:
プログラム制御マクロ
説明:
switchで指定した比較ブロックの終わりを指定します。 詳しくはswitchマクロの項を参照してください。
参照:
- switch
- case
- default
- swbreak
default
デフォルト比較指定
グループ:
プログラム制御マクロ
説明:
switch〜swendの比較ブロック内で、 それまでのcaseにあてはまらない条件の時に実行される処理を指定します。 詳しくはswitchマクロの項を参照してください。
参照:
- switch
- case
- swbreak
- swend
case
比較値指定
グループ:
プログラム制御マクロ
パラメーター:
case p1
- p1 : 比較値
説明:
switch〜swendの比較ブロック内で、比較元との条件を指定して正しい場合に実行される処理を指定します。 詳しくはswitchマクロの項を参照してください。
参照:
- switch
- default
- swbreak
- swend
swbreak
比較実行脱出指定
グループ:
プログラム制御マクロ
説明:
switch〜swendの比較ブロック内から脱出します。 詳しくはswitchマクロの項を参照してください。
参照:
- switch
- default
- case
- swend
_continue
マクロループをやり直す
グループ:
プログラム制御マクロ
説明:
標準マクロによって定義されている繰り返しマクロ、 while〜wend、do〜until、for〜next間のループをやり直します。 現在以降の繰り返しブロック内は実行せずに、次の繰り返しから再開されます。
参照:
- _break
- while
- wend
- do
- until
- for
- next
_break
マクロループを脱出する
グループ:
プログラム制御マクロ
説明:
標準マクロによって定義されている繰り返しマクロ、 while〜wend、do〜until、for〜next間のループから抜け出します。 現在以降の繰り返しブロック内は実行せずに、ループの次にある命令から再開されます。
参照:
- _continue
- while
- wend
- do
- until
- for
- next
foreach
変数の要素数だけ繰り返す
グループ:
プログラム制御命令
パラメーター:
foreach p1
- p1=変数名 : ループの対象となる変数
説明:
配列変数に格納されている要素の数だけ繰り返しを行ないます。 foreachは、repeat命令と同様にループ開始場所に記述し、 ループの終了場所にloop命令を記述します。 repeat命令との違いは、指定された配列変数の要素数が繰り返し回数になる点と、モジュール型変数の場合には、delmod命令で削除された要素はループ内容を実行しないという点です。
例 :
dim a,10
foreach a
mes "#"+cnt+":"+a.cnt
loop
ループの中で、システム変数cntを配列要素として指定することで、 すべての要素を繰り返し実行させるような処理を簡潔に書くことができます。 また、break、continue命令もrepeat命令使用時と同じように機能します。
参照:
- repeat
- loop
- break
- continue
oncmd
Windowsメッセージ割り込み実行指定
グループ:
プログラム制御命令
パラメーター:
oncmd goto/gosub *label,p1
- *label : ラベル名
- p1 : メッセージID
説明:
指定されたウィンドウメッセージが送られた時に、自動的にジャンプする場所を指定します。
oncmdの後に続けて、gotoまたはgosubキーワードを指定してからラベルを記述します。 gotoの場合には、単純なプログラムジャンプ。 gosubの場合はサブルーチンジャンプを行ないます。 goto/gosubキーワードを省略した場合には、gotoキーワードと同等の動作になります。
oncmd命令でラベルを指定すると、それ以降はHSPのウィンドウに対してp1のメッセージが送られた時に*labelで指定したラベルにジャンプします。 oncmd命令は、現在の操作先ウィンドウのみが対象になります。 複数のウィンドウを作成している場合は、 ウィンドウごとにoncmd命令による登録が可能です。
既に登録されているウィンドウメッセージが指定された場合は、以前の登録が無効になります。 また、割り込みの登録は、ウィンドウの初期化とは同期していません。 一度登録された割り込みは、アプリケーションが終了するまで有効になります。
割り込みジャンプは、stop命令および、wait、 await命令で停止している時に割り込みを受け付けてジャンプを行います。 また、割り込みによりジャンプを行なった後はシステム変数iparam、wparam、lparamがセットされます。 割り込みが発生したウィンドウIDは、 ginfo関数により取得することができます。
割り込み要因 | iparam | wparam | lparam
---------------------------------------------------------------------
oncmd | メッセージID | wParam | lParam
システム変数iparamには、送信されたメッセージIDが代入されます。 また、wparam,lparamはWindowsメッセージとして渡されたパラメータがそのまま格納されています。 割り込みの設定で、 gosubキーワードによるサブルーチンジャンプが発生した場合は、return命令により戻り値を設定することが可能です。 「return 数値」で、ウィンドウプロシージャーが返す値を指定します。 return命令にパラメーターを指定しなかった場合には、デフォルトのウインドゥプロシージャーに処理が渡されます。
イベント割り込み実行の一時的なON/OFFをすることも可能です。
oncmd 0
で一時的に割り込みを停止します。
oncmd 1
で一時停止した割り込みを再開させることができます。
参照:
- onkey
- onclick
- onexit
- onerror
else
条件を満たしていなければその行の命令を実行
グループ:
プログラム制御命令
説明:
if命令と組み合わせて使用します。 詳しくはif命令の解説を参照してください。
例:
if a == 0 {
mes "aは0です。"
} else {
mes "aは0ではありません。"
}
参照:
- if