Last Update : 2006/12/xx
ボタンオブジェクトの設置を行う命令です。命令名の由来は、そのまま「button」(ボタン)から。
マウスでボタンを押して離すと、指定した「ラベル」(*〜)へジャンプして、処理が移る機能を持ってます。ボタンにフォーカスがある場合は「スペースキー」でもボタンを押すことが可能です。
ラベルとして利用できる文字列は、「*(アスタリスク)の後に続く59文字(半角)以下」という制限があるので注意してください。一応、全角の日本語も使用できますが。存在しないラベル名を指定した場合はエラー(内部エラー番号19)になります。ちなみに、HSP2では「*」を付けないラベル指定も非公式で可能でしたが、HSP3ではエラー扱いになります。
button "文字列", *ラベル名
button命令を呼び出した直後のシステム変数statにはオブジェクトIDが返ります。また、同様にラベルジャンプ先でも押したボタンのオブジェクトIDが返ります。オブジェクトIDはオブジェクトを設置する順に0から割り振られる数値です。
ボタンオブジェクトを削除するにはclrobj命令、ボタンにフォーカスを移すにはobjsel命令を利用します。ボタンを押せないように無効化するには、objgray命令(obj.asモジュール)やHSP 3.2以降で標準のobjenable命令があります。
簡単にサンプルソースです。ボタンを押すとジャンプ先のダイアログ(dialog命令)が表示されます。
ボタンオブジェクトの表示位置を指定するにはpos命令を、表示サイズを指定するにはobjsize命令を利用します。ジャンプ先ではstop命令を用意するのを忘れないようにしましょう。忘れるとラベルを素通りしてダイアログが連発表示されてしまいます。
// ボタンの設置 ; 表示位置 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
ラベルジャンプ先を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)を利用します。
// フォント指定と文字列変更 ; フォントの適用 objmode 2 font "MS UI Gothic", 25, 1 objsize 100, 50 button "ポチッ!", *jump1 ; デフォルトのフォントに戻す場合 objmode 1 button "0", *jump2 stop *jump1 ; 第2パラメータに変更後の文字列を指定 objprm 0, "へんこー" stop *jump2 ; カウントアップ value++ objprm 1, value stop
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命令のコード
(ボタン・チェックボックス)
→ ボタン関連の発展的なサンプルソース