Last Update : 2008/08/xx
コンボボックスオブジェクトを設置する命令です。命令名の由来は、「combo box」から。
combox 状態保持変数, 拡張Yサイズ, "文字列"
オブジェクトの右側に「6」ボタンが付いており、オブジェクト全体をマウスでクリックすると、あらかじめ用意しておいた項目文字列を持つドロップダウンリストがニョキッと現れます。その中から1つの項目をユーザーに選択してもらう機能を持ってます。
コンボボックスオブジェクトを削除するにはclrobj命令、コンボボックスそのものにフォーカスを移すにはobjsel命令を利用します。コンボボックスを操作できないように無効化するには、objgray命令(obj.asモジュール)やHSP 3.2以降で標準のobjenable命令があります。コンボボックスに似たようなオブジェクトとしてリストボックス(listbox命令)が用意されていて、違いはデザインだけです。
◆ 第2パラメータの拡張Yサイズ
ドロップダウンリストの縦方向サイズを指定するパラメータです。100〜150あたりの数値(単位はピクセル)を指定しておいてください。このパラメータは、Windows
XP以降の環境で指定した数値がうまく反映されません。対処方法は最下部を参照。
コンボボックスの設置。ドロップダウンリスト部分に表示される文字列を「\n」(改行)で区切ることで、1項目分の文字列になります。objsize命令は横方向の表示サイズとして反映されます。(縦方向は表示文字列のフォントのサイズで自動的に決定されます)
; コンボボックスオブジェクトの表示位置 pos 100, 100 ; コンボボックスオブジェクトのサイズ (横幅のみ) ; (無指定の場合の横幅サイズは64 objsize 100 ; コンボボックス設置 combox a, 100, "HSP\ncombox\nコンボボックス\nスクリプト"
文字列用の変数を別に用意しておけば、複数のコンボボックスに対して同じ文字列を反映させることができます。
comboxtext = "HSP\n講座\ncombox\nコンボボックス\nサンプル" pos 100, 100 objsize 100 combox a, 100, comboxtext combox b, 100, comboxtext
コンボボックス内の項目には、上から順番にインデックス番号(0〜)が割り振られます。1からではないのでご注意を。combox命令の状態保持変数は、このインデックス番号に関連した処理で使われます。-1を指定しておいた場合は未選択状態です。
pos 100, 100 objsize 100 ; 状態保持変数にあらかじめインデックス番号を指定しておくと、 ; その項目がデフォルトで選択状態になります。 a = 1 combox a, 100, "HSP\n入門\ncombox\nコンボボックス" ; 未選択状態 b = -1 combox b, 100, "プログラミング\nHSP3\nコンボボックス\n命令" button "チェック", *check stop *check ; 状態保持変数を確認すると、選択されている項目のインデックス番号が分かる mes ""+a+" / "+b
コンボボックスオブジェクト内のどの項目が選択状態になっているかをリアルタイムで監視する1つの方法です。ループ中に状態保持変数を動きを確認します。
ちなみに、コンボボックス内の文字列全体の表示フォントを指定するには、font命令+objmode命令(モード2)を利用します。項目ごとに異なるフォントを適用することはできません(Win32 API関数などを駆使してオーナードローという処理を用意する必要あり)。このフォントの大きさに収まるサイズがコンボボックスの縦方向のサイズへ反映されます。
// コンボボックスの選択監視 font "MS 明朝", 20 objmode 2 objsize 200 combox a, 100, "HSP\ncombox\nコンボボックス" repeat wait 10 title ""+a loop
すでに設置されているコンボボックスオブジェクト内の特定項目を選択状態に切り替えるには、オブジェクトの色々な制御を行うobjprm命令を利用します。選択したい項目のインデックス番号(0〜)を指定してください。数値文字列の場合だと文字列変更になってしまうので注意。ちなみに、objsel命令はコンボボックス全体のフォーカス移動なので注意。
// コンボボックスの項目選択 pos 100, 100 objsize 100 combox a, 100, "HSP\ncombox\n基本\nコンボボックス" button "選択", *select stop *select ; 第2パラメータに選択する項目のインデックス番号(0〜) objprm 0, 2
// × オブジェクト設置後に代入処理を用意しても選択項目は変わりません。 combox a, 100, "HSP\ncombox\n基本\nコンボボックス" a = 2
すでに設置してあるコンボボックス内に新たな文字列を追加したり、逆に特定の項目を削除したりする場合は、objprm命令を利用します。この命令には、コンボボックス内の文字列をまるごと変更する機能を持っています。
細かい項目の変更は、メモリノートパッド機能のnote〜命令を利用して文字列変数をいじった後、objprm命令で一気にリストボックス内を書き換える流れです。
// コンボボックスの項目文字列の追加・削除 comboxtext = "HSP\ncombox\nコンボボックス\nソース\nコード" pos 100, 100 objsize 100 combox a, 100, comboxtext button "追加", *add button "挿入", *ins button "削除", *del stop *add notesel comboxtext ; 最後部に追加 (指定行追加) noteadd "追加!", -1, 0 ; 項目全体書き換え (文字列) objprm 0, comboxtext ; 選択項目の変更 (数値) ; noteinfo関数で項目数を取得 objprm 0, noteinfo(0) - 1 stop *ins notesel comboxtext ; 選択項目の上部に挿入 (指定行追加) noteadd "挿入!", a, 0 objprm 0, comboxtext stop *del notesel comboxtext ; 項目の削除 (指定行削除) notedel a objprm 0, comboxtext stop
コンボボックスで選択項目の文字列を取得します。メモリノートパッド機能のnote〜命令と組み合わせるのがポイントです。
// コンボボックスの項目文字列の取得 sdim moji comboxtext = "HSP\nコンボボックス\nスクリプト\n講座\nコード" pos 100, 100 objsize 100 combox a, 100, comboxtext button "取得", *get stop *get notesel comboxtext ; 文字列取得 (指定行読み込み) noteget moji, a mes moji
HSP3ではWindows XPとVistaの環境で第2パラメータの数値がうまく反映されません。Windows XP以降で対応するウィンドウメッセージ「CB_SETMINVISIBLE」をPostMessage関数で送信して、ドロップダウンリストの最小表示項目数を指定してください。combox命令の第2パラメータには、Windows XP以前の環境向けに100〜150あたりの数値を指定しておいてください。
// combox命令 CB_SETMINVISIBLEメッセージ #include "user32.as" sdim data, 512 i = 0 repeat 50, 1 poke data, i, "項目 "+cnt+"\n" i += strsize loop combox a, 100, data ; CB_SETMINVISIBLE ; 必ずcombox命令の直後に用意、第3パラに項目数(7個以下は反映されず?) PostMessage objinfo(stat, 2), $1701, 23, 0
コンボボックスに関連した発展的なHSP3(HSP 3.x)向けのサンプルソースを公開しています。
sendmsg命令、oncmd命令、Windows API関数などを利用して、このページで紹介しているサンプルの別手法や、基本的な命令では実現できない発展的な処理を実現してみます。たとえば、sendmsg命令を使って文字列の追加や削除、文字列取得、項目数取得などです。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(リストボックス・コンボボックス)
→ コンボボックス関連の発展的なサンプルスクリプト