【HSP3】llmod3のlistviewでチェックボックスを取り扱う方法
Windowsで動作するフリーのインタプリタ型プログラム言語「HSP(Hot Soup Processor)」にて、標準同梱されている「llmod3」。HSP2.X時代から使われていたこのモジュールによって、標準命令にはないオブジェクトの配置やコントロールが可能になっておりました。HSPのバージョンアップに伴って使えなくなっていたのですが、開発者ではない方がHSP3.X用に修正したようで、標準同梱されるようになっています。これを利用して作れるオブジェクトにlistview(リストビュー)があるのだけれど、オプションでチェックボックス付きのリストビューを作成すると、そのチェックボックスを後からコントロールできない状態になっていたのです。ヘルプに書かれている内容がHSP2.X時代のもので動作しないのです。今日はそれを動作するように改良したお話…。
現在私がHSPで開発しているのが…仕事上で役立つアプリケーションのうち、最も大きなもの。いくつかのアプリケーションで構成されている、テキストファイルをWEB掲載するためのシステム。そのうちのWEB化するテキストを選択するアプリケーションに手を入れているところです。このアプリにはlistview(リストビュー)が2つ登場します。レイアウト的には2つのリストビューの間にテキストボックスがある感じです。
左側にあるリストビューはテキスト用。そこにあるテキスト名のひとつを選ぶと、隣にあるテキストボックスに中身が表示されます。テキストの内容を見てWEB化するかどうかを判断し、WEB化すると決まればリストビューのテキスト名が選択された状態でスペースバーを押すとチェックボックスにチェックが入る仕組みになっています。
この時、チェックが入ったテキストに関連した画像ファイルがあった場合、テキストボックスを挟んで反対側にある画像用のリストビューにある関連画像ファイル名の横にあるチェックボックスにも自動でチェックが入るようにしたいのだけれど…それを実現できなかったんです。
理由は先述した通り、listview命令のヘルプを見ても古いHSP用の記述になっていて動作しないため。ネットで色々と検索しつつ、Windows APIの勉強などもしてみたり…。そこで少しずつ分かってきたことをもとにして、ようやくチェックボックスの状態をチェックすることと、チェックボックスのオン/オフの切り替えができるようになりました。特にHSP3掲示板、10年以上前の過去ログに、llmod3の前身であるllmod時代のリストビューのモジュールが大いに参考になりました。これを機に私のほうでもモジュール化しておこうと思います。
以下にllmod3で作ったlistview(リストビュー)のチェックボックスの状態を確認する方法と、チェックのオン/オフの切り替え方法について書いておきます。(近くモジュール化し公開します)。
;リストビューのテスト //2012/09/25 弐条海月作成 #include "llmod3/llmod3.hsp" #include "llmod3/listview.hsp" //リストビューの作成 //リストビューコントロールの作成 listview 180,180,$50009 //リストビューを作成 id_listview=stat //リストビューのID hwnd_listview=objinfo_hwnd(id_listview) //リストビューのハンドル listaddcl 0,"タイトル",160 //リストビューに欄を追加 //リストビューの中身 txt_list={"あいうえお.txt かきくけこ.txt さしすせそ.txt たちつてと.txt なにぬねの.txt"} //リストビューに表示 sel_listview id_listview //操作するリストビューを選択 notesel txt_list : idx=notemax repeat idx noteget txt_name,cnt listadd cnt,txt_name,,, await loop //ボタンの表示 pos 2,185 : button "状態チェック",*action objsize 48,24 pos 75,185 : button "全選択",*action2 pos 130,185 : button "全解除",*action3 stop //------------------------------------------------------ *action //dialog "状態チェック" a=8,0,0,0,8192|4096 //初期設定 repeat idx a(1)=cnt getptr po, a //sendmsg用のポインタを取得 sendmsg hwnd_listview, 4101, 0, po if a(3) = 8192 {//チェックが入っている dialog ""+cnt+"番目のアイテムはチェックされています",0,"a(3)="+a(3) } if a(3) = 4096 {//チェックが入っていない dialog ""+cnt+"番目のアイテムはチェックされていません",0,"a(3)="+a(3) } await loop stop //------------------------------------------------------ *action2 //dialog "全選択" a=8,0,0,0,8192|4096 //初期設定 repeat idx a(1)=cnt getptr po, a //sendmsg用のポインタを取得 sendmsg hwnd_listview, 4101, 0, po if a(3) = 4096 {//チェックが入っていない //dialog ""+cnt+"番目のアイテムはチェックされていません",0,"a(3)="+a(3) a(3)=8192 //チェックをオンに sendmsg hwnd_listview, 0x1006, 0, po } await loop stop //------------------------------------------------------ *action3 //dialog "全解除" a=8,0,0,0,8192|4096 //初期設定 repeat idx a(1)=cnt getptr po, a //sendmsg用のポインタを取得 sendmsg hwnd_listview, 4101, 0, po if a(3) = 8192 {//チェックが入っている //dialog ""+cnt+"番目のアイテムはチェックされています",0,"a(3)="+a(3) a(3)=4096 //チェックをオンに sendmsg hwnd_listview, 0x1006, 0, po } await loop stop