●PROLOGUE/VALID/NOTVALIDについて(注意)

まず文法は・・・
  DEFINE ENTRYFIELD <オブジェクト名> OF PANEL1 ;
    AT ???.0, ???.0 WIDTH ??.0 ;
    PROLOGUE PROオブジェクト() ;
    VALID VALオブジェクト() ;
    NOTVALID NOTVALオブジェクト()

<動作>


まずPROLOGUEで定義された関数を実行します。
入力を行い、抜ける前にVALID()の判定を実行します
.T.のときはそのまま終了し次の部品へ移動しますが、.F.のときはNOTVALID()を実行します

次のような制約がありますので、注意して下さい
PROLOGUE()/VALID()では、カーソルが止まるようなパネルやダイアログを使用するのは
 禁止事項
(やってはいけない事)になっています。PROLOGUE()でダイアログを使用しても
 動いてしまいました。(使用するときは、各ユーザーの責任のもとでお願いします。)
 サブ画面を用意できるのは、NOTVALID()で呼ばれたときだけです
 DOS版ARAGOのときはNOTVALID()が存在していませんでした。WINDOWSの制約により
 追加された機能です。DOS版で動作していたPRGを書き換えるときには、修正が必要です

・NOTVALID()で定義できる部品には制約があります
 MESSAGEBOXを使用した場合には、そのままENTRYの入力に復帰しますが
 WAITやDIALOGを使用すると、NOTVALID終了時にPROLOGUE()を再度実行してしまいます
  実際にPRGを作成してみると、MESSAGEBOXだけでは満たされない事があります
  次に例を挙げてみます


例1)
ENTRYFIELDで@を入力されたら、補足項目を入力したい
その時は BROWSEやLISTBOXもしくはCOMBOBOXを使用してみたい・・・DIALOGが必要ですね

 すると、ENTRYには必ず@が入っている為、VALID()は必ず.F.を返します
 NOTVALIDによりサブ画面は表されますが、この部品から抜けられなくなります

 次に変数と併用した場合はどうなるでしょうか?
 PROLOGUEで「通過回数=0」と、初期化しておきます
 VALIDでは 通過回数=0 .AND. AT("@",ENTRY)>0 という判断をして.F.を返してみます
 ・・・1回目は良いのですが、NOTVALID終了時に「通過回数=0」が実行されてしまい
    何度も補助画面が表示される事になってしまいます

 回避する方法ですが、「通過回数=0」をPROLOGUEで行わず、メインからの ON_SELECTION
で呼ばれるサブなどで、初期化しておきます。
マウスなどでフォーカスを急に変更されても、1回位は初期化されるでしょうから
まず動作すると思います。
難点としては、部品としての移植が不便になる点です。後でコードを修正する際にも、
煩雑になっており、判りにくいプログラムになってしまいます。

例2)
NOTVALIDで表示されたDIALOG上で、ENTRYFIELDを使用しても思い通りの結果は得られない

メモリー変数や、フィールド内容を変更しようとしても、内容は書き込まれません。
(入力終了後には、入力された内容は消滅し、初期値のままになってしまいます)

Xbaseは、変数がすべてグローバルのはずなのですが、この部分だけ動作が異なっています。

回避策を挙げておきます。

NOTVALIDで呼ばれる関数で、どうしても入力を行いたい!!!(その場合は)

・1レコードのみの作業ファイルを用意する(入力が複数の場合はその分だけレコードを!)
・DEFINE DIALOG & DEFINE BROWSE にて、画面を用意する。
・そのとき、BROWSEは、レコード追加不可/フィールド幅指定 などを補足する。
・また、DIALOGは NOCLOSE を追加し、ACTIVATE DIALOG では、NOESCAPEを使用しない

ESCAPEでしか終了できなくなります。しかし、ARAGOWがデータを書き込んで良いか?を、聞いてきます。
保存されたデータはファイルに保存されていますので、USE & REPLACE を組み合わせて、
希望の変数に代入するなり、反映させて下さい。

文書での説明が難しい内容です。詳しく知りたい方は、遠慮なくメールなどで問い合わせて下さい