前回からの変更点
この章ではver2.55から変更された命令等について私の知っている分を解説していきます。
ヘルプにも載っている特に大きかった変更点は次の通り。
・ 高速コピーをするためのgcopy命令で横幅が4の倍数以外で斜めに崩れることがなくなりました。
・ await命令を使うとCPUを占有して使用率が100%になるのを修正したようです。
・ DLLを使用しなければWinAPIが利用できませんでしたが、Loadlib(llmod)の命令や、
hspext.dllだったsysinfo命令が標準で使用できるようになりました。
・ 既に紹介したプリプロセッサが強化されたり、EXEの自動生成ができるようになりました。
・ PACKFILEとなるDPMファイルを複数指定できるようになりました。
・ バッファオーバーフローを抑えるためにスクリプト段階でエラーメッセージが出る様になったり
文字列を変数に代入するdirlistやnoteadd命令が自動的にメモリ拡張するようになりました。
上記ハイライトを中心にもう少し噛み砕いて行ってみましょう。
gcopy命令のような制限の撤廃はinstr命令の全角下位バイトに反応するのにも修正されました。
buf = "ドキュメント"
instr ichi, buf, "h"
mes ichi
stop
MAG・グレースケールJPGの読込も改善されたようですが、どう変わったのかわかりませんでした…。
4の倍数でないウィンドウにpicload命令のp2を1にすると斜めに崩れたままなのは痛い気がしますが…。
コメントを示す「;」の他に、多言語にある「//」や「/* 〜 */ まで」が使えるようになりました。
「//」は「;」と変わりませんが「/* 〜 */ 」で複数行を一気にコメントにできるようになりました。
コレを期に、これからは一行コメントの時に「;」では見にくい為、「//」を使用していきます。
num = 1
/* ; 一気にコメント
repeat 25, 1
invol = cnt
str invol, 2
mes "" + invol + " " + num
num = num * 2
loop
*/
stop
await命令は2.55の時にCPU処理を占有して(100%奪う)してしまっていました。
コレは必ずしも悪いと言うことではありませんがwaitよりも短いウェイト(10ミリ秒以下)が必要な時に
必ずCPU使用率が100%になるのはどうかと思っていました。
Tipsに回避策を載せたほどですからね。
HSP2.6からはパラメータが増え「await 待ち時間,スリープ間隔」となりました。
単位は今までと同じく1ミリ秒で、別に指定時間(単位1ミリ秒)反応をなくすスリープ機能が付きました。
このスリープ間隔がデフォルト(省略)で5と設定されているようですのでCPUを占有しなくなりました。
この数値が大きいほどCPUの負担がなくなりますが、大きすぎると逆に「応答なし」となります。
5〜10ミリ秒でCPUに負担をかけず時間調整できるのでコレくらいで良いのではないでしょうか?
マイナス値の指定もできます。マイナス値の指定をすると前回使用したスリープ間隔を使用します。
repeat
await 1, 1000 // これ以上はかなり危ない...かも
loop
0を指定すると今までと同じくCPUを占有(100%使用)するようになります。
dirlist,noteadd命令を使用するとバッファのサイズを自動で確保するようになりました。
今まではdirlistで取得するファイルの件数は何件になるかわからないけど、
バッファオーバーフローを防ぐ為にかなり大きめに確保しておく必要がありました。
今回の修正により、100件だろうが、3000件だろうが、
テキスト量に関係なく自動的にサイズ変更してくれるので気にする必要がなくなったわけです。
noteadd命令も同じです。
どんどん追加していっても変数サイズは自動的に増えるので大きめに確保しておく必要はありません。
当然ですが既に入っているテキストデータはそのまま残っていますよ。
コレがなくなるようでは意味ありませんからね。
またメモリノートパッドにnoteload命令が登場しました。
変更された命令ではありませんがついでに紹介しておきます。
この命令も上記2つの命令と同じく自動でバッファサイズを拡大してくれる命令です。
何をする命令かと言うと指定ファイルを変数に読み込めるbload命令と言うのがありましたよね?
ソレの変数自動拡大版です。じゃあbload命令なくしてもいいのでは、となりますが、
オフセット指定が付いていない(仕様等の為できない?)ので一部だけ読み込むということができません。
また、noteload命令はテキストデータの読み込みを行うもので、
「テキストの終端であるNULL記号までしか読み込まない仕様」であるため、
随所にNULL文字が入っている音楽や画像ファイルを最初から最後まで取り込むことはできません。
書式「noteload 読み込むファイル名,読み込むサイズ上限」でバッファに読み込みます。
サイズ上限が0の場合はどんなサイズのテキストファイルでも読み込むようになります。
1以上指定しファイルサイズがそれ以上であってもエラーにはならず指定サイズまで読み込みます。
この命令を使用するにはまずnotesel命令でメモリノートパッド用に設定しなければなりません。
notesel buf
noteload windir + "\\win.ini" // 省略は0を書いたのと同じ
mesbox buf, 640, 480, 4
stop
上記のようにバッファが自動拡大されるようになった他、オーバーフローチェックも強化されました。
バッファがホントに拡大されたかはTデバッグウィンドウで見てみてください。
コレにより今までちょっとオーバーして何事もなく過ぎていた箇所もエラーで止まる様になりましたので、
2.55で作成したソフトのバージョンアップ等を2.6用でする場合は注意するようにしてください。
ついでのついでなのですが、notesave命令もココで解説してしまいます。
コレもnoteload,bload命令の関係と同じでbsave命令とほぼ同じものです。
コレもメモリノートパッド用のバッファ(notesel命令で指定されている変数)を保存するものです。
保存するサイズは自動的に変数に合わせられます。
sdim buf,40
title "自動サイズ変更型メモ帳"
buf = "読み込んだサイズ以上に大きくできません"
objsize winx / 2,25
mesbox buf, 640, 455,1
button "読み込み", *load
pos winx / 2, 455 : button "保存", *save
notesel buf
stop
*load
dialog "txt",16
if stat : noteload refstr : objprm 0, buf
stop
*save
dialog "txt", 17
if stat : notesave refstr
stop
標準ランタイムにloadlib.dllの機能が組み込まれてDLLを使用せずに使用できるようになりました。
コレによりHSP用以外のDLLも利用できるようになり、WinAPIも使用可能となりました。
また、hspext.dllの命令だったsysinfo命令も標準化されました。
sysinfo命令の使い方は以前のままですのでコチラを見てご利用ください。
当然、サンプル用の「#include "hspext.as"」は書かなくて結構です。
前章既に書いたようにプリプロセッサ、特に#define命令のマクロ機能が大幅に強化されました。
コレにより書こうと思えば複雑な処理を除いてマクロだけでほとんどの処理ができてしまいます。
プリプロセッサに#define命令とモジュール以外にコンパイル制御,EXE自動作成命令等が追加されました。
objmode命令を使って、配置オブジェクトのフォーカスをTABキーで移動できるようになりました。
今まではフォーカス移動もスクリプト内に自分で書かなければなりませんでしたし、
移動の際ビープ音が鳴ってしまう問題がありましたが2.6から解決しました。
sdim string, 16, 10
objmode , 1
repeat 10
string.cnt = "" + cnt + "つ目のボックス"
pos 100, cnt * 30 + 50 : input string.cnt, 200, 25
loop
stop
エラーもイベントのひとつとしてHSPが受け取り、
エラーが発生した時自動で指定ラベルにジャンプさせるonerror命令と言うものができました。
コレによりエラーメッセージを独自のものにすることができるようになったわけです。
書式としては「onerror ラベル名」です。何が原因でジャンプされたかの情報は、
wparamにエラー番号、lparamにエラーとなった行にそれぞれ入ります。iparamは使用されていません。
onerror命令でジャンプした後にまた実行を再開すると言うことはやめましょう。
エラーが原因でHSPが不安定になったり、障害が発生することがないとは言い切られません。
表示をさせたら終了するようにしましょう。
エラー時のジャンプするラベルを設定しておいても飛ばさないようにすることができます。
HSP2.61時点のヘルプにも記載されていますが間違えてonexit命令が使用されています。
「onerror 0」でジャンプをしないでそのままHSPのエラーメッセージを表示させるようにします。
onclick,onexit,onkey命令と同じく「onerror 1」で再開させることができます。
onerror *error
num = 100 / 0
mes num
stop
*error
sdim msg, 40, 21
msg.0 = "サンプルではコレは使用されません"
msg.1 = "予期しない事態が発生しました"
msg.2 = "文法が間違っています"
msg.3 = "パラメータの数値が異常です"
msg.4 = "計算式でエラーが発生しました"
msg.5 = "省略できないパラメータで省略しました"
msg.6 = "パラメータの型が一致しません"
msg.7 = "配列要素数が多すぎます"
msg.8 = "ラベルが異常です"
msg.9 = "ネストが深すぎます"
msg.10 = "サブルーチン外でreturnは実行できません"
msg.11 = "repeat外でloopは実行出ません"
msg.12 = "指定ファイルが見つかりません"
msg.13 = "画像ファイルが見つかりません"
msg.14 = "外部ファイル呼び出しエラーです"
msg.15 = "計算式中のカッコが異常です"
msg.16 = "パラメータ数が多すぎます"
msg.17 = "文字列が扱える上限を超えました"
msg.18 = "代入不可能な変数を指定しています"
msg.19 = "0で割ることはできません"
msg.20 = "変数のサイズを超えました"
dialog msg.wparam,,"" + lparam + "行目"
次の解説へ…。
run命令の変更点についての解説をします。
今まではrun命令のパラメータはファイル名を指定するものしかありませんでしたが、
コマンドラインに1024文字までの文字列がつけられるようになりました。
run命令は既にご存知の通り、HSPのオブジェクトファイル(*.ax)を実行する命令です。
ですのでどういった時にコマンドラインをつけると効果あるかと言うと、
HSPでスクリーンセーバを作った時とか、起動時にcmdlineを読み込んで何かの処理をするとかくらいですね。
あまり使う機会はないと思いますのでコレくらいの説明だけで置いておきます。
最後の解説。
gmode命令に色増減モード(モード5,モード6)が追加されました。
モード3,4の半透明合成コピーと同じくフルカラーウィンドウ限定ですが、
gmode命令のパラメータ4に指定した率でコピー元のRGBをコピー先に増減をするというものです。
モード5で色加算、モード6で色減算をします。輝度値が限界を超えても限界値で止まります。
複数色が混ざった画像同士を合成させると半透明合成と違いがわかりにくいです。
buffer 2
color , 255
boxf
gsel 0
color 255
boxf , , 319, 479
color , , 255
boxf 320, , 639, 479
title "合成前"
wait 100
title "合成後"
gmode 5, , , 255
pos 50, 50 : gcopy 2, , , 540, 380
stop
合成前は左半分が赤色(255,0,0)で右半分が青色(0,0,255)でした。
その赤青のウィンドウにバッファの緑色(0,255,0)を255(100%)合成すると、
先ほどの色が黄色(255,255,0)と水色(0,255,255)になる…というわけです。
明らかに半透明合成とは結果が違いますよね?
以上で2.55から2.6になって使い方の変わった命令(新命令も少し)の説明を終わります。
次章から新命令の解説ができそうです。
それでは。