Last Update : 2006/12/xx
入力ボックスオブジェクトの設置です。命令名の由来は、そのまま「input」(入力)から。任意の文字や数値を表示したり、書き換えが可能な1行分の領域を表示します。複数行文字列を表示したいならばmesbox命令を利用します。
命令の形式は、下のようになっています。オブジェクトの大きさ(横方向サイズ)は、objsize命令でも指定できます。入力ボックスの設置前の変数にあらかじめ文字列や数値を指定しておくと、実際にそれが反映された入力ボックスが表示されます。また、設置後にこの変数をチェックすることで、入力されている文字列や数値を確認できます。
input 変数, 横幅サイズ, 高さサイズ, 最大文字数
なお、HSP3環境で、第4パラメータの最大文字数はOSによりカウント単位が異なります。基本的にはバイト(Byte)カウントでしたが、Windows XP以降の環境では文字数カウントになります。これはMicrosoftによる何とも困った仕様変更です。
入力ボックスを削除するにはclrobj命令、ボックス内にフォーカスを移すにはobjsel命令を利用します。ボックス内に文字を入力できないよう無効化するには、objgray命令(obj.asモジュール)やHSP 3.2以降で標準のobjenable命令があります。
入力ボックスの設置です。
文字列型変数value1のデフォルトサイズは64バイトになっています。HSP3の場合、下のサンプルは半角英数字64文字(全角日本語の場合は32文字、Windows XP以降は64文字)までしか入力できない制限になります、それ以上の文字を入力できるようにするには、sdim命令で変数領域をあらかじめ確保しましょう。value2は整数値型変数です。
value1 = "入力ボックス" ; 文字列型変数 value2 = 7 ; 整数値型変数 ; オブジェクトの表示位置 pos 50, 50 ; 入力ボックス設置 input value1, 500, 22 input value2, 100, 22 button "チェック!", *check stop *check dialog ""+value1+"\n"+value2+"
// 入力できる文字数を増やす方法 sdim value, 128 value = "128バイト分の文字列を入力できるボックス" input value, 500, 22
入力ボックスを設置した後に、ボックス内の内容を変更するには、様々なオブジェクトの制御を行うためのobjprm命令を必ず利用します。オブジェクトIDは、スクリプト上で設置した順に割り当てられるHSP独自の番号(0〜)です。
入力ボックス内の表示文字列のフォントを指定するには、font命令+objmode命令(モード2)を利用します。
// ボックス内の内容変更、フォント変更 value = "入力ボックス" font "", 20 objmode 2 pos 50, 50 input value, 200, 30 ; デフォルトGUIフォントに戻す用 objmode 1 button "変更!", *change stop *change objprm 0, "チェーンジ!"
// × オブジェクト設置後に単純な代入処理を用意しても書き換わりません!!! input value ; 単なる代入処理 value = "あいうえお"
gettime関数で時刻を取得して表示します。repeat-loop命令を使って無限ループさせて、時刻の数値をobjprm命令で反映させてやります。
// 入力ボックスに時刻をリアルタイム表示 input value repeat objprm 0, ""+gettime(4)+":"+gettime(5)+":"+gettime(6)+" wait 100 loop
入力ボックスに文字列を入力した後、Enterキー(Returnキー、エンターキー、リターンキー)押しを判定させる。
getkey命令やstick命令を利用すると、IMEによる日本語変換の際のキー入力が反応してしまいます。そこでonkey命令を利用します。フォーカスのあるオブジェクトを知るにはobjsel命令を使います。(キーコードについては、HSP3あれこれ (キーボード)のページも参照〜。
// 入力ボックスのエンターキー判定 onkey gosub *keyjump objsize 100 a = "" : input a ; オブジェクトID 0 b = "" : input b ; オブジェクトID 1 stop *keyjump ; wparamにキーコードが返る (13=Enterキー) title "キーコード: "+wparam if wparam = 13 { ; objsel命令の-1指定でフォーカスのあるオブジェクトIDがstatに返る objsel -1 if stat = 0 : dialog "ボックスa ["+a+"]" : return if stat = 1 : dialog "ボックスb ["+b+"]" : return return } return
input命令の入力ボックスに対して、入力された文字列を「*」(アスタリスク)などで置き換えて、何が入力されているか分からないよう表示を隠すパースワードボックスにしてみます。
objinfo関数で入力ボックスのウィンドウハンドル値をあらかじめ取得しておき、sendmsg命令で「EM_SETPASSWORDCHAR」メッセージを送信してやることでサクッと実現できます。ちなみに、Windows XP以降の環境ではアスタリスクの代わりに「黒丸」に置き換えられるのが一般的ですが、このサンプルコードでは1バイト文字しか指定できません。
// パスワードボックスな入力ボックス (by Kpan) buf = "" input buf hInput = objinfo(stat, 2) ; パスワード化 (EM_SETPASSWORDCHAR) ; 第3パラのwparam値に置き換わる1バイト文字 sendmsg hInput, $CC, '*' button "チェック!", *check stop *check dialog "["+buf+"] でーす。"
ついでに、入力ボックスを設置した後にパスワードボックス化したり、パスワードの表示を解除したい場合は、sendmsg命令に加えて、再描画的な役割としてobiprm命令も利用します。
// パスワード表示解除サンプル (by Kpan) buf = "" input buf hInput = objinfo(stat, 2) ; パスワード化 (EM_SETPASSWORDCHAR) sendmsg hInput, $CC, '?' button "カイジョ", *change stop *change ; 第3パラのwparam値に0指定(省略)で解除 sendmsg hInput, $CC ; 再描画用 objprm 0, buf
入力ボックスに関連したHSP3(HSP 3.x)向けの発展的なサンプルコードを公開しています。sendmsg命令、Windows API関数などを駆使して、基本的な命令では実現できない発展的な処理を実現してみます。
たとえば、文字列の表示位置(左寄り・中央)の指定、数値しか入力できないボックス、入力された英文字の大文字・小文字の強制表示、書き換え不可能な入力ボックス、文字色や背景色の変更、など。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(入力ボックス・メッセージボックス)
→ 入力ボックス関連の発展的なサンプル