Last Update : 2006/12/xx
入力ボックスオブジェクトの設置です。命令名の由来は、そのまま「input」(入力)から。任意の文字や数値を表示したり、書き換えが可能な1行分の領域を表示します。(複数行文字列を表示したいならばmesbox命令を利用)
命令の形式は、下のようになっています。オブジェクトの大きさ(横方向)は、objsize命令でも指定可能です。入力ボックスの設置前の変数にあらかじめ文字列や数値を指定しておくと、実際にそれが反映された入力ボックスが表示されます。また、設置後でもこの変数を見ることで、入力されている文字列や数値を確認できます。
input 変数, 横幅サイズ, 高さサイズ, 最大文字数
なお、HSP3環境で、第4パラメータの最大文字数はOSによりカウント単位が異なります。基本的にはバイト(Byte)カウントでしたが、Windows XP以降の環境では文字数カウントになります。これはMicrosoftによる何とも困った仕様変更です。
入力ボックスの設置です。
変数aのデフォルトサイズは64バイトになっています。HSP3の場合、下のサンプルは半角英数字64文字(全角日本語の場合は32文字、Windows XP以降は64文字)までしか入力できない制限になります、それ以上の文字を入力できるようにするには、sdim命令で変数領域をあらかじめ確保しましょう。
a = "入力ボックス" ; 文字列型 b = 7 ; 数値型 ; オブジェクトの表示位置 pos 50, 50 ; 入力ボックス設置 input a, 200, 20 input b, 100, 20 button "チェック!", *check stop *check dialog ""+a+"\n"+b+"
入力ボックス設置後に、ボックス内の文字列や数値を変更するには、様々なオブジェクトの制御を行うobjprm命令を利用します。オブジェクトIDは、上からスクリプト上の設置順に割り当てられるHSP独自の数値(0〜)。ちなみに、入力ボックス内の表示文字列のフォントを指定するには、font命令+objmode命令(モード2)を利用します。
a = "入力ボックス" font "", 20 objmode 2 pos 50, 50 input a, 200, 30 ; デフォルトGUIフォントに戻す用 objmode 1 button "変更!", *change stop *change objprm 0, "チェーンジ!"
入力ボックスに文字列を入力した後、Enterキー(Returnキー、エンターキー、リターンキー)押しを判定させる。
getkey命令やstick命令を利用すると、IMEによる日本語変換の際のキー入力が反応してしまいます。そこで、onkey命令と、フォーカスのあるオブジェクトを知るためにobjsel命令を利用します。(キーコードについては、HSP3あれこれ : キーボード編 のページも参照〜。
objsize 100
a = "" : input a ; オブジェクトID 0
b = "" : input b ; オブジェクトID 1
onkey gosub *keyjump
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
入力ボックスに対して、入力された文字列を「*」(アスタリスク、米印)などで置き換えて、文字列を隠すパースワード表示にしてみます。objinfo関数を使って入力ボックスのウィンドウハンドルをあらかじめ取得しておき、sendmsg命令でパスワードボックス化するEM_SETPASSWORDCHARメッセージを送ってやることでサクッと実現できます。
; パスワードボックスな入力ボックスサンプルソース (by Kpan) a = "" input a hInput = objinfo(stat, 2) ; パスワード化 (EM_SETPASSWORDCHAR) ; 第3パラのwparam値に置き換わる任意の半角1バイト文字を指定 sendmsg hInput, $CC, '*' button "チェック!", *check stop *check dialog "["+a+"] でーす。"
ついでに、入力ボックス設置後にパスワードボックス化したり、パスワード表示の解除を行いたい場合は、sendmsg命令に加えて、再描画的な役割としてobiprm命令を利用します。
; パスワード表示解除サンプル (by Kpan) a = "" input a hInput = objinfo(stat, 2) sendmsg hInput, $CC, '?' button "カイジョ", *change stop *change ; 第3パラのwparam値に0指定で解除 sendmsg hInput, $CC ; 再描画用 objprm 0, a
入力ボックスに関連したHSP3(HSP 3.x)向けの発展的なサンプルコードを公開しています。sendmsg命令、Windows API関数などを利用して、基本的な命令では実現できない発展的な処理を実現してみます。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(入力ボックス・メッセージボックス)
→ 入力ボックス関連の発展的なサンプル