オブジェクト操作 by llmod PART4
この章では拡張オブジェクトであるリストビュー関係の命令を紹介したいと思います。

皆さんはリストビューと言うものを聞いたことがあるでしょうか?
リストボックスを想像してしまった方、オシイです。
リストビューとは、リストボックスのように決められたエリア内に指定した情報の一覧を表示するものです。
表示された情報をクリックすることで選択している状態を表したり、
決められたエリア内に入りきらない場合にスクロールバーが自動的に付けられて
ユーザーが操作することで一通りの情報を扱えると言ったリストボックスにある機能はもちろんのこと
リストボックスではできない下記の様な機能を標準で持っています。
・リストボックスは単一列複数行だが、リストビューは複数列複数行にできる ・リストビューにタイトル行を設けて任意のテキストを配置できる ・テキスト横に任意の小さな画像(アイコン)を配置できる ・アイコンをメインとしてテキストをつけたデザインに出来る
パッとイメージがしにくいかもしれませんのでズバリと書きますと、 要はファイル選択をするエクスプローラの右側と同じコントロールです。 リストビューはリストボックスに比べて非常に多機能なのですが、 多機能ゆえに操作する命令は幾つも存在し、複雑です。 下記に一つずつ順番に紹介していきますので利用しようと思う方は頑張って覚えていってください。 まず初めに、拡張オブジェクトを使用するために llmod.asと使用するオブジェクトのasファイルをインクルードする必要があります。 今回はリストビューなのでlistview.asが必要となります。 そこまで用意するとリストビューの作成をする命令としてlistviewを使います。 listview命令の書式は「listview 幅,高さ,スタイル」です。 幅、高さを省略すると現在のobjsizeで指定されているサイズとなります。 p3のスタイルに次の値を組み合わせることで複数の指定が出来ます。
指定なし、又は0で左端の画像のように大きいアイコン表示となります。
1で2つ目の画像のように詳細表示です。
エクスプローラてばアイコン・名称、サイズ、種類、更新日時があります。
2で3つ目の画像のように小さいアイコン表示です。エクスプローラの並べて表示と同形です。
3で右端の画像のようにリスト表示となります。ファイル選択ダイアログで見る横スクロールするものです。
コレらだとドラッグ&ドロップ等でアイテムの複数選択ができるものですが、
4を加算すると複数選択できないようになります。
8の指定がない場合、リストビューにフォーカスがない場合に選択アイテムを反転表示しなくなります。
非アクティブ時でもアイテムを反転しておく場合は指定の必要があります。
$10(10進数の16)でアイテムを昇順で並べるようにします。
$20(同32)だとアイテムを降順で並べるようになります。
$40(同64)だとセットしたアイコンのイメージリストを消去しなくなりますが、
後ほど出ますが現段階でイメージリストについて説明しません。
$80(同128)で、大きいアイコン表示の時のテキストを指定位置で折り返さないようにします。
$100(同160)と$800(同2048)はヘルプに書かれているもののどうなるかは書かれていません。
$2000(同8192)だとリストビューのスクロールバーが付かなくなります。
コレは例えアイテムがエリア内に収まらない場合でも表示されません。
$4000(同16384)だと、詳細表示の時に表示されるタイトル行を非表示にすることができます。
ココまではWin95以降であれば普通に使用できるものと思いますが、
コレ以降のスタイルはcomctl32.dllのバージョンにより効果がない場合があるようです。
$10000(同65536)だとリスト表示時に罫線を付けるとヘルプに書かれていますが、
コレは恐らく詳細表示時の間違いだと思います。指定すると各列各行に罫線が表示されます。
$40000(同262144)でアイコン(表示されている場合)横にチェックボックスが表示されます。
アイコンの追加時に設定するものではなくリストビューに対して設定をするため、
アイコンやアイテムテキストが表示されている全アイテムに表示されます。
チェックが付けられているかどうかの確認は後ほど解説します。
$100000(同1048576)で詳細表示時に表示される列タイトルをドラッグ&ドロップで入替られます。
$200000(同2097152)で同列全ての情報が選択時に反転表示されるようになります。
これもヘルプにはリスト表示時と書かれてますが、詳細表示でなければ1行に別アイテムも入ってしまうし、
アイテムテキスト以外のサブアイテムが表示されないのでこの説明で間違いないと思います。
$400000(同4194304)でアイテム上にマウスカーソルがある時に選択対象アイテムとして、
ブラウザのリンクテキストのように手の形のポインタ(標準時)に変わって
アイテムテキストも色が変わるようになります。
$800000(同8388608)は$400000の時と似ていて、アイテム上にマウスカーソルがあると
選択対象アイテムとしてアイテムテキスト色が変更され、選択すると手の形のポインタに変わります。
$1000000(同16777216)でリストビューのスクロールバーがフラットタイプになります。
$8000000(同134217728)でリンクテキストとなる$400000・$800000が同時指定されている場合、
もっとリンクテキストらしくなり、マウスカーソルが来た時にテキストに下線が付加されます。
$10000000(同268435456)ではリンクテキストとなる$400000・$800000が同時指定されている場合、
マウスカーソルがアイテム上にないときでもテキストに下線が引かれる様になります。
$8000000の指定も同時にされていない場合、アイテム上に来た時テキストの下線は消えてしまいます。
常に表示させる場合は$184XXXXXにしましょう。
それでは実際に配置してみましょう。
#include "llmod.as"
#include "listview.as"

	pos 100, 100 : listview 400, 300
	stop
実行してみるとリストビューの確認が出来ました。 しかし、何もアイテムをセットしていないのでエリアが表示されただけです。 アイテムの配置は表示スタイルにより二通り出てきます。 大きい・小さいアイコン又はリスト表示の時は次に説明するアイテムセット命令で配置できるのですが、 詳細表示の場合だけは異なり、配置の前に配置する列の作成をしなければなりません。 その詳細表示は置いておいて、その他の通常配置の場合を先にしましょう。 アイテム追加はlistaddで、書式は「listadd 位置,テキスト,欄No,アイコンNo,状態,アイテム値」です。 p1の位置は先頭のアイテムを0として何番目のアイテムとするかを指定します。 p2のテキストはアイテムを表す表示テキストのことです。エクスプローラだとファイルになるところですね。 p3の欄Noは詳細表示の所で説明しますが、詳細表示以外は0を指定してください。 0以外をセットするとアイテム追加をしても表示されません。 p4のアイコンNoはテキストに関連付けるアイコンをアイコンリストの何番目にするかをセットするもの。 しかし、アイコンリストにどのアイコンを追加するのかを設定する命令は別途使用する必要がありますので、 とりあえずはアイコンなしで説明していきます。 p4もp3同様、とりあえず0セットにしておいてください。 p5の状態とは、どのような状態でアイテムを追加するのかを指定します。 1でフォーカスがある状態になります。フォーカスがある状態とは点線で選択された状態です。 しかし、実際にしてみても通常となんら変更がありません。 確認がしたい場合はリストビューエリア内の空白をクリックすることでその確認は出来ます。 2で選択したときの反転表示された状態にすることができます。 これの確認をしたい場合もリストビュー内の空いている所を選択して確認してください。 4で切り取り時のアイコンが半透明で表示されている状態になります。 コチラはアイコンがある状態だと切り取り状態で追加しただけで確認が出来ます。 8のハイライトは一番強調された状態で、その状態で追加されます。 これも4同様追加した段階ですぐに確認できますが、非選択状態でも解除されませんので注意が必要です。 組み合わせてもその数値になるのは1パターンしかありませんので、 これは複数指定することができると言うことでしょう。 例えば、12とすることで切り取り状態のハイライト、とか。
#include "llmod.as"
#include "listview.as"

	pos 100, 50 : listview 80, 100, 2 // 80×100の大きさで小さいアイコン表示のリストビューを配置する
	repeat 5
		listadd cnt, "LIST_" + cnt // 0番から順番にアイテム配置
	loop
	stop
追加ができるようになったので、先ほど保留していたチェックについて解説しましょう。 チェックの付いたリストビューに対して、チェックされているかを判定するには、 リストビューに対してメッセージを送ってやります。 メッセージについての説明は今までしていませんでしたが、今章以前にもう扱っています。 objsendと言うものを覚えていますか? あそこでは、使い方の説明だけでメッセージ云々については説明していませんでした。 メッセージとはWindowsが様々な処理の受け渡しに使用している内部的な命令のことです。 プログラマーはこのメッセージを渡すことで命令に沿った動作をさせることが出来たり、 Windowsが吐き出したメッセージを受け取って状態を知ることが出来ます。 メッセージの受け渡しを行うAPIはSendMessagePostMessageと呼ばれているものですが、 命令を実行して即座に結果を得るにはSendMessageを使用するのです。 SendMessageを使用すると言っても、これはHSPで用意された命令ではなく、 Windowsにより提供された命令の1つですが、HSPで使用できるよう準備してくれており、 llmod.as内に新命令sendmsgとして公開されてます。 sendmsg命令の書式は「sendmsg 渡すパラメータの入った配列変数」となってます。 渡すパラメータの配列変数は「ハンドル,メッセージコード,wParam,lParam」を入れた形にしておきますが、 objsend命令同様、入門として相応しくないためにココでの紹介は割愛させていただきます。 検索エンジンなどで検索してみると大量に引っかかるので興味がある方は探してみてはいかがでしょうか? …で、リストビューにチェックが付いているかどうかを判断するのにどんなメッセージを送るかと言うと、 「リストビューID,4120,アイテムNo,61440」とします。 数値の意味については考えないでください、そのままその数値を指定することで動きますので。 そうすることでチェックが付いているかどうかWindowsより結果が返りstatに代入されます。 チェックが付いていない場合は0が、付いている場合は1…ではなく4096がstatに返ります。
#include "llmod.as"
#include "listview.as"

	sdim msg, 256
	screen 0, 320, 240
	objsize winx, 30
	listview winx, winy - 30, $40003 // チェックボックス付きのリスト表示リストビュー
	listid = stat // リストビューIDを取得
	repeat 30
		listadd cnt, "アイテムNo." + cnt
	loop
	button "チェック状態を確認する", check
	stop

*check
	msg = ""
	repeat 30
		prm = listid, $102C, cnt, $F000 // $102Cは4120、$F000は61440のこと
		sendmsg prm
		if stat >> 12 - 1 { // 「stat - 4096」でもよい
			if msg ! "" : msg += " , "
			msg += "" + cnt
		}
	loop
	dialog "アイテムNo." + msg + "がチェックされてます"
	stop
詳細表示に必要な列作成について紹介します。 大きい・小さいアイコン又はリスト表示の時はそのままlistaddするだけで使用できますが、 1アイテムに複数の列を持つ詳細表示だけは列を追加しなければ、 どの列にアイテムを追加するのか分からないので追加することができないと書きました。 列を作成するのはlistaddcl命令です。 書式は「listaddcl 欄No,表示テキスト,幅,テキスト位置No」となっています。 p1の欄Noは左端の列を0としてどの位置に作成するかを指定します。 p2の表示テキストはタイトルとして表示させるテキストのことです。 列の幅よりタイトルテキストの方が長い場合、 テキスト末尾は「XXX...」といった形で省略され、はみ出ることはありません。 列は手動で広げることが出来ますので広げることで残りを表示できます。 p3の幅は列の幅です。ピクセル(ドット)単位で指定します。 全列幅がリストビュー幅を超える場合、自動的に横スクロールバーが付加されます。 p4のテキスト位置Noはタイトル位置を0〜2で指定します。 0にすると左寄せ、1で右寄せ、2で中央揃えになります。 コレでlistaddcl命令の設定は完了です。 詳細表示でないときにlistaddcl命令を使用しても無視されて何も変化がありません。 後はlistadd命令を使用してどの列にアイテムを追加するかを指定してあげましょう。
#include "llmod.as"
#include "listview.as"
#define COLUMN 4 // 列数

	listview winx, winy, $200001
	repeat COLUMN
		listaddcl cnt, "列" + cnt, winx / COLUMN, 2
		setcolumn = cnt
		repeat 10
			listadd cnt, "列" + setcolumn + "のアイテム" + cnt, setcolumn
		loop
	loop
	stop
続いて、追加の逆のアイテム削除について説明します。 アイテムを削除するのはlistdel命令で書式は「listdel 削除するアイテムNo」となります。 パラメータに−1を指定することで全アイテムを一括して削除することが出来ます。 詳細表示の時にlistdel命令でアイテムの削除を行うと、削除行の全列を削除します。 削除するインデックスを指定するだけの命令ですので解説はこれくらいで十分でしょう。
#include "llmod.as"
#include "listview.as"
#define NUM 30

	notesel item
	listview winx, winy - 25, $80
	repeat NUM
		listadd cnt, "アイテム其の" + cnt
		noteadd "アイテム其の" + cnt, cnt
	loop
	objsize winx / 2, 25
	combox index, 200, item
	pos winx / 2, winy - 25 : button "削除", *del
	stop

*del
	listdel index
	notedel index
	objprm 0, item
	objprm 0, 0
	stop
詳細表示時に使用する列の削除を行いましょう。 listdelcl命令を使用するのですがlistdel命令同様、書式は「listdelcl 削除列No」となっています。 パラメータに削除する列の番号を指定するのですが、アイテムと異なり−1の全列削除はありません。 listview命令で、$200000のサブアイテムも含めた全列を選択するようにしていない場合、 通常は左端の列アイテムしか選択をして反転表示にすることはできません。 もし左端の列を削除した場合にどのようになるかと言うと、削除前に左端から数えて2つ目、 つまり削除後に左端となる列が自動的に選択可能な列となってくれます。
#include "llmod.as"
#include "listview.as"
#define NUM 15 // 全列数

	dim show, NUM
	dim check, NUM
	listview winx - 70, winy, $10001 // 列区切りに罫線を引いた詳細表示リストビュー
	repeat NUM
		count = cnt
		listaddcl cnt, "列" + cnt, winx - 70 / NUM
		repeat 30
			listadd cnt, "列" + count, count
		loop
	loop
	objsize 100, 25
	pos winx - 70, 0
	repeat NUM
		show.cnt = 1 : check.cnt = 1
		chkbox "Item" + cnt, show.cnt
	loop

*main
	count.1 = 0 // 左端から列数カウンタ
	repeat NUM
		if show.cnt ! check.cnt : count = cnt : gosub *change
		if show.cnt : count.1++
	loop
	wait 30
	goto *main

*change
	check.count = show.count
	if show.count {
		listaddcl count, "列" + count, winx - 70 / NUM
	} else {
		listdelcl count.1
	}
	return
リストビューに入っているアイテム数を取得するのはlistmax命令で、 書式は「listmaxa class=r> 結果を入れる変数,フラグ」となってます。 p1の結果を代入する変数は数値が返るので数値変数を指定するように書かれていますが、 文字列変数であってもエラーは出ずに正常に取得できますが、一応は数値変数を渡してあげましょう。 問題はp2のフラグで、形上は0で全アイテム数の取得、1で見えているアイテム数の取得となっています。 0の時は確かに全アイテム数を取得できているのですが、1にしてみると誤った値が返ってきてしまいます。 見えていない分も含まれていたり、リストビューにアイテムが完全に入りきっている場合に、 全部埋まるとその数になるという数が返ってきたりときちんと返ってきてくれません。 しかし、コレはHSP側のバグでも何でもないと思います。 HSPは単純に呼び出しているだけで、別言語の掲示板で同じ様な話題を見かけたことがあります。 よってコレはこの命令でうまく取得することが出来ないものと思われます。 一応は全アイテム数の取得は出来ますので、そのサンプルを書いておきます。
#include "llmod.as"
#include "listview.as"

	listview winx, winy
	repeat 200
		listadd cnt, "NO." + cnt
	loop
	listmax max, 0 // ココを1に変えると見えているアイテム数だけになるはずだが…
	title "アイテム数は" + max + "です。"
	stop
今度はリストビューの指定アイテムを指定した状態にして選択をするlistsel命令です。 書式は「listsel アイテムNo,選択状態番号」となっています。 p1のアイテムNoは選択をしたいアイテムのNoですね。 p2の選択状態番号ですが、listadd命令の時にも選択状態番号を指定することがあったのを覚えていますか? 1でフォーカスを合わせ、2で選択をして、4で切り取り状態にし、8でハイライトにするというものです。 listsel命令もそれと同じで、1,2,4,8を選択します。 また、−1で選択状態を解除、パラメータを省略することでフォーカスを合わせた上で選択状態にします。
#include "llmod.as"
#include "listview.as"
#define NUM 30 // アイテム数

	type = -1, 1, 2, 4, 8
	notesel item
	listview winx, winy - 25, 11
	repeat NUM
		listadd cnt, "アイテムNo." + cnt
		noteadd "アイテムNo." + cnt, -1
	loop
	objsize 220, 25
	pos 10, winy - 25 : mes "リストビューの"
	pos 130, winy - 25 : combox index.1, 100, item
	pos 350, winy - 25 : combox index.0, 100, "を非選択\nにフォーカス\nを選択\nを切取\nをハイライト"
	objsize 70, 25
	pos 570, winy - 25 : button "実行", running
	stop
*running
	listsel index.1, type.index
	stop
listadd命令同様、アイコンがなければ切り取り状態の確認が出来ません。 先ほどはアイテムの選択でしたが、今度はリストビューの選択について解説したいと思います。 1画面内に複数のリストビューが存在する場合、 どのリストビューのアイテムを処理するのかを指定してやる必要があります。 リストビューを選択させるのはsel_listview命令で書式は「sel_listview リストビューID」です。 リストビューにフォーカスを合わせることでどうと言うものではありません。 今後の操作対象リストビューはコレ、とHSPに知らせるだけです。 パラメータにリストビューIDを指定しますが、配置順に0,1,2,3…とはなっていきません。 リストビューはHSPに組み込まれた正規の命令ではないため(?)そういうわけにもいかないようです。 リストビューのハンドルと呼ばれるものを指定するわけですが、 sendmsg命令の時にもハンドルと出てきましたが、ハンドルとは一体…!? 実は以前にチラッと話していたんですけど覚えていませんよね。 ハンドルとはアドレスの別名みたいなものでそれについての情報が格納された場所を指しています。 つまりリストビューの情報が入っているメモリアドレスを指定することで、 これから「このリストビュー」を使うよ、と知らせることが出来るわけですね。 リストビューのハンドルはどこに格納されていてどうやって知るのか、と言う話になるわけですけど、 listview命令を実行すると、システム変数statに返るようになっています。 作成直後には必要なくてもこれから先、どこで必要になるか分からないので statが別命令の実行により上書されてしまう前に変数に退避させてしまいましょう。
#include "llmod.as"
#include "listview.as"
#const SIZE 320 // オブジェクトXサイズ

	sdim name, 16, 2
	name = "左リストビュー", "右リストビュー"
	repeat 2
		pos SIZE * cnt, 0 : listview SIZE, winy - 25, $81 // テキストを折り返さない詳細表示
	 listviewid.cnt = stat
		listaddcl 0, name.cnt, SIZE, 2
	loop
	objsize SIZE, 25
	pos 0, winy - 25 : combox index, 100, name + "\n" + name.1
	pos SIZE, winy - 25 : button "アイテム追加", add
	stop

*add
	sel_listview listviewid.index
	listmax max
	listadd max, name.index + "アイテム其の" + max
	stop
今までリストビュー内のアイテム操作はアイテムを間接的に指定するものばかりで、 直接に選択されたアイテムを判別して操作する、と言うことがされていませんでした。 リストボックス等とは違い、現在どれが選択されているかを容易に取得することができません。 これから説明するlistget命令を使用することでどのアイテムが選択されているか等の検索が出来ます。 listget命令の書式は「listget 結果を入れる変数,アイテムNo,取得するタイプ,アイテム状態」です。 p1に取得した結果、取得に成功した場合はアイテムNoが、失敗なら-1が入るようになっています。 p2に検索を開始するアイテムNoを指定します。例えば3なら先頭から数えて4番目から検索開始します。 p2に-1を指定した場合、一番初めから検索を開始します。 p3とp4は2つ指定することで1つの結果を取得します。p4の状態は前から何回か出てきているものと同じで、 1でフォーカスイン、2で選択、4で切り取られた、8でハイライトアイテムです。 p4を0にすると、アイテムの状態を指定せずに一番側近にあるアイテムが対象となります。 p3とp4の組み合わせとその結果は下記の通りです。
p3が0の時、p2以降でp4の状態になっているアイテムインデックスをp1に返す。 p3が1の時、p2より上に配置されたアイテムのうちp4の状態のものをp1に返す。 p3が2の時、p2より下に配置されたアイテムのうちp4の状態のものをp1に返す。 p3が3の時、p2より左に配置されたアイテムのうちp4の状態のものをp1に返す。 p3が4の時、p2より右に配置されたアイテムのうちp4の状態のものをp1に返す。 p3が5の時、p2のアイテムテキストをp4バイトだけp1に返し、p4が−1でp1のテキストで再設定。 p3が6の時、p2のアイテムに持たせた値をp1に返し、p4が1でp1に入った値を使用して再設定。
#include "llmod.as"
#include "listview.as"

	listview winx, winy, 4
	repeat 160
		listadd cnt, "アイテム[" + cnt + "]"
	loop

*main
	listget index, -1, 0, 2 // 方向指定なし(=0)・先頭(=-1)から選択中(=2)のアイテムを取得
	if index ! index.1 {
		index.1 = index
		if index < 0 {
			title "アイテムが選択されていません"
		} else {
			title "アイテム[" + index + "]を選択中..."
		}
	}
	wait 10
	goto *main
先ほどは選択に関するアイテム取得でしたが、今度は選択しようとしているアイテムを取得します。 アイテムの選択はキーボードでも、マウスでも可能です。 選択をする前に何らかの処理を行わせたい場合など、前もって予想しておく必要があるでしょう。 キーボードで選択する場合、1つ単位でしか移動できないので次に選択するアイテムは予想できますが、 マウスの場合、自由に動かせてどこが選択されるのか予想することが出来ませんね。 そういった場合などに、マウスカーソルの下にあるアイテムを取得できるlisthit命令が用意されています。 書式は「listhit」だけでstatにインデックスが返り、 カーソル下にアイテムがない場合は−1が返るようになっています。 実は、パラメータの指定はあるようですが、llmod.as提供者が指定しても違いが分からないと言うことで ヘルプのほうからパラメータは除外されております。
#include "llmod.as"
#include "listview.as"

	listview winx, winy, 4
	repeat 160
		listadd cnt, "アイテム[" + cnt + "]"
	loop

*main
	listhit
	if index ! stat {
		index = stat
		if index < 0 {
			title "下にアイテムがありません"
		} else {
			title "アイテム[" + index + "]の上です"
		}
	}
	wait 10
	goto *main
残りは、お待ちかねアイコン付きアイテムについての解説なのですが、 listadd命令の所で書いたようにアイコンを扱う上で必要な命令があるのでソレを先に説明します。 アイコンはイメージリストと呼ばれるアイコン集に入れなければ操作できません。 今から説明するget_icon命令はアイコン情報を取得するだけですがimg.asで定義されている命令ですし、 イメージリスト操作の大半がimg.as内で行われている為に結合する必要があるのですが、 定義側が先にないとダメなので、listview.asよりも先にimg.asをインクルードしておきましょう。 get_icon命令の書式は「get_icon 結果代入変数,ファイル名,アイコンNo,小アイコン取得フラグ」です。 p1の数値型変数にはアイコンのハンドルが入ります。 p2には取得したいアイコンが含まれているファイルのパスを指定します。 カレントフォルダがWindowsやHSPのインストールしたフォルダなど既にパスが通っている所は、 フォルダ名を抜いたファイル名だけで構いません。 p3はp2のファイル内の何番目のアイコンを取得するかを指定します。 p3に−1を指定すると、ファイルに含まれている全アイコン数を取得しstatに返します。 また、p3に−2を指定すると、ファイル内の全アイコンを取得するようになります。 もしアイコン数が16を超える場合、数値変数の初期要素数を超えるため、 dim命令、又はdim命令にて要素を確保しておく必要があります。 −1を指定してアイコン数を取得し、その数分の配列要素を確保して全部取得するというようにしましょう。 p4には小さいアイコンを取得するかどうかを指定します。 p4に0、又は省略をすることで大きいアイコンを、1にすることで小さいアイコンを取得します。
#include "llmod.as"
#include "img.as" // listview.asよりも前に結合する
#include "listview.as"

	get_icon icon, "shell32.dll", 3, 1 // フォルダアイコン
	mes icon
	stop
上記サンプルを実行すると、よくわからない数字が表示されるだけです。 これが何度か出てきているハンドルと呼ばれるもののことで、 データ自体を表しているのではなく、データのある位置を指し示しているものとなります。 このアドレスの指し示す先には実際のアイコンが入っています。 今回はリストビューにアイコンをセットするだけで、 アイコンの描画などはリストビューが勝手にやってくれます。 リストビューにアイコンをセットするには、listicon命令を使用しましょう。 listicon命令の書式は「listicon get_iconで取得したハンドル,アイコン数,アイコンの大きさ」で リストビューのアイテムにアイコンをセットする為に使う命令ではありますが、 リストビューにアイコンをセットする命令ではありませんので間違えないでください。 get_icon命令で解説したように、アイコンは一旦イメージリストと呼ばれるものに入れる必要があります。 listicon命令はget_icon命令で取得したアイコン情報を元にイメージリストにセットを行い、 リストビューのアイテムにアイコンを使用できるようにする命令です。 p1のアイコンハンドルにはget_icon命令で取得するときに使用した変数を渡すだけですね。 p2のアイコン数はイメージリストにセットするアイコンの数を指定します。 p1で指定できる変数がセットするアイコンなので、複数アイコンを指定したい場合は配列変数として、 配列要素0〜セットするアイコン数−1魔で順番に入れて、その配列変数を渡してp2にその数を指定します。 p3のアイコンの大きさには0で32*32サイズで、1で16*16サイズを使用します。 大きいアイコンを指定する時は0、小さいアイコンを指定する時は1を指定してください。 各アイテムのアイコンはlistadd命令でアイテムを追加する時に指定しましょう。
#include "llmod.as"
#include "img.as"
#include "listview.as"

	get_icon icon.0, "shell32.dll", 3, 1
	listview 100, 100
	listicon icon, 1
	listadd 0, "Icon付", , 0 // 0なので省略しても同じだが,とりあえずココで決めていることを明示
	stop
リストビューの場合は次章に説明するツリービューとは異なり、 基本的にビューが消されると同時にイメージリスト分のメモリが自動的に解放されます。 ただ、既に書いたようにlistview命令のスタイルに$40を指定すると解放されません。 その場合は、自前で解放処理を入れてやる必要があります。 手動での解放はdestroy_imglist命令を呼び出します。 書式は「destroy_imglist イメージリストID」です。 p1のイメージリストIDはlisticon命令よって入るstatから取得します。 当然、イメージリストを消去するとアイコン画像は使えなくなってしまいますのでご注意ください。
#include "llmod.as"
#include "img.as"
#include "listview.as"

	get_icon icon, "shell32.dll", 3, 1
	listview 100, 100
	listicon icon, 1
	imgid = stat
	destroy_imglist imgid // この使い方は意味がないが書き方のサンプルです
	stop