#include "llmod.as" #include "img.as" #include "treebox.as" #include "listview.as" ; ;explorerをちょっとだけまねしたプログラム ;listviewのアイテムの並び方がぐちゃぐちゃです。^^;;; ; ;ドライブ名を取得するモジュール(llmod.asが必要)---------------------- #module #deffunc get_drives val mref v1,24 mref stt,64 #define BUF_SIZE 256 ;適当 alloc a,BUF_SIZE prm=BUF_SIZE getptr prm.1,a : dllproc "GetLogicalDriveStringsA",prm,2 ;notepad命令で取り扱える形式にする s="" : i=0,0 : notesel v1 repeat -1 peek s,a,i.1 : strlen L,s if L : noteadd s,i,1 : i+ : i.1+=L+1 : else break loop stt=i ;ドライブの数をstatに代入 return #global ;-------------------------------------------------------------------- #define TREE_W 230 #define DRIVE_ITEM $ff000000 #define FOLDER_ALREADY $00ff0000 #define FOLDER_ITEM $ff000000 screen 0,680,400 sdim buf,1024*64 ;サブフォルダ検索用バッファ sdim path,260 sdim file,260 treebox TREE_W,400,1+2+4 tr=stat ;treeboxのID pos TREE_W,0 listview winx-TREE_W-6,winy-26,1 lst=stat ;listviewのID #define PATH_DISP_ID 0 sdim s,260 input s,winx-TREE_W-6 ;id=0 (PATH_DISP_ID) ;listviewの欄 listaddcl 0,"名前",180 ;幅 180 listaddcl 1,"サイズ",80,1 ;最後の1は右寄せ listaddcl 2,"ファイルの種類",150 get_drives drv sdim drvs,16,stat ;ドライブ名を保存する変数 notesel drv : notemax n_drv repeat n_drv noteget s,cnt drvs.cnt=s ;実際のドライブ名は後で使うので保存しておく listadd cnt,s+" 検索中..." get_fileicon icon.cnt,s,1 ;ドライブに使われているアイコンを取得 get_fileicon ss,s,$20 ;ドライブに使われている名前を取得 ;ドライブのアイテムを他のアイテムと区別するため ;DRIVE_ITEM+cntという値を持たせる treeadd 0,ss,0,cnt,cnt,DRIVE_ITEM+cnt+FOLDER_ALREADY drvitm=stat ;全てのサブフォルダをここで追加すると10秒以上かかるので ;アイテムにフォーカスがあったときに1つずつ追加していく pitm=drvitm path=drvs.cnt gosub tree_subfolder ;サブフォルダ追加 treesort drvitm notesel drv loop treeicon icon,n_drv : tree_img=stat ;既にアイコンをセットしているとき、次のようにするとアイコンを付け足すことができる s="shell32.dll" get_icon icon.0,s,3,1 ;フォルダのアイコン get_icon icon.1,s,4,1 ;フォルダが開いたアイコン repeat 2 addicon_imglist tree_img,icon.cnt loop _objsel tr active_objects=1,tr,lst,PATH_DISP_ID itm_list=0 *main_loop treeget itm_stop if itm_stop!itm_list { t=0 *@ wait 1 t+ if (t>15)|(t.1=1) { ;同じアイテムに15ms以上止まっていたらlistviewに表示 gosub list_items t.1=0 }else{ treeget child,4,itm_stop ;子ども取得 if child : treeget a,7,child : if a&FOLDER_ALREADY=0 { ;子どもアイテムにまだサブフォルダが追加されていない gosub create_subfolder } treeget itm_stop.1 if itm_stop=itm_stop.1 : goto *@b } } ginfo 1 if prmx=-1 { if deactive=0 : deactive=1 }else{ if deactive=1 : _objsel last_actobj : deactive=0 _objsel -1 : if stat!-1 : last_actobj=stat if last_actobj=lst : getkey ms_left,1 : getkey a,13 : if ms_left | a { ;listviewのアイテムがクリックされたらそのファイルを実行 treeget itm ;選択されているアイテムのID i=itm gosub make_path i=-1 repeat -1 listget i,i,,2 ;選択状態のアイテムを探す if i=-1 : break listget s,i,5 ;選択状態のアイテムの名前 ;stat = listviewのi番目のアイテムが持っている値 if stat&FOLDER_ITEM { ;フォルダならitmの子の中から同じ名前の ;アイテムを探す treeget child,4,itm repeat -1 if child=0 : break treeget ss,6,child if s=ss { ;見つかったらそのアイテムを展開 treesel child,$10 ;listviewをすぐに更新する t.1=1 break } treeget child,1,child loop } else { ;ファイルなら実行 exec path+s,16 } loop } getkey a,9 : if a : _objsel -1 { ;tabキーで treebox <-> listview を交互に選択 active_objects+ if active_objects>3 : active_objects=1 _objsel active_objects.active_objects wait 8 } getkey a,8 : if a : _objsel -1 : if stat=lst { ;back space で一つ上のフォルダに移動 treeget i ;選択されているアイテム取得 treeget i,3,i ;親アイテムを取得 if i : treesel i : t.1=1 ;親アイテムがあれば選択 } getkey a,112 : if a { ;F1キー treeget itm ;選択されているアイテムのID i=itm gosub make_path listget i,-1,,2 ;選択状態のアイテムを探す if i=-1 : s="" : else listget s,i,5 ;選択状態のアイテムの名前 objprm PATH_DISP_ID,path+s _objsel active_objects.active_objects } } wait 1 goto main_loop *make_path treeget path,6,i ;iには基準となるツリービューのアイテムIDが入っている a=stat if a&DRIVE_ITEM : a=a&$f : path=drvs.a : else path+="\\" repeat -1 treeget i,3,i ;アイテムの親のIDを取得 if i { treeget s,6,i ;親のテキストを取得 a=stat ;treeboxに追加したドライブ名は実際のドライブ名ではないので ;保存しておいたドライブ名を使う if a&DRIVE_ITEM : a=a&$f : s=drvs.a :else s+="\\" path=s+path }else break ;親がなければbreak loop return *list_items itm_list=itm_stop treeget child,4,itm_stop ;子ども取得 if child : treeget a,7,child : if a&FOLDER_ALREADY=0 { ;子どもアイテムにまだサブフォルダが追加されていない gosub create_subfolder } listdel -1 ;listviewの全てのアイテムを消去 i=itm_stop gosub make_path title path objprm PATH_DISP_ID,path : _objsel tr sdim tmp,1024*64 dirlist buf,path+"*",5 ;フォルダを検索 notesel buf noteget s : if s="." : notedel : notedel ;"."と".."を消す dirlist tmp,path+"*",1 ;ファイルを検索 buf+=tmp alloc tmp,64 notemax max : if max=0 : return if list_img : destroy_imglist list_img ;アイコンが既にセットされていたら ;セット時に返された値を消去する create_imglist 16,16,5,max ;16*16サイズのイメージをmax個作る設定 list_img=stat listimglist list_img,1 ;1は小さいアイコンをセットすることを示す repeat max noteget s,cnt file=path+s get_fileicon icon,file,1 ;fileから小さいアイコンを取得 addicon_imglist list_img,icon ;先頭のアイテムをフォーカスがあった状態にする if cnt=0 : state=1 : else state=0 ;ファイルのサイズを調べる exist file sz=strsize ;sz=-1だったらfileをフォルダとみなしFOLDER_ITEMという値を持たせる if sz=-1 : i=FOLDER_ITEM : else i=0 listadd cnt,s,0,cnt,state,i ;(cnt,0)番目に"s"を追加 if sz!-1 : x=strsize/1024+1 : listadd cnt,""+x+"KB",1 ;ファイルの種類を取得 get_fileicon s,file,$40 listadd cnt,s,2 await loop return *tree_subfolder dirlist buf,path+"*",5 notesel buf noteget s if s="." : notedel : notedel ;"."と".."を消す notemax max if max { await ;awaitを消せば全てのアイテムが追加されるまでtreeboxが更新されない repeat max noteget s,cnt treeadd pitm,s,0,n_drv,n_drv+1 loop } return *create_subfolder repeat -1 i=child gosub make_path pitm=child gosub tree_subfolder a=FOLDER_ALREADY treeget a,7,child,1 ;アイテムに値 'FOLDER_ALREADY' を持たせる treesort child treeget child,1,child ;次のアイテム if child=0 : break loop return