リストビューいろいろ †
リストビューの使い方についてのまとめ。
ちょくとさんのサイトへのリンクがメインで、ここでは補足を行います。
HSP3.1にはリストビューを作る専用の命令は用意されていません。
winobj命令またはWin32API(CreateWindowEx?)を利用する必要があります。通常はwinobjで充分でしょう。
1
|
| winobj "SysListView32", "ListView", <拡張ウィンドウスタイル>, <ウィンドウスタイル>
|
拡張ウィンドウスタイルおよびウィンドウスタイルについては、ちょくとさんのサイトに詳しい説明があります。
通常はウィンドウスタイルとしてWS_VISIBLEおよびWS_CHILDを指定すれば良いでしょう。
- ウィンドウスタイル(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/prm/window_style.html
- 拡張ウィンドウスタイル(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/prm/extended_window_style.html
ただ作成しただけでは行も桁もないので利用できません。
まず桁を追加し、その後でアイテム(行)を追加していきます。
カラムの追加にはLVM_INSERTCOLUMNメッセージおよびLVCOLUMN構造体を利用します。
- LVM_INSERTCOLUMN(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/message/LVM_INSERTCOLUMN.html
- LVCOLUMN構造体(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/struct/LVCOLUMN.html
1
2
3
|
| #define LVM_INSERTCOLUMN $0000101B
sendmsg <リストビューのハンドル>, LVM_INSERTCOLUMN, <新しく挿入するカラムの位置>, <新しいカラムの情報を格納したLVCOLUMN構造体のアドレス>
|
アイテムの追加にはLVM_INSERTITEMメッセージおよびLVITEM構造体を利用します。
- LVM_INSERTITEM(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/message/LVM_INSERTITEM.html
- LVITEM構造体(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/struct/LVITEM.html
1
2
3
|
| #define LVM_INSERTITEM $00001007
sendmsg <リストビューのハンドル>, LVM_INSERTITEM, 0, <新しいアイテムの情報を格納したLVITEM構造体のアドレス>
|
サブアイテムの追加はLVM_SETITEMメッセージおよびLVITEM構造体を利用します。
- LVM_SETITEM(ちょくとのページ)
- http://chokuto.ifdef.jp/urawaza/message/LVM_SETITEM.html
1
2
3
|
| #define LVM_SETITEM $00001006
sendmsg <リストビューのハンドル>, LVM_SETITEM, 0, <新しいサブアイテムの情報を格納したLVITEM構造体のアドレス>
|
リストビューの項目を取得するにはLVM_GETITEMTEXT(A)メッセージおよびLVITEM構造体を利用します。
LVM_GETITEMTEXT(A) $0000102D
- wparam
- 取得したいアイテムのインデックス
- lparam
- 取得結果が格納されるLVITEM構造体のアドレス
|
lparamで指定するLVITEM構造体には、取得した文字列を代入する変数のアドレスおよびサイズを代入しておく必要があります。
具体的には
- pszTextメンバにvarptr(<代入先変数>)を代入
- cchTextMax?メンバに<代入先変数のサイズ>を代入
すればOKです。
1
2
3
4
5
6
|
| #define LVM_GETITEMTEXTA $0000102D
<代入先変数> = "" <取得結果が格納されるLVITEM構造体のpszTextメンバ> = varptr(<代入先変数>)
<取得結果が格納されるLVITEM構造体のcchTextMaxメンバ> = <代入先変数のサイズ>
sendmsg <リストビューのハンドル>, LVM_GETITEMTEXTA, <アイテムのインデックス>, <取得結果が格納されるLVITEM構造体のアドレス>
|
ソートに利用できる主なメッセージには2種類ありますが、ここではLVM_SORTITEMSEXメッセージについて扱います。
なお、HSP3.1から利用するにはコールバック関数DLL「hscallbk.dll」が必要です。
- コールバック関数実装プラグイン hscallbk.dll for HSP3(ちょくとのページ)
- http://yokohama.cool.ne.jp/chokuto/download/index.html#hscallbk
LVM_SORTITEMSEX $00001051
- wparam
- 比較する関数に渡す数値(任意)
- lparam
- 比較する関数のアドレス
|
リストビューにLVM_SORTITEMSEX関数を送る際、lparam(sendmsg命令の第4引数)に比較する関数のアドレスを指定しなければなりません。
比較する関数は3つの引数(すべて整数型)を受け取り、比較した結果を整数で返す必要があります。
- 第1引数&第2引数
- 比較するアイテムのインデックス
- 第3引数
- LVM_SORTITEMSEXメッセージのlparam
- 戻り値
- 比較した結果
リストビューにLVM_SORTITEMSEXメッセージを送ると、すべてのアイテムから自動的に比較すべき2つを選び出して比較・並べ替えを行います。
比較する関数の戻り値が0より大きい場合のみ、2つのアイテムは交換されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
| #define LVM_SORTITEMSEX $00001051
#include "hscallbk.as"
#uselib ""
#func _compare "" int, int, int
setcallbk proc, _compare, *compare
sendmsg <リストビューのハンドル>, LVM_SORTITEMSEX, <任意の値>, varptr(proc)
stop
*compare
return 1
|