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を一番最後に配置するため、フォーカス移動が
  大変です。


私はとりあえず上記の方法で解決してみましたが、皆さんはいかがでしょうか?
これについては是非ご意見を頂ければ有り難いと思っています

以上を体感できるサンプルコードを用意しました。(自己解凍形式)