Last Update : 2006/12/xx
ボタンオブジェクトの設置を行う命令です。命令名の由来は、そのまま「button」から。
マウスでボタンを押して離すと、指定した「ラベル」(*〜)へジャンプして、処理が移る機能を持ってます。ボタンにフォーカスがある場合はスペースキーでボタンを押せます。
ラベルとして利用できる文字列は、「*(アスタリスク)の後に続く59文字(半角)以下」という制限があるので注意してください。一応、全角の日本語も使用できますが・・・。存在しないラベル名を指定した場合はエラー(エラー番号19)になります。ちなみに、HSP2では「*」を付けないラベル指定も非公式で可能でしたが、HSP3ではエラー扱いになります。
button "文字列", *ラベル名
button命令を呼び出した直後のシステム変数statにはオブジェクトIDが返ります。また、同様にラベルジャンプ先でも押したボタンのオブジェクトIDが返ります。オブジェクトIDはオブジェクトを設置する順に0から割り振られる数値です。
簡単にサンプルソースです。ボタンを押すとジャンプ先のダイアログが表示されます。ボタンオブジェクトの表示位置を指定するにはpos命令を、表示サイズを指定するにはobjsize命令を利用します。
; ボタンオブジェクトの表示位置 pos 100, 100 ; ボタンオブジェクトのサイズ ; (指定がない場合の大きさは、64x24) objsize 100, 40 ; ボタン設置 button "押して!", *jump_a mes "オブジェクトID "+stat button "Push!", *jump_b mes "オブジェクトID "+stat button "押す!", *jump_c mes "オブジェクトID "+stat stop *jump_a dialog "押したーヨ。", , "オブジェクトID : "+stat stop *jump_b dialog "ぷっしゅ!", , "オブジェクトID : "+stat stop *jump_c dialog "ぷっしゅ!", , "オブジェクトID : "+stat stop
押したボタンのオブジェクトIDがラベルジャンプ先で返るのを利用すれば、ラベルを1つにまとめることも可能です。
// ジャンプ先をひとつにまとめる button "押して!", *jump mes "オブジェクトID "+stat button "Push!", *jump mes "オブジェクトID "+stat button "押す!", *jump mes "オブジェクトID "+stat stop *jump dialog "押した", , "オブジェクトID : "+stat
すでに設置されているボタンオブジェクト上の表示文字列をスクリプト上で後から変更するには、オブジェクトの様々な制御を行うobjprm命令を利用します。
ちなみに、ボタン上に表示される文字列の表示フォントを指定するには、font命令+objmode命令(モード2)を利用します。
font "", 20 objmode 2 objsize 100, 50 button "ポチッ!", *a stop *a ; 第2パラメータに変更後の文字列 objprm 0, "へんこー"
HSP3(HSP 3.x)からボタンオブジェクトにサブルーチンジャンプ機能が加わりました。「button」という命令文字の直後に「gosub」か「goto」という文字を付けるもので、「goto」は今まで通り普通のジャンプ処理です(省略可)。
サブルーチンジャンプ機能の説明する前に、まずは従来のジャンプ処理。下のサンプルスクリプトでは、どんどん+1した数値をタイトルバーに表示する処理になってます。ここでもしボタンを押したら、ループ中(repeat〜loop)から抜け出して、「*reset」ラベルに飛び、当然ながらそこで処理がストップ(stop)します。
; <普通のジャンプ処理> button "リセット", *reset ; ループさせて数値をアップ repeat wait 10 count++ title ""+count loop *reset ; 数値をリセット count = 0 stop
もし、数値の上昇を継続させたい場合、repeat命令の直前に別のラベルを用意しておき、そこへgoto命令で飛ばすというのが1つの方法になるかと思います。
; <普通のジャンプ処理+goto命令でループへ戻す> button "リセット", *reset ; 戻り用のラベル *modoru ; ループさせて数値をアップ repeat wait 10 count++ title ""+count loop *reset ; 数値をリセット count = 0 goto *modoru
今度はこの部分をサブルーチンジャンプ処理で行ってみましょう。これにより、もしボタンを押すと、ループ中から抜け出し、「*reset」ラベルの処理を経由して、再びループ内へ戻ってきます。
button gosub "文字列", *ラベル名
; <サブルーチンジャンプ処理> button gosub "リセット", *reset ; ボタンを押しても、最終的にはここのループに戻ってきます repeat wait 10 count++ title ""+count loop *reset ; 数値をリセット count = 0 ; gosub命令の組み合わせで必ずリターンさせます return
ボタンオブジェクトに関連したHSP3(HSP
3.x)向けの発展的なサンプルソースコード、モジュールを公開しています。sendmsg命令、oncmd命令、Windows
API関数を利用して、HSPの基本命令では実現できない発展的な処理を実現してみます。たとえば、ボタン上に表示される文字列の表示位置の変更、標準命令には用意されてない「ラジオボタン」や「トグルボタン」の設置。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(ボタン・チェックボックス)
→ ボタン関連の発展的なサンプルソース