|
|
2008/9/26(Fri) 22:59:39|NO.19768
こんにちは。
ファイル保存ダイアログのファイルの種類で選択したものを変数に代入できませんか?
Windows付属のペイントなどである様にファイルの形式をダイアログで選択できるようにしたいです。
どうかよろしくお願いします。
|
|
2008/9/26(Fri) 23:34:22|NO.19769
どうも、begriffと申します。
保存されるファイル名は 開くときと同様に refstr
そこから拡張子を取り出すには getpath
ドットが拡張子についているので strmid+strlen で 拡張子だけを取り出す
このような流れでできます。
|
|
2008/9/27(Sat) 03:18:04|NO.19771
こんばんは。
拡張子を取り出したいならbegriffさんの方法でできます。
フィルタを何個か設定するのは標準では無理?なので・・・
#uselib "comdlg32.dll"
#func GetSaveFileName "GetSaveFileNameA" sptr
;フィルタ設定(フィルタ1の説明->フィルタ1->フィルタ2の説明->フィルタ2...)
sdim filter, 128 : i = 0
poke filter, i, "ビットマップ(*.bmp)" : i+=strsize+1
poke filter, i, "*.bmp" : i+=strsize+1
poke filter, i, "JPEG(*.jpg;*.jpeg)" : i+=strsize+1
poke filter, i, "*.jpg;*.jpeg" : i+=strsize+1
poke filter, i, "PNG(*.png)" : i+=strsize+1
poke filter, i, "*.png"
;初期フォルダ設定
initialdir = dir_cur
sdim filetitle, 260
dim ofn, 19
ofn(0) = 76
ofn(1) = hwnd
ofn(3) = varptr(filter)
ofn(7) = varptr(filetitle)
ofn(8) = 260
ofn(11) = varptr(initialdir)
GetSaveFileName varptr(ofn)
mes filetitle ;ファイル名
mes ""+ofn(6) ;選択されたフィルタのインデックス(1,2,...)
|
|
2008/9/27(Sat) 06:20:27|NO.19773
HSP3.2ではdialogの16,17の仕様を変える必要があるようだ。
|
|
2008/9/27(Sat) 08:38:12|NO.19775
New Monkeyさんのサンプルみたいに使えると便利ですね。
標準命令では無理に必要ないと思いますが、拡張モジュールとして
HSPに同梱されていると重宝しそうです。
|
|
2008/9/27(Sat) 11:26:53|NO.19779
重宝するものは本体に組み込まれるべき。
|
|
2008/9/27(Sat) 17:10:26|NO.19796
dialog "bmp|jpg;jpeg|png", 16, "ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)"
といった形で実装できないかな?
|
|
2008/9/28(Sun) 00:32:08|NO.19802
>dialog "bmp|jpg;jpeg|png", 16, "ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)"
普通に考えて不自然でしょう。
dialog "bmp\njpg;jpeg\npng", 16, "ビットマップ(*.bmp)\nJPEG(*.jpg;*.jpeg)\nPNG(*.png)"
だな。
|
|
2008/9/28(Sun) 01:21:38|NO.19804
renau(NO.19796) wrote:
> dialog "bmp|jpg;jpeg|png", 16, "ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)"
> といった形で実装できないかな?
よさそうな感じがします。OpenHSPで実装してみます。
S&R(NO.19802) wrote:
> dialog "bmp|jpg;jpeg|png", 16, "ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)"
> 普通に考えて不自然でしょう。
> dialog "bmp\njpg;jpeg\npng", 16, "ビットマップ(*.bmp)\nJPEG(*.jpg;*.jpeg)\nPNG(*.png)"
> だな。
うーん、S&Rさんが仰る事は分からないでもないですが"\n"はなんか嫌です
一瞬 "\" + "npng" なのか "\n" + "png" なのか判断が付き辛いですし、
"bmp\jpg"を指定して動かないです><って掲示板に聞きに来る人が出そうな気がします
あと互換性を考えるならoptionのほうは
"ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)" ではなく "ビットマップ|JPEG|PNG" の方が適切だと思います
|
|
2008/9/28(Sun) 05:35:37|NO.19806
フィルタに|が使えないんですが!?
|
|
2008/9/28(Sun) 05:37:28|NO.19807
Shark++さん、あなたのその発言はメモリノートパッドやコンボボックス
その他区切りに\nを使う方式を採用しているHSPを根底から否定していますよ。
俺が\nを提案したから否定してるとしか受け取れないです。
|
|
2008/9/28(Sun) 05:42:55|NO.19808
|区切りなんてほかの言語でも類を見ない区切り文字をOpenHSPで実装しないでほしい。|ますますHSPという言語がstupidに見られてしまうようで心配です。|\nより|が見やすいというならコンボボックスから\n区切りを採用している命令全部を変えてください。|互換性?|だったら新しい機能も\nにあわせるべきです。|そうか、nっていう字が嫌いなんですね?
|
|
2008/9/28(Sun) 05:47:42|NO.19809
エスケープシーケンスのみづらさは今に始まったことではない|見づらさよりも慣例に従ったんだよHSPは|これからHSPを牽引していく人がこれまでの慣例を否定して一部の区切りだけ|にしちゃっていいのですか?shark++さんの好き嫌いがHSP全体の慣例を変えてしまう恐れだってあるんですよ?
というわけで区切り文字をオプションに入れましょう。getstrのように。
|
|
2008/9/28(Sun) 09:42:40|NO.19813
>New Monkeyさん
フィルタ文字を切り出すところで、0x7Cが含まれてる2バイト文字
だと崩れます。(たとえば「酢」「掃」
|
|
2008/9/28(Sun) 14:17:18|NO.19817
3.2に組み込まれるとありがたいです。
> うーん、S&Rさんが仰る事は分からないでもないですが"\n"はなんか嫌です
「なんか嫌」は理由になっていません。
comboxなどに合わせて \n にすべきでしょう。
もしくは、HSP全体の慣例を変えるか。
> 見づらさ
hsed で文字列中のエスケープシーケンスだけ色を変える、ぐらい
してくれれば、改善されると思いますけど。 (これ要望じゃん)
|
|
2008/9/28(Sun) 15:29:39|NO.19818
>>"bmp\jpg"を指定して動かないです><って掲示板に聞きに来る人が出そうな気がします
これもおそらく、このようなミスを犯す人は結局同じようなミスを他の場所でやらかすでしょうし、気にしても仕方ないと思いますよ。
"\n"を使用したほうが分かりやすいでしょう。
あと、レノスさんの仰ること同様、「なんか嫌」で仕様を決めていてはユーザーを振り回す事になるので、思っても口にしないほうがいいです。
あんまり、そこらへんを議論にしてるスレッドではないのですが……。申し訳ないです。
|
|
2008/9/28(Sun) 15:50:04|NO.19819
Shark++さんの意見も十分理由になっていると思いますけどね。
『なんか嫌』の言葉だけとって否定されても困るでしょう。
『個人的』には拡張命令でも良いと思っているのですが
仮に実装されるとしても、リアルタイム処理が必要な所ではないので
どちらでも使えるようにすれば良いのでは?
そういった選択の自由さもHSPらしさだと思いますよ。
それよりも、ここは質問スレですので
これ以上本題以外の事で議論が続くようなら
他の場所へ移られた方が宜しいのではないでしょうか?
|
|
2008/9/28(Sun) 17:51:45|NO.19826
>19813 Kpanさん
ご指摘ありがとうございます。
もう不要かもしれませんが一応修正してみました。
区切り文字はHSP2のmultiopen命令では|でしたが、やはり\nに統一したほうがいいですね。
#module
;================================================================================================
; FileSelectDialog v1, p1, s1, s2, s3, p2
;
; 引数
; v1 : ファイル名を取得する文字列型変数
; p1 : ダイアログの種類 0 = 開く, else = 保存
; s1 : フィルタ文字列(ex. "Jpeg files(*.jpg;*.jpg)\n*.jpg;*.jpeg\nAll files(*.*)\n*.*")
; s2 : 初期フォルダ
; s3 : ダイアログのタイトル
; s4 : 初期ファイル名
; p2 : 複数ファイルの選択 0 = 不可, else = 可
;
; 戻り値
; stat : 選択されているフィルタのインデックス(1,2,...)、キャンセルまたはエラーの場合-1
; v1で指定した変数に選択されたファイル名がパスを含めて格納される
; 複数のファイルが選択された場合は改行で区切られ、最初の行にフォルダのパス、以降ファイル名
;================================================================================================
#uselib "comdlg32.dll"
#func GetOpenFileName "GetOpenFileNameA" sptr
#func GetSaveFileName "GetSaveFileNameA" sptr
#define MAXFILE 2048
#deffunc FileSelectDialog var v1, int p1, str s1, str s2, str s3, str s4, int p2
sdim filter, 512
_s1 = s1 : i1 = 0 : i2 = 0
repeat
getstr s, _s1, i1
if strsize=0 { break }
i1 += strsize
poke filter, i2, s
i2 += strsize+1
loop
initialdir = s2
dialogtitle = s3
sdim buf, MAXFILE
buf = s4
dim ofn, 19 ;OPENFILENAME構造体
ofn(0) = 76 ;lStructSize
ofn(1) = hwnd ;hwndOwner
ofn(3) = varptr(filter) ;lpstrFilter
ofn(6) = 1 ;nFilterIndex
ofn(7) = varptr(buf) ;lpstrFile
ofn(8) = MAXFILE ;nMaxFile
if s2!="" { ofn(11) = varptr(initialdir) } ;lpstrInitialDir
if s3!="" { ofn(12) = varptr(dialogtitle) } ;lpstrTitle
ofn(13) = $00000002/*OFN_OVERWRITEPROMPT*/|0x00000004/*OFN_HIDEREADONLY*/|0x00001000/*OFN_FILEMUSTEXIST*/|$00080000/*OFN_EXPLORER*/ ;Flags
if p2!=0 { ofn(13) = ofn(13)|$00000200/*OFN_ALLOWMULTISELECT*/ }
if p1=0 { GetOpenFileName varptr(ofn) } else { GetSaveFileName varptr(ofn) }
if stat=0 { p = -1 } else { p = ofn(6) }
v1 = "" : i1 = 0
repeat
getstr s, buf, i1
if strsize=0 { break }
i1 += strsize+1
v1 += s+"\n"
loop
return p
#global
FileSelectDialog filename, 0, "Bitmap files(*.bmp)\n*.bmp\nJpeg files(*.jpg;*.jpg)\n*.jpg;*.jpeg\nAll files(*.*)\n*.*", dir_cur, "ダイアログタイトル", "初期ファイル名", 1
if stat!=-1 { dialog filename+"\nFilter Index = "+stat } else { dialog "キャンセル or エラー" }
end
| |
|
2008/9/28(Sun) 19:46:17|NO.19831
なかなか面白い議論になっててきてますね。
> "\n"はなんか嫌です
さすがにこれではあんまりですね。w
> フィルタに|が使えないんですが!?
『|』ってワイルドカードありましたっけ。
すみません普段*ぐらいしか使わないもので…。
> |区切りなんてほかの言語でも類を見ない区切り文字を
私の場合何処で覚えたのか、ファイルダイアログの拡張子指定は『|』で区切るのが当たり前だと思ってました。
GetOpenFileNameだとヌル(\0)なんですね。
で、『|』で区切るのが何なのか気になったので調べてみました。
CFileDialogだと|で区切るようです。C++です。
私の記憶は昔読んだC++の本で得た知識だと思うので多分これの影響でしょうね。
少なくとも吉里吉里2のStorages.selectFileってことは無いです。キリキリは使ったこと無いので。
\nと\0…大差ない気もしますが、|のほうが視認性がいい気もします。
もう遅いようですが、関連と言うことで一応。
HSP開発wiki - 小ワザ/ファイル選択ダイアログ
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D5%A5%A1%A5%A4%A5%EB%C1%AA%C2%F2%A5%C0%A5%A4%A5%A2%A5%ED%A5%B0
|
|
2008/9/28(Sun) 21:40:45|NO.19848
沢山の返答をありがとうございます。
ファイル名に拡張子を入力しなくても、フィルターで選んでいた拡張子を代入したりできないのでしょうか?
>New Monkeyさん
こんなに長いソースをわざわざありがとうございます。
よくわからないところもありますが、参考にさせていただきます。
|
|
2008/9/28(Sun) 23:08:31|NO.19850
それは自前でやるしかないです。
フィルタのインデックスが取得できるのでそれを利用すると、例えば次のように書けます
;この下の空白の部分にNO.19771のスクリプトから最後2行を除いたものを貼り付けてください
if stat=0 {
dialog "エラー or キャンセル"
} else {
switch ofn(6) ;選択されたフィルタのインデックス(1,2,...)
case 1
ext = ".bmp"
swbreak
case 2
ext = ".jpg"
swbreak
case 3
ext = ".png"
swbreak
swend
filetitle = getpath(filetitle, 1)+ext ;取得したファイル名から一旦拡張子を取り除き、選択されたフィルタに対応する拡張子をつける
dialog filetitle
}
end
|
|
2008/10/1(Wed) 20:27:55|NO.19911
ありがとうございます。
さっそく試してみますね。
こんな質問スレに沢山の返信をありがとうございました。
|
|
2008/10/25(Sat) 03:28:35|NO.20429
省略時の拡張子に何か入れておけば自動で拡張子は付きます。空白でも良いです。
ext="" :ofn(15)=varptr(ext)
この拡張子が有効になるのは*.*の時だけなので
フィルタがbmpの時ならばbmpが付きます。
(win2000で確認)
|
|