原典:http://compasstech.com.au/TNS_Authoring/Scripting/script_tut4.html
レッスン4.1「テキストを入力する」
Luaには、さまざまなイベントをキャプチャーするための簡単で便利な方法が豊富に用意されています。このレッスンの主な目的はキーボードからの入力を取り込むことですが、矢印キー、タッチバッド、マウスの操作に対してもまったく同じように対処できます。ここでの目的は、キーボードからの文字入力をon.charIn(char)で取り込むことです。answerという名前の変数を作成し、英数字およびそれ以外の文字・記号など、何であれキーボードで入力したものをその変数に代入します
まず、変数answerを空の文字列として定義します。
函数on.charInを実行すると、キーボードから入力した各文字が変数answerへ追加されます。ダブルドット(..)は文字列同士を連結する働きをすることに注意してください。
各文字は、answerに追加されると同時に、変数line3としてTI-Nspireにストアされます。そしてこの変数Line3が画面に表示されます。このようにして文字が次々に追加されてゆく変数line3が画面に表示されるわけです。var.recallは、TI-Nspireの変数を取得するコマンドでした。それとは逆に、var.store("var", value)は、TI-Nspire の変数(ここでは"var")に実際に値を書き込む働きをします。この変数は、たとえ存在しなくても、var.storeを実行することによって作成されます。都合よくできていますね。
画面は、各文字の入力されるたびにplatform.window:invalidate()によってリフレッシュされます。これは単に、直前に生じた可能性のある変更点を考慮して画面を再描画しているだけです。
エラーを修正する手段も必要ですので、バックスペース・キーを使えるようにしなければなりません。
これは文字の追加より少し面倒です。answerに代入された文字列の末尾から1文字分を削除して返す設定にした文字列コマンドstring.usubコマンドを使います。
screen = platform.window
answer = ""
function on.charIn(char)
answer = answer..char
var.store("line3",answer)
-- Refresh the screen after each key is pressed.
screen:invalidate()
end
function on.backspaceKey()
answer = answer:usub(0,-2)
var.store("line3",answer)
screen:invalidate()
end
上の2つのコマンドを使うと、キーボードから打ち込まれたテキストが変数answerとして取り込まれてline3の位置に表示されます。上の各ステートメントは、前回のレッスンまでに組み立てたプログラムにそのままはめ込むことができますので、これ以上ステートメントを追加しなくても、line3へのテキストの入力およびline3の内容の表示ができます。自動的に行われるはずです。前回までに作成したプログラムのon.paint函数の前に上の各ステートメントを追加すればいいだけです。1行目、2行目、4行面などには、問題などの情報が表示できますし、キーボードから入力したテキストはline3の位置に表示されます。
上の例で次の3つの疑問が生じたはずです。(1)各行に表示する値は、どこでどのようにして入力するのか。(2)解答を囲む青いボックスはどうやって描くのか。(3)正解が入力されたときに、それをどうやって認識させるのか。
---------------------------------------------------------------------------
(訳註)今回の実行例: