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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0428
Cheesehamburg7273HSPでエクスプローラーみたいな物は作れるでしょうか10解決


Cheesehamburg7273

リンク

2016/4/28(Thu) 05:39:38|NO.75335

HSPでOSもどきを作っている者です。
OSもどきのエクスプローラーみたいな物はつくれないでしょうか?
dirlist命令でファイル一覧を取得して表示することぐらいしかできていません...
dirlist命令で取得したファイル一覧にクリックなどでアクセスする方法を教えて下さい!



この記事に返信する


skyblue

リンク

2016/4/28(Thu) 07:05:34|NO.75337

HSPでエクスプローラーを作れるかといったら、作れます。

選択されたアイテムが反転されている状態で
アクティブなアイテムの番号を取得して
番号に応じたファイルを開けばいいだけです。



kanamaru

リンク

2016/4/28(Thu) 17:16:36|NO.75338

エクスプローラの作成にチャレンジしてみましたが、
実力不足でした。
とりあえず、ファイル名、更新日時、ファイルの種類は表示できました。
参考になればいいですけど。
クリックしたときの動作ってどうやって実装すればいいのでしょうか
http://asmape-star.exout.net/proxy/filer.hsp



kanamaru

リンク

2016/4/28(Thu) 17:17:56|NO.75339

後、ファイルサイズを調べる方法を知っていたら教えてください。
ほかの人のスレッドなのに質問してしまい、すいませんでした。



Cheesehamburg7273

リンク

2016/4/28(Thu) 19:04:50|NO.75341

現時点の状況

#module ;▼必要となるAPIや定数の定義 #uselib "kernel32.dll" #cfunc FindFirstFile "FindFirstFileA" var,var #func FindClose "FindClose" int #func FileTimeToLocalFileTime "FileTimeToLocalFileTime" var,var #func FileTimeToSystemTime "FileTimeToSystemTime" var,var #deffunc getstamp array prm1,str prm2,int prm3 mref ref,65 sdim dir,260 : dim fd,80 : dim st,8 dir = prm2 : if dir=="" : dir=exedir nMode = prm3 : if (nMode<=0)|(nMode>2) : nMode=0 hFind=FindFirstFile(dir,fd) : if hFind=-1 : return -1 ref=dir ; refstrにdir(filename)を返す exist dir : fsize=strsize FindClose hFind if nMode==0 : ft=fd(1),fd(2) ;作成日時 if nMode==1 : ft=fd(3),fd(4) ;アクセス日時 if nMode==2 : ft=fd(5),fd(6) ;更新日時 ;ファイル時間をローカルファイル時間に変換 FileTimeToLocalFileTime ft,ft ;ファイル時間をシステム時間に変換 FileTimeToSystemTime ft,st ;SystemTime構造体 stより各要素を分解抽出する n=0 repeat 6 if cnt==2 : n+2 s(cnt)=wpeek(st,n) : n+2 prm1(cnt)=s(cnt) loop ;文字列として編集した形式で取得値prm1にを返す ret =str(s(0))+"/"+strf("%02d",s(1))+"/"+strf("%02d",s(2))+" " ret+=strf("%02d",s(3))+":"+strf("%02d",s(4))+":"+strf("%02d",s(5)) ref = ret ;編集文字列は、refstrに返す sdim dir,0 : dim fd,0 : dim st,0 return fsize #uselib "shell32.dll" #func global SHGetFileInfo "SHGetFileInfo" sptr,sptr,sptr,sptr,sptr #define SHGFI_ICON $00000100 #define SHGFI_TYPENAME $00000400 #defcfunc getfiletype str path dim SHFILEINFO, 88 sdim filetype, 80 SHGetFileInfo path, 0, varptr(SHFILEINFO), $160, SHGFI_ICON | SHGFI_TYPENAME getstr filetype, SHFILEINFO, $110 return filetype #global title "hsp製簡易ファイラー(実力不足で表示するだけ)" chdir dirinfo(2) dirlist folist,"*.*",5 dirlist filist,"*.*",3 winobj "SysListView32", "", 0x00000200, 0x50000001, 640, 480 hList = objinfo(stat, 2) sendmsg hList, $1036, , $20 szText = "名前" LVCOLUMN = 0x000F, 0, 160, varptr(szText), 0, 0 sendmsg hList, 0x101B, 0, varptr(LVCOLUMN) szText = "更新日時" LVCOLUMN = 0x000F, 0, 160, varptr(szText), 0, 1 sendmsg hList, 0x101B, 1, varptr(LVCOLUMN) szText = "種類" LVCOLUMN = 0x000F, 0, 160, varptr(szText), 0, 1 sendmsg hList, 0x101B, 2, varptr(LVCOLUMN) szText = "サイズ" LVCOLUMN = 0x000F, 0, 160, varptr(szText), 0, 1 sendmsg hList, 0x101B, 3, varptr(LVCOLUMN) split filist,"\n",list2 repeat length(list2)-1 pszText = list2(cnt) LVITEM = 0x0001, cnt, 0, 0, 0, varptr(pszText) sendmsg hList, 0x1007, 0, varptr(LVITEM) getstamp n,list2(cnt),0 pszText = refstr LVITEM = 0x0001, cnt, 1, 0, 0, varptr(pszText) sendmsg hList, 0x1006, 0, varptr(LVITEM) pszText = getfiletype(list2(cnt)) LVITEM = 0x0001, cnt, 2, 0, 0, varptr(pszText) sendmsg hList, 0x1006, 0, varptr(LVITEM) await 1 loop split folist,"\n",list2 repeat length(list2)-44 pszText = list2(cnt) LVITEM = 0x0001, cnt, 0, 0, 0, varptr(pszText) sendmsg hList, 0x1007, 0, varptr(LVITEM) getstamp n,list2(cnt),0 pszText = refstr LVITEM = 0x0001, cnt, 1, 0, 0, varptr(pszText) sendmsg hList, 0x1006, 0, varptr(LVITEM) pszText = getfiletype(list2(cnt)) LVITEM = 0x0001, cnt, 2, 0, 0, varptr(pszText) sendmsg hList, 0x1006, 0, varptr(LVITEM) await 0.000001 loop

IEコンポーネントでエクスプローラーっぽくしてみた



zero

リンク

2016/4/28(Thu) 20:15:54|NO.75342

すごい適当ですけど、kanamaruさんのスクリプトの後ろにこんな感じですかね

oncmd gosub *onNotify, 0x4E stop *onNotify if (lparam != 0) { dupptr hdr, lparam, 12 if (hdr.0 == hList) { if (hdr.2 == -2) : gosub *listview_clicked if (hdr.2 == -3) : gosub *listview_dblclked } } return *listview_clicked if (lparam != 0) { dupptr ia, lparam, 48 item = ia.3 dim lvitem, 15 sdim itemtext, 300 lvitem.0 = 0x00000001 lvitem.1 = item lvitem.2 = 0 lvitem.5 = varptr(itemtext) lvitem.6 = 300 sendmsg hList, 0x1000+5, 0, varptr(lvitem) title itemtext + " が選択されました" } return *listview_dblclked if (lparam != 0) { dupptr ia, lparam, 48 item = ia.3 dim lvitem, 15 sdim itemtext, 300 lvitem.0 = 0x00000001 lvitem.1 = item lvitem.2 = 0 lvitem.5 = varptr(itemtext) lvitem.6 = 300 sendmsg hList, 0x1000+5, 0, varptr(lvitem) title itemtext + " がダブルクリックされました" } return



Cheesehamburg7273

リンク

2016/4/29(Fri) 08:33:24|NO.75344

ありがとうございました
無事解決しました。
kanamaruさんのスクリプトにzeroさんのスクリプトを足したものを使用させていただきました。



くちくん

リンク

2016/4/29(Fri) 11:05:25|NO.75345

zeroさんのものにさらに起動を追加すると

;省略 *listview_dblclked if (lparam != 0) { dupptr ia, lparam, 48 item = ia.3 dim lvitem, 15 sdim itemtext, 300 lvitem.0 = 0x00000001 lvitem.1 = item lvitem.2 = 0 lvitem.5 = varptr(itemtext) lvitem.6 = 300 sendmsg hList, 0x1000+5, 0, varptr(lvitem) title itemtext + " がダブルクリックされました" exec itemtext,16 ; ここで起動 } return
って感じだと思います
ダブルクリック起動状態。



kanamaru

リンク

2016/4/29(Fri) 11:08:57|NO.75346

それだと不十分です。フォルダを選択すると、windows標準のエクスプローラーが起動する気がします。



sakura

リンク

2016/4/29(Fri) 19:13:18|NO.75351

簡単にやると、こんなの?



dir = "d:\\" axobj obj, "Shell.Explorer.2", ginfo_winx, ginfo_winy obj->"Navigate" dir



InoueSoftwear

リンク

2016/5/8(Sun) 12:18:48|NO.75424




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