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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0116
オレンジ再度質問:リネーム処理がうまくいきません6解決


オレンジ

リンク

2013/1/16(Wed) 18:28:10|NO.51909

いつもお世話になっております

皆様のアドバイスを受けながら、サンプルをつなぎあわせて
どうにか形になったのですがうまくいきません。

1)フォルダ内の画像ファイル一覧を取得しリストボックスに表示
2)D&Dで順番を変えてリネームしたいのですが

やりたいこと↓

リストボックス
★001.JPG      サムネイル=>★□▲
□002.JPG
▲003.JPG

リストボックスのファイルをD&Dで順番を入れ替える

リストボックス
□002.JPG      サムネイル=>□▲★
▲003.JPG      ※実はサムネイルはまだ動かない
★001.JPG

ボタンを押すと並び替えた順番にリネーム
サムネイル書き直し

リストボックス
□001.JPG      サムネイル=>□▲★
▲002.JPG
★003.JPG

なんとなく動き出したのですが、
肝心のリネーム部分がうまくいきません。。。

長いですが、リストを載せますのでどうかアドバイスを頂けませんでしょうか?
どうぞよろしくお願いいたします。


//#include "scr.hsp" #include "shell32.as" #define WM_DROPFILES 0x0233 #uselib "msvcrt" #func rename "rename" str, str //#include "user32.as" #include "hspcv.as" //画像縮小用 //-------- ; Win32API関数 #uselib "user32" #cfunc RegisterWindowMessage "RegisterWindowMessageA" str #uselib "comctl32" #func MakeDragList "MakeDragList" int #cfunc LBItemFromPt "LBItemFromPt" int, int, int, int #func DrawInsert "DrawInsert" int, int, int ; マクロ #define DRAGLISTMSGSTRING "commctrl_draglistmsg" #define DL_BEGINDRAG $485 #define DL_DRAGGING $486 #define DL_DROPPED $487 #define DL_CANCELDRAG $488 #define DL_CURSORSET 0 #define DL_STOPCURSOR 1 #define DL_COPYCURSOR 2 #define DL_MOVECURSOR 3 *start //----▼D&D処理 ; WM_DROPFILES メッセージハンドラを設定 oncmd gosub *OnDropFiles, WM_DROPFILES sdim file,260 if dir_cmdline!="" { mes dir_cmdline } DragAcceptFiles hwnd, 1 stop *OnDropFiles hdrop = wParam ; ドロップファイル情報のハンドル DragQueryFile hdrop, -1, 0, 0 ndrop = stat ; ファイルの数 repeat ndrop DragQueryFile hdrop, cnt, varptr(file), 260 //-----▲D&D処理 fileにフルパスを代入 フォルダ = file *メイン oncmd gosub, *draglistmsg, RegisterWindowMessage (DRAGLISTMSGSTRING) ; 項目文字列取得用変数 sdim listbox_text sdim file, 64 sdim filelist, 64 // フォルダ = "R:\\TEST\\" chdir フォルダ // フォルダ内のJPGファイルリスト作成 dirlist filelist, "*.JPG":TotalShowImg=stat // ファイル数を調べる notesel filelist sdim data,256 repeat TotalShowImg noteget data,cnt //mes data FileName.cnt=data // ファイル名 Order.cnt = cnt // 表示順序 loop objsize 100,300 pos 20, 20 listbox a, , filelist ; ドラッグリストボックス化 MakeDragList objinfo (stat, 2) objsize 100 pos 150, 20 button "保存", *save stop loop ; DRAGLISTMSGSTRING *draglistmsg SDIM listbox_text ; DRAGLISTINFO構造体 ; DRAGLISTINFO.0 = 通知メッセージ ; DRAGLISTINFO.1 = リストボックスのハンドル ; DRAGLISTINFO.2 & .3 = カーソル位置 dupptr DRAGLISTINFO, lparam, 16 ; ドラッグ開始時 if DRAGLISTINFO.0 = DL_BEGINDRAG { ; ドラッグする項目インデックス取得 dragindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, ) return 1 } ; ドラッグ中 if DRAGLISTINFO.0 = DL_DRAGGING { ; ドラッグ途中の項目インデックス取得 newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, 1) if newindex = -1 : return DL_STOPCURSOR ; ドラッグ目印表示 DrawInsert hwnd, DRAGLISTINFO.1, newindex return DL_MOVECURSOR } ; ドロップ後 (ドラッグ終了) if DRAGLISTINFO.0 = DL_DROPPED { ; 新たな位置となる項目インデックス取得 newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, ) if newindex != -1 { ; LB_GETTEXT sendmsg DRAGLISTINFO.1, $189, dragindex, varptr (listbox_text) ; LB_DELETESTRING sendmsg DRAGLISTINFO.1, $182, dragindex ; LB_INSERTSTRING sendmsg DRAGLISTINFO.1, $181, newindex, listbox_text ; LB_SETCURSEL sendmsg DRAGLISTINFO.1, $186, newindex } ; ドラッグ目印消去 DrawInsert hwnd, DRAGLISTINFO.1, -1 return } ; ドラッグキャンセル if DRAGLISTINFO.0 = DL_CANCELDRAG { ; ドラッグ目印消去 DrawInsert hwnd, DRAGLISTINFO.1, -1 return } return //---------ファイルリネーム処理---------- // ここがうまくいかない *save notesel listbox_text repeat TotalShowImg sendmsg objinfo (0, 2), $189, cnt, varptr (listbox_text) mes listbox_text //-----▼ファイル名をリネームするため一旦ダブらない名前に変換 //notesel list//JPEGファイルを一旦格納 B=B+1//乱数の代わり これ重要 mes B I=0//カウント設定ゼロ NAMESET=""+B+""+strf("%04d",I)+".JPG"//ファイル名作成 mes "NAMESET "+NAMESET rename listbox_text,NAMESET//リネーム後のファイル名 noteadd listbox_text.I I=I+1 loop *サムネイル onexit gosub *owari onclick goto *picture_print sdim file, 64 sdim filelist, 64; dirlist filelist, "*.jpg", 0; // フォルダ内のBMPファイルリスト作成 notesel filelist; filenum = noteinfo( 0 ); // ファイル数を調べる lpx = 300; // サムネイル表示位置 lpy = 5; size = 50; // サムネイルサイズ dst = 5; // サムネイル表示間隔 snw = 6; // サムネイル最大表示列数 snh = ( filenum + snw - 1 ) / 6; // ファイル数から行数を算出 bsy = dst * ( snh + 1 ) + size * snh; // サムネイル領域の高さ(余白含む) bsx = 800; // 幅 // サムネイルウィンドウを初期化 if( bsy < 600 ) { // screen 0, bsx, 600, 0; } else { // screen 0, bsx, bsy, 0; } title "サムネイル作成中..."; // ScrollBar; // スクロールバー付加 width 800, 800; // 表示サイズ設定 // 画像読み込み用バッファ作成 buffer 2, , , 0; // サムネイル作成 scnt = 0; // サムネイルを作った回数を計測 repeat snh slpy = lpy + ( size + dst ) * cnt; // Y座標計算 slpx = lpx; // X座標 repeat snw gsel 2; noteget file, scnt; // ファイル名取得 picload file; sx = ginfo_sx; // 画像サイズ取得 sy = ginfo_sy; gsel 0; // サムネイルの外枠 color 128, 128, 128; boxf slpx - 1, slpy - 1, slpx + size, slpy + size; color 255, 255, 255; boxf slpx, slpy, slpx + size - 1, slpy + size - 1; // 縦横比固定でサムネイル作成 if( sx > sy ) { ssy = size * sy / sx; pos slpx, slpy + ( size - ssy ) / 2; gzoom size, ssy, 2, 0, 0, sx, sy; color 155:mes file//ファイル名表示 } else { ssx = size * sx / sy; pos slpx + ( size - ssx ) / 2, slpy; gzoom ssx, size, 2, 0, 0, sx, sy; color 255:mes file//ファイル名表示 } slpx += size + dst; // X座標更新 scnt++; if( scnt == filenum ) { // 全ファイルのサムネイルが完成したらループから抜ける break; } loop loop // タイトル変更 title "サムネイルウィンドウ"; //stop goto *メイン // クリックしたとき *picture_print if( ginfo_act == 0 ) { // サムネイルウィンドウをクリックした場合 // サムネイル範囲内にマウスがあるか確認 if( lpx < mousex && mousex < (bsx - dst) && lpy < mousey && mousey < (bsy - dst) ) { scl_py = ginfo_vy; // スクロールバーの位置記録 // マウスと重なってる可能性のあるサムネイルを算出 ppx = ( mousex - lpx ) / ( size + dst ); ppy = ( mousey + scl_py - lpy ) / ( size + dst ); // サムネイル表示位置計算から流用 slpx = lpx + ( size + dst ) * ppx; slpy = lpy + ( size + dst ) * ppy; // 可能性のあるサムネイルの範囲内と重なっているか判定 if( slpx <= mousex && mousex <= (slpx + size) && slpy <= (mousey + scl_py) && (mousey + scl_py) <= (slpy + size) ) { gsel 2; // サムネイルの画像読み込み noteget file, ppy * 5 + ppx; picload file; // 画像サイズ取得 sx = ginfo_sx; sy = ginfo_sy; // 画像表示ウィンドウ初期化 screen 1, 800, 800, 0; title "画像表示ウィンドウ" // 画像表示 pos 0, 0; gzoom 800, 800, 2, 0, 0, sx, sy; font "MS Pゴシック", 40, 1:mes file//ファイル名表示 gsel 0; // 2回目以降のクリックに反応しないことがあるので描画先をサムネイルウィンドウに戻す } } } stop; *owari if iparam|wparam=0:end wait 20:gsel wparam, -1:gsel 0:return



この記事に返信する


KA

リンク

2013/1/16(Wed) 19:18:24|NO.51911

>>サンプルをつなぎあわせてどうにか形になった
>>なんとなく動き出した

前回の質問時点では、バラバラながら動いていたのでしょうか?

そもそも「サンプル」は命令を解釈するためのもので、それを単純に合わせても余計
に難しくなるだけです。

前回の物をきちんと自分で理解してください、それじゃあ何時までたっても同じです。



YSR

リンク

2013/1/16(Wed) 22:07:44|NO.51914

>>オレンジさん
原因を自分で考えるのが一番楽しいのですよ……?
まあ一言だけ言うとしたら、

な ん で リ ネ ー ム を 1 回 し か し て な い ん だ い ?



オレンジ

リンク

2013/1/16(Wed) 22:38:47|NO.51920

いつもお世話になっております

楽しみながらパズルを説いているような感じですが、
すみません、頭がごちゃごちゃになってしまって質問しました。

頭を整理して、リネーム部分の変数を自分がわかりやすい日本語へ変換したものがコレです。
リネームだけだとコレでうまくいくのですが。
※リネームを2回しています。

リストボックスの並びを取り出して、リネームし直すというのがわからず寝れません^^;

ヒントでも頂けたら嬉しいです^^;

//---------ファイルリネーム処理----------
*save

notesel 画像ファイルリスト
repeat ファイル数
sendmsg objinfo (0, 2), $189, cnt, varptr (画像ファイルリスト)
mes 画像ファイルリスト
noteadd 画像ファイルリスト,cnt
loop

goto *サムネイル
//-----▲D&D処理 fileにフルパスを代入-------------------------------------------------------------
// 画像フォルダパス(file) 画像フォルダのフルパス
// 画像フォルダ名(FOLDER) 画像フォルダ名
// 画像ファイルリスト(list)画像ファイルリスト
// 一時変数(get1) ファイル名の一時変数
// リネーム名(NAMESET) リネーム名
// ファイル数(s)
//-----▼リネーム処理------------------------------------------------------------------------------
CLS //画面クリア
//chdir 画像フォルダパス //リネームしたいファイルがあるフォルダー
//画像フォルダ名 = getpath(画像フォルダパス, 8) //フォルダー名を取得 (FK-123など)
//CharUpper varptr(画像フォルダ名) //大文字に変換 なぜかエラーになる??
//dirlist 画像ファイルリスト,"*.JPG" //JPEGファイルだけを数えて
//ファイル数=stat //ファイル数に代入
//-----▼ファイル名をリネームするため一旦ダブらない名前に変換--------------------------------------
notesel 画像ファイルリスト //JPEGファイルを一旦格納
B=B+1 :mes B;チェック表示 //乱数の代わり これ重要
I=0 //カウント設定ゼロ
repeat ファイル数 //▼ファイルの数だけリピート開始
noteget 一時変数,cnt //格納したファイル名を取り出す
リネーム名=""+B+"1000"+strf("%02d",I)+".JPG" //ファイル名作成
rename 一時変数,リネーム名 //リネーム後のファイル名
I=I+1 //Iカウント増やす
loop //▲ループ
//-----▲------------------------------------------------------------------------------------------
//-----▼ファイル名変換 本番----------------------------------------------------------------------
I=0 //Iカウント設定ゼロ
dirlist 画像ファイルリスト,"*.JPG" //ファイル名が変わったので再度フォルダー読み込み
notesel 画像ファイルリスト //JPEGファイルを一旦格納
repeat ファイル数 //▼ファイルの数だけリピート開始
noteget 一時変数,cnt //格納したファイル名を取得
リネーム名=""+画像フォルダ名+"_"+strf("%02d",I)+".JPG" //ファイル名作成
rename 一時変数,リネーム名 //リネーム後のファイル名
I=I+1 //Iカウント増やす
loop //▲ループ
//-----▲------------------------------------------------------------------------------------------
//-----▼サムネイル画像作成------------------------------------------------------------------------
//buffer 1, 800, 800
//picload 画像フォルダ名+"_00.JPG", 0
//picload 画像フォルダ名+"0_00.JPG", 0
//imgx = ginfo_sx //画像Xサイズ
//imgy = ginfo_sy //画像Yサイズ
//cvbuffer 0, imgx, imgy
//cvputimg 0
//cvresize 170, 170, 0, CV_INTER_AREA //170pxに縮小
//cvgetimg 0, 1
//cvsave 画像フォルダ名+"_00s.jpeg", 0, 100 //区別するために拡張子を変更(jpeg)
//-----▲------------------------------------------------------------------------------------------



YSR

リンク

2013/1/16(Wed) 23:04:02|NO.51922

>自分がわかりやすい日本語へ
プログラミング言語で日本語はむしろ見辛いって人は多いんよ〜
(英数字+一部の記号のみが普通だから)
それはともかく、「リストボックスの並び」が普通の文字列の配列として取得
できたならそこから、ノートパッド形式なら1行づつ読み込んでやればいいじゃない



暇人

リンク

2013/1/16(Wed) 23:57:39|NO.51924

必要ない間違ってると思うのを;でコメントアウトして修正

*save ;notesel listbox_text notesel filelist repeat TotalShowImg sendmsg objinfo (0, 2), $189, cnt, varptr (listbox_text) mes listbox_text //-----▼ファイル名をリネームするため一旦ダブらない名前に変換 //notesel list//JPEGファイルを一旦格納 B=B+1//乱数の代わり これ重要 mes B ;I=0//カウント設定ゼロ NAMESET=""+B+""+strf("%04d",cnt)+".JPG"//ファイル名作成 mes "NAMESET "+NAMESET rename listbox_text,NAMESET//リネーム後のファイル名 ;noteadd listbox_text.I noteadd NAMESET , cnt , 1 ;I=I+1 loop mes "---------" repeat TotalShowImg noteget listbox_text, cnt NAMESET=strf("%04d.JPG",cnt)//ファイル名作成 mes "NAMESET "+NAMESET rename listbox_text,NAMESET//リネーム後のファイル名 noteadd NAMESET , cnt , 1 loop objprm 0,filelist //リストボックスを更新 *サムネイル
noteaddは無くしてリネーム後にdirlistでも良いけど



オレンジ

リンク

2013/1/17(Thu) 01:20:46|NO.51925

YSR様

アドバイスどうもありがうございます。
すみません、日本語は自分が変数の流れをわかるために書きなおしたものです^^;

暇人様
アドバイスどうもありがとうございます。
思うように動きました!
本当に有難うございます
間違えていたソースと見比べて、勉強したいと思います。

今後ともどうぞよろしくお願いいたします。



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