キー押下でプログラムをコントロールしたい - Casio Basicプログラミング
Casio Basicプログラミング
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
追記修正 2017/01/03
追記修正 2017/01/03
プログラムの一旦停止や実行をキー押下でコントロールしたい。
最も簡単な方法は、Casio Basic に備わっている Casio 特有の旧来からの命令の1つ ◢ (出力)命令を使うことだ。
◢ 命令には、一旦停止の機能も備わっているので、プログラムを一旦停止したいところで使うことができる。但し、一旦停止を解除するには [EXE] を押す必要があり、他のキーは使えない。なお ◢ 命令は出力命令なので空白を含めて何か出力させるようにコードを書く必要がある。何も出力せずに一旦停止のみ行うには ""◢ とすれば良い。
⇒ ◢命令を含んた旧来の命令の使いこなしは、Casio Basic 入門38 を参照
Basic コマンドを使うと、キーを押した時のプログラムの動作のコントロールを、より自由度高く行える。
汎用性のあるコードとして、以下の事例を紹介する。
- 処理を一旦停止させ、何かキーを押している間に処理を先に進める方法
- 処理を一旦停止させ、何かキーを押すたびに(押している時間に係わらず) 処理を1回だけ実行する方法
- ◢ 命令と同じ動作を、Basic コマンドで実現する方法
- ◢ 命令とほぼ同じ機能だが、[EXE] キー以外で一旦停止を解除する方法
- 処理を一旦停止させ、何かキーを押している間だけ処理を実行する方法
⇒ Casio Basic コマンドリファレンス: Whileループ
先ず、以下のプログラムを作り、これを元にそれぞれの課題を実現する方法を付加してゆく。
以下のプログラムは、fx-5800P, fx-9860GII, fx-CG20 のすべてに共通して使える。
ファイル名: C-UP
0→C
While 1
Isz C
Locate 1,1,C
WhileEnd
変数 C を 0 で初期化し、
Isz C で C を1つ増やして Locate 1,1,C で増やした C の値を表示する。
While 1 / WhileEnd による無限ループでこの処理を繰り返す。
プログラム C-UP を実行すると、数字がカウントアップされ、[AC] キーで強制終了する。
==========
何かキーを押している時だけカウントアップを実行し、キーを離したら一旦停止するように、C-UP を改造する。
ファイル名: C-UP1
0→C
While 1
Isz C
Locate 1,1,C
While Getkey=0
WhileEnd
WhileEnd
プログラム C-UP に赤文字の2行を追加した。
While Getkey=0
WhileEnd
は、いずれのキーも押されていない時に処理を先に進めない (一旦停止) 機能を実現する。プログラムを一旦停止し、何かキー([AC] キーを除く)を押したら一旦停止を解除する。
さらにキーを押している間カウントアップ処理が継続され、キーを離したら処理が一旦停止する。
なお、カウントアップを1回だけ行うには、キーを押している時間をできるだけ短くする必要がある。言い換えればキーの長押しは、キーを複数回押したのと同じと判定される、つまりキ-リピートを検出する。
ここで、
While Getkey=0
WhileEnd
の動作を詳しく見てみる。While Getkey=0 は、While ループの [ループ継続条件] が Getkey=0 になっている。
Getkey=0 は、何もキーが押されていないことを意味するから、何もキーが押されていないときこのループが継続する。つまりループがグルグル回っていて、プログラムの処理は先に進まないから、ここでプログラムが一旦停止しているように見える(実際はループ処理が続くのでプログラムは停止していない)。
Getkey は、それが実行された時に押されているキーを判別するコマンドで、押されているキーごとの固有のキーコードを返し、キーが押されていない時は 0 を返す。「返す」というのは、Getkey が その値になっていると思って良い。キーが押されていない場合は 0 になる。
従って、Getkey=0 は、いずれのキーも押されていない条件を示す。
==========
次に、C-UP1 を改造して、キーを押す時間にかかわらず、1回押したらカウントアップを1回だけ行うようにする。
ファイル名: C-UP2
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd
While Getkey=0
WhileEnd
WhileEnd
C-UP1 に青文字の
While Getkey
WhileEnd
の2行を追加した。
ここで、
While Getkey
WhileEnd
は、何かキーが押されている限りこの2行のループ処理が続き、キーが離された時にこのループを抜ける。つまりキーリピートを抑制する機能を実現する。
Getkey は、このコマンドが実行された時に何かキーが押されていたら 0 以外のキーコードを返す。「返す」とは、Getkey その値であると思って良い。
While Getkey は、While のループ継続条件が Getkey になっていて、何かキーが押されていたら Getkey が 0 以外の値になるから、この時ループは継続され、処理は先へ進まない。キーが離されると、Getkey は 0 になるからループから抜けて、処理は先へ進む。
==========
C-UP2 を改造して、◢ 命令と同じ機能を実現してみる。
つまり、
0→C
While 1
Isz C
Locate 1,1,C◢
WhileEnd
と同じ機能を実現する。
ファイル名: C-UP3
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd
While Getkey≠47
WhileEnd
WhileEnd
C-UP2 の赤文字の部分を変更した。
ここで、、
Getkey は、このコマンドが実行された時に何かキーが押されていたら 0 以外のキーコードを返す。「返す」とは、Getkey その値であると思って良い。
While Getkey は、While のループ継続条件が Getkey になっていて、何かキーが押されていたら Getkey が 0 以外の値になるから、この時ループは継続され、処理は先へ進まない。キーが離されると、Getkey は 0 になるからループから抜けて、処理は先へ進む。
==========
C-UP2 を改造して、◢ 命令と同じ機能を実現してみる。
つまり、
0→C
While 1
Isz C
Locate 1,1,C◢
WhileEnd
と同じ機能を実現する。
ファイル名: C-UP3
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd
While Getkey≠47
WhileEnd
WhileEnd
C-UP2 の赤文字の部分を変更した。
ここで、、
While Getkey≠47
WhileEnd
WhileEnd
このループは、キーコード 47 のキー、つまり [EXE] キーが押されない限り、繰り返しを継続して、処理が先に進まない。[EXE] キーが押される時のみ、処理が先へ進む。
◢ 命令を使う時は、キーリピートは無いので、
While Getkey
WhileEnd
◢ 命令を使う時は、キーリピートは無いので、
While Getkey
WhileEnd
によりキーリピートを抑制している。
この例は、キーコード47の [EXE] キーで処理を1回進めるものだが、他のキーに対応するキーコードを使えば、好きなキーコードで処理を1回進めることができる。汎用の高い方法だ。
==========
プログラム C-UP を改造して、何かキーが押されている時だけ、カウントアップを停止させるようにする。
ファイル名: C-UP4
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd
WhileEnd
このコードで、
While Getkey
WhileEnd
は、何かキーが押されている限り、この2行のループが継続することは、上で紹介した。キーが離されている時は、このループは継続しない。
もし、この Getkey が実行されるとき、キーが押されていない場合、[ループ継続条件] である Getkey は 0 なので、ループに1度も入ることなくループを抜ける。
応援クリックをお願いします。励みになるので...
この例は、キーコード47の [EXE] キーで処理を1回進めるものだが、他のキーに対応するキーコードを使えば、好きなキーコードで処理を1回進めることができる。汎用の高い方法だ。
==========
プログラム C-UP を改造して、何かキーが押されている時だけ、カウントアップを停止させるようにする。
ファイル名: C-UP4
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd
WhileEnd
このコードで、
While Getkey
WhileEnd
は、何かキーが押されている限り、この2行のループが継続することは、上で紹介した。キーが離されている時は、このループは継続しない。
もし、この Getkey が実行されるとき、キーが押されていない場合、[ループ継続条件] である Getkey は 0 なので、ループに1度も入ることなくループを抜ける。
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
文字列変数 Str - コマンドリファレンス 2018/01/15
-
DATE から 年月日を取り出す - Casio Basicプログラミング 2018/01/07
-
キー押下でプログラムをコントロールしたい - Casio Basicプログラミング 2017/01/03
-
逆引き Casio Basic - 目次 - 2015/10/19
-
キー長押しでメニュー選択させたい - Casio Basicプログラミング 2015/10/13
-