Style
;================================================================================ ;モジュール multiopen ;ver 1.0 ; ファイル名を取得 ; llmod.asが必要です ;================================================================================
; multiopenモジュール命令一覧 ; ; multiopen 複数のファイル名を取得 ; ; 計 1個
;使い方
;================================================================================
; multiopen v1,v2,n3,n4 複数のファイル名を取得
;
; v1 : 選択されたファイル名を受け取るための変数
; v2 : 情報
; n3 : フィルタのインデックス(1から)
; n4 : Read Onlyボックスを付ける
;================================================================================
;
;<>説明
; HSPのdialog(type 16,17)で複数のファイルを選択できるようにしたものです。
; multiopen呼び出し時に、v1.0,v1.1にそれぞれv1,v2のサイズを代入しておきます。
; v2には例のような形式でフィルタを代入します。
; n3を省略、またはマイナスの値を使ったときの動作は備考参照。
; n4を1にするとReadOnlyボックスを付けます。2にするとReadOnlyボックスを
; チェックした状態にします。
;
;<>この命令を呼び出した後のstatの値
; 0 キャンセルされた
; 1 ファイルが選択されてOKボタンが押された
; 2 ファイルが選択されてOKボタンが押された(ReadOnlyがチェックされている。ただし
; 複数選択されていない場合のみ)
;
;<>例
; buf_size=512 : info_size=128
; alloc buf,buf_size
; alloc info,info_size
;
; buf="ファイルを開くtest title" : info="a:\\windows"スクリプトファイル(*.as)|*.as|テキストファイル(*.txt)|*.txt|全てのファイル|*.*|"キャンセルされました" : else {
; notesel buf
; notemax mx
; mes "選択されたファイル数 "+mx
; repeat mx
; noteget a,cnt
; mes a
; loop
; if mx=1 : mes "拡張子は"+info : else mes "フォルダ "+info
; }
;
;<>備考
; p3を0(省略)にしてp1,p2に文字列を入れるとp1がタイトルになり、p2は初期フォルダに
; なります。
; p3をマイナス値にすると保存するファイル名を得るときに使うことができます。(ただし
; 複数選択はできません)
;
; 複数のファイルが選択されたかはnotesel,notemaxを使って調べます。
; ファイルが一つしか選択されなかった場合、p1にはファイル名のフルパスが代入され、
; p2にはファイルの拡張子が代入されます。
; ファイルが複数選ばれた場合は、p1にnotegetで取得できる形式でファイル名が複数
; 入っていて、p2には選択されたファイルがあるフォルダが代入されます。(p1のファイル
; 名は'\r'で区切られています。)
;module始め>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #module "multiopen"
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;multiopen ;................................................................................ #deffunc multiopen val,val,int,int
mref buf,16 ;(buf.0=buf_size, buf.1=info_size) mref info,25 mref filt_idx,2 mref read_only,3 mref stt,64
if first_call=0 : ttle="" : inidir="" : first_call=1
if filt_idx=0 {
mref buf,24
strlen a,buf : if a>=64 : sdim ttle,a+1 : else sdim ttle,64
strlen a,info : if a>=64 : sdim inidir,a+1 : else sdim inidir,64
ttle="" : inidir=""
ttle=buf
inidir=info
return
}
if filt_idx<0 : filt_idx=-filt_idx : b_save=1 : else b_save=0
strlen a,info if a>=64 : sdim lcl_info,a+1 lcl_info=info ;保存しておかないとまずい
_null_sep_str lcl_info,'|'
defext=""
; a=0
; repeat -1
; peek a,lcl_info,cnt
; if a=0 : peek defext,lcl_info,cnt+3 : break
; loop
alloc prm,76 prm.0=76
;@@@@ Instanceの取得 @@@@ _get_instance prm.2
;@@@@ Active Windows の取得 @@@@ _get_active_window prm.1
getptr prm.3,lcl_info prm.4=0,0,filt_idx
getptr prm.7,buf prm.8=buf.0 getptr prm.9,info prm.10=buf.1
buf=""
getptr prm.11,inidir getptr prm.12,ttle
;#define OFN_ALLOWMULTISELECT 512 ;#define OFN_CREATEPROMPT 0x2000 ;#define OFN_ENABLEHOOK 32 ;#define OFN_ENABLETEMPLATE 64 ;#define OFN_ENABLETEMPLATEHANDLE 128 ;#define OFN_EXPLORER 0x80000 ;#define OFN_EXTENSIONDIFFERENT 0x400 ;#define OFN_FILEMUSTEXIST 0x1000 ;#define OFN_HIDEREADONLY 4 ;#define OFN_LONGNAMES 0x200000 ;#define OFN_NOCHANGEDIR 8 ;#define OFN_NODEREFERENCELINKS 0x100000 ;#define OFN_NOLONGNAMES 0x40000 ;#define OFN_NONETWORKBUTTON 0x20000 ;#define OFN_NOREADONLYRETURN 0x8000 ;#define OFN_NOTESTFILECREATE 0x10000 ;#define OFN_NOVALIDATE 256 ;#define OFN_OVERWRITEPROMPT 2 ;#define OFN_PATHMUSTEXIST 0x800 ;#define OFN_READONLY 1 ;#define OFN_SHAREAWARE 0x4000 ;#define OFN_SHOWHELP 16 ;#define OFN_SHAREFALLTHROUGH 2 ;#define OFN_SHARENOWARN 1 ;#define OFN_SHAREWARN 0
if b_save {
; OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT
; prm.13=$800 | 2
prm.13=$802
}else{
; OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER
; prm.13=$1000 | $200 | $80000
prm.13=$81200
if read_only=0 : prm.13=(prm.13)|4
if read_only=2 : prm.13+
}
prm.14=0
getptr prm.15,defext
prm.16=0,0,0
getptr a,prm
if b_save {
dllproc "GetSaveFileNameA",a,1,D_COMDLG
}else{
dllproc "GetOpenFileNameA",a,1,D_COMDLG
}
ret=stat
alloc lcl_info,64 ;確保しておいたバッファをもどす
if ret {
a=(prm.14>>16)&$ffff
if a { ;シングルセレクト
peek info,buf,a
}else{ ;マルチセレクト
info=""
peek info,buf
repeat -1
peek a,buf,cnt
if a=0 {
peek a,buf,cnt+1
if a=0 : prm=cnt : break
}
loop
getptr a,buf
defext=0
strlen defext,info
ll_peek@ buf,a+defext+1,prm+1
repeat -1
peek a,buf,cnt
if a=0 {
poke buf,cnt,13
peek a,buf,cnt+1
if a=0 : break
}
loop
}
}
if ret : stt=1 : else stt=0 if read_only&(prm.13&1) : stt=2
return #global ;module終わり>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>