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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0406
dirlistのソート順6解決


リンク

2019/4/6(Sat) 11:02:36|NO.87090

例えば以下のようなファイルがあるフォルダを
1.png
2.png
005.png
10.png
a1.png

dirlistした場合

005.png
1.png
10.png
2.png
a1.png

の順にソートされて取得されますが
これをもとのまま取得する方法は無いでしょうか?
他言語では数値を数値として解釈する命令などあるみたいですがHSPだと?
一行ずつ解析して数値を切り分けてからソートとか大仰で面倒な
方法をとらざるを得ないのでしょうか?



この記事に返信する


科学太郎

リンク

2019/4/6(Sat) 11:16:48|NO.87091

dirlist 命令よりも Windows OS のフォルダ設定で取得される順番と思います。
よって、ファイル名を工夫すべきでしょう。

01_1.png 02_2.png 03_005.png 04_10.png 05_a1.png
上記の名前で dirlist 命令で取得。
その後に文字列処理で先頭3文字を削除。

こんな方法でどうでしょうか。



リンク

2019/4/6(Sat) 11:49:53|NO.87092

さっそくのレスありがとうございます。
OS設定上はフォルダを開いても、hspでdialogしてももとの順番で出ます
(多分7以降はこれがデフォルトっぽい)

dirlistした時点で先頭文字からアスキーコード順?ソートされてしまいます。
作っているのが画像ビューアのため手動リネームは残念ながら現実的ではありません。



いののて

リンク

2019/4/6(Sat) 12:59:42|NO.87094

WinAPIに文字の数字を数値とみなして比較する StrCmpLogicalW関数 があるので、
それを使うとエクスプローラーのような並びでソートできます。


#include "hsp3util.as" #uselib "shlwapi" #cfunc StrCmpLogicalW "StrCmpLogicalW" wstr, wstr list = {"005.png 1.png 10.png 2.png a1.png"} note2array list_arr, list //複数行文字列を配列へ //バブルソート(あまり速くない) len = length(list_arr) repeat len cnt_ = cnt fin = 1 repeat len - cnt_ - 1 if (StrCmpLogicalW(list_arr(cnt), list_arr(cnt + 1)) > 0){ s = list_arr(cnt) list_arr(cnt) = list_arr(cnt + 1) list_arr(cnt + 1) = s fin = 0 } loop if (fin){ break } loop array2note list, list_arr //配列を複数行文字列へ mes list



科学太郎

リンク

2019/4/6(Sat) 17:51:01|NO.87098

> 作っているのが画像ビューアのため手動リネームは残念ながら現実的ではありません。
過去に同じようなソフトを作ったことがあります。

・ディレクトリのファイル一覧で取得の不具合発見!!
http://hsp.tv/play/pforum.php?mode=pastwch&num=74545

これで解決しそうな気がします。



リンク

2019/4/8(Mon) 20:23:32|NO.87116

ありがとうございました。

StrCmpLogicalW、なかなか便利なものがあるんですね。
希望通りのソートができました。

文字数制限についての情報もありがとうございました。
現状そこまでの対応はしなくてもよさそうですが今後の参考とさせていただきます。



リンク

2019/4/8(Mon) 20:28:51|NO.87117

解決済み忘れていました。

ところで、今更知りましたが文字列型の配列変数は各要素のサイズが同一でなくても
値の入れ替えができるんですね。



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