●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 を組み合わせて、
希望の変数に代入するなり、反映させて下さい。
文書での説明が難しい内容です。詳しく知りたい方は、遠慮なくメールなどで問い合わせて下さい