Last Update : 2006/11/xx
リストボックスオブジェクトの設置です。命令名の由来は、そのまま「list box」から。あらかじめ用意しておいた項目文字列の中から1つの項目をユーザーに選択してもらう、という機能を持ってます。
命令の形式は下のようになってます。拡張Yサイズを指定すると、表示できる項目数によりリストボックス内の右側にスクロールバーを表示してくれます。objsize命令はオブジェクトのサイズ(横方向&縦方向)としても反映できます。
listbox 状態保持変数, 拡張Yサイズ, "文字列"
似たようなオブジェクトにコンボボックス(combox命令)があります。リストボックスを削除するにはclrobj命令、フォーカスを移すにはobjsel命令を利用します。リストボックスを操作できないよう無効化するには、objgray命令(obj.asモジュール)やHSP 3.2以降で標準のobjenable命令があります。
リストボックスを表示します。文字列を「\n」(改行)で区切ることで1つの項目の文字列になります。
; リストボックスオブジェクトの表示位置 pos 100, 100 ; リストボックスオブジェクトのサイズ (横幅) objsize 100 ; リストボックス設置 listbox a, 30, "HSP\nlistbox\nリストボックス\n項目選択"
文字列用の変数を別に用意しておけば、複数のリストボックスに同じ文字列を指定することもできます。
listboxtext = "リストボックス\nHSP\nlistbox\nコード\nスクリプト" pos 100, 100 objsize 100 listbox a, 40, listboxtext listbox b, 30, listboxtext
リストボックス内の項目には、上から順番にインデックス番号(0〜)が割り振られます。1からではないのでご注意を。状態保持変数は、このインデックス番号に関する処理で使われます。
pos 100, 100 objsize 100 ; 状態保持変数にあらかじめインデックス番号を指定しておくと、 ; その項目が選択状態になります。-1の場合は未選択状態。 a = 2 listbox a, 100, "リストボックス\nlistbox\nHSP\nサンプルコード" button "チェック", *check stop *check ; 状態保持変数をチェックすると、どの項目が選択されているかが分かる mes a
リストボックス内のどの項目が選択状態かをリアルタイムで監視する1つの方法です。ループ中に状態保持変数の変化をチェックします。ちなみに、リストボックス内の表示文字列全体のフォントを指定するには、font命令+objmode命令を利用します(項目ごとのフォント変更はできません)。
// リストボックスの項目選択監視 font "MS UI Gothic", 14, 1 objmode 2 objsize 100 listbox a, 100, "listbox\nリストボックス\nHSP3\n項目監視" repeat wait 10 title ""+a loop
すでに設置してあるリストボックスの特定項目を強制的に選択するには、HSPに登場するオブジェクトの様々な制御を行うobjprm命令を使用します。インデックス番号(0〜)を指定してください。数値文字列の場合だと文字列変更になってしまうので注意。(この処理いついてはHSPリファレンスでは触れられてません)
// リストボックスの項目選択 pos 100, 100 objsize 100 listbox a, 100, "HSP\nリストボックス\nソース\n項目文字列\nlistbox" button "選択", *select stop *select ; 第2パラメータに選択する項目のインデックス番号(0〜)値を objprm 0, 3
// × オブジェクト設置後に代入処理を用意しても選択項目は変わりません。 listbox a, 100, "HSP\nリストボックス\nソース\n項目文字列\nlistbox" a = 3
すでに設置してあるリストボックス内に新たな文字列を追加したり、逆に特定の項目を削除したりする場合は、objprm命令を利用します。この命令にはリストボックス内の文字列をまるごと変更する機能を持っています。
細かい項目の変更には、メモリノートパッド機能のnote〜命令を利用して文字列をいじった後、最終的にobjprm命令でリストボックス内の文字列を入れ替える、という流れです。
// リストボックスの項目追加・削除 listboxtext = "HSP\nコード\nlistbox\nリストボックス" pos 100, 100 objsize 100 listbox a, 40, listboxtext button "追加", *add button "挿入", *ins button "削除", *del stop *add notesel listboxtext ; 最後部に追加 noteadd "追加!", -1, 0 ; 項目全体書き換え (文字列) objprm 0, listboxtext ; 選択項目の変更 (数値) ; noteinfo関数で項目数を取得 objprm 0, noteinfo (0) - 1 stop *ins notesel listboxtext ; 選択項目の上部に挿入 noteadd "挿入!", a, 0 objprm 0, listboxtext stop *del notesel listboxtext ; 項目の削除 notedel a objprm 0, listboxtext stop
ちなみに、全項目の文字列を一発削除するには、objprm命令を文字列無指定で呼び出せばOK。
; 全項目の文字列削除 objprm (オブジェクトID), ""
リストボックスで選択項目の文字列を取得します。メモリノートパッド機能のnote〜命令と組み合わせるのがポイント。
// リストボックスの項目文字列の取得 sdim moji listboxtext = "HSP\n講座\nサンプル\nリストボックス\nソースコード\nスクリプト" pos 100, 100 objsize 100 listbox a, 100, listboxtext button "取得", *get stop *get notesel listboxtext ; 文字列取得 (指定行読み込み) noteget moji, a mes moji
リストボックスに関連した発展的なHSP3(HSP 3.x)向けのサンプルソースを公開しています。oncmd命令、sendmsg命令、Windows API(Win32API)を利用して、このページで紹介しているスクリプトの別手法や、基本的命令では実現できないちょっと発展的な処理を実現してみます。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(リストボックス・コンボボックス)
→ リストボックス関連の発展的なサンプルスクリプト