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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0916
テスト28号J複数のファイルが選択可能なダイアログ。4解決


テスト28号J

リンク

2009/9/16(Wed) 19:38:54|NO.27720

HSPWikiの"ファイル選択ダイアログ/複数ファイルを選択する"を参考に作ってみたのですが、
ファイルを一つのみ選択した場合は、正常にファイルのパスを返してくれるのですが、
複数選択した場合、ファイルのパスでなく、フォルダのパスが返ってきてしまいます。
どのようにすれば、正常に返してくれるのでしょうか。


#uselib "Comdlg32.DLL" #func GetOpenFileName "GetOpenFileNameA" int #define BUFSIZE 260 #define FILTERSIZE 512 #define ALLTYPE "ALL files (*.*)@*.*@" #define PICTURE "画像ファイル (*.bmp;*.mag;*.jpg)@*.bmp;*.mag;*.jpg@" #define SOUND "音楽ファイル (*.mid;*.mp3;*.wav)@*.mid;*.mp3;*.wav@" #define DOCUMENT "文書ファイル (*.txt)@*.txt@" #define OFN_FILEMUSTEXIST $00001000 #define OFN_OVERWRITEPROMPT $00000002 #define OFN_ALLOWMULTISELECT $00000200 #define OFN_EXPLORER mref bmscr , 67 dim ofn , 22 sdim aplFilter , FILTERSIZE+1 sdim usrFilter , FILTERSIZE+1 sdim filename , BUFSIZE+1 aplFilter = PICTURE + SOUND + DOCUMENT + ALLTYPE + "@" usrFilter = "ユーザ選択フィルタ (*.*)@*.*@" + "@" repeat await 0 mutch=instr(aplFilter,start,"@") if mutch = -1 : break poke aplFilter , start + mutch , $00 start += mutch + 1 loop start = 0 repeat await 0 mutch=instr(usrFilter,start,"@") if mutch = -1 : break poke usrFilter , start + mutch , $00 start += mutch + 1 loop ofn.0 = 88 ; lStructSize ofn.1 = bmscr.13 ; hwndOwner ofn.2 = bmscr.14 ; hInstance ofn.3=varptr(aplFilter) ; lpstrFilter ofn.4=varptr(usrFilter) ; lpstrCustomFilter ofn.5 = FILTERSIZE ; nMaxCustFilter ofn.6 = 1 ; nFilterIndex ofn.7=varptr(filename) ; lpstrFile ofn.8 = BUFSIZE ; nMaxFile ofn.9 = 0 ; lpstrFileTitle ofn.10 = 0 ; nMaxFileTitle ofn.11 = 0 ; lpstrInitialDir ofn.12 = 0 ; lpstrTitle ofn.13 = OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_EXPLORER ; Flags prm=varptr(ofn) GetOpenFileName prm if stat=0{ dialog "失敗",0,"終了確認":end } mes filename stop



この記事に返信する


Kpan

リンク

2009/9/16(Wed) 20:56:52|NO.27724

NULL文字区切りとのことです。
「フォルダ名00ファイル名00ファイル名00・・・」のような感じで
ちゃんと返ってきてるみたい。(デバッグウィンドウ見てください)
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/OPENFILENAME.html

nFileOffsetが最初のファイル名文字列の位置なので、getstr命令で
切り出してく形になると思います。



テスト28号J

リンク

2009/9/17(Thu) 10:12:46|NO.27734

Kpanさん、回答ありがとうございます。
デバッグウィンドウを見てみましたが、該当するような箇所を見つけ出す事が出来ませんでした。
又、nFileOffsetをofn.14として試してみましたが、0しか返してくれません。
もう少し詳しくお願いできないでしょうか。



あり

リンク

2009/9/17(Thu) 11:17:47|NO.27736

NULL文字($00)があるとそれ以降の文字列は表示されないので
NULL文字をチェックして回避するようにすればファイルのパスが取り出せます。
上のスクリプトを改造してfilenameの中を確認できる様にしてみました。

#uselib "Comdlg32.DLL" #func GetOpenFileName "GetOpenFileNameA" int #define BUFSIZE 260 #define FILTERSIZE 512 #define ALLTYPE "ALL files (*.*)@*.*@" #define PICTURE "画像ファイル (*.bmp;*.mag;*.jpg)@*.bmp;*.mag;*.jpg@" #define SOUND "音楽ファイル (*.mid;*.mp3;*.wav)@*.mid;*.mp3;*.wav@" #define DOCUMENT "文書ファイル (*.txt)@*.txt@" #define OFN_FILEMUSTEXIST $00001000 #define OFN_OVERWRITEPROMPT $00000002 #define OFN_ALLOWMULTISELECT $00000200 #define OFN_EXPLORER $00080000 mref bmscr , 67 dim ofn , 22 sdim aplFilter , FILTERSIZE+1 sdim usrFilter , FILTERSIZE+1 sdim filename , BUFSIZE+1 aplFilter = PICTURE + SOUND + DOCUMENT + ALLTYPE + "@" usrFilter = "ユーザ選択フィルタ (*.*)@*.*@" + "@" repeat await 0 mutch=instr(aplFilter,start,"@") if mutch = -1 : break poke aplFilter , start + mutch , $00 start += mutch + 1 loop start = 0 repeat await 0 mutch=instr(usrFilter,start,"@") if mutch = -1 : break poke usrFilter , start + mutch , $00 start += mutch + 1 loop ofn.0 = 88 ; lStructSize ofn.1 = bmscr.13 ; hwndOwner ofn.2 = bmscr.14 ; hInstance ofn.3=varptr(aplFilter) ; lpstrFilter ofn.4=varptr(usrFilter) ; lpstrCustomFilter ofn.5 = FILTERSIZE ; nMaxCustFilter ofn.6 = 1 ; nFilterIndex ofn.7=varptr(filename) ; lpstrFile ofn.8 = BUFSIZE ; nMaxFile ofn.9 = 0 ; lpstrFileTitle ofn.10 = 0 ; nMaxFileTitle ofn.11 = 0 ; lpstrInitialDir ofn.12 = 0 ; lpstrTitle ofn.13 = OFN_FILEMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT|OFN_EXPLORER ; Flags prm=varptr(ofn) GetOpenFileName prm if stat=0{ dialog "失敗",0,"終了確認":end } ; NULL文字($00)を改行(\n)に変換する repeat BUFSIZE+1 r1=peek(filename, cnt) if r1=$00 : poke filename, cnt, '\n' loop mes filename stop



テスト28号J

リンク

2009/9/17(Thu) 13:32:28|NO.27739

ありさん、回答ありがとうございます。
希望通りの動作にたどり着く事が出来ました。



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