便利なオブジェクト3
命令1つで簡単に配置できる3タイプ目のコントロールは、エディット系オブジェクトです。
エディット系とはコチラにあるような、利用者に入力・編集してもらうオブジェクトです。
1つ目は、1行分だけ入力できるタイプから。
input 保持変数, 横幅, 高さ, 最大文字数
保持変数ボックス内容を保持する変数。
横幅入力ボックスの横幅。
高さ入力ボックスの高さ。
最大文字数入力ボックスに入力可能な最大文字数。
第2、3パラメータの大きさを省略すると、objsize命令で指定された大きさとなります。
第4パラメータの最大文字数は少しだけ気をつける必要があります。
HSPにはテキスト操作命令が幾つもありますが、位置やサイズは基本的にバイト単位です。
バイト単位ということは、半角1文字で1バイト、全角1文字で2バイト。
つまり、「abあcdいeう」という文字データならば、全体サイズは「11(バイト)」になりますが、
OSによってinput命令の最大文字数は、バイト単位ではなく文字数単位になりますので、
「abあcdいeう」という文字データの文字数は「8(文字)」となります。
気をつけるというのがどういう意味かと申しますと、
入力されたテキストデータをHSPのテキスト系命令で処理する際にバイト単位となるので、
処理の過不足(予期せぬ問題)が生じやすくなるということです。
入力できる文字数でもう1点気をつけなければならないことがあります。
値を省略すると文字列型の場合、変数のサイズ(64文字未満の場合は64文字)まで、
その他の型の場合だと32文字間で入力できるようになります。
省略ではなく0を指定すると、そのOSで扱える最大文字数が入力可能になります。
最大文字数ですが、Windows95や98等の9X系OSだと65,535バイトまでしか扱えません。
使用しているメモ帳と同じコントロールの限界がその様になっているからで、
65,536バイト以上のサイズを確保していても、65,535バイトまでしか扱えないのです。
厳密には65,000バイトほどで入力できなくなるそうですが。
もし数メガバイト、数百メガバイト等の膨大なテキストデータを9X系OSで扱いたい場合は、
リッチテキストと呼ばれるワードパッドと同じコントロールを使用する必要がありますが、
HSPではこのコントロールを標準オブジェクトとして用意していません。
自分でAPIを駆使するか、対応した拡張プラグインを利用させてもらいましょう。
予め第1パラメータに指定する変数に何らかのテキストデータがあればその内容が表示されます。
整数型の場合、何も入力していなくても0が入力ボックスにセットされ、空で表示されることはありません。
実数型も同様に0.000000がセットされることとなります。
全く何も入力されていない状態にしたい場合は、変数を文字列型で初期化するようにしましょう。
 1
 2
 3
 4
 5
 6
 7
 8
	buf = "名前を入力してください。"
	pos 200, 100 : input buf, 250, 30, 40 // 入力ボックスを配置する
	pos 200, 150 : button "確認", *check
	stop

*check
	dialog "アナタの名前は、\n\n" + buf + "\n\nですね?"
	stop
入力ボックス上で右クリックすると、
普段から使っているテキストコントロールと同じ様なポップアップメニューが表示され、
何もプログラムしていなくても「コピー」「貼付」「削除」「元に戻す」等の機能が使えます。
非常に便利ですね。
続いてのエディットオブジェクトはinput命令とほとんど同じものです。
mesbox 保持変数, 横幅, 高さ, スタイル, 最大文字数
保持変数ボックス内容を保持する変数。
横幅入力ボックスの横幅。
高さ入力ボックスの高さ。
スタイルエディットボックスのスタイル(後述)を指定。
最大文字数入力ボックスに入力可能な最大文字数。
パラメータにスタイルが追加され、「改行が出来る」ようにはなりますが、
コントロール自体はinput命令によるエディットボックスと完全に同じものです。
よってパラメータ紹介も簡潔に行います。
mesbox命令側はスクロールバー付のスタイルも可能ですが、
第2,3パラメータの横幅と高さはバーも含めたオブジェクト全体のサイズです。
水平バーを付けた状態でオブジェクトが文字分と同じ高さしかない場合は
テキストをほとんど見られなくなってしまいます。
第4パラメータのスタイルは次の通りです。

スタイル
0編集不可(縦スクロールバー付)
1編集可能(縦スクロールバー付)
4編集不可(縦・横スクロールバー付)
5編集可能(縦・横スクロールバー付)

HSP2では、2を指定することで縦横両方のスクロールバーがなく、
編集の出来ないスタティックテキストボックスの作成が出来たのですが、HSP3ではなくなったようです。
最大文字数をしている第5パラメータですが、input命令と異なり、
マイナス値を指定するとOSで扱える限界サイズではなく、値を省略した時と同様に
変数サイズと同じだけの文字数(変数が64バイト以下なら64文字)までとなります。
ウィンドウ全体の大きさのエディットボックスを配置するだけで、
ファイル読み書きすらできない簡易エディタの完成ですね。
 1
 2
 3
	title "簡易エディター"
	buf = ""
	mesbox buf, 640, 480, 5 // 縦横スクロールバー付の入力ボックスを配置する
標準命令1つだけで配置できるオブジェクト(COMを除く)は以上で終了です。
不要になったオブジェクトは、次の命令を用いて除去しましょう。
clrobj 消去開始ID, 消去終了ID
消去開始ID除去するオブジェクトIDの開始番号を指定する。
消去終了ID除去するオブジェクトIDの終了番号を指定する。
第1パラメータで指定したオブジェクトの番号から、第2パラメータで指定した番号まで一括削除します。
もし、第1パラメータを省略すると、オブジェクト番号0番から指定こととなります。
第2パラメータを省略、または−1で、最後(一番大きい番号)のオブジェクトまでが対象となります。
両方指定しない場合は、ウィンドウに配置した全てのオブジェクトが対象となります。
尚、削除されるのはgsel命令で指定するカレントウィンドウだけとなります。
ウィンドウを複数作成した場合は、ウィンドウ毎にオブジェクト番号が0から割り振られますので、
消去する必要がある場合は、gsel命令で対象ウィンドウに切り替えて、消去コマンドを実行してください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
	title "命中ゲーム!"
	randomize

*init
	r = rnd(100)
	challenge = 0
	clrobj
	objsize 64, 48
	repeat 100
		pos cnt \ 10 * 64, cnt / 10 * 48 : button "" + (cnt + 1), *clear
	loop
	color 255, 255, 255 : boxf
	color 255 : boxf r \ 10 * 64, r / 10 * 48, r \ 10 * 64 + 63, r / 10 * 48 + 47
	stop

*clear
	clrobj stat, stat // 押されたボタンのみ除去する
	challenge++
	if r = stat : dialog "Hit!\n" + (100.0 / challenge) + "%" : gosub *init
	stop
オブジェクトを複数配置した際にTABキーを押すと、次のオブジェクトにフォーカスが移動します。
HSP2では、設定することで初めて移動可能となりましたが、HSP3では初めからこの設定が有効です。
もし、逆のTABキーで移動しないようにしたい場合は、次に紹介する命令を使用しましょう。
objmode モード, TABキー移動制御
モードオブジェクトのフォントを指定モード(後述)に変更。
TABキー移動制御TABキーでオブジェクトを移動可能にするか否かを設定。
この命令はTABキーでの移動制御のほかに、オブジェクトに使用されるフォントを変更することが出来ます。
第1パラメータのモードには、使用フォントを次のいずれかの値で指定してください。

モード
0HSP標準(デフォルト)フォント
1GUIフォント(ダイアログ等と同じもの)
2font命令(後述)で指定したフォント

起動時のスタイルは0で指定するのと同じ、HSPデフォルトフォントになっています。
GUIフォントはメニューバーのフォントやダイアログボックスのフォントと同じシステムフォントです。
2にすることでfont命令(後述)で指定したフォントと同じものになります。
尚、font命令とobjmode命令はどちらが先に書かれていても関係ありません。
オブジェクトの配置前に記述されている現在のフォントスタイルが適用されるようになると言うことです。
第2パラメータには、先に説明したTABキーでの移動制御を設定します。
0で許可しない、1で許可する設定となります。
もし、mesbox命令によるエディットコントロールにフォーカスがある場合、
オブジェクト内にTABスペースが入るだけで、オブジェクトのフォーカス移動は行いません。
値を省略すると、現在の設定を引き継ぎます(上位互換性の為)。
 1
 2
 3
 4
 5
 6
	objmode 1, 1 // 以下に配置するオブジェクトのフォントは「GUIフォント」でTAB移動を許可する
	sdim s, 12, 10
	repeat 10
		pos  50, cnt * 40 + 20 : mes "" + (cnt + 1) + "つ目"
		pos 130, cnt * 40 + 20 : input s.cnt, 150, 16
	loop
objmode命令により、TABキーを利用して自分で選択オブジェクトを変更できるようになりましたが、
プログラム側で特定のオブジェクトにフォーカスを移動する命令もあります。
objsel オブジェクトID
オブジェクトID選択するオブジェクトのオブジェクトIDを指定する。
パラメータに選択したいオブジェクトIDを指定することで、
エディットボックスならキャレットを点滅させ、キーボードによる入力モードとなり、
それ以外のボタン系・リスト系オブジェクトはフォーカスが合っている事を示す点線が表示されます。
パラメータに−1を指定すると、現在フォーカスを持っているオブジェクトのIDを知ることも出来ます。
もし、いずれかのオブジェクトにフォーカスがあるなら、
システム変数statにそのオブジェクトIDが、いずれにもフォーカスがないなら−1が入ります。
尚、ボタンにフォーカスが合っていても、エンターキーでボタンを押下することはできないようです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	selid = 2, -1
	buf.0 = "グー・チョキ・パー"
	buf.1 = "色は匂えど散りぬるを我が世誰ぞ常ならむ有為の奥山今日越えて浅き夢見し酔ひもせず"
	objsize 60, 25
	pos  10,  10 : combox selid, 100, "ID:1\nID:2\nID:3\nID:4\nID:5\nID:6"
	objsize 150, 25
	pos  40,  50 : mes "ID:1" : button "終 了", *exit
	pos 250,  50 : mes "ID:2" : listbox index.0, 50, "富士山\n信濃川\n鳴門海峡\n琵琶湖\n守礼門"
	pos 460,  50 : mes "ID:3" : input buf
	pos  40, 200 : mes "ID:4" : combox index.1, 50, "ひよこ\nおたまじゃくし\nボウフラ"
	pos 250, 200 : mes "ID:5" : mesbox buf.1, , 50
	pos 460, 200 : mes "ID:6" : chkbox "すべて同意します。", index.2

*check
	if selid ! selid.1 {
		selid.1 = selid
		objsel selid + 1 // 指定オブジェクトを選択する
	}
	wait 10
	goto *check

*exit
	end
この章の最後に、「HSP標準フォント」「GUIフォント」以外の、
「MS 明朝」「Symbol」等のインストール済みフォントに変更する場合に必要な命令の紹介を行います。
objmode命令は2を指定し、次の命令で指示してください。
font フォント名, サイズ, スタイル
フォント名変更後のフォント名を指定。
サイズピクセル単位に比例した論理サイズを指定。
スタイルフォントのオプション(後述)を指定。
第1パラメータのフォント名は、半角全角も間違えてはなりません。
例えば「MS 明朝」を例にしますと、全角の「MS」が半角の「MS」であっては正しく認識されませんし、
「明朝」の手前にある「半角スペース」がなかったり、「全角スペース」であってもダメです。
また、自分の環境ではインストール済のフォントが
配布した利用者の環境にインストールされていない場合、HSPのデフォルトフォントが使用されます。
特有のフォントを使い、それが売りの1つであるゲーム等を作る場合には注意が必要です。
「HSP拡張マクロを使用する」にチェックを入れている場合、hspdef.asが自動的に読み込まれますが、
このhspdef.as内に「MS 明朝」が「msmincho」、「MS ゴシック」が「msgothic」と定義されており、
これらの名前でも正しくフォントを使用することが可能です。
第3パラメータのスタイルは次の通りで複数組み合わせることができます。(例.太字+下線=5)

スタイル
+1太文字
+2イタリック(斜体)
+4下線付き
+8打消線
+16アンチエイリアス(ギザギザ取り)

WindowsXPでは常にアンチエイリアスが有効になっているようですが、
アンチエイリアス(+16)を利用するには、フルカラーで初期化されている必要があるそうです。
尚、objmode命令で、第1パラメータに2を指定すればオブジェクトを指定フォントに変えられますが、
font命令は通常、mes命令やprint命令でウィンドウにテキストを置く場合のフォント変更に使用します。
 1
 2
 3
 4
 5
 6
 7
	font msmincho, 40, 4 // MS 明朝
	pos 50, 20 : mes "フォント変更テスト中1"
	font msgothic, 32, 3 // MS ゴシック
	pos 50, 80 : mes "フォント変更テスト中2"
	color 255
	font "symbol", 100
	pos 50, 200 : mes "ァィゥェ" // ←半角「ァィゥェ」です。文字化け時はご容赦願います。
コントロールを使用したプログラムは、
できる内容が一気に広がりますが、その分予期せぬ問題が発生しやすくなります。
特に、エディットコントロールは、未入力でも問題ないのか、数値・数値以外が入って正しいのか等
利用者にされうる様々な入力内容で問題がないかをチェックしておく必要があるでしょう。
EXE化して配布する前に、あらゆるパターンテストを行い、問題がないことを確認してください。