sinさん、こんにちは。おもしろそうな題材だったので調べてみました。
関数のアドレスを渡す方法ですが(私自身詳しくはないので自信はありません)、ヘルプによればlibptr()で得られる値は「STRUCTDAT構造体のアドレス」であって、関数自体のアドレスではないそうです。
もちろんユーザー定義命令にvarptr()は利用できないので、ちょくとさんのhscallbk.dllを利用するのが一番簡単ではないかと思います。
http://yokohama.cool.ne.jp/chokuto/download/index.html#hscallbk
DLLの利用方法は付属テキストをご覧ください。
問題の降順ソートですが、LVM_SORTITEMSよりもLVM_SORTITEMSEXを利用した方が目的のプログラムを実現しやすいようです。
LVM_GETITEMTEXTAメッセージを利用して任意のアイテム・サブアイテムのテキストを取得し、その2つを比較する関数(上記DLLを利用する場合はサブルーチン)を用意するだけで実現できました。
急ぎで作った物でモジュール化などされていませんが、一応動作するスクリプトを載せておきます。
DLLの利用法や各メッセージの利用例として役立ててください。
// 参考資料:
// リストビューを作成してみる
// http://yokohama.cool.ne.jp/chokuto/urawaza/listview1.html
// Windows32 API Constance 検索
// http://hspnext.com/tool/hsptool04.htm
// MSDN - LVM_SORTITEMSEX
// http://msdn2.microsoft.com/ja-jp/library/bb761055(en-us).aspx
#include "hscallbk.as"
#uselib ""
#func sort_items "" int, int, int
#define LVM_SETITEM $00001006
#define LVM_INSERTITEM $00001007
#define LVM_INSERTCOLUMN $0000101B
#define LVM_SORTITEMSEX $00001051
#define LVM_GETITEMTEXTA $0000102D
#define LVS_REPORT $00000001
#define WS_EX_NOPARENTNOTIFY $00000004
#define WS_VISIBLE $10000000
#define WS_CHILD $40000000
// 疑似的な「ファイル」の数
#define NUM_FILES 10
randomize
gosub *createGuiObjects
setcallbk proc, sort_items, *sort
stop
// サブアイテム(ファイルサイズ)でソート
// 第2引数が0なら昇順、1なら降順
*sort
lvitem.2 = 1 // サブアイテムを対象とする
sortmode = callbkarg(2) & 1
repeat 2
lvitem.5 = varptr(item_name(cnt))
sendmsg objinfo_hwnd(id_list), LVM_GETITEMTEXTA, callbkarg(cnt^sortmode), varptr(lvitem)
loop
return int(item_name(0)) - int(item_name(1))
// ボタンクリックによって呼び出されるサブルーチン
*sort_asc
sendmsg objinfo_hwnd(id_list), LVM_SORTITEMSEX, 0, varptr(proc)
return
*sort_desc
sendmsg objinfo_hwnd(id_list), LVM_SORTITEMSEX, 1, varptr(proc)
return
// ボタンとリストビューの作成
*createGuiObjects
// ボタンを作成
objsize ginfo_winx / 2, 32
button gosub "ファイルサイズで昇順にソート", *sort_asc
pos ginfo_winx / 2, 0 : button gosub "ファイルサイズで降順にソート", *sort_desc
// リストビューコントロール作成
w = ginfo_winx : h = ginfo_winy - 32
style = WS_VISIBLE | WS_CHILD | LVS_REPORT
pos 0, 32
winobj "SysListView32", "ListView", WS_EX_NOPARENTNOTIFY, style, w, h, 0, 0
id_list = stat
// カラムを追加
dim lvcolumn, 8
lvcolumn.0 = 0x000F
lvcolumn.2 = 100
column_name = "ファイル名", "ファイルサイズ"
repeat 2
lvcolumn(3) = varptr(column_name(cnt))
sendmsg objinfo_hwnd(id_list), LVM_INSERTCOLUMN, cnt, varptr(lvcolumn)
if stat == -1 {
dialog "カラムの追加に失敗", 1
end
}
loop
// アイテムの追加
dim lvitem, 13
sdim item_name, 64, 2
lvitem.0 = 0x0001
lvitem.6 = 64
repeat NUM_FILES
item_name = "ファイル" + cnt
lvitem.1 = cnt
lvitem.5 = varptr(item_name)
sendmsg objinfo_hwnd(id_list), LVM_INSERTITEM, 0, varptr(lvitem)
if stat == -1 {
dialog "アイテムの追加に失敗", 1
end
}
loop
// サブアイテムの追加
repeat NUM_FILES
item_name = "" + rnd(1000) + " KB"
lvitem.1 = cnt
lvitem.2 = 1
lvitem.5 = varptr(item_name)
sendmsg objinfo_hwnd(id_list), LVM_SETITEM, 0, varptr(lvitem)
if stat == -1 {
dialog "サブアイテムの追加に失敗", 1
end
}
loop
return