●ESCAPE_KEYを考慮したプログラミング
パネルで作業を行っているとき、エスケープキーを押してしまったら
DEACTIVATE_PANELの直前に記述した処理は実行されません
次のいくつかの条件や制約から、逃げるために一つの方法を提示させて
戴きます。
<条件1>
・DEFINE BROWSEを使用したい。しかしながら・・・
移動してきたフォーカスを別の部品へ移動するには、キーボードでは不可能
となっているのが現状です。(ピックアップキャラクタが動作しない)
レコードポインターを移動しないと、入力データが保存されない場合がある
<条件2>
・入力作業なので、一連動作はキーボード操作で完結したい。
(マウスの使用は、避けたい)
<条件3>
・終了方法により、状態を一定にしたい。
(使用したDBFを、CLOSEしたいなど)
大まかに以上の希望が出そろった場合、もっと良い解決方法がありましたら、御提案下さい。
<実行中の画面イメージ>
起動時(表示直後)、フォーカスは「QUIT」にしておきます。Alt+Qで終了できます。
TABキーでも、BROWSEに移動できますが、Alt+Bでも移動できるようにしてみました。
一度BROWSEにフォーカスが移動してしまうと、Alt+Qを押してもプッシュボタンは実行
されません。(ARAGO/Win Ver4.2 環境にて)
右上「×」を非表示(NOCLOSE)にしている理由:
ESCAPEで終了したとき、BROWSEでレコードポインターを移動しない入力データがある場合
「保存してから終了するか?」を表示してきます(BROWSEが持っている本来の機能)
「×」で終了すると、データを書き込まないまま終了してしまいます。
右上「×」以外で終了する場合で、レコードポインターの移動を行わなかった場合
BROWSEが内部で持っている機能です。ここで「はい」を選ぶ事で、データを確実に保存できます
<上記画面のPRG内容>
・ON ESCAPEにて、キー割り込みを有効にしてみます。
ESCAPEで用意したサブルーチンが実行されるのは、パネル定義中だけでした。
ACTIVATEに到達し表示されてしまうと、NOESCAPEなどのオプションの有無に関わらず
実行されません。
ACTIVATE のオプションで NOESCAPE を付けると、本当にESCAPEで終了できなく
なってしまいますので、ここでは使用しない事にします。
・BROWSEより、PUSHBUTTONを先に定義する。
もしくは、デフォルトフォーカスをBROWSE以外に設定しておくのが良いでしょう。
入力する事項が無かった場合、すぐに Alt+Q などで終了できます。
・USE (データベース切り離しなど、終了時処理) は ACTIVATE の次に配置しておく
ON ESCAPE 定義ルーチンが動作すれば、まとめて書くのが正しいのですが、
ESCAPEで終了したときに実行されるステップは、唯一ここだけです。
(プログラムの続きです)
・入力を始めるときのために、FOCUSを用意してみました。
機能を沢山配置したときは、BROWSEを一番最後に配置するため、フォーカス移動が
大変です。
私はとりあえず上記の方法で解決してみましたが、皆さんはいかがでしょうか?
これについては是非ご意見を頂ければ有り難いと思っています
以上を体感できるサンプルコードを用意しました。(自己解凍形式)