HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0926
e-nikuファイル保存ダイアログ23解決


e-niku

リンク

2008/9/26(Fri) 22:59:39|NO.19768

こんにちは。

ファイル保存ダイアログのファイルの種類で選択したものを変数に代入できませんか?
Windows付属のペイントなどである様にファイルの形式をダイアログで選択できるようにしたいです。

どうかよろしくお願いします。



この記事に返信する


begriff

リンク

2008/9/26(Fri) 23:34:22|NO.19769

どうも、begriffと申します。

保存されるファイル名は 開くときと同様に refstr
そこから拡張子を取り出すには getpath
ドットが拡張子についているので strmid+strlen で 拡張子だけを取り出す

このような流れでできます。



New Monkey

リンク

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,...)



S&R

リンク

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に同梱されていると重宝しそうです。



S&R

リンク

2008/9/27(Sat) 11:26:53|NO.19779

重宝するものは本体に組み込まれるべき。



renau

リンク

2008/9/27(Sat) 17:10:26|NO.19796


dialog "bmp|jpg;jpeg|png", 16, "ビットマップ(*.bmp)|JPEG(*.jpg;*.jpeg)|PNG(*.png)"
といった形で実装できないかな?



S&R

リンク

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)"
だな。



Shark++

リンク

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" の方が適切だと思います



S&R

リンク

2008/9/28(Sun) 05:35:37|NO.19806

フィルタに|が使えないんですが!?



S&R

リンク

2008/9/28(Sun) 05:37:28|NO.19807

Shark++さん、あなたのその発言はメモリノートパッドやコンボボックス
その他区切りに\nを使う方式を採用しているHSPを根底から否定していますよ。
俺が\nを提案したから否定してるとしか受け取れないです。



S&R

リンク

2008/9/28(Sun) 05:42:55|NO.19808

|区切りなんてほかの言語でも類を見ない区切り文字をOpenHSPで実装しないでほしい。|ますますHSPという言語がstupidに見られてしまうようで心配です。|\nより|が見やすいというならコンボボックスから\n区切りを採用している命令全部を変えてください。|互換性?|だったら新しい機能も\nにあわせるべきです。|そうか、nっていう字が嫌いなんですね?



S&R

リンク

2008/9/28(Sun) 05:47:42|NO.19809

エスケープシーケンスのみづらさは今に始まったことではない|見づらさよりも慣例に従ったんだよHSPは|これからHSPを牽引していく人がこれまでの慣例を否定して一部の区切りだけ|にしちゃっていいのですか?shark++さんの好き嫌いがHSP全体の慣例を変えてしまう恐れだってあるんですよ?

というわけで区切り文字をオプションに入れましょう。getstrのように。



Kpan

リンク

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 で文字列中のエスケープシーケンスだけ色を変える、ぐらい
してくれれば、改善されると思いますけど。 (これ要望じゃん)



-71

リンク

2008/9/28(Sun) 15:29:39|NO.19818

>>"bmp\jpg"を指定して動かないです><って掲示板に聞きに来る人が出そうな気がします
これもおそらく、このようなミスを犯す人は結局同じようなミスを他の場所でやらかすでしょうし、気にしても仕方ないと思いますよ。
"\n"を使用したほうが分かりやすいでしょう。

あと、レノスさんの仰ること同様、「なんか嫌」で仕様を決めていてはユーザーを振り回す事になるので、思っても口にしないほうがいいです。

あんまり、そこらへんを議論にしてるスレッドではないのですが……。申し訳ないです。



あり

リンク

2008/9/28(Sun) 15:50:04|NO.19819

Shark++さんの意見も十分理由になっていると思いますけどね。
『なんか嫌』の言葉だけとって否定されても困るでしょう。

『個人的』には拡張命令でも良いと思っているのですが
仮に実装されるとしても、リアルタイム処理が必要な所ではないので
どちらでも使えるようにすれば良いのでは?
そういった選択の自由さもHSPらしさだと思いますよ。

それよりも、ここは質問スレですので
これ以上本題以外の事で議論が続くようなら
他の場所へ移られた方が宜しいのではないでしょうか?



Shark++

リンク

2008/9/28(Sun) 16:08:03|NO.19820

実装してみました↓
http://www.sharkpp.net/blog/2008/09/28/hsp3-filedlg-multiple-filter-implement.html

> ありさん
なるほど、両方OKですか
その考えはありかも

あと、fujidigさんから教えてもらいましたが、ハックとして現状でもこんな方法で複数フィルタを実現できるようです
dialog "png", 16, "テキストファイル (*.txt)@*.txt@JPEGファイル (*.jpg)@*.jpg@PNGファイル"



New Monkey

リンク

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



GENKI

リンク

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



e-niku

リンク

2008/9/28(Sun) 21:40:45|NO.19848

沢山の返答をありがとうございます。

ファイル名に拡張子を入力しなくても、フィルターで選んでいた拡張子を代入したりできないのでしょうか?

>New Monkeyさん
こんなに長いソースをわざわざありがとうございます。
よくわからないところもありますが、参考にさせていただきます。



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



e-niku

リンク

2008/10/1(Wed) 20:27:55|NO.19911

ありがとうございます。
さっそく試してみますね。

こんな質問スレに沢山の返信をありがとうございました。



helohelo

リンク

2008/10/25(Sat) 03:28:35|NO.20429

省略時の拡張子に何か入れておけば自動で拡張子は付きます。空白でも良いです。
ext="" :ofn(15)=varptr(ext)

この拡張子が有効になるのは*.*の時だけなので
フィルタがbmpの時ならばbmpが付きます。

(win2000で確認)



ONION software Copyright 1997-2021(c) All rights reserved.