〜 ファイル 〜
セーブダイアログで拡張子を強制付加

保存ダイアログで、拡張子を指定せずに保存ボタンを押すと、
エクスプローラでは不明ファイル(関連付けられたアプリケーションがない状態)として保存されます。
保存するものがHSP内で使用するデータファイルとして、直接操作されないものであれば構いませんが、
画像や音楽、他のエディタでも使用できるテキストファイル等であれば、拡張子は付けるべきであり、
拡張子は指定されずとも、付けた状態で保存してあげるのが普通です。
単純に指定された「名前+拡張子」では、拡張子を付けられていた場合、拡張子が余計に付く形となるので、
拡張子が付けられたかチェックした上で、付いてないまたは異なる拡張子の時だけ付ける様にしましょう。
下記のサンプルモジュールでは、拡張子のないときに付けるのはもちろん、
異なる拡張子のときは、異なる拡張子をファイル名の一部として正規の拡張子を付加するか、
異なる拡張子を除去して、正規の拡張子を付加するかを指定することが可能となっています。
使い方は標準のdialog命令タイプ17とほぼ同じで、システム変数statに1が入り、
正規拡張子を付加したファイルの絶対パスがシステム変数refstrに返るようになっています。
	

savedlg 拡張子, 拡張子詳細, オプション
拡張子保存する形式の拡張子を指定する。
尚、1つ目は拡張子のみ、区切りは半角セミコロン、2つ目以降は「*.」+拡張子とする。
拡張子詳細補助的な説明内容を指定する。
尚、標準dialog命令とは異なり、完全な省略はできない。デフォルトにする場合は""とする。
オプション拡張子を強制的に変更するオプションを指定する。
0または省略で拡張子がない場合にのみ強制付加、
1は第1パラメータで指定した拡張子の1つ目以外指定されたら強制的に書き換える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#module
#deffunc savedlg str, str, int
	mref extend, 32 : mref sup, 33 : mref option, 2
	mref stt, 64
	mref result, 65
	dialog extend, 17, sup
	if stat {
		s = refstr : strlen i.0, s
		s2 = extend : instr i.1, s2, ";" : strlen i.2, s2
		if i.1 ! -1 : strmid s2, s2, 0, i.1
		s2 = "." + s2
		strmid s3, s, -1, i.2
		if s3 ! s2 {
			if option {
				repeat i, 1
					instr i.3, s, "\\", i - cnt : if i.3 ! -1 : break
					instr i.3, s, ".",  i - cnt : if i.3 ! -1 : i -= cnt : break
				loop
				strmid result, s, 0, i
				result += s2
			} else {
				result = s + s2
			}
		}
	}
	return
#global

	sdim buf, 1024
	objsize winx / 2, 25
	pos winx / 2 * 0, 0 : button "読み込む", *load
	pos winx / 2 * 1, 0 : button "保存する", *save
	pos 0 : mesbox buf, winx, winy - 25, 5
	stop

*load
	dialog "txt", 16, "読み込むファイル(1KBまで)"
	if stat {
		bload refstr, buf
		objprm 2, buf
	}
	stop

*save
	savedlg "txt", "保存するファイル名", 1
	if stat : bsave refstr, buf
	stop

savedlg 拡張子, 拡張子詳細, オプション
拡張子保存する形式の拡張子を指定する。
尚、1つ目は拡張子のみ、区切りは半角セミコロン、2つ目以降は「*.」+拡張子とする。
拡張子詳細補助的な説明内容を指定する。
尚、標準dialog命令とは異なり、完全な省略はできない。デフォルトにする場合は""とする。
オプション拡張子を強制的に変更するオプションを指定する。
0または省略で拡張子がない場合にのみ強制付加、
1は第1パラメータで指定した拡張子の1つ目以外指定されたら強制的に書き換える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#module
#deffunc savedlg str extend, str sup, int option, local s, local s2, local i
	mref result, 65
	dialog extend, 17, sup
	if stat {
		s = refstr
		s2 = extend
		if instr(s2, , ";") ! -1 : s2 = strmid(s2, 0, instr(s2, , ";"))
		s2 = "." + s2
		if strmid(s, -1, strlen(s2)) ! s2 {
			if option {
				i = strlen(s)
				repeat i, 1
					if instr(s, i - cnt, "\\") ! -1 : break
					if instr(s, i - cnt, ".") ! -1 : i -= cnt : break
				loop
				result = strmid(s, 0, i) + s2
			} else {
				result = s + s2
			}
		}
	}
	return stat
#global

	sdim buf, 1024
	objsize ginfo_winx / 2, 25
	pos ginfo_winx / 2 * 0, 0 : button gosub "読み込む", *load
	pos ginfo_winx / 2 * 1, 0 : button gosub "保存する", *save
	pos 0 : mesbox buf, ginfo_winx, ginfo_winy - 25
	stop

*load
	dialog "txt", 16, "読み込むファイル(1KBまで)"
	if stat {
		bload refstr, buf
		objprm 2, buf
	}
	return

*save
	savedlg "txt;*.abc", "保存するファイル名", 1
	if stat :dialog refstr; bsave refstr, buf
	return