外部ファイルの操作といえばコレ!
前章でpicload命令により、画像ファイルの読み込みを行いました。
読み込む画像は、スクリプト内に埋め込んでいる為、常に一定です。
ゲームで使用するキャラクタや背景画像等は固定で構いませんが、
例えば、イメージビューアや壁紙変更ツール等で、一定の画像しか読み込めないのでは使い物になりません。
利用者が利用したい画像を自由に「選択」できなければならないのです。
ペイントやテキストエディタで既存のファイルを選択する時、
いずれのツールも同じ、またはほぼ同じ「ファイルを利用者に選択させる子画面」が表示されます。
フォルダの選定や拡張子の限定等、利用者と対話形式でファイルを決定することから、
この子画面はダイアログ、またはダイアログボックスと一般に呼ばれています。
このダイアログは、ソフトが異なっても同じ操作を行う時、同じようなダイアログが出るのは、
Windowsが提供している同一機能を各ソフトが呼び出しているからなのです。
何故呼び出すのかは、言うまでもないと思いますが、
ソフトの開発者が読込処理を一から組んでいくのは面倒であるからですね。
HSPでゲームやツールを開発する際にもこのダイアログを利用できます。
スクリプトで以下の命令を使うことで利用できるのですが、
ダイアログには読み込み以外に様々な種類のダイアログが存在します。
それらを1つ1つ紹介するので根気良くご覧ください…。
dialog メッセージ, タイプ, オプション
メッセージダイアログに表示するテキストを指定する。
タイプダイアログの種類を数値コードで指定する。
オプションダイアログのオプション(指定タイプにより異なる)
p1のメッセージというのは、上記p3の説明同様に指定タイプにより若干意味合いが異なります。
タイプ番号の小さいものから順に説明をしていきます。
タイプが0、又は省略されている時、
(i)マークの付いた[OK]ボタンのみがある情報表示ダイアログとなります。
ダイアログの本文がメッセージ、タイトルバーの内容がオプションパラメータとなります。


 1
 2
	dialog "タイプ0、または省略で、\n[OK]のみの標準ダイアログ。", 0, "オプションはココのテキストです。"
	end
試していただければ確認できますが、 ダイアログが表示されている間、HSPの処理は中断されています。 ダイアログの処理が終わるまではHSPの処理も進まないわけですね。 タイトルバーにメッセージを入れたくない場合は、パラメータそのものを省略することが出来ます。 通常、文字列パラメータの場合は、値の省略("")はできても、パラメータ省略は出来ないのですけどね…。
タイプに1を指定すると、!マークに[OK]ボタンのみがある警告表示ダイアログとなります。
ダイアログの本文がメッセージ、タイトルバーの内容がオプションパラメータとなります。
タイプ0との違いはダイアログ左部のアイコンが変わる点だけです。

 1
 2
	dialog "タイプ1で、\n[OK]のみの警告ダイアログです。", 0, "オプションはココのテキストです。"
	end
タイプ2は、タイプ0と同じ(i)マークアイコンに、選択ボタンがついたダイアログとなります。
ダイアログの本文がメッセージ、タイトルバーの内容がオプションパラメータとなるのは一緒ですが、
今回の場合は、Yes/Noのどちらが選ばれたのかを判定できなければ意味がないものです。
選択ボタンの判定はシステム変数statに次の通り入れられます。
[はい(Y)]を選んだ時には、stat6に、[いいえ(N)]を選んだ時はstat7になります。
尚、タイプ0と1の[OK]を押した場合でもstat1がセットされますが、
単一ボタンであるために制御の対象にはなりません。


 1
 2
 3
	dialog "どちらかを選択してください。", 2
	if stat = 6 : mes "「はい」を選択しました。"
	if stat = 7 : mes "「いいえ」を選択しました。" // 2行目のelseに入れても良い
タイプ3は、タイプ1と同じ!マークアイコンに、選択ボタンがついたダイアログです。
ダイアログの本文がメッセージ、タイトルバーの内容がオプションパラメータとなるのは一緒で、
タイプ2同様、ボタンがYes/Noの選択式です。
[はい(Y)]を選んだ時には、stat6に、[いいえ(N)]を選んだ時はstat7になります。


 1
 2
 3
	dialog "どちらかを選択しなければなりません。", 3, "重要!"
	if stat = 6 : mes "「はい」を選択してしまいました。"
	if stat = 7 : mes "「いいえ」を選択してしまいました。" // 2行目のelseに入れても良い
それぞれの用途として、利用者に対して情報(Information)提供用に使う場合は(i)マークのものを、 注意を促す場合、重要な事柄である場合は!マークのものを使うようにしましょう。
ココまではメッセージの表示とボタンによる制御でしたが、
以下の2つは、今回の本題であるファイル選択ダイアログです。

タイプ16を指定すると、主に「利用の対象とする既存ファイルを選択させる」場合のダイアログとなります。
これからファイルを開いてよ、と言う時に使用するわけですね。
メッセージパラメータには下図の「ファイル名(N)」欄にデフォルトでセットする拡張子を指定します。
拡張子をご存知でない方は、ネットで「拡張子とは」等をキーワードに探してみてください。
拡張子は複数設定可能で、複数指定する場合は、拡張子間に「;」を挟みます。
1つ目には拡張子名だけを指定しますが、
2つ目以降には「『*.』+『拡張子』」を指定しなければなりません。
具体的には下記のサンプルスクリプトをご覧ください。
何も指定しなかった場合は、デフォルトで「*」をセットしたものと同じ状態になります。
オプションパラメータには下図の「ファイルの種類(T)」欄にセットする補助説明を指定します。
例えば、拡張子「bmp」指定時に、「ビットマップファイル」や「読み込む画像」等とメモ的に使うわけです。

このダイアログではファイルを選択するものであり、どのような拡張子のものでも選択できます。
ただし、良く勘違いされる方がいらっしゃるのでFAQにも書いていますが、
幾らファイルを選択してもそのファイルを実際に読み込むわけではありません。
このダイアログの目的は「どのファイルが選ばれたか」です。

どのファイルが選ばれたのかは、システム変数refstrにセットされるようなっています。
refstrは、statの文字列ステータス版で、主に命令や関数実行後の結果として文字列がセットされます。
また同時にstatに正常終了したことを示す1がセットされます。
ファイルが選択されずにキャンセルなどで閉じられた場合やエラーの場合は、stat0がセットされます。

 1
 2
 3
 4
 5
 6
	dialog "bmp;*.jpg;*.jpe;*.jfif;*.gif;*.ico", 16, "読み込める画像形式"
	if stat = 0 {
		dialog "ファイルが選ばれませんでした。"
		end
	}
	picload refstr // 画像ファイルであるかのチェックはしてません
HSP3.2以降では、メッセージパラメータとオプションパラメータに「|」を挟むことで、 選択肢を切り分けることが可能となります。 上記のサンプルだと、次のようなスクリプトにすることで、 スクリプト下にあるイメージのようなダイアログを表示させることが出来ます。
 1
 2
 3
 4
 5
 6
	dialog "bmp|jpg;*.jpg;*.jpe;*.jfif|gif|ico", 16, "ビットマップファイル|JPEG|GIF|ICO"
	if stat = 0 {
		dialog "ファイルが選ばれませんでした。"
		end
	}
	picload refstr // 画像ファイルであるかのチェックはしてません
尚、ファイルが正常に選択されるとカレントフォルダが選択ファイルのフォルダに変更されます。 知らなければ(特に相対パス指定している場合の)バグの要因となってしまいます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
	current = dir_cur
	dialog "bmp|jpg;*.jpg;*.jpe;*.jfif|gif|ico", 16, "ビットマップファイル|JPEG|GIF|ICO"
	if stat = 0 {
		dialog "ファイルが選ばれませんでした。"
		end
	}
	mes "読込前のカレントディレクトリ:" + current
	mes "読込後のカレントディレクトリ:" + dir_cur
	picload refstr, 1 // 画像ファイルであるかのチェックはしてません
タイプ17を指定すると、ファイルを保存する時のダイアログとなります。
上書保存ではなく、新規に名前をつけて保存する場合に使用されるものですね。
メッセージパラメータには下図の「ファイル名(N)」欄にデフォルトでセットする拡張子で、
タイプ16同様に指定の仕方は「;」で区切り、1つ目は拡張子だけを記述、
2つ目以降に「『*.』+『拡張子』」形式で指定できます。
オプションパラメータには下図の「ファイルの種類(T)」欄にセットする補助説明を指定します。
また、タイプ16と同様に、メッセージパラメータ・オプションパラメータに「|」区切りを入れると
選択肢自体を切り分けることが可能となりますが、
保存する場合に使われるダイアログですので、ほとんど使わないのではないでしょうか?

タイプ16同様に指定ファイル名を取得する為だけのものであり、
実際に保存するわけではありませんので勘違いしないようにしてください。
既存のファイルと同じ名前である場合は「同名が既に存在する」と
警告も発してくれるので「保存もしてくれるんだ」と誤解しやすいですが、
ダイアログの正常終了時にファイル名をシステム変数refstrに入れ、
statに正常終了したことを示す1が入るだけです。キャンセルした場合は0が入ります。
実際の保存するやり方については、後の章に行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
	pos 100, 30 : mes "今までにいろいろな処理が行われてきた(と仮定します)"
	wait 100
	dialog "今回行った内容を保持しておきますか?", 2
	if stat = 7 : goto *proc_end
	dialog "xxx", 17, "当ソフトで扱うファイル形式"
	if stat = 0 : goto *proc_end
	// 実際の保存処理を以下に行う
	pos 100, 60 : mes "保存中"
	repeat 3
		wait 50
		pos cnt * 10 + 150, 60 : mes "."
	loop

*proc_end
	wait 100
	pos 100, 90 : mes "…で、処理を再開します。"
ペイントを使ったことはあるでしょうか?
ペイントのカラーパレットをダブルクリックすると、パレットカラーを変更できる子画面が現れます。
あの子画面(ダイアログ)をHSPでも呼び出すことが出来ます。

タイプ32で指定可能であり、主に画像編集系ツールを作成する場合に利用できますね。
色が指定された(ダイアログの[OK]が押された)ら、stat1が代入されて、
pget命令同様にginfo_r, ginfo_g, ginfo_bマクロに各輝度がセットされます。


 1
 2
 3
 4
 5
 6
 7
	// 元の色
	color 255
	boxf 100, 50, 200, 100
	dialog "", 32
	// 変更後の色
	color ginfo_r, ginfo_g, ginfo_b
	boxf 100, 150, 200, 200
タイプ33を指定すると、色変更ダイアログ内にある[色の作成(D) >>]ボタンを押した状態で開かれます。
これもタイプ32同様に、[OK]が押されたら、stat1が代入されて、
pget命令同様にginfo_r, ginfo_g, ginfo_bマクロに各輝度がセットされます。
キャンセルされた場合はstat0がセットされ、各輝度がセットされるマクロの変更はありません。


 1
 2
 3
 4
 5
 6
 7
	// 元の色
	color 255, 255
	boxf 100, 100, 300, 200
	dialog "", 33
	// 変更後の色
	color ginfo_r, ginfo_g, ginfo_b
	boxf 100, 250, 300, 350
ダイアログは他にもフォルダ選択やフォント選択等といろいろありますが、
標準のdialog命令で使えるダイアログは上記に書いたものだけです。
タイプ64以降は標準以外のランタイムを使った場合に新しいタイプを組みこめるよう確保はされていますが
設定されていないランタイムで使用した場合は、何も起こりません。
補足ですが、HSP2以前はdialog命令の第一パラメータに文字列の指定しかできませんでしたが、
HSP3からは文字列以外の整数値や実数値でも指定可能となったようです。